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

适用于:✅Azure 数据资源管理器

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

Kusto.Language 方法概述

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

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

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

目标 方法 说明
查找列的表 code.Globals.GetTable(column) 仅适用于语义分析(ParseAndAnalyze)。
查找表的数据库 code.Globals.GetDatabase(table) 仅适用于语义分析(ParseAndAnalyze)。
查找数据库的群集 code.Globals.GetCluster(database) 仅适用于语义分析(ParseAndAnalyze)。
获取诊断信息,如错误和警告 code.GetDiagnostics() Parse 提供与语法相关的诊断信息,ParseAndAnalyze 提供语法和语义的诊断信息。
目标 方法 说明
查找列的表 code.Globals.GetTable(column) 仅适用于语义分析(ParseAndAnalyze)。
查找表的数据库 code.Globals.GetDatabase(table) 仅适用于语义分析(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. 浏览该树并访问新属性,例如 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 属性以查看诊断结果是错误、警告还是其他诊断类型。