Skip to content

TM 定义参考

本文面向需要编写或审查 Foggy Table Model(TM)的开发者,按定义对象和属性组织当前公开语义建模契约。本文只描述 TM 定义本身;QM 暴露字段和 DSL 查询语法请分别参考 QM 定义参考JSON Query DSL 语法参考

TM 描述物理数据如何进入 Foggy 语义层,包括物理表、字段、维度关系、指标、类型和公式。TM 字段不等于 DSL 可查询字段;字段需要进入当前 QM 的可见字段集合后,才可被查询调用方引用。预聚合属于查询引擎优化能力,本文只保留入口说明,详细能力见 预聚合能力参考

1. TM 文件结构

TM 文件使用 JavaScript 模块语法,导出 model 对象。

javascript
export const model = {
    name: 'FactSalesModel',
    caption: '销售事实表',
    description: '销售订单明细数据',
    tableName: 'fact_sales',
    idColumn: 'sales_key',

    dimensions: [],
    properties: [],
    measures: []
};

1.1 model 顶层属性

属性类型必填说明
namestringTM 唯一标识,QM 通过该名称引用
captionstring模型显示名称,可作为 AI 元数据
descriptionstring模型语义描述,可作为 AI 上下文
tableNamestring是¹物理表名、视图名或集合名
viewSqlstring否¹视图 SQL,与 tableName 二选一
schemastring数据库 schema
idColumnstring主键列名
typestring模型类型,常见值为 jdbcmongovector
dataSourceobject宿主注入的数据源对象;公开模型通常优先使用 dataSourceName
dataSourceNamestring命名数据源引用
mongoTemplatestringMongoDB 模板或连接配置引用,type: 'mongo' 时使用
vectorConfigobject向量模型配置,type: 'vector' 时使用
dimensionsarray维度关系定义
propertiesarray非聚合字段定义
measuresarray可聚合指标定义
preAggregationsarray预聚合定义,详见 预聚合能力参考
autoLoadDimensionsboolean是否自动加载维度
autoLoadMeasuresboolean是否自动加载度量
aiobject模型级 AI 元数据配置
deprecatedboolean是否标记为废弃
extDataobject自定义扩展元数据

¹ tableNameviewSql 通常二选一。

2. 维度定义

维度定义事实表与维度表之间的语义关系。引擎根据维度定义生成关联查询,LLM 不需要直接推断 JOIN 路径。

javascript
dimensions: [
    {
        name: 'customer',
        caption: '客户',
        tableName: 'dim_customer',
        foreignKey: 'customer_key',
        primaryKey: 'customer_key',
        captionColumn: 'customer_name',
        properties: [
            { column: 'customer_type', caption: '客户类型', type: 'STRING' },
            { column: 'province', caption: '省份', type: 'STRING' }
        ]
    }
]

2.1 dimension 属性

属性类型必填说明
namestring维度名,DSL 中通过 维度名$属性 引用
captionstring显示名称
descriptionstring语义描述
tableNamestring是¹维度表名
viewSqlstring否¹维度视图 SQL
schemastring维度表 schema
dataSourceobject宿主注入的数据源对象;默认继承 TM 数据源
foreignKeystring当前表或父维度表上的外键列
primaryKeystring维度表主键列
captionColumnstring维度名$caption 对应的显示列
captionDefobjectcaption 的公式或方言定义
keyCaptionstring维度主键显示名称
keyDescriptionstring维度主键描述
typestring维度类型,如 NORMALDAYDATETIMEDICTBOOLDOUBLEINTEGER
propertiesarray维度属性列表
dimensionsarray嵌套子维度列表
aliasstring维度别名,用于缩短引用路径
joinTostring兼容旧模型的关联目标字段;新模型优先使用嵌套维度结构表达层级
forceIndexstring强制索引名称
dimensionDataSqlfunction维度数据权限 SQL 生成函数
onBuilderfunction自定义关联条件构建函数
memberPermissionobject维度成员查询权限,见 2.5
aiobject维度级 AI 元数据配置
deprecatedboolean是否废弃
extDataobject自定义扩展元数据

¹ tableNameviewSql 通常二选一。

2.2 captionDef

captionDef 用于定义 维度名$caption 的来源。它适合处理 JSON 翻译字段、跨方言表达式或不能直接用单列表达的显示值。

