使用 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 提供语法和语义的诊断信息。 |
分析查询
以下步骤提供了分析和导航已分析的查询的示例。
将查询作为字符串参数提供给
KustoCode.Parse
方法。 以下示例返回一个包含已分析的语法树的KustoCode
实例。var query = "T | project a = a + b | where a > 10.0"; var code = KustoCode.Parse(query);
使用各种 API 来浏览该树,例如
GetDescendants
、GetAncestors
、GetChild
、Parent
、WalkNodes
、GetTokenAt
、GetNodeAt
。 以下示例查找了引用名称a
的所有位置。var referencesToA = code.Syntax.GetDescendants<NameReference>(n => n.SimpleName == "a"); Assert.AreEqual(2, referencesToA.Count);
使用语义分析来分析查询
语义分析允许识别与查询语法的不同部分关联的确切列、变量、函数或表。
在上一部分中,project
运算符声明的 a
列与表中最初存在的 a
列之间没有区别。 为了正确区分这两者,请要求分析程序执行语义分析。
以下步骤提供了使用分析程序执行语义分析的示例。
为查询中引用的实体定义架构。
var globals = GlobalState.Default.WithDatabase( new DatabaseSymbol("db", new TableSymbol("T", "(a: real, b: real)") ) );
将
KustoCode.ParseAndAnalyze
方法与包含相关实体架构的全局变量结合使用。var query = "T | project a = a + b | where a > 10.0"; var code = KustoCode.ParseAndAnalyze(query, globals);
浏览该树并访问新属性,例如
ReferencedSymbol
和ResultType
。 以下示例使用 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
属性以查看诊断结果是错误、警告还是其他诊断类型。
相关内容
- 使用 Kusto.Toolkit 查找查询中引用的所有列或表