对象开启层级结构后,会有一条指向父级的链接 parent。通过 parent 及其反向链接可以取父级、子级;通过 递归函数 可以取某成员的祖先、后代等集合。
|
含义 |
写法 |
|---|---|
|
父级 |
|
|
子级 |
|
parent 为多选链接时,.parent 可能是多个;反向 .<parent[is 对象类型] 表示「以当前对象为父的所有该类型对象」。
基于 parent 层级,常用递归函数如下:
|
函数 |
说明 |
|---|---|
|
|
指定成员的末级成员集合(叶子) |
|
|
指定成员及其末级成员集合 |
|
|
指定成员的后代成员集合(不含自身) |
|
|
指定成员及其后代成员集合 |
|
|
指定成员的祖先成员集合 |
|
|
指定成员及其祖先成员集合 |
参数为对象实例的集合,通常传单条(如先 select 一条再传入)。
假设对象 DimRegion(大区)有层级:code、name、parent(父级)、可选 self/cal_self 等自我链接。
|
属性/链接 |
说明 |
|---|---|
|
code |
大区编码(业务主键) |
|
name |
大区名称(多语言) |
|
parent |
父级(链接 DimRegion) |
获取 code 为 ‘TotalRegion’ 的大区及其所有后代成员的 code、中文名。
with m := (select DimRegion filter .code = 'TotalRegion')
select cal::idescendant(m) {
code,
name_zh := <str>.name['zh-cn']
}
结果示意:
[
{ "code": "TotalRegion", "name_zh": "全国" },
{ "code": "HD", "name_zh": "华东" },
{ "code": "HN", "name_zh": "华南" }
]
维度根成员用空集表示:<对象类型>{}。例如取大区下所有成员(即「根的后代」):
select cal::idescendant(<DimRegion>{}) {
code,
name_zh := <str>.name['zh-cn']
}
获取「华东」的父级成员:
with m := (select DimRegion filter .code = 'HD').parent
select m {
code,
name_zh := <str>.name['zh-cn']
}
获取「华东」的子级成员:
with m := (select DimRegion filter .code = 'HD').<parent[is DimRegion]
select m {
code,
name_zh := <str>.name['zh-cn']
}
结果示意(子级):
[
{ "code": "SH", "name_zh": "上海" },
{ "code": "ZJ", "name_zh": "浙江" }
]
递归函数默认沿 parent 链接计算层级。当对象有多条自我链接(如 parent 之外还有 self、计算链接 cal_self 等),需要用 L"链接编码" 字符串来指定沿哪条链接递归。
完整签名:
cal::idescendant(member, link_code, validate)
|
参数 |
类型 |
说明 |
|---|---|---|
|
member |
对象实例集合 |
起始成员 |
|
link_code |
|
指定递归所沿用的链接编码,必须用 |
|
validate |
bool(可选) |
是否校验成环,默认 false;为 true 时数据成环会报错 |
L"..." 是 DeepQL 中的链接字符串字面量,用于在需要传递链接编码的场景中引用链接名称。注意:计算链接同样可以用 L"..." 引用——只要链接在 schema 中定义了编码,无论是普通链接还是计算链接,都可以传入。
假设 DimRegion 除了 parent 还有一条计算链接 cal_self(通过业务规则动态计算的层级关系),取「华东」沿 cal_self 的所有后代:
with m := (select DimRegion filter .code = 'HD')
select cal::idescendant(m, L"cal_self") {
code,
name_zh := <str>.name['zh-cn']
}
带成环校验(数据有环时直接报错而不是死循环):
with m := (select DimRegion filter .code = 'HD')
select cal::idescendant(m, L"cal_self", true) {
code,
name_zh := <str>.name['zh-cn']
}
其他递归函数(cal::descendant、cal::ancestor、cal::iancestor、cal::base、cal::ibase)同样支持 link_code 和 validate 参数,用法一致。
|
能力 |
写法 |
|---|---|
|
父级 |
|
|
子级 |
|
|
后代/祖先 |
|
|
根成员 |
|
|
指定链接递归 |
|
|
成环校验 |
第三参数传 |
下一步可了解如何查询模式元数据,见「九、自省查询」。
回到顶部
咨询热线
