Definition Spec — 核心概念
本文档按后端
foundry-definition-spec-api当前实际 DTO,梳理 Canonical Spec 的核心概念与跨资源协议,是各资源文档的公共基础。
1. 定位与目标
foundry-definition-spec 是平台统一的定义侧规格协议层,目标包括:
- 为 CLI、前端 Authoring、模块间调用提供同一份 canonical spec 输入协议。
- 将 ObjectType、Property、LinkType、Metric、Action、AccessPolicy、PageView、App、Workflow、Dataset、DataSource、Pipeline、AnalysisPlan 等定义资源纳入统一 bundle 管理。
- 通过
DefinitionResource/DefinitionResourceVersion/DefinitionReleaseSnapshot支持版本化、幂等写入、dry-run、发布与回滚。 - 隔离定义语义(spec)与运行态字段(id、status、physical column state 等),避免安装/升级逻辑泄露底层实现细节。
2. 模块结构
be/foundry-definition-spec/
├── foundry-definition-spec-api/ # DTO / Enum / Projection 接口 / SpecReader
│ └── src/main/java/com/loambase/foundry/definition/spec/
│ ├── dto/ # 资源规格 DTO
│ ├── dto/request/ # Upsert / Sync / Bundle 请求
│ ├── dto/response/ # Bundle / Workspace 响应
│ ├── enums/ # 枚举
│ ├── projection/ # 领域投影处理器接口
│ ├── result/ # 变更结果 DTO
│ ├── api/ # 跨模块读取 spec 的接口
│ └── vo/ # 查询返回 VO3. CanonicalSpec
所有定义资源规格 DTO 的共同父接口,用于在 bundle、installer、OpenAPI 与 SDK 之间统一输入协议。
public interface CanonicalSpec {
}当前实现类包括:
ObjectTypeSpecDTOObjectTypePropertiesSpecDTOPropertySpecDTOLinkTypeSpecDTOMetricSpecDTOActionSpecDTOAccessPolicySpecDTOPageViewSpecDTOAppSpecDTODataSourceSpecDTODatasetSpecDTOPipelineSpecDTOWorkflowSpecDTOAnalysisPlanSpecDTOSeedDataSpecDTO(种子数据规格;Bundle 的seedData使用SeedDataEntryDTO,本 DTO 用于通用 canonical 入口)MapSpecDTO(未知 kind 的通用兜底,以原始Map承载)
4. ResourceRefDTO
跨资源引用的统一方式。kind 标识资源类型,name 为自然键,apiName 用于需要区分显示名与 API 名的场景(解析不到 name 时回退为 id)。
约定:manifest 中允许使用
object: Xxx等简写,安装器 adapter 会将其转换为objectRef: { kind: ObjectType, name: Xxx }。
| 字段 | 类型 | 说明 |
|---|---|---|
kind | string | 资源类型,如 ObjectType、Dataset |
name | string | 资源自然键(名称) |
apiName | string | API 名称,未解析到 name 时回退为 id |
5. ResourceLocatorDTO / ResourceScopeDTO
DefinitionCommandController 与 DefinitionQueryController 使用 ResourceLocatorDTO 定位一个定义资源;ResourceScopeDTO 表达资源在自然键之外的作用域维度(所属对象、源对象、目标对象)。
5.1 ResourceLocatorDTO
| 字段 | 类型 | 说明 |
|---|---|---|
resourceType | string | 资源类型(必填) |
naturalKey | string | 资源自然键(必填) |
scope | ResourceScopeDTO | 资源作用域 |
5.2 ResourceScopeDTO
| 字段 | 类型 | 说明 |
|---|---|---|
ownerObjectName | string | 归属对象名(PROPERTY / ACTION / METRIC / ACCESS_POLICY) |
sourceObjectName | string | 源对象名(LINK_TYPE) |
targetObjectName | string | 目标对象名(LINK_TYPE) |
6. DefinitionBundleSpec
CLI install 将 authoring manifest 编译为 DefinitionBundleSpec 后,通过 /definitions/bundles:dry-run 或 apply 提交;FE authoring 也可将多资源保存编排为此结构批量提交。
| 字段 | 类型 | 说明 |
|---|---|---|
metadata | DefinitionBundleMetadata | Bundle 元数据 |
options | DefinitionBundleOptions | 应用选项 |
objectTypes | List<ObjectTypeSpecDTO> | 对象类型定义列表 |
objectTypeProperties | List<ObjectTypePropertiesSpecDTO> | 属性定义列表,按对象聚合 |
links | List<LinkTypeSpecDTO> | 关联类型定义列表 |
metrics | List<MetricSpecDTO> | 指标定义列表 |
actions | List<ActionSpecDTO> | 动作定义列表 |
policies | List<AccessPolicySpecDTO> | 访问策略定义列表 |
pageViews | List<PageViewSpecDTO> | 页面视图定义列表 |
apps | List<AppSpecDTO> | 应用壳定义列表 |
datasources | List<DataSourceSpecDTO> | 数据源定义列表 |
datasets | List<DatasetSpecDTO> | 数据集定义列表 |
pipelines | List<PipelineSpecDTO> | Pipeline 定义列表 |
workflows | List<WorkflowSpecDTO> | 工作流定义列表 |
analysisPlans | List<AnalysisPlanSpecDTO> | 分析计划定义列表 |
collectorScripts | List<CollectorScriptSpecDTO> | 采集脚本列表(import 阶段经 CollectorAssetPort 安装) |
collectorTasks | List<CollectorTaskSpecDTO> | 采集任务列表(finalize 阶段经 CollectorAssetPort 安装) |
seedData | List<SeedDataEntryDTO> | 样本数据列表(finalize 阶段在本体发布后导入) |
workspaceConfig | WorkspaceConfigSpecDTO | Workspace 配置(至多一份,finalize 阶段 merge 安装) |
installPlan | List<InstallStepDTO> | 安装执行计划(编译期由 phase 推断生成) |
6.1 DefinitionBundleMetadata
| 字段 | 类型 | 说明 |
|---|---|---|
name | string | 包名 |
version | string | 包版本 |
description | string | 包描述 |
workspaceId | string | 所属工作空间 ID |
author | string | 作者 |
labels | Map<String, String> | 额外标签 |
6.2 DefinitionBundleOptions
| 字段 | 类型 | 说明 |
|---|---|---|
dryRun | boolean | 是否仅试运行 |
continueOnError | boolean | 出错时是否继续 |
skipExisting | boolean | 是否跳过已存在资源 |
defaultPublishOnInstall | boolean | bundle 级默认发布策略;ObjectType 未显式声明 publishOnInstall 时继承该默认值 |
materializeAfterApply | boolean | bundle apply 后是否自动物化 ObjectType |
syncMode | DefinitionBundleSyncModeEnum | Bundle 同步模式:UPSERT(默认)/ REPLACE |
pruneMissingResources | boolean | 与 syncMode = REPLACE 同义,true 表示删除本包管理但未声明的资源 |
workspaceStrategy | string | workspace 定位策略:CURRENT(默认)/ ENSURE_NAMED(按 metadata.workspaceId 查找或创建) |
forceDefaultStorage | boolean | 为 true 时即使 workspace 已有默认存储也强制覆盖;默认仅空值绑定 |
syncMode 取值说明:
UPSERT:仅对传入资源做 upsert,不删除未出现的资源。REPLACE:以传入资源集合为目标状态,缺失且由本包管理的资源执行删除。
当 syncMode 为空时,pruneMissingResources = true 等效于 REPLACE。
7. 投影框架
7.1 设计意图
- 每个资源类型一个
DomainProjectionHandler,避免大一统接口暴露不相关方法。 - Property 因具备集合语义(MERGE / REPLACE),单独暴露
PropertyProjectionHandler#syncProperties。 ProjectionContext封装一次投影调用所需的元数据,为回滚、重放、幂等、审计预留扩展点。
7.2 ProjectionContext
| 字段 | 类型 | 说明 |
|---|---|---|
workspaceId | string | 工作空间 ID |
resourceType | DefinitionResourceTypeEnum | 资源类型 |
naturalKey | string | 自然键 |
definitionResourceId | string | 定义资源 ID |
definitionVersion | long | 定义版本 |
sourceType | string | 来源类型 |
sourcePackage | string | 来源包 |
mode | ProjectionMode | 投影模式 |
skipLifecycle | boolean | 是否跳过生命周期回调 |
materializeAfterApply | Boolean | apply 后是否物化 |
publishAfterApply | Boolean | apply 后是否发布 |
bundleApply | Boolean | 是否为 bundle apply 流程 |
ownerObjectName | string | 归属对象名 |
sourceObjectName | string | 源对象名 |
targetObjectName | string | 目标对象名 |
7.3 ProjectionMode
| 枚举值 | 说明 |
|---|---|
NORMAL | 普通写入 |
ROLLBACK | 回滚:重放历史 spec 生成新头版本 |
REPLAY | 重放:按已有 spec 重新投影 |
7.4 DomainProjectionHandler
public interface DomainProjectionHandler<T> {
DefinitionResourceTypeEnum resourceType();
MutationResultDTO project(ProjectionContext context, T spec);
default MutationResultDTO delete(ProjectionContext context) {
// 默认返回“未支持”的结果;具体资源类型可选择覆盖,返回 runtime 侧是否已清理
}
}7.5 PropertyProjectionHandler
public interface PropertyProjectionHandler {
default DefinitionResourceTypeEnum resourceType() {
return DefinitionResourceTypeEnum.PROPERTY;
}
List<MutationResultDTO> syncProperties(
ProjectionContext context,
String objectNaturalKey,
List<PropertySpecDTO> properties,
PropertySyncMode mode
);
}8. DefinitionResourceSpecReader
跨模块读取 Definition 层 spec 的接口,位于 com.loambase.foundry.definition.spec.api 包,由 definition-biz 实现。其他业务模块只需依赖 spec-api 即可注入使用,避免直接依赖 definition-biz。
public interface DefinitionResourceSpecReader {
<T> Optional<T> getLatestSpec(String workspaceId, String resourceType, String naturalKey, Class<T> specClass);
<T> Optional<T> getPublishedSpec(String workspaceId, String resourceType, String naturalKey, Class<T> specClass);
<T> Optional<T> getVersionSpec(String workspaceId, String resourceType, String naturalKey, long version, Class<T> specClass);
<T> Optional<T> getSpecByVersionId(String versionId, Class<T> specClass);
// WORKFLOW 快捷方法
Optional<WorkflowSpecDTO> getWorkflowSpec(String workspaceId, String naturalKey);
Optional<WorkflowSpecDTO> getPublishedWorkflowSpec(String workspaceId, String naturalKey);
Optional<WorkflowSpecDTO> getWorkflowVersionSpec(String workspaceId, String naturalKey, long version);
}9. 关键约束
- 定义语义 vs 运行态字段:Spec DTO 只应包含定义语义,禁止将运行态字段(如
id、currentPublishedVersionId、datasetColumnName、physicalColumnState)写入 canonical spec。 - 自然键设计:ObjectType / LinkType / Metric / AccessPolicy / Dataset / DataSource / Pipeline / App / Workflow / AnalysisPlan 等均以
name作为自然键;Property 以对象下的apiName作为自然键。 - 引用解析:
ResourceRefDTO中的name用于资源引用,安装器通过名称解析目标资源。 - Property 删除:可通过
PropertySyncReqDTO或ObjectTypePropertiesSpecDTO的REPLACE模式删除属性,也可通过:remove接口下线单个属性。 - 物化与发布顺序:物化必须在发布之前执行,因为发布需要物化过程中生成的
primaryDatasetId。 - 安装后自动触发:
- 数据集配置中,若
syncSchemaOnInstall/syncDataOnInstall为 true,需自动触发同步 schema / 同步数据。 - ObjectType 配置中,若
materializeOnInstall/publishOnInstall为 true,需自动触发物化 / 发布本体。
- 数据集配置中,若