javascript
{
    name: 'product',
    tableName: 'product_template',
    foreignKey: 'product_id',
    primaryKey: 'id',
    captionDef: {
        column: 'name',
        dialectFormulaDef: {
            postgresql: {
                builder: (alias) => `${alias}.name ->> 'en_US'`
            }
        },
        formulaDef: {
            builder: (alias) => `${alias}.name`
        }
    }
}

优先级为:captionDef.dialectFormulaDef > captionDef.formulaDef > captionDef.column > 外层 captionColumn

2.3 嵌套维度引用

嵌套维度使用 . 表示建模路径,使用 $ 表示属性访问。

语法说明
product$caption访问一级维度 product 的显示值
product.category$caption访问 product -> category 的显示值
product.category.group$caption访问三级嵌套维度的显示值
productCategory$caption使用 TM 中定义的 alias 访问维度

响应列名中,嵌套维度路径里的 . 通常转为 _,例如 product.category$caption 对应 product_category$caption。面向 DSL 调用方时,应以当前 QM 暴露的最终字段名为准。

2.4 父子维度属性

父子维度用于组织架构、品类树等层级结构。

属性类型必填说明
closureTableNamestring闭包表名称
closureTableSchemastring闭包表 schema
parentKeystring闭包表祖先列
childKeystring闭包表后代列

父子维度配合 DSL 的 childrenOfdescendantsOfselfAndDescendantsOf 等操作符使用。

2.5 维度成员权限

维度可声明 memberPermission,控制 synthetic member-QM 或成员查询时可见的成员字段、强制过滤、排序和层级操作范围。QM 可通过 memberPermissions[] 对指定维度做覆盖。

javascript
{
    name: 'product',
    tableName: 'dim_product',
    foreignKey: 'product_key',
    primaryKey: 'product_key',
    captionColumn: 'product_name',
    properties: [
        { column: 'brand', caption: '品牌' }
    ],
    memberPermission: {
        patch: {
            visibleColumns: ['id', 'caption', 'brand'],
            forcedSlice: [
                { field: 'enabled', op: '=', value: true }
            ],
            forcedOrderBy: [{ field: 'caption', dir: 'ASC' }],
            hierarchyEnabled: true,
            allowedHierarchyOps: ['childrenOf', 'descendantsOf']
        },
        queryBuilder: (context) => {
            context.query.and(context.member.enabled, true);
        }
    }
}

3. 属性定义

properties 描述非聚合字段,通常用于明细字段、枚举字段、状态字段、日期字段等。

javascript
properties: [
    {
        column: 'order_status',
        caption: '订单状态',
        description: '订单生命周期状态',
        type: 'STRING'
    }
]
属性类型必填说明
columnstring物理列名
namestring语义字段名,默认由 column 转换得到
aliasstring字段别名
captionstring显示名称
descriptionstring字段语义描述
typestring数据类型
formatstring格式化模板
dictRefstring/object字典引用
aggregationFormulastring自定义聚合表达式,供特定聚合场景使用
formulaDefobject计算字段定义
dialectFormulaDefobject方言专属计算字段定义,优先级高于 formulaDef
dimensionsnumber向量字段维度,type: 'VECTOR' 时使用
metricstring向量距离度量,如 cosineeuclideandotProduct
semanticScaleFactornumber/string语义缩放因子,例如物理分转换为语义元
semanticUnitstring缩放后的语义单位,如 yuan
semanticUnitLabelstring语义单位显示名,如
aiobjectAI 元数据配置
deprecatedboolean是否废弃
extDataobject自定义扩展元数据

4. 指标定义

measures 描述可聚合字段。aggregation 是默认聚合方式,查询时可以在 DSL 中覆盖。

javascript
measures: [
    {
        column: 'sales_amount',
        caption: '销售金额',
        type: 'MONEY',
        aggregation: 'sum'
    }
]
属性类型必填说明
columnstring否¹物理列名
namestring指标名,默认由 column 转换得到
aliasstring指标别名
captionstring显示名称
descriptionstring指标语义描述
typestring数据类型
aggregationstring默认聚合方式
formulaDefobject计算指标定义
dialectFormulaDefobject方言专属计算指标定义,优先级高于 formulaDef
semanticScaleFactornumber/string语义缩放因子,例如物理分转换为语义元
semanticUnitstring缩放后的语义单位,如 yuan
semanticUnitLabelstring语义单位显示名,如
aiobjectAI 元数据配置
deprecatedboolean是否废弃
extDataobject自定义扩展元数据

