使用 Kusto.Language 分析查询和命令

使用 “版本 ”下拉列表切换服务。 了解有关导航的详细信息
适用于:✅ Azure Data Explorer

使用 Kusto.Language,可以分析查询和管理命令以生成结构化语法树。 本文概述了使用 Kusto.Language 分析查询所需的基本概念和方法。

Kusto.Language 方法概述

下表概述了本文中使用的主要方法。

目标 方法
分析查询或命令 KustoCode.Parse(查询KustoCode.Parse()
使用语义分析来分析查询或命令 KustoCode.ParseAndAnalyze( 查询,全局)

下表概述了分析查询后可以执行的其他操作。 code 是从前述方法返回的值,这意味着它是一个已分析的 KustoCode 实例。

目标 方法 说明
查找列的表 code.Globals.GetTable( ) 仅适用于语义分析(ParseAndAnalyze)。
查找表的数据库 code.Globals.GetDatabase( ) 仅适用于语义分析(ParseAndAnalyze)。
查找数据库的群集 code.Globals.GetCluster( 数据库) 仅适用于语义分析(ParseAndAnalyze)。
获取诊断信息,如错误和警告 code.GetDiagnostics() Parse 提供与语法相关的诊断信息,ParseAndAnalyze 提供语法和语义的诊断信息。
目标 方法 说明
查找列的表 code.Globals.GetTable( ) 仅适用于语义分析(ParseAndAnalyze)。
查找表的数据库 code.Globals.GetDatabase( ) 仅适用于语义分析(ParseAndAnalyze)。
获取诊断信息,如错误和警告 code.GetDiagnostics() Parse 提供与语法相关的诊断信息,ParseAndAnalyze 提供语法和语义的诊断信息。

分析查询

以下步骤提供了分析和导航已分析的查询的示例。

  1. 将查询作为字符串参数提供给 KustoCode.Parse 方法。 以下示例返回一个包含已分析的语法树的 KustoCode 实例。

    var query = "T | project a = a + b | where a > 10.0";
    var code = KustoCode.Parse(query);
    
  2. 使用各种 API 来浏览该树,例如 GetDescendantsGetAncestorsGetChildParentWalkNodesGetTokenAtGetNodeAt。 以下示例查找了引用名称 a 的所有位置。

    var referencesToA = code.Syntax.GetDescendants<NameReference>(n => n.SimpleName == "a");
    Assert.AreEqual(2, referencesToA.Count);
    

使用语义分析来分析查询

语义分析允许识别与查询语法的不同部分关联的确切列、变量、函数或表。

在上一节中,project 运算符声明的列a与表中最初存在的列a之间没有区别。 为了正确区分这两者,请要求分析程序执行语义分析。

以下步骤提供了使用分析程序执行语义分析的示例。

  1. 为查询中引用的实体定义架构

    var globals = GlobalState.Default.WithDatabase(
        new DatabaseSymbol("db",
            new TableSymbol("T", "(a: real, b: real)")
        )
    );
    
  2. KustoCode.ParseAndAnalyze 方法与包含相关实体架构的全局变量结合使用。

    var query = "T | project a = a + b | where a > 10.0";
    var code = KustoCode.ParseAndAnalyze(query, globals);
    
  3. 导航树并access新属性,例如 ReferencedSymbolResultType。 以下示例使用 ReferencedSymbol 属性检查原始表中的列 a 的引用次数。

    var columnA = globals.Database.Tables.First(t => t.Name == "T").GetColumn("a");
    var referencesToA = code.Syntax.GetDescendants<NameReference>(n => n.ReferencedSymbol == columnA);
    Assert.AreEqual(1, referencesToA.Count);
    

检查分析的查询是否存在错误

使用 GetDiagnostics 方法识别查询中的语法和语义错误。 对于在未进行语义分析的情况下分析的查询,仅会发现语法错误。

以下示例演示如何分析查询并检查它的错误。

// Parse a query.
var query = "T | project a = a + b | where a > 10";
var code = KustoCode.Parse(query);

// Check if the query has any syntax errors.
var diagnostics = code.GetDiagnostics();

// Investigate and handle the errors.
if (diagnostics.Count > 0) { ... }

注意

检查 Severity 属性以查看诊断结果是错误、警告还是其他诊断类型。