维度表达式是为查询某维度下符合特定条件的维度成员而设计的特定查询语法。
维度表达式的基础构成单元有两种:
维度成员名 例如 A
维度表达式函数 例如 Descendant(A,0)
一个维度表达式中可以出现多个函数或是维度成员,函数与函数或者维度成员之间用“;”连接(例如Entity{Descendant(A,0);Children(B,0);C}); 这里需要提到完整维度表达式的格式:
维度名{维度表达式} 例如 Year{2024;2025}
在先胜云平台的大部分组件中,用户不需要写完整的维度名{维度表达式} 的格式,只需要关注内部的 维度表达式 即可。
维度表达式中的英文不区分大小写;
在某些业务场景下,同名成员的共享节点有着不同的业务意义。所有需要一种新的维度成员格式:父.子。因为维度成员name本身支持“.”点符号,所以在使用父.子结构时,父和子成员需要各套一层中括号[]以做区分(如[A].[B])。
维度表达式中包含四种类型的基本函数以及在基本函数基础上延伸的聚合函数,聚合函数可以更灵活的查询表达式的维度成员。下面我们将分别介绍:
即当前节点下的所有低于当前节点等级的节点。
Descendant(维度成员名,排序方式(0/1),有效性过滤参数(0/1/2))
IDescendant(维度成员名,排序方式(0/1),有效性过滤参数(0/1/2))(包含节点本身)
示例:
获取 Entity 维度 #root 节点下所有后代节点的维度表达式为:
Entity{Descendant(#root,0)}
获取Entity维度#root节点下的所有后代节点,并且过滤实体激活版有效性,且返回纯子结构的维度表达式为 :
Entity{Descendant(#root,0,2)}
即当前节点下的所有次级节点。
Children(维度成员名,排序方式(0/1),有效性过滤参数(0/1/2))
IChildren(维度成员名,排序方式(0/1),有效性过滤参数(0/1/2))(包含节点本身)
示例:
获取 Entity 维度 #root 节点下所有子代节点的维度表达式为:
Entity{Children(#root,0)}
即当前节点下的所有最底层节点。
Base(维度成员名,排序方式(0/1),有效性过滤参数(0/1/2)),已知维度成员本身为末级节点时返回本身
IBase(维度成员名,排序方式(0/1),有效性过滤参数(0/1/2))(包含节点本身)
示例:
获取 Entity 维度 #root 节点下所有末级节点的维度表达式为:
Entity{Base(#root,0)}
Level(维度成员名,排序方式(0/1),当前层级开始层级,当前层级结束层级,有效性过滤参数(0/1/2))
ILevel(维度成员名,排序方式(0/1),当前层级开始层级,当前层级结束层级,有效性过滤参数(0/1/2))(包含节点本身)
示例:
获取 Entity 维度 TotalEntity 节点向下第一层级到第三层级之间的节点维度表达式:
Entity{Level(TotalEntity,0,1,3)}
排序方式 0:正序 1:倒序
有效性过滤参数 0:否;1:是,并返回父点子结构成员;2:是,并返回纯子结构成员。该参数非必传,默认为0。该参数仅对多版本实体维生效。
#root是一个虚拟节点,使用表达式函数不会返回#root节点,但是作为单个维度成员查询,会返回#root节点。Entity{IDescendant(#root,0)}的返回结果中不会出现#root,但是Entity{#root}则会返回#root。
示例: 获取 Entity 维度 TotalEntity 的所有末级节点,NoEntity,以及和 TotalEntiy 同级的 Company 节点下所有节点的维度表达式:
Entity{Base(TotalEntity,0);NoEntity;Descendant(Company,0)}
维度表达式包含两种类型的聚合函数。
删除函数:去除某个单独成员。
条件过滤:筛选过滤维度成员字段。
从 函数一 获取的列表数据中去除 函数二 或者单独某个维度成员,去除的 函数二 和维度成员可为多个 Remove(函数一,函数二,维度成员名…)。
示例:
获取 Entity 维度 #root 节点的所有不是末级节点的后代节点,TotalEntity 不包含在内:
Entity{Remove(IDescendant(#root,0),Base(#root,0),TotalEntity)}
从 函数一 中获取的列表数据中维度成员的字段属性需要满足某些具体的条件。
表达式为:AndFilter/OrFilter/NAndFilter/NOrFilter(函数1,Attr(属性名,属性值))
Attr(属性名,属性值) 中属性值是否需要单引号要根据当前属性数据库设置的类型来设置:
若 ud5 的类型为 varchar,则字段属性表达式为 Attr(ud5,'1')
若 ud5 的类型为 int,则字段属性表达式为 Attr(ud5,1)
条件过滤有四种情况:
满足函数查询结果并且满足字段属性值的设定,字段属性可设置多个。
示例:
获取 Entity 维度 #root 节点下的所有 ud5 等于 1 的后代节点:
Entity{AndFilter(Descendant(#root,0),Attr(ud5,'1'))}
满足函数查询结果并且符合字段属性值设定的至少一个条件,字段属性可设置多个。
示例:
获取 Entity 维度 #root 节点下的所有 ud5 等于 1 或者是末级节点的后代节点:
Entity{OrFilter(IDescendant(#root,0),Attr(ud5,'1'),Attr(is_base,1))}
满足函数查询结果不满足字段属性值的设定,字段属性可设置多个。
示例:
获取 Entity 维度 #root 节点下的所有 ud5 不等于 1 并且不是末级节点的后代节点:
Entity{NAndFilter(IDescendant(#root,0),Attr(ud5,'1'),Attr(is_base,1))}
满足函数查询结果并且不符合字段属性值设定的至少一个条件,字段属性可设置多个。
示例:
获取 Entity 维度 #root 节点下的所有 ud5 不等于 1 或者不是末级节点的后代节点:
Entity{NOrFilter(IDescendant(#root,0),Attr(ud5,'1'),Attr(is_base,1))}
Entity{AndFilter(IDescendant(#root,0),Attr(ud5,’1’),Attr(ud5,’2’))}:取ud5=1且ud5=2的成员–无成员; Entity{AndFilter(IDescendant(#root,0),Attr(ud5,’1’,’2’))}:取ud5的值在 1和2 范围的成员–ud5=1和ud5=2全包含;
Entity{OrFilter(IDescendant(#root,0),Attr(ud5,’1’),Attr(ud5,’2’))}:取ud5=1或ud5=2的成员–ud5=1和ud5=2全包含; Entity{OrFilter(IDescendant(#root,0),Attr(ud5,’1’,’2’))}:取ud5的值在 1和2 范围的成员–ud5=1和ud5=2全包含;
Entity{NAndFilter(IDescendant(#root,0),Attr(ud5,’1’),Attr(ud5,’2’))}:取ud5≠1且ud5≠2的成员–ud5=1和ud5=2全剔除; Entity{NAndFilter(IDescendant(#root,0),Attr(ud5,’1’,’2’))}:取ud5的值不在 1和2 范围的成员–ud5=1和ud5=2全剔除;
Entity{NOrFilter(IDescendant(#root,0),Attr(ud5,’1’),Attr(ud5,’2’))}:取ud5≠1或ud5≠2的成员–全部成员; Entity{NOrFilter(IDescendant(#root,0),Attr(ud5,’1’,’2’))}:取ud5的值不在 1和2 范围的成员–ud5=1和ud5=2全剔除;
支持Filter(包括AndFilter/OrFilter/NAndFilter/NOrFilter)和Remove套用,但是只能Remove在外层,Filter在内层,也即可以在Remove函数中将Filter函数结果作为入参,但是不能在Filter函数中使用Remove函数。
子集相当于一个自定义维度表达式,管理员和普通用户可以在维度中创建子集,并给每个子集配置子集编码。在表达式中可以是用子集函数,函数名subset,参数为子集编码。 例如: 用户在维度中配置了子集EastDistrict,其表达式为IDescendant(B,0);A;C。 那么可以使用子集函数 subset(EastDistrict),其效果等于调用了对应配置的维度表达式IDescendant(B,0);A;C。
别名是支持特殊字符的特殊维度名称。每个维度成员均可设置一个别名。在维度表达式中可以使用别名,但是 因为别名中可以存在特殊字符,因此需要引入边界符[]。边界符[]的设定为:所有成员编码和别名都可以使用边界符,但是当别名中存在特殊字符时,必须加上边界符。 例如: 某成员编码为A,别名为Aの店,@1 23 在写表达式时,可以写IDescendant(A,0) IDescendant([A],0) IDescendant([Aの店,@1 23],0) 但是不能写IDescendant(Aの店,@1 23,0) 包括当有特殊字符的别名当做单成员使用时,也需要加边界符,例如:IDescendant(A,0);[Aの店,@1 23]
原则上允许各种特殊字符,但部分特殊字符涉及到json格式或维度表达式预留字符等限制,需要特殊处理:
1,支持转义符(即反斜杠\),可以在别名中使用转义符,但因为转义符本身在json字符串语法规则中不能单独出现,所以在使用维度表达式时,需要使用两个连续的转义符来表示转义符。
例如:
有别名为:A\公司,那么在维度表示中需要这样写:IDescendant([A\公司],0)
2,不支持 换行符 (\n)和 回车符 (\r)
例如:以下别名不合法:A\n公司,A\r公司
3,支持英文单引号和英文双引号,但是因为英文双引号本身在json字符串语法规则中不能在字符串中直接出现,在维度表达式中使用时,需要在双引号前加上转义符(英文单引号不需要额外处理,直接使用即可)。
例如:有别名为:AB’C”公司,那么在维度表示中需要这样写:IDescendant([AB’C”公司],0)
4,因为维度表达式本身使用了[]作为边界符,所以如果别名中存在[],必须要成对出现,并且在表达式中使用时,需要使用[[来代表[, 使用]]来代表]。 例如:有别名:A门店[某某路分店] ,那么在维度表示中需要这样写:[A门店[[某某路分店]]]
5,别名首尾不能使用空格,中间可以出现空格。
6,别名长度不能超过255。
回到顶部
咨询热线