¹ count 类型指标可以不绑定具体 column

4.1 聚合方式

说明
sum / SUM求和
avg / AVG平均值
count / COUNT计数
count_distinct / COUNT_DISTINCT去重计数
max / MAX最大值
min / MIN最小值
GROUP_CONCAT字符串聚合,使用前应验证目标数据库方言
STDDEV_POP总体标准差
STDDEV_SAMP样本标准差
VAR_POP总体方差
VAR_SAMP样本方差
none / NONE不聚合

5. 公式与 AI 元数据

5.1 formulaDef

formulaDef 用于在 TM 中为绑定到物理列的字段或指标提供 SQL 表达式。当前 Java 引擎仍要求 TM property/measure 声明 column;如果需要不依赖单个物理列的纯计算输出,应优先在 QM column item 中使用 formula

属性类型说明
builderfunctionSQL 构建函数,参数通常为表别名
valuestring公式表达式
descriptionstring公式说明
javascript
{
    name: 'amountInWan',
    column: 'amount',
    caption: '金额(万元)',
    type: 'MONEY',
    formulaDef: {
        builder: (alias) => `${alias}.amount / 10000`,
        description: '金额单位换算'
    }
}

5.2 dialectFormulaDef

dialectFormulaDef 用于为不同数据库方言提供不同 SQL 构建逻辑。它可用于属性、指标和维度 captionDef,优先级高于通用 formulaDef

javascript
{
    name: 'localizedName',
    column: 'name',
    caption: '本地化名称',
    type: 'STRING',
    dialectFormulaDef: {
        postgresql: {
            builder: (alias) => `${alias}.name ->> 'en_US'`
        },
        mysql: {
            builder: (alias) => `JSON_UNQUOTE(JSON_EXTRACT(${alias}.name, '$.en_US'))`
        }
    },
    formulaDef: {
        builder: (alias) => `${alias}.name`
    }
}

5.3 semanticScaleFactor

semanticScaleFactor 用于声明物理存储单位和语义查询单位之间的比例。例如 ERP 系统把金额以“分”存储,对外分析希望以“元”查询,可以在物理列字段上声明缩放因子。

javascript
{
    column: 'amount_cent',
    name: 'amount',
    caption: '金额',
    type: 'MONEY',
    aggregation: 'sum',
    semanticScaleFactor: 100,
    semanticUnit: 'yuan',
    semanticUnitLabel: '元'
}

该能力适用于直接绑定物理列的 property 或 measure。不要把 semanticScaleFactorformulaDef / dialectFormulaDef 混用;复杂换算应使用公式字段显式建模。

5.4 ai

ai 用于补充面向 LLM 的字段说明。

属性类型说明
enabledboolean是否向 AI 上下文暴露
promptstring供 AI 使用的语义提示
levelsnumber[]字段可见或推荐等级

6. 数据类型

类型别名说明常见用途
STRING-短字符串编码、ID、名称
TEXTVARCHARCHARCLOB文本长文本、备注
INTEGER-整数计数、枚举
BIGINTLONG长整数大数值主键
MONEY-金额小数金额、价格
NUMBERDECIMALNUMERICDOUBLEFLOAT数值小数比率、数量、通用数值
DATETIMETIMESTAMPTIME日期时间时间戳
DAYDATE日期yyyy-MM-dd
BOOLBoolean布尔值是/否标志
DICT-字典值枚举编码
VECTOR-向量语义检索字段

VECTORmongo、预聚合等高级能力依赖具体引擎或扩展模块;公开语法中可以建模,但上线前应在目标运行时验证。预聚合的匹配、刷新和运行边界见 预聚合能力参考

7. 命名规则

对象建议命名示例
TM 文件{ModelName}.tmFactSalesModel.tm
TM namePascalCaseFactSalesModel
字段 namecamelCasesalesAmount
JDBC columnsnake_casesales_amount
维度属性引用$ 分隔customer$caption
嵌套维度建模路径. 导航product.category$caption

JDBC 字段名通常由 snake_case 自动转为 camelCase,例如 order_count 转为 orderCount。当 column 自动转换后的名称已经符合期望时,可以省略 name;只有在 _id、缩写列名或需要自定义语义名时再显式声明 name