使用正则表达式解析DAX查询以获取度量和维度

时间:2019-04-08 09:19:15

标签: regex mdx dax azure-analysis-services

我想创建一个使用扩展事件来分析Azure Analysis Services模型使用情况的应用程序。 具体来说,我想知道最终用户正在使用哪些度量和维度。

我查看QueryEnd事件,并尝试解析TextData字段。根据查询模型所用的工具,我可以在TextData中获得MDX或DAX。

我想我已经使用此RegEx解析了MDX:([[\ w] +]。[[\ w] +](?:。(?: Members | [Q \ d]))?) (摘自这篇文章:Regular expression for extracting element from MDX Query

现在解析DAX就是问题所在。如果我从fx PowerBI查询模型,则会得到如下DAX:

EVALUATE 
TOPN(
502,
SUMMARIZECOLUMNS(
ROLLUPADDISSUBTOTAL('Product'[Color], \"IsGrandTotalRowTotal\"),
\"Order_Count\", 'SalesOrderDetail'[Order Count]
),
[IsGrandTotalRowTotal],
0,
[Order_Count],
0,
'Product'[Color],
1
)
ORDER BY
[IsGrandTotalRowTotal] DESC, [Order_Count] DESC, 'Product'[Color]

我想与RegEx匹配的是:

“产品” [颜色]和“ SalesOrderDetail” [订单数]

然后...。我怎么知道订单数被用作商品,而颜色是产品维度的属性呢?.....我猜不会吗?

非常感谢 尼古拉(Nicolaj)

2 个答案:

答案 0 :(得分:0)

认为我刚刚找到了一种解析DAX和MDX查询的可能解决方案:

([\[\'][\w ]+[\]\']\.?[\[\'][\w ]+[\]\'])(?!.*\1)

这会给我我所需要的...。欢迎改进:-)

答案 1 :(得分:0)

要从度量中消除列的歧义,我将查询DMV以获取已部署模型的信息,以获取列列表和度量列表。然后,您可以只在两个列表中查找解析的令牌:

DMV docs

Column DMV

Measure DMV

请注意,度量名称在列和度量名称的总体中是全局唯一的,因此可以轻松查找(只需丢弃表引用即可)。列名仅在它们所属的表中唯一。

您似乎已经拥有了适合您的正则表达式,因此可以运行它。

我还将注意到,几乎所有返回简单列表以外​​的内容(例如,切片器或一列表将仅返回列表)的PBI视觉对象都将遵循您共享查询的模式。

度量应全部放在SUMMARIZECOLUMNS的后面的args中。模式是:

SUMMARIZECOLUMNS (
    <grouping columns, optionally in a ROLLUPADDISSUBTOTAL>,
    <filters, defined above in VARs>,
    <measures as ("Alias", [Measure]) pairs>
)