@documentation-robotics/cli 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +46 -16
- package/dist/analysis/relationship-classifier.js +2 -9
- package/dist/analysis/relationship-classifier.js.map +2 -2
- package/dist/analyzers/active-analyzer.js +62 -0
- package/dist/analyzers/active-analyzer.js.map +7 -0
- package/dist/analyzers/call-graph-utils.js +2 -2
- package/dist/analyzers/call-graph-utils.js.map +2 -2
- package/dist/analyzers/cards/build.js +191 -0
- package/dist/analyzers/cards/build.js.map +7 -0
- package/dist/analyzers/cards/classify.js +42 -0
- package/dist/analyzers/cards/classify.js.map +7 -0
- package/dist/analyzers/cards/edge-index.js +44 -0
- package/dist/analyzers/cards/edge-index.js.map +7 -0
- package/dist/analyzers/cards/extract.js +138 -0
- package/dist/analyzers/cards/extract.js.map +7 -0
- package/dist/analyzers/cards/facts.js +46 -0
- package/dist/analyzers/cards/facts.js.map +7 -0
- package/dist/analyzers/cards/graph.js +42 -0
- package/dist/analyzers/cards/graph.js.map +7 -0
- package/dist/analyzers/cards/index.js +8 -0
- package/dist/analyzers/cards/index.js.map +7 -0
- package/dist/analyzers/cards/routes.js +96 -0
- package/dist/analyzers/cards/routes.js.map +7 -0
- package/dist/analyzers/cards/tier0.js +18 -0
- package/dist/analyzers/cards/tier0.js.map +7 -0
- package/dist/analyzers/cards/types.js +1 -0
- package/dist/analyzers/cards/types.js.map +7 -0
- package/dist/analyzers/cbm-analyzer.js +270 -174
- package/dist/analyzers/cbm-analyzer.js.map +2 -2
- package/dist/analyzers/cbm-responses.js +342 -0
- package/dist/analyzers/cbm-responses.js.map +7 -0
- package/dist/analyzers/code-changes.js +159 -0
- package/dist/analyzers/code-changes.js.map +7 -0
- package/dist/analyzers/edge-relationships.js +49 -0
- package/dist/analyzers/edge-relationships.js.map +7 -0
- package/dist/analyzers/extraction-plan.js +541 -0
- package/dist/analyzers/extraction-plan.js.map +7 -0
- package/dist/analyzers/index-job.js +229 -0
- package/dist/analyzers/index-job.js.map +7 -0
- package/dist/analyzers/mapping-loader.js +9 -0
- package/dist/analyzers/mapping-loader.js.map +2 -2
- package/dist/analyzers/tier0-rules.js +153 -0
- package/dist/analyzers/tier0-rules.js.map +7 -0
- package/dist/analyzers/types.js.map +1 -1
- package/dist/audit/relationships/ai/prompts.js +10 -10
- package/dist/audit/relationships/ai/prompts.js.map +2 -2
- package/dist/audit/relationships/analysis/layer-templates.js +52 -52
- package/dist/audit/relationships/analysis/layer-templates.js.map +1 -1
- package/dist/cli.js +23 -11
- package/dist/cli.js.map +2 -2
- package/dist/coding-agents/default-permissions.js +31 -1
- package/dist/coding-agents/default-permissions.js.map +2 -2
- package/dist/coding-agents/drbot-mcp.js +269 -0
- package/dist/coding-agents/drbot-mcp.js.map +7 -0
- package/dist/commands/add.js +7 -4
- package/dist/commands/add.js.map +2 -2
- package/dist/commands/analyzer.js +143 -40
- package/dist/commands/analyzer.js.map +2 -2
- package/dist/commands/changeset-verify.js +63 -0
- package/dist/commands/changeset-verify.js.map +7 -0
- package/dist/commands/changeset.js +80 -29
- package/dist/commands/changeset.js.map +2 -2
- package/dist/commands/delete.js +10 -4
- package/dist/commands/delete.js.map +2 -2
- package/dist/commands/farm.js +176 -60
- package/dist/commands/farm.js.map +2 -2
- package/dist/commands/init.js +9 -26
- package/dist/commands/init.js.map +2 -2
- package/dist/commands/mcp.js +40 -21
- package/dist/commands/mcp.js.map +3 -3
- package/dist/commands/relationship.js +208 -37
- package/dist/commands/relationship.js.map +2 -2
- package/dist/commands/reports.js +3 -3
- package/dist/commands/reports.js.map +2 -2
- package/dist/commands/update.js +52 -32
- package/dist/commands/update.js.map +2 -2
- package/dist/commands/upgrade.js +99 -103
- package/dist/commands/upgrade.js.map +3 -3
- package/dist/commands/validate.js +19 -3
- package/dist/commands/validate.js.map +2 -2
- package/dist/commands/version.js +1 -1
- package/dist/commands/visualize.js +34 -15
- package/dist/commands/visualize.js.map +2 -2
- package/dist/core/annotation-store.js +15 -5
- package/dist/core/annotation-store.js.map +2 -2
- package/dist/core/catalog-migration.js +34 -0
- package/dist/core/catalog-migration.js.map +7 -0
- package/dist/core/changeset-analysis.js +421 -0
- package/dist/core/changeset-analysis.js.map +7 -0
- package/dist/core/changeset-base-index.js +160 -0
- package/dist/core/changeset-base-index.js.map +7 -0
- package/dist/core/changeset-brief-compact.js +256 -0
- package/dist/core/changeset-brief-compact.js.map +7 -0
- package/dist/core/changeset-brief-delta.js +102 -0
- package/dist/core/changeset-brief-delta.js.map +7 -0
- package/dist/core/changeset-graph.js +281 -0
- package/dist/core/changeset-graph.js.map +7 -0
- package/dist/core/changeset-only-guard.js +32 -0
- package/dist/core/changeset-only-guard.js.map +7 -0
- package/dist/core/changeset-summary.js +68 -0
- package/dist/core/changeset-summary.js.map +7 -0
- package/dist/core/changeset-validator.js +66 -20
- package/dist/core/changeset-validator.js.map +2 -2
- package/dist/core/changeset-verify.js +848 -0
- package/dist/core/changeset-verify.js.map +7 -0
- package/dist/core/changeset.js +56 -9
- package/dist/core/changeset.js.map +2 -2
- package/dist/core/element-type-migration.js +145 -0
- package/dist/core/element-type-migration.js.map +7 -0
- package/dist/core/extraction-observability.js +161 -0
- package/dist/core/extraction-observability.js.map +7 -0
- package/dist/core/farm-manifest.js +12 -6
- package/dist/core/farm-manifest.js.map +2 -2
- package/dist/core/farm-sync-engine.js +1 -1
- package/dist/core/farm-sync-engine.js.map +2 -2
- package/dist/core/farm-sync-state.js +10 -2
- package/dist/core/farm-sync-state.js.map +2 -2
- package/dist/core/migration-registry.js +88 -47
- package/dist/core/migration-registry.js.map +2 -2
- package/dist/core/model-upgrade.js +102 -0
- package/dist/core/model-upgrade.js.map +7 -0
- package/dist/core/model.js +82 -30
- package/dist/core/model.js.map +2 -2
- package/dist/core/mutation-handler.js +71 -6
- package/dist/core/mutation-handler.js.map +2 -2
- package/dist/core/project-init.js +53 -0
- package/dist/core/project-init.js.map +7 -0
- package/dist/core/relationship-migration-table.js +6639 -0
- package/dist/core/relationship-migration-table.js.map +7 -0
- package/dist/core/relationship-migration.js +272 -0
- package/dist/core/relationship-migration.js.map +7 -0
- package/dist/core/relationship-prune.js +49 -0
- package/dist/core/relationship-prune.js.map +7 -0
- package/dist/core/relationship-staging.js +161 -0
- package/dist/core/relationship-staging.js.map +7 -0
- package/dist/core/relationships.js +26 -4
- package/dist/core/relationships.js.map +2 -2
- package/dist/core/report-data-model.js +7 -13
- package/dist/core/report-data-model.js.map +2 -2
- package/dist/core/staged-changeset-storage.js +145 -18
- package/dist/core/staged-changeset-storage.js.map +2 -2
- package/dist/core/staged-source-reference.js +28 -0
- package/dist/core/staged-source-reference.js.map +7 -0
- package/dist/core/staging-area.js +166 -24
- package/dist/core/staging-area.js.map +2 -2
- package/dist/core/upgrade-plan.js +117 -0
- package/dist/core/upgrade-plan.js.map +7 -0
- package/dist/core/virtual-projection.js +13 -5
- package/dist/core/virtual-projection.js.map +2 -2
- package/dist/export/archimate-exporter.js +1 -0
- package/dist/export/archimate-exporter.js.map +2 -2
- package/dist/generated/compiled-validators.js +2 -2
- package/dist/generated/compiled-validators.js.map +2 -2
- package/dist/generated/layer-registry.js +16 -16
- package/dist/generated/layer-registry.js.map +2 -2
- package/dist/generated/node-types.js +186 -168
- package/dist/generated/node-types.js.map +2 -2
- package/dist/generated/relationship-index.js +2468 -7913
- package/dist/generated/relationship-index.js.map +2 -2
- package/dist/integrations/claude_code/.claude-plugin/plugin.json +24 -0
- package/dist/integrations/claude_code/agents/dr-architect.md +30 -3
- package/dist/integrations/claude_code/agents/dr-extractor.md +8 -2
- package/dist/integrations/claude_code/commands/dr-analyzer.md +565 -0
- package/dist/integrations/claude_code/commands/dr-changeset.md +2 -1
- package/dist/integrations/claude_code/commands/dr-map.md +20 -1
- package/dist/integrations/claude_code/commands/dr-plan.md +66 -0
- package/dist/integrations/claude_code/commands/dr-relate.md +106 -96
- package/dist/integrations/claude_code/commands/dr-verify.md +45 -2
- package/dist/integrations/claude_code/docs/END_TO_END_WALKTHROUGH.md +14 -0
- package/dist/integrations/claude_code/docs/MCP_SERVER.md +47 -26
- package/dist/integrations/claude_code/docs/QUICK_START.md +37 -8
- package/dist/integrations/claude_code/docs/README.md +68 -2
- package/dist/integrations/claude_code/plugin-agents/dr-advisor.md +255 -0
- package/dist/integrations/claude_code/plugin-agents/dr-architect.md +306 -0
- package/dist/integrations/claude_code/skills/dr_01_motivation_layer/SKILL.md +93 -72
- package/dist/integrations/claude_code/skills/dr_02_business_layer/SKILL.md +163 -126
- package/dist/integrations/claude_code/skills/dr_03_product_layer/SKILL.md +161 -126
- package/dist/integrations/claude_code/skills/dr_04_security_layer/SKILL.md +153 -133
- package/dist/integrations/claude_code/skills/dr_05_application_layer/SKILL.md +129 -100
- package/dist/integrations/claude_code/skills/dr_06_technology_layer/SKILL.md +111 -94
- package/dist/integrations/claude_code/skills/dr_07_api_layer/SKILL.md +143 -157
- package/dist/integrations/claude_code/skills/dr_08_data_model_layer/SKILL.md +117 -33
- package/dist/integrations/claude_code/skills/dr_09_dataset_layer/SKILL.md +74 -25
- package/dist/integrations/claude_code/skills/dr_10_ux_layer/SKILL.md +88 -12
- package/dist/integrations/claude_code/skills/dr_11_navigation_layer/SKILL.md +83 -24
- package/dist/integrations/claude_code/skills/dr_12_apm_layer/SKILL.md +57 -12
- package/dist/integrations/claude_code/skills/dr_13_testing_layer/SKILL.md +95 -15
- package/dist/integrations/claude_code/skills/dr_change_planning/SKILL.md +178 -0
- package/dist/integrations/claude_code/skills/dr_changeset_reviewer/SKILL.md +8 -0
- package/dist/integrations/claude_code/skills/dr_engineering_guide/SKILL.md +6 -1
- package/dist/integrations/github_copilot/agents/dr-architect.md +3 -1
- package/dist/integrations/github_copilot/skills/dr_01_motivation_layer/SKILL.md +182 -102
- package/dist/integrations/github_copilot/skills/dr_02_business_layer/SKILL.md +266 -148
- package/dist/integrations/github_copilot/skills/dr_03_product_layer/SKILL.md +547 -86
- package/dist/integrations/github_copilot/skills/dr_04_security_layer/SKILL.md +164 -169
- package/dist/integrations/github_copilot/skills/dr_05_application_layer/SKILL.md +420 -150
- package/dist/integrations/github_copilot/skills/dr_06_technology_layer/SKILL.md +331 -138
- package/dist/integrations/github_copilot/skills/dr_07_api_layer/SKILL.md +265 -201
- package/dist/integrations/github_copilot/skills/dr_08_data_model_layer/SKILL.md +181 -58
- package/dist/integrations/github_copilot/skills/dr_09_dataset_layer/SKILL.md +209 -57
- package/dist/integrations/github_copilot/skills/dr_10_ux_layer/SKILL.md +277 -112
- package/dist/integrations/github_copilot/skills/dr_11_navigation_layer/SKILL.md +219 -70
- package/dist/integrations/github_copilot/skills/dr_12_apm_layer/SKILL.md +189 -105
- package/dist/integrations/github_copilot/skills/dr_13_testing_layer/SKILL.md +225 -102
- package/dist/integrations/github_copilot/skills/dr_change_planning/SKILL.md +177 -0
- package/dist/integrations/github_copilot/skills/dr_changeset_reviewer/SKILL.md +3 -0
- package/dist/integrations/hash-utils.js.map +2 -2
- package/dist/mcp/api-key-manager.js +14 -1
- package/dist/mcp/api-key-manager.js.map +2 -2
- package/dist/mcp/changeset-only.js +45 -0
- package/dist/mcp/changeset-only.js.map +7 -0
- package/dist/mcp/project-root.js +85 -0
- package/dist/mcp/project-root.js.map +7 -0
- package/dist/mcp/server-instructions.js +27 -0
- package/dist/mcp/server-instructions.js.map +7 -0
- package/dist/mcp/strict-schema.js +52 -0
- package/dist/mcp/strict-schema.js.map +7 -0
- package/dist/mcp/tool-registry.js +55 -5
- package/dist/mcp/tool-registry.js.map +2 -2
- package/dist/mcp/tools/changeset-analysis-tools.js +98 -0
- package/dist/mcp/tools/changeset-analysis-tools.js.map +7 -0
- package/dist/mcp/tools/changeset-commit.js +224 -0
- package/dist/mcp/tools/changeset-commit.js.map +7 -0
- package/dist/mcp/tools/changeset-editing.js +260 -0
- package/dist/mcp/tools/changeset-editing.js.map +7 -0
- package/dist/mcp/tools/changeset-lifecycle.js +83 -0
- package/dist/mcp/tools/changeset-lifecycle.js.map +7 -0
- package/dist/mcp/tools/changeset-shared.js +31 -0
- package/dist/mcp/tools/changeset-shared.js.map +7 -0
- package/dist/mcp/tools/changeset-show.js +17 -1
- package/dist/mcp/tools/changeset-show.js.map +2 -2
- package/dist/mcp/tools/changeset-verify.js +49 -0
- package/dist/mcp/tools/changeset-verify.js.map +7 -0
- package/dist/mcp/tools/codebase-extract.js +836 -0
- package/dist/mcp/tools/codebase-extract.js.map +7 -0
- package/dist/mcp/tools/codebase-index.js +125 -0
- package/dist/mcp/tools/codebase-index.js.map +7 -0
- package/dist/mcp/tools/codebase-shared.js +265 -0
- package/dist/mcp/tools/codebase-shared.js.map +7 -0
- package/dist/mcp/tools/codebase-verify.js +48 -0
- package/dist/mcp/tools/codebase-verify.js.map +7 -0
- package/dist/mcp/tools/index.js +34 -1
- package/dist/mcp/tools/index.js.map +2 -2
- package/dist/mcp/tools/model-add.js +191 -74
- package/dist/mcp/tools/model-add.js.map +2 -2
- package/dist/mcp/tools/model-delete.js +2 -2
- package/dist/mcp/tools/model-delete.js.map +2 -2
- package/dist/mcp/tools/model-search.js +14 -0
- package/dist/mcp/tools/model-search.js.map +2 -2
- package/dist/mcp/tools/model-show.js +29 -2
- package/dist/mcp/tools/model-show.js.map +2 -2
- package/dist/mcp/tools/model-trace.js +93 -30
- package/dist/mcp/tools/model-trace.js.map +2 -2
- package/dist/mcp/tools/model-update.js +46 -26
- package/dist/mcp/tools/model-update.js.map +2 -2
- package/dist/mcp/tools/model-validate.js +46 -4
- package/dist/mcp/tools/model-validate.js.map +2 -2
- package/dist/mcp/tools/project-status-collectors.js +381 -0
- package/dist/mcp/tools/project-status-collectors.js.map +7 -0
- package/dist/mcp/tools/project-status.js +237 -0
- package/dist/mcp/tools/project-status.js.map +7 -0
- package/dist/mcp/tools/project-tools.js +505 -0
- package/dist/mcp/tools/project-tools.js.map +7 -0
- package/dist/mcp/tools/relationship-tools.js +167 -0
- package/dist/mcp/tools/relationship-tools.js.map +7 -0
- package/dist/mcp/tools/review-open.js +210 -0
- package/dist/mcp/tools/review-open.js.map +7 -0
- package/dist/mcp/tools/shared.js +35 -4
- package/dist/mcp/tools/shared.js.map +2 -2
- package/dist/mcp/tools/spec-type.js +90 -0
- package/dist/mcp/tools/spec-type.js.map +7 -0
- package/dist/reports/model-report-orchestrator.js +31 -2
- package/dist/reports/model-report-orchestrator.js.map +2 -2
- package/dist/schemas/bundled/analyzers/cbm.json +1200 -70
- package/dist/schemas/bundled/analyzers/manifest.json +2 -2
- package/dist/schemas/bundled/api.json +1029 -1658
- package/dist/schemas/bundled/apm.json +499 -734
- package/dist/schemas/bundled/application.json +735 -371
- package/dist/schemas/bundled/base.json +3 -220
- package/dist/schemas/bundled/business.json +452 -366
- package/dist/schemas/bundled/data-model.json +395 -411
- package/dist/schemas/bundled/data-store.json +334 -558
- package/dist/schemas/bundled/manifest.json +18 -18
- package/dist/schemas/bundled/motivation.json +349 -368
- package/dist/schemas/bundled/navigation.json +415 -731
- package/dist/schemas/bundled/product.json +325 -159
- package/dist/schemas/bundled/security.json +864 -1232
- package/dist/schemas/bundled/technology.json +574 -703
- package/dist/schemas/bundled/testing.json +865 -1646
- package/dist/schemas/bundled/ux.json +739 -1352
- package/dist/server/schemas.js +8 -0
- package/dist/server/schemas.js.map +2 -2
- package/dist/server/server.js +686 -231
- package/dist/server/server.js.map +3 -3
- package/dist/server/viewer-registry.js +264 -0
- package/dist/server/viewer-registry.js.map +7 -0
- package/dist/server-entry.js +2 -1
- package/dist/server-entry.js.map +2 -2
- package/dist/telemetry/index.js +1 -1
- package/dist/utils/ansi-suppressor.js +6 -8
- package/dist/utils/ansi-suppressor.js.map +2 -2
- package/dist/utils/attribute-patch.js +41 -0
- package/dist/utils/attribute-patch.js.map +7 -0
- package/dist/utils/error-hints.js +29 -0
- package/dist/utils/error-hints.js.map +7 -0
- package/dist/utils/errors.js +9 -3
- package/dist/utils/errors.js.map +2 -2
- package/dist/utils/id-generator.js +5 -2
- package/dist/utils/id-generator.js.map +2 -2
- package/dist/utils/project-paths.js +26 -1
- package/dist/utils/project-paths.js.map +2 -2
- package/dist/utils/source-reference.js +64 -31
- package/dist/utils/source-reference.js.map +2 -2
- package/dist/utils/spec-version.js +2 -2
- package/dist/utils/spec-version.js.map +1 -1
- package/dist/validators/composed-reference-validator.js +5 -27
- package/dist/validators/composed-reference-validator.js.map +2 -2
- package/dist/validators/model-warnings.js +28 -0
- package/dist/validators/model-warnings.js.map +7 -0
- package/dist/validators/reference-validator.js +0 -7
- package/dist/validators/reference-validator.js.map +2 -2
- package/dist/validators/relationship-schema-validator.js +3 -3
- package/dist/validators/relationship-schema-validator.js.map +2 -2
- package/dist/validators/schema-validator.js +27 -9
- package/dist/validators/schema-validator.js.map +2 -2
- package/dist/validators/types.js.map +1 -1
- package/dist/viewer/README.md +6 -6
- package/dist/viewer/assets/main-CUOQGGRA.css +1 -0
- package/dist/viewer/assets/main-DvH3gYrI.js +84 -0
- package/dist/viewer/index.html +2 -2
- package/dist/viewer/manifest.json +10 -10
- package/dist/viewer/version.json +1 -1
- package/package.json +2 -1
- package/dist/viewer/assets/main-B7AOQXXX.js +0 -81
- package/dist/viewer/assets/main-vdrFrG7q.css +0 -1
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
|
-
"specVersion": "0.
|
|
2
|
+
"specVersion": "0.12.0",
|
|
3
3
|
"layer": {
|
|
4
4
|
"id": "data-store",
|
|
5
5
|
"number": 9,
|
|
6
6
|
"name": "Data Store Layer",
|
|
7
|
-
"description": "
|
|
7
|
+
"description": "Describes physical persistence: databases and schemas, tables and collections, columns and fields, indexes, constraints, views, migrations, access patterns and the queries that read and write them (ISO/IEC 9075 SQL with extensions for document, key-value and graph paradigms). Migration scripts, table definitions and repository or DAO code that talks to storage are evidence for elements here. Modelling rules: containment is one level at a time: a database composes namespaces, or collections and views directly when the engine has none; a namespace composes collections, views, stored logic and nested namespaces; a collection composes its fields, indexes, validation rules and event handlers, and may compose partitions. Stored data is passive: collections, views, fields and databases are accessed, referenced and mapped, and never serve or trigger; application components, functions and services access the collections and views they read and write. Behaviour inside the store is stored logic, event handlers and access patterns: event handlers are attached to a collection, reference the fields they watch and trigger stored logic; stored logic accesses collections, triggers other stored logic and refreshes views; access patterns access a collection, use indexes and reference the fields in their key and filter conditions, and serve the application functions that issue them. Validation rules reference the fields they constrain, and a foreign key cascades to the collection it references. Views derive from collections and views; retention policies govern collections and namespaces, archive to collections and trigger the stored logic that purges them. Across layers, the store reaches the business through the application layer and the data model: stored logic realizes application functions, event handlers trigger application events, object schemas map to collections, and a collection may realize a business object as a shortcut; a view maps to the API response it backs.",
|
|
8
8
|
"inspired_by": {
|
|
9
9
|
"standard": "ISO/IEC 9075 (SQL) + Paradigm Extensions",
|
|
10
10
|
"version": "2024",
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"accesspattern": {
|
|
29
29
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
30
30
|
"title": "AccessPattern",
|
|
31
|
-
"description": "A
|
|
31
|
+
"description": "A single named read or write operation against one collection, characterized by its key condition, optional sort and filter conditions, and operation category, as issued by application code or listed in a data-model design. It describes the request shape the application sends to the store, not a structure or computation stored in the engine. Use StoredLogic instead when the computation is defined and registered inside the database engine (SQL function or procedure, aggregation pipeline saved server-side, Lua script loaded via SCRIPT LOAD) rather than issued as a query from application code. Use View instead when the query is persisted in the schema as a named derived collection (CREATE VIEW, materialized view, search alias) that other queries read from. Use Index instead when the element is the physical lookup structure (CREATE INDEX, GSI, vector index) that makes a lookup efficient, not the lookup itself. Use EventHandler instead when the logic runs reactively in response to a data-change event (trigger, change stream, CDC consumer) rather than being requested by an application call.",
|
|
32
32
|
"allOf": [
|
|
33
33
|
{
|
|
34
34
|
"$ref": "urn:dr:spec:base:spec-node"
|
|
@@ -113,12 +113,24 @@
|
|
|
113
113
|
"additionalProperties": false
|
|
114
114
|
}
|
|
115
115
|
},
|
|
116
|
+
"x-dr-standard": "ISO/IEC 9075-2 (Foundation) query specification and SQL-data change statements (approximate; the access pattern is a NoSQL data-modeling construct with no direct SQL counterpart)",
|
|
117
|
+
"x-dr-evidence": [
|
|
118
|
+
"a repository or DAO method that issues one parameterized query against a single table or collection, e.g. Spring Data findByCustomerIdAndStatus, an @Query annotation, or a Mongoose Model.find({customerId}) call",
|
|
119
|
+
"a DynamoDB GetItem/Query/PutItem/BatchWriteItem call, or a Cassandra prepared statement, carrying a KeyConditionExpression or WHERE clause on partition and clustering keys",
|
|
120
|
+
"a data-model design document or single-table-design spreadsheet that enumerates access patterns with their PK/SK expressions, GSI used, and expected request rate"
|
|
121
|
+
],
|
|
122
|
+
"x-dr-distinguish": {
|
|
123
|
+
"data-store.storedlogic": "the computation is defined and registered inside the database engine (SQL function or procedure, aggregation pipeline saved server-side, Lua script loaded via SCRIPT LOAD) rather than issued as a query from application code",
|
|
124
|
+
"data-store.view": "the query is persisted in the schema as a named derived collection (CREATE VIEW, materialized view, search alias) that other queries read from",
|
|
125
|
+
"data-store.index": "the element is the physical lookup structure (CREATE INDEX, GSI, vector index) that makes a lookup efficient, not the lookup itself",
|
|
126
|
+
"data-store.eventhandler": "the logic runs reactively in response to a data-change event (trigger, change stream, CDC consumer) rather than being requested by an application call"
|
|
127
|
+
},
|
|
116
128
|
"$id": "urn:dr:spec:node:data-store.accesspattern"
|
|
117
129
|
},
|
|
118
130
|
"collection": {
|
|
119
131
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
120
132
|
"title": "Collection",
|
|
121
|
-
"description": "A container
|
|
133
|
+
"description": "A named, persistent container that directly stores base records, documents, key-value entries, nodes or edges inside a database or namespace, and whose contents are written to it rather than derived from other containers. It maps to a SQL base table, document collection, key-value bucket or structure, column family, vector collection, time-series measurement or hypertable, graph node label or edge type, and search-engine index. Use View instead when the container's contents are computed from one or more other collections by a query, alias or continuous aggregate rather than written to it directly. Use Namespace instead when the element groups several containers (SQL schema, Cassandra keyspace, MongoDB database, Redis key prefix) and does not itself hold records. Use Index instead when the structure exists only to speed up lookups over another container's fields (B-tree, HNSW, inverted index) and is not queried as the data's home; an Elasticsearch index holding documents remains a collection. Use Field instead when the element is a single named attribute or property of records, such as a column, document path or graph property, rather than the container of records. Use data-model ObjectSchema instead when the symbol is the entity or ORM class that describes the records' logical shape; a table declared by an ORM class is both, and the object schema maps to the collection.",
|
|
122
134
|
"allOf": [
|
|
123
135
|
{
|
|
124
136
|
"$ref": "urn:dr:spec:base:spec-node"
|
|
@@ -180,12 +192,24 @@
|
|
|
180
192
|
"additionalProperties": false
|
|
181
193
|
}
|
|
182
194
|
},
|
|
195
|
+
"x-dr-standard": "ISO/IEC 9075-2 (SQL/Foundation) §11.3 <table definition> (persistent base table), generalised by the paradigm extensions",
|
|
196
|
+
"x-dr-evidence": [
|
|
197
|
+
"A CREATE TABLE, CREATE COLUMNFAMILY or create_hypertable statement in a migration or DDL file, or a db.createCollection / client.indices.create call with mappings.",
|
|
198
|
+
"An ORM or ODM mapping that binds a class to a named store container, such as a JPA @Entity/@Table, SQLAlchemy __tablename__, Django Model Meta.db_table, Mongoose model('Order', schema) or Spring @Document(collection=...).",
|
|
199
|
+
"An infrastructure-as-code resource declaring a container with keys or TTL, such as a Terraform aws_dynamodb_table with hash_key/range_key, a Pinecone or Qdrant collection with a vector size, or a Neo4j label used in MERGE (:Label) setup scripts."
|
|
200
|
+
],
|
|
201
|
+
"x-dr-distinguish": {
|
|
202
|
+
"data-store.view": "the container's contents are computed from one or more other collections by a query, alias or continuous aggregate rather than written to it directly.",
|
|
203
|
+
"data-store.namespace": "the element groups several containers (SQL schema, Cassandra keyspace, MongoDB database, Redis key prefix) and does not itself hold records.",
|
|
204
|
+
"data-store.index": "the structure exists only to speed up lookups over another container's fields (B-tree, HNSW, inverted index) and is not queried as the data's home; an Elasticsearch index holding documents remains a collection.",
|
|
205
|
+
"data-store.field": "the element is a single named attribute or property of records, such as a column, document path or graph property, rather than the container of records."
|
|
206
|
+
},
|
|
183
207
|
"$id": "urn:dr:spec:node:data-store.collection"
|
|
184
208
|
},
|
|
185
209
|
"database": {
|
|
186
210
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
187
211
|
"title": "Database",
|
|
188
|
-
"description": "A database
|
|
212
|
+
"description": "A named, independently addressable data store deployment, typically a database or catalog on a specific engine reached through its own connection endpoint or connection string, that contains namespaces and collections. It is the outermost persistence boundary an application connects to, regardless of paradigm. Use Namespace instead when the element is a logical grouping inside a connected deployment. Examples include a PostgreSQL schema, a Cassandra keyspace, a Redis key prefix, or a MongoDB 'database' selected on an already-open client connection. Use Collection instead when the element is a single container of records, such as a table, a DynamoDB table, an Elasticsearch index, or a vector collection, rather than the deployment that hosts it. Use View instead when the element is a derived or virtual container defined by a query over existing collections, not a separately deployed store.",
|
|
189
213
|
"allOf": [
|
|
190
214
|
{
|
|
191
215
|
"$ref": "urn:dr:spec:base:spec-node"
|
|
@@ -224,13 +248,16 @@
|
|
|
224
248
|
"description": "Primary data model paradigm. RELATIONAL: SQL-based tabular data (PostgreSQL, MySQL, Oracle). DOCUMENT: JSON/BSON document storage (MongoDB, CouchDB, Firestore). KEY_VALUE: simple key-to-value mapping (Redis, DynamoDB, etcd). WIDE_COLUMN: column-family storage (Cassandra, HBase, Bigtable). VECTOR: vector embedding storage and similarity search (Pinecone, Weaviate, Qdrant). TIME_SERIES: time-indexed measurements (InfluxDB, TimescaleDB). GRAPH: nodes and edges with traversal (Neo4j, Neptune). SEARCH_ENGINE: full-text search and analytics (Elasticsearch, OpenSearch). MULTI_MODEL: natively supports multiple paradigms (ArangoDB, CosmosDB, FaunaDB)."
|
|
225
249
|
},
|
|
226
250
|
"version": {
|
|
227
|
-
"type": "string"
|
|
251
|
+
"type": "string",
|
|
252
|
+
"description": "Release version of the database engine in the vendor's own format (e.g. '15.4', '7.0', '8.0.35'); set it when it is pinned in an image tag, provider config or migration baseline."
|
|
228
253
|
},
|
|
229
254
|
"charset": {
|
|
230
|
-
"type": "string"
|
|
255
|
+
"type": "string",
|
|
256
|
+
"description": "Default character encoding for text stored in this database (e.g. 'UTF8', 'utf8mb4', 'LATIN1'); set it when it is declared at creation time, mainly for relational engines."
|
|
231
257
|
},
|
|
232
258
|
"collation": {
|
|
233
|
-
"type": "string"
|
|
259
|
+
"type": "string",
|
|
260
|
+
"description": "Default collation governing string comparison and sort order (e.g. 'en_US.UTF-8', 'utf8mb4_unicode_ci', 'C'); set it when it is explicitly configured at database creation."
|
|
234
261
|
},
|
|
235
262
|
"deploymentModel": {
|
|
236
263
|
"type": "string",
|
|
@@ -249,12 +276,23 @@
|
|
|
249
276
|
"additionalProperties": false
|
|
250
277
|
}
|
|
251
278
|
},
|
|
279
|
+
"x-dr-standard": "ISO/IEC 9075-1 SQL-environment: catalog (a named collection of SQL-schemas managed by an SQL-server), generalised to non-relational engines",
|
|
280
|
+
"x-dr-evidence": [
|
|
281
|
+
"A connection URL or DSN in configuration or environment variables naming an engine, host and database, e.g. DATABASE_URL=postgres://db:5432/orders, MONGO_URI or spring.datasource.url.",
|
|
282
|
+
"An infrastructure declaration provisioning a store, e.g. a docker-compose service using a postgres/mongo/redis image with POSTGRES_DB, or a Terraform aws_db_instance, aws_dynamodb_table group or google_sql_database resource.",
|
|
283
|
+
"An ORM or driver datasource block registering a named connection, e.g. a Prisma 'datasource db' with a provider, Django DATABASES['default'], or SQLAlchemy create_engine()/Mongoose connect() invoked at application startup."
|
|
284
|
+
],
|
|
285
|
+
"x-dr-distinguish": {
|
|
286
|
+
"data-store.namespace": "the element is a logical grouping inside a connected deployment. Examples include a PostgreSQL schema, a Cassandra keyspace, a Redis key prefix, or a MongoDB 'database' selected on an already-open client connection.",
|
|
287
|
+
"data-store.collection": "the element is a single container of records, such as a table, a DynamoDB table, an Elasticsearch index, or a vector collection, rather than the deployment that hosts it.",
|
|
288
|
+
"data-store.view": "the element is a derived or virtual container defined by a query over existing collections, not a separately deployed store."
|
|
289
|
+
},
|
|
252
290
|
"$id": "urn:dr:spec:node:data-store.database"
|
|
253
291
|
},
|
|
254
292
|
"eventhandler": {
|
|
255
293
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
256
294
|
"title": "EventHandler",
|
|
257
|
-
"description": "A
|
|
295
|
+
"description": "A registered binding, declared in or against a data store, that attaches to a collection or database scope and runs an action automatically when specified data-change events or data conditions occur there (SQL trigger, change-stream or CDC subscription, keyspace notification, watcher or alert rule). It is the activation wiring (event, timing, granularity, filter), not the computation body it invokes. Use StoredLogic instead when the symbol is the function, procedure, Lua script or pipeline body that does the work (e.g. the trigger function created by CREATE FUNCTION ... RETURNS trigger), not the declaration that binds it to events. Use ValidationRule instead when integrity is enforced declaratively by the engine (CHECK, NOT NULL, FOREIGN KEY, JSON Schema validator) rather than by a BEFORE trigger that runs code to reject or rewrite rows. Use RetentionPolicy instead when the mechanism is a TTL, ILM or downsampling policy that expires or moves data by age, rather than reacting to individual insert, update, delete or expiry events with custom logic. Use View instead when derived data is kept current by a materialized view or continuous aggregate refresh policy rather than by a handler that writes to another collection on each change.",
|
|
258
296
|
"allOf": [
|
|
259
297
|
{
|
|
260
298
|
"$ref": "urn:dr:spec:base:spec-node"
|
|
@@ -338,19 +376,32 @@
|
|
|
338
376
|
"description": "Optional filter condition. Only events matching this condition activate the handler. Maps to SQL WHEN clause, MongoDB pipeline $match stage, or Elasticsearch watcher condition."
|
|
339
377
|
},
|
|
340
378
|
"enabled": {
|
|
341
|
-
"type": "boolean"
|
|
379
|
+
"type": "boolean",
|
|
380
|
+
"description": "Whether the handler is currently active and will fire; set false when it is declared but disabled (e.g. ALTER TABLE ... DISABLE TRIGGER, a paused connector or deactivated watcher), otherwise true, which is the default."
|
|
342
381
|
}
|
|
343
382
|
},
|
|
344
383
|
"required": ["handlerType", "events"],
|
|
345
384
|
"additionalProperties": false
|
|
346
385
|
}
|
|
347
386
|
},
|
|
387
|
+
"x-dr-standard": "ISO/IEC 9075-2 (SQL/Foundation) <trigger definition> (CREATE TRIGGER), extended to change streams, CDC and keyspace notifications",
|
|
388
|
+
"x-dr-evidence": [
|
|
389
|
+
"A migration or DDL file containing CREATE TRIGGER ... BEFORE|AFTER INSERT OR UPDATE ON <table> FOR EACH ROW EXECUTE FUNCTION <fn>()",
|
|
390
|
+
"Code or config opening a change feed on a store, e.g. MongoDB collection.watch([{ $match: ... }]), a DynamoDB StreamSpecification with a Lambda event source mapping, or a Debezium connector config listing table.include.list",
|
|
391
|
+
"Redis setup issuing CONFIG SET notify-keyspace-events (or notify-keyspace-events in redis.conf) together with a PSUBSCRIBE on __keyspace@*__ or __keyevent@*__ channels"
|
|
392
|
+
],
|
|
393
|
+
"x-dr-distinguish": {
|
|
394
|
+
"data-store.storedlogic": "the symbol is the function, procedure, Lua script or pipeline body that does the work (e.g. the trigger function created by CREATE FUNCTION ... RETURNS trigger), not the declaration that binds it to events.",
|
|
395
|
+
"data-store.validationrule": "integrity is enforced declaratively by the engine (CHECK, NOT NULL, FOREIGN KEY, JSON Schema validator) rather than by a BEFORE trigger that runs code to reject or rewrite rows.",
|
|
396
|
+
"data-store.retentionpolicy": "the mechanism is a TTL, ILM or downsampling policy that expires or moves data by age, rather than reacting to individual insert, update, delete or expiry events with custom logic.",
|
|
397
|
+
"data-store.view": "derived data is kept current by a materialized view or continuous aggregate refresh policy rather than by a handler that writes to another collection on each change."
|
|
398
|
+
},
|
|
348
399
|
"$id": "urn:dr:spec:node:data-store.eventhandler"
|
|
349
400
|
},
|
|
350
401
|
"field": {
|
|
351
402
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
352
403
|
"title": "Field",
|
|
353
|
-
"description": "A named data element
|
|
404
|
+
"description": "A named, typed data element declared in the physical structure of a persisted collection, whose value is stored for each record. Covers a SQL column, document field or path, hash field, wide-column column, time-series tag or field, vector or metadata field, graph property, and search-engine mapping property. Use Collection instead when the symbol declares the container of records (table, collection, bucket, measurement, node label) rather than one named element inside it. Use Index instead when the symbol declares a lookup structure over one or more existing fields (CREATE INDEX, createIndex, mapping index option) rather than the stored element itself. Use ValidationRule instead when the symbol is a separately declared constraint (PRIMARY KEY, FOREIGN KEY, CHECK, UNIQUE, JSON Schema required list) that restricts field values, rather than the field declaration. Use View instead when the column appears only in a derived query or projection (SELECT list of a view, continuous aggregate) and is not stored in a base collection.",
|
|
354
405
|
"allOf": [
|
|
355
406
|
{
|
|
356
407
|
"$ref": "urn:dr:spec:base:spec-node"
|
|
@@ -374,10 +425,12 @@
|
|
|
374
425
|
"description": "Data type of this field. Interpretation is paradigm-specific: SQL types (VARCHAR, INTEGER, TIMESTAMP), BSON types (String, ObjectId, Document), Elasticsearch mapping types (keyword, text, dense_vector), or any engine-native type name."
|
|
375
426
|
},
|
|
376
427
|
"nullable": {
|
|
377
|
-
"type": "boolean"
|
|
428
|
+
"type": "boolean",
|
|
429
|
+
"description": "Whether the store accepts an absent or null value for this field. Set false when the declaration carries NOT NULL, required: true, or an equivalent, and true when nulls or missing paths are explicitly allowed."
|
|
378
430
|
},
|
|
379
431
|
"defaultValue": {
|
|
380
|
-
"type": "string"
|
|
432
|
+
"type": "string",
|
|
433
|
+
"description": "The literal or expression the store assigns when a write omits this field, recorded as written in the source (e.g. '0', 'now()', 'CURRENT_TIMESTAMP'). Set only when the default is declared in the storage schema, not when it is assigned in application code."
|
|
381
434
|
},
|
|
382
435
|
"generated": {
|
|
383
436
|
"type": "string",
|
|
@@ -425,12 +478,24 @@
|
|
|
425
478
|
"additionalProperties": false
|
|
426
479
|
}
|
|
427
480
|
},
|
|
481
|
+
"x-dr-standard": "ISO/IEC 9075-2 §11.4 <column definition> (column descriptor)",
|
|
482
|
+
"x-dr-evidence": [
|
|
483
|
+
"a column clause inside CREATE TABLE or ALTER TABLE ... ADD COLUMN in a migration script (e.g. 'email VARCHAR(255) NOT NULL')",
|
|
484
|
+
"an ORM-mapped attribute such as a JPA @Column field, SQLAlchemy Column(...), Django models.CharField, or Prisma model field line",
|
|
485
|
+
"an entry under a document or search schema definition, such as a Mongoose schema path, a MongoDB $jsonSchema property, or an Elasticsearch mappings.properties key with a type"
|
|
486
|
+
],
|
|
487
|
+
"x-dr-distinguish": {
|
|
488
|
+
"data-store.collection": "the symbol declares the container of records (table, collection, bucket, measurement, node label) rather than one named element inside it",
|
|
489
|
+
"data-store.index": "the symbol declares a lookup structure over one or more existing fields (CREATE INDEX, createIndex, mapping index option) rather than the stored element itself",
|
|
490
|
+
"data-store.validationrule": "the symbol is a separately declared constraint (PRIMARY KEY, FOREIGN KEY, CHECK, UNIQUE, JSON Schema required list) that restricts field values, rather than the field declaration",
|
|
491
|
+
"data-store.view": "the column appears only in a derived query or projection (SELECT list of a view, continuous aggregate) and is not stored in a base collection"
|
|
492
|
+
},
|
|
428
493
|
"$id": "urn:dr:spec:node:data-store.field"
|
|
429
494
|
},
|
|
430
495
|
"index": {
|
|
431
496
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
432
497
|
"title": "Index",
|
|
433
|
-
"description": "A
|
|
498
|
+
"description": "A lookup structure the data store engine maintains alongside a collection's or view's records, keyed on one or more of its fields with a declared access method (B-tree, hash, inverted, ANN, geospatial and similar). Queries use it to locate matching entries without scanning the whole collection. Use ValidationRule instead when the declaration is a PRIMARY KEY, UNIQUE or FOREIGN KEY constraint whose purpose is rejecting invalid data, even if the engine backs it with an implicit index; model a separate Index only when the index is declared explicitly. Use Collection instead when the thing called an 'index' is itself the container of documents or vectors, such as an Elasticsearch/OpenSearch index (collectionType SEARCH_INDEX) or a Pinecone index, rather than an auxiliary structure over another container's fields. Use AccessPattern instead when the code or documentation describes the shape of a read or write (key condition, filter, frequency) rather than a structure declared to the engine. Use View instead when the structure holds derived rows that are queried directly, such as a materialized view or continuous aggregate, rather than pointers back to the source records.",
|
|
434
499
|
"allOf": [
|
|
435
500
|
{
|
|
436
501
|
"$ref": "urn:dr:spec:base:spec-node"
|
|
@@ -454,7 +519,8 @@
|
|
|
454
519
|
"description": "Field name(s) included in the index key."
|
|
455
520
|
},
|
|
456
521
|
"unique": {
|
|
457
|
-
"type": "boolean"
|
|
522
|
+
"type": "boolean",
|
|
523
|
+
"description": "Boolean that is true when the index rejects duplicate key values across indexed entries (CREATE UNIQUE INDEX, MongoDB {unique: true}); set it only when the index declaration itself enforces uniqueness, and otherwise leave it false or unset."
|
|
458
524
|
},
|
|
459
525
|
"method": {
|
|
460
526
|
"type": "string",
|
|
@@ -523,12 +589,24 @@
|
|
|
523
589
|
"additionalProperties": false
|
|
524
590
|
}
|
|
525
591
|
},
|
|
592
|
+
"x-dr-standard": "None in ISO/IEC 9075: indexes are implementation-defined; the de facto reference is the vendor CREATE INDEX statement (e.g. PostgreSQL CREATE INDEX).",
|
|
593
|
+
"x-dr-evidence": [
|
|
594
|
+
"A CREATE INDEX / CREATE UNIQUE INDEX statement (optionally with USING gin|hnsw|ivfflat or a WHERE predicate) in a migration script, or a migration-tool call such as op.create_index, add_index, or knex table.index().",
|
|
595
|
+
"An ORM or schema declaration of an index: Prisma @@index, Django Meta.indexes, SQLAlchemy Index(...) in __table_args__, JPA @Table(indexes=@Index(...)), or a Mongoose schema.index({...}) call.",
|
|
596
|
+
"Engine-specific index provisioning: a MongoDB createIndex({...}, {partialFilterExpression, sparse}) call, DynamoDB GlobalSecondaryIndexes/LocalSecondaryIndexes in CloudFormation or Terraform, or a Cassandra CREATE CUSTOM INDEX / SAI statement."
|
|
597
|
+
],
|
|
598
|
+
"x-dr-distinguish": {
|
|
599
|
+
"data-store.validationrule": "the declaration is a PRIMARY KEY, UNIQUE or FOREIGN KEY constraint whose purpose is rejecting invalid data, even if the engine backs it with an implicit index; model a separate Index only when the index is declared explicitly.",
|
|
600
|
+
"data-store.collection": "the thing called an 'index' is itself the container of documents or vectors, such as an Elasticsearch/OpenSearch index (collectionType SEARCH_INDEX) or a Pinecone index, rather than an auxiliary structure over another container's fields.",
|
|
601
|
+
"data-store.accesspattern": "the code or documentation describes the shape of a read or write (key condition, filter, frequency) rather than a structure declared to the engine.",
|
|
602
|
+
"data-store.view": "the structure holds derived rows that are queried directly, such as a materialized view or continuous aggregate, rather than pointers back to the source records."
|
|
603
|
+
},
|
|
526
604
|
"$id": "urn:dr:spec:node:data-store.index"
|
|
527
605
|
},
|
|
528
606
|
"namespace": {
|
|
529
607
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
530
608
|
"title": "Namespace",
|
|
531
|
-
"description": "A logical
|
|
609
|
+
"description": "A named logical container inside a single database instance that scopes the names of collections, views, indexes, stored logic and other database objects, but does not itself hold records. Corresponds to an SQL schema, a MongoDB database, a Cassandra keyspace, a Redis key prefix convention, a vector-store namespace, or a graph named graph. Use Database instead when the element is the deployed engine instance or server/cluster that you connect to (host, engine, version, deployment model), not a name-scoping container within it. Use Collection instead when the element directly stores records, documents, keys or vectors, such as a table, a MongoDB collection, a Cassandra table, or an Elasticsearch index that holds documents. Use View instead when the element is a derived or virtual record set defined by a query or alias over source collections rather than a container that scopes object names.",
|
|
532
610
|
"allOf": [
|
|
533
611
|
{
|
|
534
612
|
"$ref": "urn:dr:spec:base:spec-node"
|
|
@@ -548,18 +626,30 @@
|
|
|
548
626
|
"type": "object",
|
|
549
627
|
"properties": {
|
|
550
628
|
"owner": {
|
|
551
|
-
"type": "string"
|
|
629
|
+
"type": "string",
|
|
630
|
+
"description": "The database role, user or principal that owns the namespace and holds default privileges over its objects, e.g. the AUTHORIZATION role in CREATE SCHEMA. Set it when ownership is declared in DDL or provisioning code, and leave it empty for paradigms without an ownership concept, such as Redis prefixes."
|
|
552
631
|
}
|
|
553
632
|
},
|
|
554
633
|
"additionalProperties": false
|
|
555
634
|
}
|
|
556
635
|
},
|
|
636
|
+
"x-dr-standard": "ISO/IEC 9075-2 Clause 11.1 <schema definition> (CREATE SCHEMA)",
|
|
637
|
+
"x-dr-evidence": [
|
|
638
|
+
"a migration or DDL script containing CREATE SCHEMA, CREATE KEYSPACE, or CREATE DATABASE inside a MongoDB/MySQL-style server, or a USE <name> statement",
|
|
639
|
+
"ORM or mapping configuration that qualifies tables with a schema name, e.g. @Table(schema=\"billing\"), SQLAlchemy MetaData(schema=\"billing\"), or Prisma @@schema(\"billing\")",
|
|
640
|
+
"client code selecting a scoped container by name, e.g. mongoClient.getDatabase(\"orders\"), session.execute(\"USE analytics\"), a Pinecone upsert(namespace=\"tenant-42\"), or a constant Redis key prefix such as \"cart:\" applied to every key"
|
|
641
|
+
],
|
|
642
|
+
"x-dr-distinguish": {
|
|
643
|
+
"data-store.database": "the element is the deployed engine instance or server/cluster that you connect to (host, engine, version, deployment model), not a name-scoping container within it",
|
|
644
|
+
"data-store.collection": "the element directly stores records, documents, keys or vectors, such as a table, a MongoDB collection, a Cassandra table, or an Elasticsearch index that holds documents",
|
|
645
|
+
"data-store.view": "the element is a derived or virtual record set defined by a query or alias over source collections rather than a container that scopes object names"
|
|
646
|
+
},
|
|
557
647
|
"$id": "urn:dr:spec:node:data-store.namespace"
|
|
558
648
|
},
|
|
559
649
|
"retentionpolicy": {
|
|
560
650
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
561
651
|
"title": "RetentionPolicy",
|
|
562
|
-
"description": "A data lifecycle
|
|
652
|
+
"description": "A data lifecycle rule, declared in or enforced by the data store, that sets a maximum age for records in a collection or namespace and names the single action (delete, archive, downsample, move tier or compress) applied to records older than that age. Use ValidationRule instead when the rule constrains or rejects writes, such as a TTL_CONSTRAINT requiring every key to carry an expiry, rather than removing or transforming data that has aged out. Use StoredLogic instead when the symbol is the executable job, function or continuous query that performs the purge or rollup; the policy only declares age and action and triggers that logic. Use View instead when the downsampled result is a queryable derived collection such as a TimescaleDB continuous aggregate; the retention policy governs only when the source data expires. Use EventHandler instead when the code reacts to expiry or deletion events, such as a Redis keyspace EXPIRE notification listener, instead of defining when data expires.",
|
|
563
653
|
"allOf": [
|
|
564
654
|
{
|
|
565
655
|
"$ref": "urn:dr:spec:base:spec-node"
|
|
@@ -602,19 +692,31 @@
|
|
|
602
692
|
"description": "For DOWNSAMPLE action, the aggregation interval (e.g., '1h', '1d'). Only applicable when action is DOWNSAMPLE."
|
|
603
693
|
},
|
|
604
694
|
"enabled": {
|
|
605
|
-
"type": "boolean"
|
|
695
|
+
"type": "boolean",
|
|
696
|
+
"description": "Whether the policy is currently active and enforced by the engine; set to false when the policy is defined but suspended (e.g., a disabled TimescaleDB job or paused ILM policy), otherwise true or omitted."
|
|
606
697
|
}
|
|
607
698
|
},
|
|
608
699
|
"required": ["targetCollection", "retentionDuration", "action"],
|
|
609
700
|
"additionalProperties": false
|
|
610
701
|
}
|
|
611
702
|
},
|
|
703
|
+
"x-dr-evidence": [
|
|
704
|
+
"A migration or setup script containing InfluxDB `CREATE RETENTION POLICY ... DURATION 30d`, TimescaleDB `add_retention_policy('metrics', INTERVAL '90 days')`, or pg_partman `retention` settings on a partitioned table",
|
|
705
|
+
"An Elasticsearch ILM or OpenSearch ISM policy document with phases such as `delete.min_age`, or IaC declaring DynamoDB `TimeToLiveSpecification` or S3 lifecycle rules for a storage bucket",
|
|
706
|
+
"A MongoDB index created with `expireAfterSeconds`, or a scheduled purge job (cron or worker) issuing `DELETE ... WHERE created_at < now() - interval` or dropping old partitions"
|
|
707
|
+
],
|
|
708
|
+
"x-dr-distinguish": {
|
|
709
|
+
"data-store.validationrule": "the rule constrains or rejects writes, such as a TTL_CONSTRAINT requiring every key to carry an expiry, rather than removing or transforming data that has aged out",
|
|
710
|
+
"data-store.storedlogic": "the symbol is the executable job, function or continuous query that performs the purge or rollup; the policy only declares age and action and triggers that logic",
|
|
711
|
+
"data-store.view": "the downsampled result is a queryable derived collection such as a TimescaleDB continuous aggregate; the retention policy governs only when the source data expires",
|
|
712
|
+
"data-store.eventhandler": "the code reacts to expiry or deletion events, such as a Redis keyspace EXPIRE notification listener, instead of defining when data expires"
|
|
713
|
+
},
|
|
612
714
|
"$id": "urn:dr:spec:node:data-store.retentionpolicy"
|
|
613
715
|
},
|
|
614
716
|
"storedlogic": {
|
|
615
717
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
616
718
|
"title": "StoredLogic",
|
|
617
|
-
"description": "
|
|
719
|
+
"description": "A named unit of executable logic that is deployed into and executed by the data store engine itself, such as an SQL function, procedure or package, a Redis Lua script or function, a Cassandra UDF/UDA, a Neo4j procedure, an Elasticsearch ingest pipeline or Painless script, or a scheduled time-series task. It is invoked by name, by an event handler, or on a schedule, rather than shipped as a query text by application code. Use EventHandler instead when the element is the binding that fires on a data-change event (CREATE TRIGGER, a change-stream subscription, a keyspace notification listener), not the routine body that the binding calls. Use View instead when the stored query is exposed as a readable derived collection (CREATE VIEW, a materialized view, a continuous aggregate, a search alias) that clients select from, rather than a routine they invoke. Use AccessPattern instead when the query or aggregation pipeline is built and sent ad hoc by repository/DAO code on each call and is never registered in the engine. Use ValidationRule instead when the integrity check is a declarative constraint (CHECK, NOT NULL, FOREIGN KEY, JSON Schema validator, strict mapping) rather than procedural code.",
|
|
618
720
|
"allOf": [
|
|
619
721
|
{
|
|
620
722
|
"$ref": "urn:dr:spec:base:spec-node"
|
|
@@ -706,12 +808,24 @@
|
|
|
706
808
|
"additionalProperties": false
|
|
707
809
|
}
|
|
708
810
|
},
|
|
811
|
+
"x-dr-standard": "ISO/IEC 9075-2 SQL-invoked routines (CREATE FUNCTION / CREATE PROCEDURE) and ISO/IEC 9075-4 SQL/PSM (Persistent Stored Modules)",
|
|
812
|
+
"x-dr-evidence": [
|
|
813
|
+
"A migration or schema file containing CREATE [OR REPLACE] FUNCTION, CREATE PROCEDURE or CREATE PACKAGE with a LANGUAGE clause (plpgsql, tsql, java) and a routine body, e.g. a $$-delimited block",
|
|
814
|
+
"A .lua script file loaded with SCRIPT LOAD and called via EVALSHA, or registered with redis.register_function / ioredis defineCommand",
|
|
815
|
+
"Application code calling a routine by name (JDBC CallableStatement '{call ...}', Python cursor.callproc, Spring @Procedure, Npgsql CommandType.StoredProcedure), or engine config such as PUT _ingest/pipeline/<name> or an InfluxDB task with 'option task = {every: ...}'"
|
|
816
|
+
],
|
|
817
|
+
"x-dr-distinguish": {
|
|
818
|
+
"data-store.eventhandler": "the element is the binding that fires on a data-change event (CREATE TRIGGER, a change-stream subscription, a keyspace notification listener), not the routine body that the binding calls",
|
|
819
|
+
"data-store.view": "the stored query is exposed as a readable derived collection (CREATE VIEW, a materialized view, a continuous aggregate, a search alias) that clients select from, rather than a routine they invoke",
|
|
820
|
+
"data-store.accesspattern": "the query or aggregation pipeline is built and sent ad hoc by repository/DAO code on each call and is never registered in the engine",
|
|
821
|
+
"data-store.validationrule": "the integrity check is a declarative constraint (CHECK, NOT NULL, FOREIGN KEY, JSON Schema validator, strict mapping) rather than procedural code"
|
|
822
|
+
},
|
|
709
823
|
"$id": "urn:dr:spec:node:data-store.storedlogic"
|
|
710
824
|
},
|
|
711
825
|
"validationrule": {
|
|
712
826
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
713
827
|
"title": "ValidationRule",
|
|
714
|
-
"description": "A
|
|
828
|
+
"description": "A declarative integrity constraint, declared in the data store's schema or collection configuration and enforced by the storage engine itself, that restricts which records, field values, keys or cross-collection references a write may produce. Application-side validation that the engine never sees, and imperative checks coded in triggers or procedures, are not instances. Use EventHandler instead when the check is imperative logic fired by a change event, such as a BEFORE INSERT trigger that raises an exception, rather than a declared constraint. Use Index instead when the declaration is an index created mainly to speed up lookups; a UNIQUE or PRIMARY KEY constraint that the engine happens to back with an index is still a validationrule. Use Field instead when the only restriction is the field's declared dataType, nullable flag, default or generation rule, with no separately named or declared constraint. Use RetentionPolicy instead when the rule governs how long data is kept and expires, deletes, archives or downsamples it, rather than rejecting or flagging invalid writes.",
|
|
715
829
|
"allOf": [
|
|
716
830
|
{
|
|
717
831
|
"$ref": "urn:dr:spec:base:spec-node"
|
|
@@ -799,12 +913,24 @@
|
|
|
799
913
|
"additionalProperties": false
|
|
800
914
|
}
|
|
801
915
|
},
|
|
916
|
+
"x-dr-standard": "ISO/IEC 9075-2 (SQL/Foundation) §11.6 <table constraint definition>, with §11.7 unique, §11.8 referential and §11.9 check constraint definitions",
|
|
917
|
+
"x-dr-evidence": [
|
|
918
|
+
"Migration or DDL statements containing constraint clauses, such as ALTER TABLE ... ADD CONSTRAINT, PRIMARY KEY (...), FOREIGN KEY ... REFERENCES ... ON DELETE CASCADE, or CHECK (...).",
|
|
919
|
+
"Engine-level validator or constraint commands, such as MongoDB createCollection/collMod with validator: {$jsonSchema: ...} and validationAction, or Neo4j CREATE CONSTRAINT ... REQUIRE n.email IS UNIQUE / IS NOT NULL.",
|
|
920
|
+
"ORM or schema-config declarations that emit engine constraints, such as SQLAlchemy CheckConstraint/UniqueConstraint/ForeignKey, Django Meta.constraints, or an Elasticsearch mapping with \"dynamic\": \"strict\"."
|
|
921
|
+
],
|
|
922
|
+
"x-dr-distinguish": {
|
|
923
|
+
"data-store.eventhandler": "the check is imperative logic fired by a change event, such as a BEFORE INSERT trigger that raises an exception, rather than a declared constraint.",
|
|
924
|
+
"data-store.index": "the declaration is an index created mainly to speed up lookups; a UNIQUE or PRIMARY KEY constraint that the engine happens to back with an index is still a validationrule.",
|
|
925
|
+
"data-store.field": "the only restriction is the field's declared dataType, nullable flag, default or generation rule, with no separately named or declared constraint.",
|
|
926
|
+
"data-store.retentionpolicy": "the rule governs how long data is kept and expires, deletes, archives or downsamples it, rather than rejecting or flagging invalid writes."
|
|
927
|
+
},
|
|
802
928
|
"$id": "urn:dr:spec:node:data-store.validationrule"
|
|
803
929
|
},
|
|
804
930
|
"view": {
|
|
805
931
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
806
932
|
"title": "View",
|
|
807
|
-
"description": "A derived
|
|
933
|
+
"description": "A named collection registered in the data store engine whose contents are derived, by a stored query, pipeline or alias, from one or more source collections or views rather than written directly by applications. It is read like a collection and may be computed on each read or precomputed and refreshed. Use Collection instead when the container holds base records that applications insert directly, including a table filled by an ETL job or by a $merge/$out stage, since the engine does not maintain it from a defining query. Use StoredLogic instead when the query or pipeline is invoked procedurally (called with parameters, run as a scheduled task or script) rather than exposed as a named, queryable object, e.g. an InfluxDB continuous query writing into a measurement. Use AccessPattern instead when the query lives only in application or repository code and is not registered in the engine as a named derived object. Use RetentionPolicy instead when the element is the lifecycle rule that downsamples or expires data, not the derived aggregate that results from it.",
|
|
808
934
|
"allOf": [
|
|
809
935
|
{
|
|
810
936
|
"$ref": "urn:dr:spec:base:spec-node"
|
|
@@ -851,6 +977,18 @@
|
|
|
851
977
|
"additionalProperties": false
|
|
852
978
|
}
|
|
853
979
|
},
|
|
980
|
+
"x-dr-standard": "ISO/IEC 9075-2 (SQL/Foundation) <view definition> (CREATE VIEW); materialized views and non-relational aliases or aggregates are paradigm extensions",
|
|
981
|
+
"x-dr-evidence": [
|
|
982
|
+
"a CREATE VIEW, CREATE MATERIALIZED VIEW or CREATE OR REPLACE VIEW statement in a migration or schema file, often paired with a REFRESH MATERIALIZED VIEW job",
|
|
983
|
+
"a MongoDB db.createView(name, source, pipeline) call, an Elasticsearch _aliases or index-template alias definition, or a TimescaleDB CREATE MATERIALIZED VIEW ... WITH (timescaledb.continuous) statement",
|
|
984
|
+
"an ORM entity mapped to a read-only database object, such as a Django model with managed=False whose db_table names a view, a Hibernate @Immutable/@Subselect entity, or an SQLAlchemy Table reflected from a view"
|
|
985
|
+
],
|
|
986
|
+
"x-dr-distinguish": {
|
|
987
|
+
"data-store.collection": "the container holds base records that applications insert directly, including a table filled by an ETL job or by a $merge/$out stage, since the engine does not maintain it from a defining query",
|
|
988
|
+
"data-store.storedlogic": "the query or pipeline is invoked procedurally (called with parameters, run as a scheduled task or script) rather than exposed as a named, queryable object, e.g. an InfluxDB continuous query writing into a measurement",
|
|
989
|
+
"data-store.accesspattern": "the query lives only in application or repository code and is not registered in the engine as a named derived object",
|
|
990
|
+
"data-store.retentionpolicy": "the element is the lifecycle rule that downsamples or expires data, not the derived aggregate that results from it"
|
|
991
|
+
},
|
|
854
992
|
"$id": "urn:dr:spec:node:data-store.view"
|
|
855
993
|
}
|
|
856
994
|
},
|
|
@@ -864,40 +1002,8 @@
|
|
|
864
1002
|
"predicate": "accesses",
|
|
865
1003
|
"cardinality": "many-to-many",
|
|
866
1004
|
"strength": "medium",
|
|
867
|
-
"required": false
|
|
868
|
-
|
|
869
|
-
"data-store.accesspattern.aggregates.data-store.collection": {
|
|
870
|
-
"id": "data-store.accesspattern.aggregates.data-store.collection",
|
|
871
|
-
"source_spec_node_id": "data-store.accesspattern",
|
|
872
|
-
"source_layer": "data-store",
|
|
873
|
-
"destination_spec_node_id": "data-store.collection",
|
|
874
|
-
"destination_layer": "data-store",
|
|
875
|
-
"predicate": "aggregates",
|
|
876
|
-
"cardinality": "many-to-many",
|
|
877
|
-
"strength": "medium",
|
|
878
|
-
"required": false
|
|
879
|
-
},
|
|
880
|
-
"data-store.accesspattern.aggregates.data-store.field": {
|
|
881
|
-
"id": "data-store.accesspattern.aggregates.data-store.field",
|
|
882
|
-
"source_spec_node_id": "data-store.accesspattern",
|
|
883
|
-
"source_layer": "data-store",
|
|
884
|
-
"destination_spec_node_id": "data-store.field",
|
|
885
|
-
"destination_layer": "data-store",
|
|
886
|
-
"predicate": "aggregates",
|
|
887
|
-
"cardinality": "many-to-many",
|
|
888
|
-
"strength": "medium",
|
|
889
|
-
"required": false
|
|
890
|
-
},
|
|
891
|
-
"data-store.accesspattern.aggregates.data-store.index": {
|
|
892
|
-
"id": "data-store.accesspattern.aggregates.data-store.index",
|
|
893
|
-
"source_spec_node_id": "data-store.accesspattern",
|
|
894
|
-
"source_layer": "data-store",
|
|
895
|
-
"destination_spec_node_id": "data-store.index",
|
|
896
|
-
"destination_layer": "data-store",
|
|
897
|
-
"predicate": "aggregates",
|
|
898
|
-
"cardinality": "many-to-many",
|
|
899
|
-
"strength": "medium",
|
|
900
|
-
"required": false
|
|
1005
|
+
"required": false,
|
|
1006
|
+
"description": "The access pattern reads or writes records in the collection: this is the one collection its key condition targets."
|
|
901
1007
|
},
|
|
902
1008
|
"data-store.accesspattern.maps-to.api.operation": {
|
|
903
1009
|
"id": "data-store.accesspattern.maps-to.api.operation",
|
|
@@ -908,18 +1014,20 @@
|
|
|
908
1014
|
"predicate": "maps-to",
|
|
909
1015
|
"cardinality": "many-to-many",
|
|
910
1016
|
"strength": "medium",
|
|
911
|
-
"required": false
|
|
1017
|
+
"required": false,
|
|
1018
|
+
"description": "The access pattern is the store-side counterpart of an API operation, such as the query that a 'get order by id' endpoint issues."
|
|
912
1019
|
},
|
|
913
|
-
"data-store.accesspattern.
|
|
914
|
-
"id": "data-store.accesspattern.
|
|
1020
|
+
"data-store.accesspattern.references.data-store.field": {
|
|
1021
|
+
"id": "data-store.accesspattern.references.data-store.field",
|
|
915
1022
|
"source_spec_node_id": "data-store.accesspattern",
|
|
916
1023
|
"source_layer": "data-store",
|
|
917
|
-
"destination_spec_node_id": "
|
|
918
|
-
"destination_layer": "
|
|
919
|
-
"predicate": "
|
|
1024
|
+
"destination_spec_node_id": "data-store.field",
|
|
1025
|
+
"destination_layer": "data-store",
|
|
1026
|
+
"predicate": "references",
|
|
920
1027
|
"cardinality": "many-to-many",
|
|
921
1028
|
"strength": "medium",
|
|
922
|
-
"required": false
|
|
1029
|
+
"required": false,
|
|
1030
|
+
"description": "The access pattern names the field in its key, sort or filter condition, such as customer_id in 'orders by customer'."
|
|
923
1031
|
},
|
|
924
1032
|
"data-store.accesspattern.satisfies.motivation.requirement": {
|
|
925
1033
|
"id": "data-store.accesspattern.satisfies.motivation.requirement",
|
|
@@ -930,7 +1038,8 @@
|
|
|
930
1038
|
"predicate": "satisfies",
|
|
931
1039
|
"cardinality": "many-to-many",
|
|
932
1040
|
"strength": "medium",
|
|
933
|
-
"required": false
|
|
1041
|
+
"required": false,
|
|
1042
|
+
"description": "The access pattern meets a requirement on data access, such as a lookup that must return within a latency budget."
|
|
934
1043
|
},
|
|
935
1044
|
"data-store.accesspattern.serves.application.applicationfunction": {
|
|
936
1045
|
"id": "data-store.accesspattern.serves.application.applicationfunction",
|
|
@@ -941,29 +1050,8 @@
|
|
|
941
1050
|
"predicate": "serves",
|
|
942
1051
|
"cardinality": "many-to-many",
|
|
943
1052
|
"strength": "medium",
|
|
944
|
-
"required": false
|
|
945
|
-
|
|
946
|
-
"data-store.accesspattern.serves.business.businessfunction": {
|
|
947
|
-
"id": "data-store.accesspattern.serves.business.businessfunction",
|
|
948
|
-
"source_spec_node_id": "data-store.accesspattern",
|
|
949
|
-
"source_layer": "data-store",
|
|
950
|
-
"destination_spec_node_id": "business.businessfunction",
|
|
951
|
-
"destination_layer": "business",
|
|
952
|
-
"predicate": "serves",
|
|
953
|
-
"cardinality": "many-to-many",
|
|
954
|
-
"strength": "medium",
|
|
955
|
-
"required": false
|
|
956
|
-
},
|
|
957
|
-
"data-store.accesspattern.triggers.data-store.eventhandler": {
|
|
958
|
-
"id": "data-store.accesspattern.triggers.data-store.eventhandler",
|
|
959
|
-
"source_spec_node_id": "data-store.accesspattern",
|
|
960
|
-
"source_layer": "data-store",
|
|
961
|
-
"destination_spec_node_id": "data-store.eventhandler",
|
|
962
|
-
"destination_layer": "data-store",
|
|
963
|
-
"predicate": "triggers",
|
|
964
|
-
"cardinality": "many-to-many",
|
|
965
|
-
"strength": "medium",
|
|
966
|
-
"required": false
|
|
1053
|
+
"required": false,
|
|
1054
|
+
"description": "The access pattern is the request the application function issues to the store; the function relies on it to read or write its data. Use the function's accesses collection instead when the query shape is not modelled."
|
|
967
1055
|
},
|
|
968
1056
|
"data-store.accesspattern.triggers.data-store.storedlogic": {
|
|
969
1057
|
"id": "data-store.accesspattern.triggers.data-store.storedlogic",
|
|
@@ -974,7 +1062,8 @@
|
|
|
974
1062
|
"predicate": "triggers",
|
|
975
1063
|
"cardinality": "many-to-many",
|
|
976
1064
|
"strength": "medium",
|
|
977
|
-
"required": false
|
|
1065
|
+
"required": false,
|
|
1066
|
+
"description": "The access pattern calls stored logic by name, such as a CALL to a procedure or an EVAL of a Lua script."
|
|
978
1067
|
},
|
|
979
1068
|
"data-store.accesspattern.uses.data-store.index": {
|
|
980
1069
|
"id": "data-store.accesspattern.uses.data-store.index",
|
|
@@ -985,7 +1074,8 @@
|
|
|
985
1074
|
"predicate": "uses",
|
|
986
1075
|
"cardinality": "many-to-many",
|
|
987
1076
|
"strength": "medium",
|
|
988
|
-
"required": false
|
|
1077
|
+
"required": false,
|
|
1078
|
+
"description": "The access pattern is served by the index, which the engine uses to answer it without a scan."
|
|
989
1079
|
},
|
|
990
1080
|
"data-store.collection.composes.data-store.collection": {
|
|
991
1081
|
"id": "data-store.collection.composes.data-store.collection",
|
|
@@ -996,7 +1086,8 @@
|
|
|
996
1086
|
"predicate": "composes",
|
|
997
1087
|
"cardinality": "many-to-many",
|
|
998
1088
|
"strength": "medium",
|
|
999
|
-
"required": false
|
|
1089
|
+
"required": false,
|
|
1090
|
+
"description": "The collection contains a partition or sub-collection that exists only as part of it, such as a table partition or a subcollection under a document."
|
|
1000
1091
|
},
|
|
1001
1092
|
"data-store.collection.composes.data-store.eventhandler": {
|
|
1002
1093
|
"id": "data-store.collection.composes.data-store.eventhandler",
|
|
@@ -1007,7 +1098,8 @@
|
|
|
1007
1098
|
"predicate": "composes",
|
|
1008
1099
|
"cardinality": "many-to-many",
|
|
1009
1100
|
"strength": "medium",
|
|
1010
|
-
"required": false
|
|
1101
|
+
"required": false,
|
|
1102
|
+
"description": "The event handler is attached to the collection, such as a trigger declared on a table or a change stream opened on a collection; it is dropped with it."
|
|
1011
1103
|
},
|
|
1012
1104
|
"data-store.collection.composes.data-store.field": {
|
|
1013
1105
|
"id": "data-store.collection.composes.data-store.field",
|
|
@@ -1018,7 +1110,8 @@
|
|
|
1018
1110
|
"predicate": "composes",
|
|
1019
1111
|
"cardinality": "many-to-many",
|
|
1020
1112
|
"strength": "medium",
|
|
1021
|
-
"required": false
|
|
1113
|
+
"required": false,
|
|
1114
|
+
"description": "The field is a column, document path or property declared in the collection's structure."
|
|
1022
1115
|
},
|
|
1023
1116
|
"data-store.collection.composes.data-store.index": {
|
|
1024
1117
|
"id": "data-store.collection.composes.data-store.index",
|
|
@@ -1029,18 +1122,8 @@
|
|
|
1029
1122
|
"predicate": "composes",
|
|
1030
1123
|
"cardinality": "many-to-many",
|
|
1031
1124
|
"strength": "medium",
|
|
1032
|
-
"required": false
|
|
1033
|
-
|
|
1034
|
-
"data-store.collection.composes.data-store.namespace": {
|
|
1035
|
-
"id": "data-store.collection.composes.data-store.namespace",
|
|
1036
|
-
"source_spec_node_id": "data-store.collection",
|
|
1037
|
-
"source_layer": "data-store",
|
|
1038
|
-
"destination_spec_node_id": "data-store.namespace",
|
|
1039
|
-
"destination_layer": "data-store",
|
|
1040
|
-
"predicate": "composes",
|
|
1041
|
-
"cardinality": "many-to-many",
|
|
1042
|
-
"strength": "medium",
|
|
1043
|
-
"required": false
|
|
1125
|
+
"required": false,
|
|
1126
|
+
"description": "The index is maintained over the collection's records and is dropped with it."
|
|
1044
1127
|
},
|
|
1045
1128
|
"data-store.collection.composes.data-store.validationrule": {
|
|
1046
1129
|
"id": "data-store.collection.composes.data-store.validationrule",
|
|
@@ -1051,29 +1134,8 @@
|
|
|
1051
1134
|
"predicate": "composes",
|
|
1052
1135
|
"cardinality": "many-to-many",
|
|
1053
1136
|
"strength": "medium",
|
|
1054
|
-
"required": false
|
|
1055
|
-
|
|
1056
|
-
"data-store.collection.implements.security.secureresource": {
|
|
1057
|
-
"id": "data-store.collection.implements.security.secureresource",
|
|
1058
|
-
"source_spec_node_id": "data-store.collection",
|
|
1059
|
-
"source_layer": "data-store",
|
|
1060
|
-
"destination_spec_node_id": "security.secureresource",
|
|
1061
|
-
"destination_layer": "security",
|
|
1062
|
-
"predicate": "implements",
|
|
1063
|
-
"cardinality": "many-to-many",
|
|
1064
|
-
"strength": "medium",
|
|
1065
|
-
"required": false
|
|
1066
|
-
},
|
|
1067
|
-
"data-store.collection.maps-to.api.requestbody": {
|
|
1068
|
-
"id": "data-store.collection.maps-to.api.requestbody",
|
|
1069
|
-
"source_spec_node_id": "data-store.collection",
|
|
1070
|
-
"source_layer": "data-store",
|
|
1071
|
-
"destination_spec_node_id": "api.requestbody",
|
|
1072
|
-
"destination_layer": "api",
|
|
1073
|
-
"predicate": "maps-to",
|
|
1074
|
-
"cardinality": "many-to-many",
|
|
1075
|
-
"strength": "medium",
|
|
1076
|
-
"required": false
|
|
1137
|
+
"required": false,
|
|
1138
|
+
"description": "The validation rule is declared on the collection, such as a CHECK, UNIQUE or foreign-key constraint, or a collection-level JSON Schema validator."
|
|
1077
1139
|
},
|
|
1078
1140
|
"data-store.collection.realizes.business.businessobject": {
|
|
1079
1141
|
"id": "data-store.collection.realizes.business.businessobject",
|
|
@@ -1084,18 +1146,20 @@
|
|
|
1084
1146
|
"predicate": "realizes",
|
|
1085
1147
|
"cardinality": "many-to-many",
|
|
1086
1148
|
"strength": "medium",
|
|
1087
|
-
"required": false
|
|
1149
|
+
"required": false,
|
|
1150
|
+
"description": "The collection stores the records of a business object, such as an orders table for the Order concept. This is a shortcut through the data model; when an object schema describes the records, it maps to the collection."
|
|
1088
1151
|
},
|
|
1089
|
-
"data-store.collection.realizes.
|
|
1090
|
-
"id": "data-store.collection.realizes.
|
|
1152
|
+
"data-store.collection.realizes.security.secureresource": {
|
|
1153
|
+
"id": "data-store.collection.realizes.security.secureresource",
|
|
1091
1154
|
"source_spec_node_id": "data-store.collection",
|
|
1092
1155
|
"source_layer": "data-store",
|
|
1093
|
-
"destination_spec_node_id": "
|
|
1094
|
-
"destination_layer": "
|
|
1156
|
+
"destination_spec_node_id": "security.secureresource",
|
|
1157
|
+
"destination_layer": "security",
|
|
1095
1158
|
"predicate": "realizes",
|
|
1096
1159
|
"cardinality": "many-to-many",
|
|
1097
1160
|
"strength": "medium",
|
|
1098
|
-
"required": false
|
|
1161
|
+
"required": false,
|
|
1162
|
+
"description": "The collection is the physical form of a resource the security model protects."
|
|
1099
1163
|
},
|
|
1100
1164
|
"data-store.collection.references.data-store.collection": {
|
|
1101
1165
|
"id": "data-store.collection.references.data-store.collection",
|
|
@@ -1106,18 +1170,20 @@
|
|
|
1106
1170
|
"predicate": "references",
|
|
1107
1171
|
"cardinality": "many-to-many",
|
|
1108
1172
|
"strength": "medium",
|
|
1109
|
-
"required": false
|
|
1173
|
+
"required": false,
|
|
1174
|
+
"description": "The collection points at another collection without containing it, such as a document collection holding references to records in another."
|
|
1110
1175
|
},
|
|
1111
|
-
"data-store.collection.
|
|
1112
|
-
"id": "data-store.collection.
|
|
1176
|
+
"data-store.collection.references.security.dataclassification": {
|
|
1177
|
+
"id": "data-store.collection.references.security.dataclassification",
|
|
1113
1178
|
"source_spec_node_id": "data-store.collection",
|
|
1114
1179
|
"source_layer": "data-store",
|
|
1115
1180
|
"destination_spec_node_id": "security.dataclassification",
|
|
1116
1181
|
"destination_layer": "security",
|
|
1117
|
-
"predicate": "
|
|
1182
|
+
"predicate": "references",
|
|
1118
1183
|
"cardinality": "many-to-many",
|
|
1119
1184
|
"strength": "medium",
|
|
1120
|
-
"required": false
|
|
1185
|
+
"required": false,
|
|
1186
|
+
"description": "The collection is handled at the protection level of the data classification, such as a table holding personal data."
|
|
1121
1187
|
},
|
|
1122
1188
|
"data-store.collection.satisfies.motivation.requirement": {
|
|
1123
1189
|
"id": "data-store.collection.satisfies.motivation.requirement",
|
|
@@ -1128,40 +1194,8 @@
|
|
|
1128
1194
|
"predicate": "satisfies",
|
|
1129
1195
|
"cardinality": "many-to-many",
|
|
1130
1196
|
"strength": "medium",
|
|
1131
|
-
"required": false
|
|
1132
|
-
|
|
1133
|
-
"data-store.collection.serves.application.applicationcomponent": {
|
|
1134
|
-
"id": "data-store.collection.serves.application.applicationcomponent",
|
|
1135
|
-
"source_spec_node_id": "data-store.collection",
|
|
1136
|
-
"source_layer": "data-store",
|
|
1137
|
-
"destination_spec_node_id": "application.applicationcomponent",
|
|
1138
|
-
"destination_layer": "application",
|
|
1139
|
-
"predicate": "serves",
|
|
1140
|
-
"cardinality": "many-to-many",
|
|
1141
|
-
"strength": "medium",
|
|
1142
|
-
"required": false
|
|
1143
|
-
},
|
|
1144
|
-
"data-store.collection.serves.application.applicationservice": {
|
|
1145
|
-
"id": "data-store.collection.serves.application.applicationservice",
|
|
1146
|
-
"source_spec_node_id": "data-store.collection",
|
|
1147
|
-
"source_layer": "data-store",
|
|
1148
|
-
"destination_spec_node_id": "application.applicationservice",
|
|
1149
|
-
"destination_layer": "application",
|
|
1150
|
-
"predicate": "serves",
|
|
1151
|
-
"cardinality": "many-to-many",
|
|
1152
|
-
"strength": "medium",
|
|
1153
|
-
"required": false
|
|
1154
|
-
},
|
|
1155
|
-
"data-store.collection.serves.api.operation": {
|
|
1156
|
-
"id": "data-store.collection.serves.api.operation",
|
|
1157
|
-
"source_spec_node_id": "data-store.collection",
|
|
1158
|
-
"source_layer": "data-store",
|
|
1159
|
-
"destination_spec_node_id": "api.operation",
|
|
1160
|
-
"destination_layer": "api",
|
|
1161
|
-
"predicate": "serves",
|
|
1162
|
-
"cardinality": "many-to-many",
|
|
1163
|
-
"strength": "medium",
|
|
1164
|
-
"required": false
|
|
1197
|
+
"required": false,
|
|
1198
|
+
"description": "The collection meets a requirement on stored data, such as keeping an audit history of every change."
|
|
1165
1199
|
},
|
|
1166
1200
|
"data-store.database.composes.data-store.collection": {
|
|
1167
1201
|
"id": "data-store.database.composes.data-store.collection",
|
|
@@ -1172,29 +1206,8 @@
|
|
|
1172
1206
|
"predicate": "composes",
|
|
1173
1207
|
"cardinality": "many-to-many",
|
|
1174
1208
|
"strength": "medium",
|
|
1175
|
-
"required": false
|
|
1176
|
-
|
|
1177
|
-
"data-store.database.composes.data-store.field": {
|
|
1178
|
-
"id": "data-store.database.composes.data-store.field",
|
|
1179
|
-
"source_spec_node_id": "data-store.database",
|
|
1180
|
-
"source_layer": "data-store",
|
|
1181
|
-
"destination_spec_node_id": "data-store.field",
|
|
1182
|
-
"destination_layer": "data-store",
|
|
1183
|
-
"predicate": "composes",
|
|
1184
|
-
"cardinality": "many-to-many",
|
|
1185
|
-
"strength": "medium",
|
|
1186
|
-
"required": false
|
|
1187
|
-
},
|
|
1188
|
-
"data-store.database.composes.data-store.index": {
|
|
1189
|
-
"id": "data-store.database.composes.data-store.index",
|
|
1190
|
-
"source_spec_node_id": "data-store.database",
|
|
1191
|
-
"source_layer": "data-store",
|
|
1192
|
-
"destination_spec_node_id": "data-store.index",
|
|
1193
|
-
"destination_layer": "data-store",
|
|
1194
|
-
"predicate": "composes",
|
|
1195
|
-
"cardinality": "many-to-many",
|
|
1196
|
-
"strength": "medium",
|
|
1197
|
-
"required": false
|
|
1209
|
+
"required": false,
|
|
1210
|
+
"description": "The collection lives directly in the database, for engines without namespaces. Use the namespace's composes instead when the engine has schemas or keyspaces."
|
|
1198
1211
|
},
|
|
1199
1212
|
"data-store.database.composes.data-store.namespace": {
|
|
1200
1213
|
"id": "data-store.database.composes.data-store.namespace",
|
|
@@ -1205,18 +1218,8 @@
|
|
|
1205
1218
|
"predicate": "composes",
|
|
1206
1219
|
"cardinality": "many-to-many",
|
|
1207
1220
|
"strength": "medium",
|
|
1208
|
-
"required": false
|
|
1209
|
-
|
|
1210
|
-
"data-store.database.composes.data-store.validationrule": {
|
|
1211
|
-
"id": "data-store.database.composes.data-store.validationrule",
|
|
1212
|
-
"source_spec_node_id": "data-store.database",
|
|
1213
|
-
"source_layer": "data-store",
|
|
1214
|
-
"destination_spec_node_id": "data-store.validationrule",
|
|
1215
|
-
"destination_layer": "data-store",
|
|
1216
|
-
"predicate": "composes",
|
|
1217
|
-
"cardinality": "many-to-many",
|
|
1218
|
-
"strength": "medium",
|
|
1219
|
-
"required": false
|
|
1221
|
+
"required": false,
|
|
1222
|
+
"description": "The namespace (schema, keyspace, named graph) is a logical container inside the database."
|
|
1220
1223
|
},
|
|
1221
1224
|
"data-store.database.composes.data-store.view": {
|
|
1222
1225
|
"id": "data-store.database.composes.data-store.view",
|
|
@@ -1227,7 +1230,8 @@
|
|
|
1227
1230
|
"predicate": "composes",
|
|
1228
1231
|
"cardinality": "many-to-many",
|
|
1229
1232
|
"strength": "medium",
|
|
1230
|
-
"required": false
|
|
1233
|
+
"required": false,
|
|
1234
|
+
"description": "The view lives directly in the database, for engines without namespaces."
|
|
1231
1235
|
},
|
|
1232
1236
|
"data-store.database.depends-on.technology.node": {
|
|
1233
1237
|
"id": "data-store.database.depends-on.technology.node",
|
|
@@ -1238,7 +1242,8 @@
|
|
|
1238
1242
|
"predicate": "depends-on",
|
|
1239
1243
|
"cardinality": "many-to-many",
|
|
1240
1244
|
"strength": "medium",
|
|
1241
|
-
"required": false
|
|
1245
|
+
"required": false,
|
|
1246
|
+
"description": "The database runs on the node, the server or cluster that hosts it."
|
|
1242
1247
|
},
|
|
1243
1248
|
"data-store.database.depends-on.technology.systemsoftware": {
|
|
1244
1249
|
"id": "data-store.database.depends-on.technology.systemsoftware",
|
|
@@ -1249,7 +1254,8 @@
|
|
|
1249
1254
|
"predicate": "depends-on",
|
|
1250
1255
|
"cardinality": "many-to-many",
|
|
1251
1256
|
"strength": "medium",
|
|
1252
|
-
"required": false
|
|
1257
|
+
"required": false,
|
|
1258
|
+
"description": "The database runs on the system software, the engine such as PostgreSQL or MongoDB."
|
|
1253
1259
|
},
|
|
1254
1260
|
"data-store.database.federates.data-store.database": {
|
|
1255
1261
|
"id": "data-store.database.federates.data-store.database",
|
|
@@ -1260,18 +1266,8 @@
|
|
|
1260
1266
|
"predicate": "federates",
|
|
1261
1267
|
"cardinality": "many-to-many",
|
|
1262
1268
|
"strength": "medium",
|
|
1263
|
-
"required": false
|
|
1264
|
-
|
|
1265
|
-
"data-store.database.realizes.business.businessservice": {
|
|
1266
|
-
"id": "data-store.database.realizes.business.businessservice",
|
|
1267
|
-
"source_spec_node_id": "data-store.database",
|
|
1268
|
-
"source_layer": "data-store",
|
|
1269
|
-
"destination_spec_node_id": "business.businessservice",
|
|
1270
|
-
"destination_layer": "business",
|
|
1271
|
-
"predicate": "realizes",
|
|
1272
|
-
"cardinality": "many-to-many",
|
|
1273
|
-
"strength": "medium",
|
|
1274
|
-
"required": false
|
|
1269
|
+
"required": false,
|
|
1270
|
+
"description": "The database presents another database's data as part of its own without copying it, such as a foreign data wrapper or a linked server. Use replicates instead when the data is copied."
|
|
1275
1271
|
},
|
|
1276
1272
|
"data-store.database.replicates.data-store.database": {
|
|
1277
1273
|
"id": "data-store.database.replicates.data-store.database",
|
|
@@ -1282,7 +1278,8 @@
|
|
|
1282
1278
|
"predicate": "replicates",
|
|
1283
1279
|
"cardinality": "many-to-many",
|
|
1284
1280
|
"strength": "medium",
|
|
1285
|
-
"required": false
|
|
1281
|
+
"required": false,
|
|
1282
|
+
"description": "The database holds a copy of another database's data kept in step with it, such as a read replica or a cross-region replica. Use federates instead when the data is queried in place."
|
|
1286
1283
|
},
|
|
1287
1284
|
"data-store.database.satisfies.motivation.constraint": {
|
|
1288
1285
|
"id": "data-store.database.satisfies.motivation.constraint",
|
|
@@ -1293,7 +1290,8 @@
|
|
|
1293
1290
|
"predicate": "satisfies",
|
|
1294
1291
|
"cardinality": "many-to-many",
|
|
1295
1292
|
"strength": "medium",
|
|
1296
|
-
"required": false
|
|
1293
|
+
"required": false,
|
|
1294
|
+
"description": "The database meets a constraint on the solution, such as an approved engine list or a data-residency rule."
|
|
1297
1295
|
},
|
|
1298
1296
|
"data-store.database.satisfies.motivation.requirement": {
|
|
1299
1297
|
"id": "data-store.database.satisfies.motivation.requirement",
|
|
@@ -1304,7 +1302,8 @@
|
|
|
1304
1302
|
"predicate": "satisfies",
|
|
1305
1303
|
"cardinality": "many-to-many",
|
|
1306
1304
|
"strength": "medium",
|
|
1307
|
-
"required": false
|
|
1305
|
+
"required": false,
|
|
1306
|
+
"description": "The database meets a requirement on storage, such as point-in-time recovery or a durability target."
|
|
1308
1307
|
},
|
|
1309
1308
|
"data-store.database.satisfies.security.securitypolicy": {
|
|
1310
1309
|
"id": "data-store.database.satisfies.security.securitypolicy",
|
|
@@ -1315,62 +1314,20 @@
|
|
|
1315
1314
|
"predicate": "satisfies",
|
|
1316
1315
|
"cardinality": "many-to-many",
|
|
1317
1316
|
"strength": "medium",
|
|
1318
|
-
"required": false
|
|
1319
|
-
|
|
1320
|
-
"data-store.database.serves.application.applicationcomponent": {
|
|
1321
|
-
"id": "data-store.database.serves.application.applicationcomponent",
|
|
1322
|
-
"source_spec_node_id": "data-store.database",
|
|
1323
|
-
"source_layer": "data-store",
|
|
1324
|
-
"destination_spec_node_id": "application.applicationcomponent",
|
|
1325
|
-
"destination_layer": "application",
|
|
1326
|
-
"predicate": "serves",
|
|
1327
|
-
"cardinality": "many-to-many",
|
|
1328
|
-
"strength": "medium",
|
|
1329
|
-
"required": false
|
|
1330
|
-
},
|
|
1331
|
-
"data-store.database.serves.application.applicationservice": {
|
|
1332
|
-
"id": "data-store.database.serves.application.applicationservice",
|
|
1333
|
-
"source_spec_node_id": "data-store.database",
|
|
1334
|
-
"source_layer": "data-store",
|
|
1335
|
-
"destination_spec_node_id": "application.applicationservice",
|
|
1336
|
-
"destination_layer": "application",
|
|
1337
|
-
"predicate": "serves",
|
|
1338
|
-
"cardinality": "many-to-many",
|
|
1339
|
-
"strength": "medium",
|
|
1340
|
-
"required": false
|
|
1317
|
+
"required": false,
|
|
1318
|
+
"description": "The database applies a security policy, such as encryption at rest or restricted network access."
|
|
1341
1319
|
},
|
|
1342
|
-
"data-store.
|
|
1343
|
-
"id": "data-store.
|
|
1344
|
-
"source_spec_node_id": "data-store.database",
|
|
1345
|
-
"source_layer": "data-store",
|
|
1346
|
-
"destination_spec_node_id": "business.businessprocess",
|
|
1347
|
-
"destination_layer": "business",
|
|
1348
|
-
"predicate": "serves",
|
|
1349
|
-
"cardinality": "many-to-many",
|
|
1350
|
-
"strength": "medium",
|
|
1351
|
-
"required": false
|
|
1352
|
-
},
|
|
1353
|
-
"data-store.database.uses.technology.technologyservice": {
|
|
1354
|
-
"id": "data-store.database.uses.technology.technologyservice",
|
|
1355
|
-
"source_spec_node_id": "data-store.database",
|
|
1356
|
-
"source_layer": "data-store",
|
|
1357
|
-
"destination_spec_node_id": "technology.technologyservice",
|
|
1358
|
-
"destination_layer": "technology",
|
|
1359
|
-
"predicate": "uses",
|
|
1360
|
-
"cardinality": "many-to-many",
|
|
1361
|
-
"strength": "medium",
|
|
1362
|
-
"required": false
|
|
1363
|
-
},
|
|
1364
|
-
"data-store.eventhandler.monitors.data-store.collection": {
|
|
1365
|
-
"id": "data-store.eventhandler.monitors.data-store.collection",
|
|
1320
|
+
"data-store.eventhandler.references.data-store.field": {
|
|
1321
|
+
"id": "data-store.eventhandler.references.data-store.field",
|
|
1366
1322
|
"source_spec_node_id": "data-store.eventhandler",
|
|
1367
1323
|
"source_layer": "data-store",
|
|
1368
|
-
"destination_spec_node_id": "data-store.
|
|
1324
|
+
"destination_spec_node_id": "data-store.field",
|
|
1369
1325
|
"destination_layer": "data-store",
|
|
1370
|
-
"predicate": "
|
|
1326
|
+
"predicate": "references",
|
|
1371
1327
|
"cardinality": "many-to-many",
|
|
1372
1328
|
"strength": "medium",
|
|
1373
|
-
"required": false
|
|
1329
|
+
"required": false,
|
|
1330
|
+
"description": "The event handler watches the field, such as a trigger declared AFTER UPDATE OF status."
|
|
1374
1331
|
},
|
|
1375
1332
|
"data-store.eventhandler.triggers.application.applicationevent": {
|
|
1376
1333
|
"id": "data-store.eventhandler.triggers.application.applicationevent",
|
|
@@ -1381,18 +1338,8 @@
|
|
|
1381
1338
|
"predicate": "triggers",
|
|
1382
1339
|
"cardinality": "many-to-many",
|
|
1383
1340
|
"strength": "medium",
|
|
1384
|
-
"required": false
|
|
1385
|
-
|
|
1386
|
-
"data-store.eventhandler.triggers.business.businessevent": {
|
|
1387
|
-
"id": "data-store.eventhandler.triggers.business.businessevent",
|
|
1388
|
-
"source_spec_node_id": "data-store.eventhandler",
|
|
1389
|
-
"source_layer": "data-store",
|
|
1390
|
-
"destination_spec_node_id": "business.businessevent",
|
|
1391
|
-
"destination_layer": "business",
|
|
1392
|
-
"predicate": "triggers",
|
|
1393
|
-
"cardinality": "many-to-many",
|
|
1394
|
-
"strength": "medium",
|
|
1395
|
-
"required": false
|
|
1341
|
+
"required": false,
|
|
1342
|
+
"description": "The event handler raises an application event when data changes, such as a CDC subscription that publishes an OrderUpdated message."
|
|
1396
1343
|
},
|
|
1397
1344
|
"data-store.eventhandler.triggers.data-store.storedlogic": {
|
|
1398
1345
|
"id": "data-store.eventhandler.triggers.data-store.storedlogic",
|
|
@@ -1403,7 +1350,8 @@
|
|
|
1403
1350
|
"predicate": "triggers",
|
|
1404
1351
|
"cardinality": "many-to-many",
|
|
1405
1352
|
"strength": "medium",
|
|
1406
|
-
"required": false
|
|
1353
|
+
"required": false,
|
|
1354
|
+
"description": "The event handler runs the stored logic when its event occurs: the handler is the binding, the stored logic the body."
|
|
1407
1355
|
},
|
|
1408
1356
|
"data-store.field.composes.data-store.field": {
|
|
1409
1357
|
"id": "data-store.field.composes.data-store.field",
|
|
@@ -1414,7 +1362,8 @@
|
|
|
1414
1362
|
"predicate": "composes",
|
|
1415
1363
|
"cardinality": "many-to-many",
|
|
1416
1364
|
"strength": "medium",
|
|
1417
|
-
"required": false
|
|
1365
|
+
"required": false,
|
|
1366
|
+
"description": "The field contains nested fields, such as a document sub-object or a composite column type."
|
|
1418
1367
|
},
|
|
1419
1368
|
"data-store.field.maps-to.api.parameter": {
|
|
1420
1369
|
"id": "data-store.field.maps-to.api.parameter",
|
|
@@ -1425,62 +1374,32 @@
|
|
|
1425
1374
|
"predicate": "maps-to",
|
|
1426
1375
|
"cardinality": "many-to-many",
|
|
1427
1376
|
"strength": "medium",
|
|
1428
|
-
"required": false
|
|
1377
|
+
"required": false,
|
|
1378
|
+
"description": "The field holds the same value as an API parameter, such as an id column behind a path parameter."
|
|
1429
1379
|
},
|
|
1430
|
-
"data-store.field.
|
|
1431
|
-
"id": "data-store.field.
|
|
1432
|
-
"source_spec_node_id": "data-store.field",
|
|
1433
|
-
"source_layer": "data-store",
|
|
1434
|
-
"destination_spec_node_id": "security.fieldaccesscontrol",
|
|
1435
|
-
"destination_layer": "security",
|
|
1436
|
-
"predicate": "requires",
|
|
1437
|
-
"cardinality": "many-to-many",
|
|
1438
|
-
"strength": "medium",
|
|
1439
|
-
"required": false
|
|
1440
|
-
},
|
|
1441
|
-
"data-store.field.satisfies.security.dataclassification": {
|
|
1442
|
-
"id": "data-store.field.satisfies.security.dataclassification",
|
|
1380
|
+
"data-store.field.references.security.dataclassification": {
|
|
1381
|
+
"id": "data-store.field.references.security.dataclassification",
|
|
1443
1382
|
"source_spec_node_id": "data-store.field",
|
|
1444
1383
|
"source_layer": "data-store",
|
|
1445
1384
|
"destination_spec_node_id": "security.dataclassification",
|
|
1446
1385
|
"destination_layer": "security",
|
|
1447
|
-
"predicate": "
|
|
1448
|
-
"cardinality": "many-to-many",
|
|
1449
|
-
"strength": "medium",
|
|
1450
|
-
"required": false
|
|
1451
|
-
},
|
|
1452
|
-
"data-store.field.triggers.data-store.eventhandler": {
|
|
1453
|
-
"id": "data-store.field.triggers.data-store.eventhandler",
|
|
1454
|
-
"source_spec_node_id": "data-store.field",
|
|
1455
|
-
"source_layer": "data-store",
|
|
1456
|
-
"destination_spec_node_id": "data-store.eventhandler",
|
|
1457
|
-
"destination_layer": "data-store",
|
|
1458
|
-
"predicate": "triggers",
|
|
1459
|
-
"cardinality": "many-to-many",
|
|
1460
|
-
"strength": "medium",
|
|
1461
|
-
"required": false
|
|
1462
|
-
},
|
|
1463
|
-
"data-store.field.triggers.data-store.storedlogic": {
|
|
1464
|
-
"id": "data-store.field.triggers.data-store.storedlogic",
|
|
1465
|
-
"source_spec_node_id": "data-store.field",
|
|
1466
|
-
"source_layer": "data-store",
|
|
1467
|
-
"destination_spec_node_id": "data-store.storedlogic",
|
|
1468
|
-
"destination_layer": "data-store",
|
|
1469
|
-
"predicate": "triggers",
|
|
1386
|
+
"predicate": "references",
|
|
1470
1387
|
"cardinality": "many-to-many",
|
|
1471
1388
|
"strength": "medium",
|
|
1472
|
-
"required": false
|
|
1389
|
+
"required": false,
|
|
1390
|
+
"description": "The field is handled at the protection level of the data classification, such as a column holding personal data."
|
|
1473
1391
|
},
|
|
1474
|
-
"data-store.field.
|
|
1475
|
-
"id": "data-store.field.
|
|
1392
|
+
"data-store.field.requires.security.fieldaccesscontrol": {
|
|
1393
|
+
"id": "data-store.field.requires.security.fieldaccesscontrol",
|
|
1476
1394
|
"source_spec_node_id": "data-store.field",
|
|
1477
1395
|
"source_layer": "data-store",
|
|
1478
|
-
"destination_spec_node_id": "
|
|
1479
|
-
"destination_layer": "
|
|
1480
|
-
"predicate": "
|
|
1396
|
+
"destination_spec_node_id": "security.fieldaccesscontrol",
|
|
1397
|
+
"destination_layer": "security",
|
|
1398
|
+
"predicate": "requires",
|
|
1481
1399
|
"cardinality": "many-to-many",
|
|
1482
1400
|
"strength": "medium",
|
|
1483
|
-
"required": false
|
|
1401
|
+
"required": false,
|
|
1402
|
+
"description": "Reading or writing the field is governed by field-level access control, such as column masking."
|
|
1484
1403
|
},
|
|
1485
1404
|
"data-store.index.aggregates.data-store.field": {
|
|
1486
1405
|
"id": "data-store.index.aggregates.data-store.field",
|
|
@@ -1491,18 +1410,8 @@
|
|
|
1491
1410
|
"predicate": "aggregates",
|
|
1492
1411
|
"cardinality": "many-to-many",
|
|
1493
1412
|
"strength": "medium",
|
|
1494
|
-
"required": false
|
|
1495
|
-
|
|
1496
|
-
"data-store.index.optimizes.data-store.accesspattern": {
|
|
1497
|
-
"id": "data-store.index.optimizes.data-store.accesspattern",
|
|
1498
|
-
"source_spec_node_id": "data-store.index",
|
|
1499
|
-
"source_layer": "data-store",
|
|
1500
|
-
"destination_spec_node_id": "data-store.accesspattern",
|
|
1501
|
-
"destination_layer": "data-store",
|
|
1502
|
-
"predicate": "optimizes",
|
|
1503
|
-
"cardinality": "many-to-many",
|
|
1504
|
-
"strength": "medium",
|
|
1505
|
-
"required": false
|
|
1413
|
+
"required": false,
|
|
1414
|
+
"description": "The index is keyed on the field; the field exists apart from any index that covers it."
|
|
1506
1415
|
},
|
|
1507
1416
|
"data-store.namespace.composes.data-store.collection": {
|
|
1508
1417
|
"id": "data-store.namespace.composes.data-store.collection",
|
|
@@ -1513,29 +1422,8 @@
|
|
|
1513
1422
|
"predicate": "composes",
|
|
1514
1423
|
"cardinality": "many-to-many",
|
|
1515
1424
|
"strength": "medium",
|
|
1516
|
-
"required": false
|
|
1517
|
-
|
|
1518
|
-
"data-store.namespace.composes.data-store.field": {
|
|
1519
|
-
"id": "data-store.namespace.composes.data-store.field",
|
|
1520
|
-
"source_spec_node_id": "data-store.namespace",
|
|
1521
|
-
"source_layer": "data-store",
|
|
1522
|
-
"destination_spec_node_id": "data-store.field",
|
|
1523
|
-
"destination_layer": "data-store",
|
|
1524
|
-
"predicate": "composes",
|
|
1525
|
-
"cardinality": "many-to-many",
|
|
1526
|
-
"strength": "medium",
|
|
1527
|
-
"required": false
|
|
1528
|
-
},
|
|
1529
|
-
"data-store.namespace.composes.data-store.index": {
|
|
1530
|
-
"id": "data-store.namespace.composes.data-store.index",
|
|
1531
|
-
"source_spec_node_id": "data-store.namespace",
|
|
1532
|
-
"source_layer": "data-store",
|
|
1533
|
-
"destination_spec_node_id": "data-store.index",
|
|
1534
|
-
"destination_layer": "data-store",
|
|
1535
|
-
"predicate": "composes",
|
|
1536
|
-
"cardinality": "many-to-many",
|
|
1537
|
-
"strength": "medium",
|
|
1538
|
-
"required": false
|
|
1425
|
+
"required": false,
|
|
1426
|
+
"description": "The collection is declared in the namespace, such as a table in a SQL schema."
|
|
1539
1427
|
},
|
|
1540
1428
|
"data-store.namespace.composes.data-store.namespace": {
|
|
1541
1429
|
"id": "data-store.namespace.composes.data-store.namespace",
|
|
@@ -1546,10 +1434,11 @@
|
|
|
1546
1434
|
"predicate": "composes",
|
|
1547
1435
|
"cardinality": "many-to-many",
|
|
1548
1436
|
"strength": "medium",
|
|
1549
|
-
"required": false
|
|
1437
|
+
"required": false,
|
|
1438
|
+
"description": "The namespace contains a nested namespace, for engines with a hierarchy such as catalog and schema."
|
|
1550
1439
|
},
|
|
1551
|
-
"data-store.namespace.composes.storedlogic": {
|
|
1552
|
-
"id": "data-store.namespace.composes.storedlogic",
|
|
1440
|
+
"data-store.namespace.composes.data-store.storedlogic": {
|
|
1441
|
+
"id": "data-store.namespace.composes.data-store.storedlogic",
|
|
1553
1442
|
"source_spec_node_id": "data-store.namespace",
|
|
1554
1443
|
"source_layer": "data-store",
|
|
1555
1444
|
"destination_spec_node_id": "data-store.storedlogic",
|
|
@@ -1557,18 +1446,8 @@
|
|
|
1557
1446
|
"predicate": "composes",
|
|
1558
1447
|
"cardinality": "one-to-many",
|
|
1559
1448
|
"strength": "high",
|
|
1560
|
-
"required": false
|
|
1561
|
-
|
|
1562
|
-
"data-store.namespace.composes.data-store.validationrule": {
|
|
1563
|
-
"id": "data-store.namespace.composes.data-store.validationrule",
|
|
1564
|
-
"source_spec_node_id": "data-store.namespace",
|
|
1565
|
-
"source_layer": "data-store",
|
|
1566
|
-
"destination_spec_node_id": "data-store.validationrule",
|
|
1567
|
-
"destination_layer": "data-store",
|
|
1568
|
-
"predicate": "composes",
|
|
1569
|
-
"cardinality": "many-to-many",
|
|
1570
|
-
"strength": "medium",
|
|
1571
|
-
"required": false
|
|
1449
|
+
"required": false,
|
|
1450
|
+
"description": "The stored logic is declared in the namespace, such as a function in a SQL schema."
|
|
1572
1451
|
},
|
|
1573
1452
|
"data-store.namespace.composes.data-store.view": {
|
|
1574
1453
|
"id": "data-store.namespace.composes.data-store.view",
|
|
@@ -1579,29 +1458,8 @@
|
|
|
1579
1458
|
"predicate": "composes",
|
|
1580
1459
|
"cardinality": "many-to-many",
|
|
1581
1460
|
"strength": "medium",
|
|
1582
|
-
"required": false
|
|
1583
|
-
|
|
1584
|
-
"data-store.retentionpolicy.aggregates.data-store.collection": {
|
|
1585
|
-
"id": "data-store.retentionpolicy.aggregates.data-store.collection",
|
|
1586
|
-
"source_spec_node_id": "data-store.retentionpolicy",
|
|
1587
|
-
"source_layer": "data-store",
|
|
1588
|
-
"destination_spec_node_id": "data-store.collection",
|
|
1589
|
-
"destination_layer": "data-store",
|
|
1590
|
-
"predicate": "aggregates",
|
|
1591
|
-
"cardinality": "many-to-many",
|
|
1592
|
-
"strength": "medium",
|
|
1593
|
-
"required": false
|
|
1594
|
-
},
|
|
1595
|
-
"data-store.retentionpolicy.aggregates.data-store.namespace": {
|
|
1596
|
-
"id": "data-store.retentionpolicy.aggregates.data-store.namespace",
|
|
1597
|
-
"source_spec_node_id": "data-store.retentionpolicy",
|
|
1598
|
-
"source_layer": "data-store",
|
|
1599
|
-
"destination_spec_node_id": "data-store.namespace",
|
|
1600
|
-
"destination_layer": "data-store",
|
|
1601
|
-
"predicate": "aggregates",
|
|
1602
|
-
"cardinality": "many-to-many",
|
|
1603
|
-
"strength": "medium",
|
|
1604
|
-
"required": false
|
|
1461
|
+
"required": false,
|
|
1462
|
+
"description": "The view is declared in the namespace."
|
|
1605
1463
|
},
|
|
1606
1464
|
"data-store.retentionpolicy.archives-to.data-store.collection": {
|
|
1607
1465
|
"id": "data-store.retentionpolicy.archives-to.data-store.collection",
|
|
@@ -1612,7 +1470,8 @@
|
|
|
1612
1470
|
"predicate": "archives-to",
|
|
1613
1471
|
"cardinality": "many-to-many",
|
|
1614
1472
|
"strength": "medium",
|
|
1615
|
-
"required": false
|
|
1473
|
+
"required": false,
|
|
1474
|
+
"description": "Records the policy expires are moved to the collection, such as a cold-storage or archive table."
|
|
1616
1475
|
},
|
|
1617
1476
|
"data-store.retentionpolicy.governs.data-store.collection": {
|
|
1618
1477
|
"id": "data-store.retentionpolicy.governs.data-store.collection",
|
|
@@ -1623,7 +1482,8 @@
|
|
|
1623
1482
|
"predicate": "governs",
|
|
1624
1483
|
"cardinality": "many-to-many",
|
|
1625
1484
|
"strength": "medium",
|
|
1626
|
-
"required": false
|
|
1485
|
+
"required": false,
|
|
1486
|
+
"description": "The policy sets how long records in the collection are kept and what happens to them after that."
|
|
1627
1487
|
},
|
|
1628
1488
|
"data-store.retentionpolicy.governs.data-store.namespace": {
|
|
1629
1489
|
"id": "data-store.retentionpolicy.governs.data-store.namespace",
|
|
@@ -1634,7 +1494,8 @@
|
|
|
1634
1494
|
"predicate": "governs",
|
|
1635
1495
|
"cardinality": "many-to-many",
|
|
1636
1496
|
"strength": "medium",
|
|
1637
|
-
"required": false
|
|
1497
|
+
"required": false,
|
|
1498
|
+
"description": "The policy applies to every collection in the namespace, such as a default TTL on a keyspace."
|
|
1638
1499
|
},
|
|
1639
1500
|
"data-store.retentionpolicy.satisfies.motivation.constraint": {
|
|
1640
1501
|
"id": "data-store.retentionpolicy.satisfies.motivation.constraint",
|
|
@@ -1645,7 +1506,8 @@
|
|
|
1645
1506
|
"predicate": "satisfies",
|
|
1646
1507
|
"cardinality": "many-to-many",
|
|
1647
1508
|
"strength": "medium",
|
|
1648
|
-
"required": false
|
|
1509
|
+
"required": false,
|
|
1510
|
+
"description": "The policy meets a constraint on keeping data, such as a statutory maximum retention period."
|
|
1649
1511
|
},
|
|
1650
1512
|
"data-store.retentionpolicy.satisfies.business.contract": {
|
|
1651
1513
|
"id": "data-store.retentionpolicy.satisfies.business.contract",
|
|
@@ -1656,7 +1518,8 @@
|
|
|
1656
1518
|
"predicate": "satisfies",
|
|
1657
1519
|
"cardinality": "many-to-many",
|
|
1658
1520
|
"strength": "medium",
|
|
1659
|
-
"required": false
|
|
1521
|
+
"required": false,
|
|
1522
|
+
"description": "The policy meets the retention terms of a contract, such as a customer agreement to delete data on termination."
|
|
1660
1523
|
},
|
|
1661
1524
|
"data-store.retentionpolicy.satisfies.motivation.principle": {
|
|
1662
1525
|
"id": "data-store.retentionpolicy.satisfies.motivation.principle",
|
|
@@ -1667,7 +1530,8 @@
|
|
|
1667
1530
|
"predicate": "satisfies",
|
|
1668
1531
|
"cardinality": "many-to-many",
|
|
1669
1532
|
"strength": "medium",
|
|
1670
|
-
"required": false
|
|
1533
|
+
"required": false,
|
|
1534
|
+
"description": "The policy follows a principle, such as 'keep only what we need'."
|
|
1671
1535
|
},
|
|
1672
1536
|
"data-store.retentionpolicy.satisfies.motivation.requirement": {
|
|
1673
1537
|
"id": "data-store.retentionpolicy.satisfies.motivation.requirement",
|
|
@@ -1678,7 +1542,8 @@
|
|
|
1678
1542
|
"predicate": "satisfies",
|
|
1679
1543
|
"cardinality": "many-to-many",
|
|
1680
1544
|
"strength": "medium",
|
|
1681
|
-
"required": false
|
|
1545
|
+
"required": false,
|
|
1546
|
+
"description": "The policy meets a requirement on keeping data, such as holding audit records for seven years."
|
|
1682
1547
|
},
|
|
1683
1548
|
"data-store.retentionpolicy.satisfies.security.retentionpolicy": {
|
|
1684
1549
|
"id": "data-store.retentionpolicy.satisfies.security.retentionpolicy",
|
|
@@ -1689,7 +1554,8 @@
|
|
|
1689
1554
|
"predicate": "satisfies",
|
|
1690
1555
|
"cardinality": "many-to-many",
|
|
1691
1556
|
"strength": "medium",
|
|
1692
|
-
"required": false
|
|
1557
|
+
"required": false,
|
|
1558
|
+
"description": "The store's policy enforces the security layer's retention policy; its maximum age must not be shorter than the security policy's minimum."
|
|
1693
1559
|
},
|
|
1694
1560
|
"data-store.retentionpolicy.triggers.data-store.eventhandler": {
|
|
1695
1561
|
"id": "data-store.retentionpolicy.triggers.data-store.eventhandler",
|
|
@@ -1700,7 +1566,8 @@
|
|
|
1700
1566
|
"predicate": "triggers",
|
|
1701
1567
|
"cardinality": "many-to-many",
|
|
1702
1568
|
"strength": "medium",
|
|
1703
|
-
"required": false
|
|
1569
|
+
"required": false,
|
|
1570
|
+
"description": "Expiry under the policy fires an event handler, such as a keyspace notification on key expiry."
|
|
1704
1571
|
},
|
|
1705
1572
|
"data-store.retentionpolicy.triggers.data-store.storedlogic": {
|
|
1706
1573
|
"id": "data-store.retentionpolicy.triggers.data-store.storedlogic",
|
|
@@ -1711,18 +1578,8 @@
|
|
|
1711
1578
|
"predicate": "triggers",
|
|
1712
1579
|
"cardinality": "many-to-many",
|
|
1713
1580
|
"strength": "medium",
|
|
1714
|
-
"required": false
|
|
1715
|
-
|
|
1716
|
-
"data-store.retentionpolicy.uses.technology.technologyservice": {
|
|
1717
|
-
"id": "data-store.retentionpolicy.uses.technology.technologyservice",
|
|
1718
|
-
"source_spec_node_id": "data-store.retentionpolicy",
|
|
1719
|
-
"source_layer": "data-store",
|
|
1720
|
-
"destination_spec_node_id": "technology.technologyservice",
|
|
1721
|
-
"destination_layer": "technology",
|
|
1722
|
-
"predicate": "uses",
|
|
1723
|
-
"cardinality": "many-to-many",
|
|
1724
|
-
"strength": "medium",
|
|
1725
|
-
"required": false
|
|
1581
|
+
"required": false,
|
|
1582
|
+
"description": "The policy runs the stored logic that carries out its action, such as a scheduled purge or downsampling job."
|
|
1726
1583
|
},
|
|
1727
1584
|
"data-store.storedlogic.accesses.data-store.collection": {
|
|
1728
1585
|
"id": "data-store.storedlogic.accesses.data-store.collection",
|
|
@@ -1733,29 +1590,8 @@
|
|
|
1733
1590
|
"predicate": "accesses",
|
|
1734
1591
|
"cardinality": "many-to-many",
|
|
1735
1592
|
"strength": "medium",
|
|
1736
|
-
"required": false
|
|
1737
|
-
|
|
1738
|
-
"data-store.storedlogic.aggregates.data-store.collection": {
|
|
1739
|
-
"id": "data-store.storedlogic.aggregates.data-store.collection",
|
|
1740
|
-
"source_spec_node_id": "data-store.storedlogic",
|
|
1741
|
-
"source_layer": "data-store",
|
|
1742
|
-
"destination_spec_node_id": "data-store.collection",
|
|
1743
|
-
"destination_layer": "data-store",
|
|
1744
|
-
"predicate": "aggregates",
|
|
1745
|
-
"cardinality": "many-to-many",
|
|
1746
|
-
"strength": "medium",
|
|
1747
|
-
"required": false
|
|
1748
|
-
},
|
|
1749
|
-
"data-store.storedlogic.aggregates.data-store.field": {
|
|
1750
|
-
"id": "data-store.storedlogic.aggregates.data-store.field",
|
|
1751
|
-
"source_spec_node_id": "data-store.storedlogic",
|
|
1752
|
-
"source_layer": "data-store",
|
|
1753
|
-
"destination_spec_node_id": "data-store.field",
|
|
1754
|
-
"destination_layer": "data-store",
|
|
1755
|
-
"predicate": "aggregates",
|
|
1756
|
-
"cardinality": "many-to-many",
|
|
1757
|
-
"strength": "medium",
|
|
1758
|
-
"required": false
|
|
1593
|
+
"required": false,
|
|
1594
|
+
"description": "The stored logic reads or writes the collection's records, including reading them to check them."
|
|
1759
1595
|
},
|
|
1760
1596
|
"data-store.storedlogic.composes.data-store.storedlogic": {
|
|
1761
1597
|
"id": "data-store.storedlogic.composes.data-store.storedlogic",
|
|
@@ -1766,18 +1602,8 @@
|
|
|
1766
1602
|
"predicate": "composes",
|
|
1767
1603
|
"cardinality": "many-to-many",
|
|
1768
1604
|
"strength": "medium",
|
|
1769
|
-
"required": false
|
|
1770
|
-
|
|
1771
|
-
"data-store.storedlogic.composes.data-store.validationrule": {
|
|
1772
|
-
"id": "data-store.storedlogic.composes.data-store.validationrule",
|
|
1773
|
-
"source_spec_node_id": "data-store.storedlogic",
|
|
1774
|
-
"source_layer": "data-store",
|
|
1775
|
-
"destination_spec_node_id": "data-store.validationrule",
|
|
1776
|
-
"destination_layer": "data-store",
|
|
1777
|
-
"predicate": "composes",
|
|
1778
|
-
"cardinality": "many-to-many",
|
|
1779
|
-
"strength": "medium",
|
|
1780
|
-
"required": false
|
|
1605
|
+
"required": false,
|
|
1606
|
+
"description": "The stored logic contains other routines, such as procedures in a package or functions in a Redis library."
|
|
1781
1607
|
},
|
|
1782
1608
|
"data-store.storedlogic.depends-on.technology.systemsoftware": {
|
|
1783
1609
|
"id": "data-store.storedlogic.depends-on.technology.systemsoftware",
|
|
@@ -1788,18 +1614,8 @@
|
|
|
1788
1614
|
"predicate": "depends-on",
|
|
1789
1615
|
"cardinality": "many-to-many",
|
|
1790
1616
|
"strength": "medium",
|
|
1791
|
-
"required": false
|
|
1792
|
-
|
|
1793
|
-
"data-store.storedlogic.implements.application.applicationfunction": {
|
|
1794
|
-
"id": "data-store.storedlogic.implements.application.applicationfunction",
|
|
1795
|
-
"source_spec_node_id": "data-store.storedlogic",
|
|
1796
|
-
"source_layer": "data-store",
|
|
1797
|
-
"destination_spec_node_id": "application.applicationfunction",
|
|
1798
|
-
"destination_layer": "application",
|
|
1799
|
-
"predicate": "implements",
|
|
1800
|
-
"cardinality": "many-to-many",
|
|
1801
|
-
"strength": "medium",
|
|
1802
|
-
"required": false
|
|
1617
|
+
"required": false,
|
|
1618
|
+
"description": "The stored logic needs the system software to run, such as a PL/pgSQL extension or a scripting runtime in the engine."
|
|
1803
1619
|
},
|
|
1804
1620
|
"data-store.storedlogic.migrates.data-store.collection": {
|
|
1805
1621
|
"id": "data-store.storedlogic.migrates.data-store.collection",
|
|
@@ -1810,18 +1626,20 @@
|
|
|
1810
1626
|
"predicate": "migrates",
|
|
1811
1627
|
"cardinality": "many-to-many",
|
|
1812
1628
|
"strength": "medium",
|
|
1813
|
-
"required": false
|
|
1629
|
+
"required": false,
|
|
1630
|
+
"description": "The stored logic changes the collection's structure or moves its data, such as a migration routine registered in the engine."
|
|
1814
1631
|
},
|
|
1815
|
-
"data-store.storedlogic.realizes.
|
|
1816
|
-
"id": "data-store.storedlogic.realizes.
|
|
1632
|
+
"data-store.storedlogic.realizes.application.applicationfunction": {
|
|
1633
|
+
"id": "data-store.storedlogic.realizes.application.applicationfunction",
|
|
1817
1634
|
"source_spec_node_id": "data-store.storedlogic",
|
|
1818
1635
|
"source_layer": "data-store",
|
|
1819
|
-
"destination_spec_node_id": "
|
|
1820
|
-
"destination_layer": "
|
|
1636
|
+
"destination_spec_node_id": "application.applicationfunction",
|
|
1637
|
+
"destination_layer": "application",
|
|
1821
1638
|
"predicate": "realizes",
|
|
1822
1639
|
"cardinality": "many-to-many",
|
|
1823
1640
|
"strength": "medium",
|
|
1824
|
-
"required": false
|
|
1641
|
+
"required": false,
|
|
1642
|
+
"description": "The stored logic implements an application function inside the database, such as a procedure that calculates an invoice total."
|
|
1825
1643
|
},
|
|
1826
1644
|
"data-store.storedlogic.satisfies.security.securitypolicy": {
|
|
1827
1645
|
"id": "data-store.storedlogic.satisfies.security.securitypolicy",
|
|
@@ -1832,7 +1650,8 @@
|
|
|
1832
1650
|
"predicate": "satisfies",
|
|
1833
1651
|
"cardinality": "many-to-many",
|
|
1834
1652
|
"strength": "medium",
|
|
1835
|
-
"required": false
|
|
1653
|
+
"required": false,
|
|
1654
|
+
"description": "The stored logic applies a security policy, such as a SECURITY DEFINER routine that enforces row filtering."
|
|
1836
1655
|
},
|
|
1837
1656
|
"data-store.storedlogic.serves.application.applicationservice": {
|
|
1838
1657
|
"id": "data-store.storedlogic.serves.application.applicationservice",
|
|
@@ -1843,7 +1662,8 @@
|
|
|
1843
1662
|
"predicate": "serves",
|
|
1844
1663
|
"cardinality": "many-to-many",
|
|
1845
1664
|
"strength": "medium",
|
|
1846
|
-
"required": false
|
|
1665
|
+
"required": false,
|
|
1666
|
+
"description": "The stored logic provides behaviour that an application service relies on, such as a routine the service calls for every request."
|
|
1847
1667
|
},
|
|
1848
1668
|
"data-store.storedlogic.serves.api.operation": {
|
|
1849
1669
|
"id": "data-store.storedlogic.serves.api.operation",
|
|
@@ -1854,7 +1674,8 @@
|
|
|
1854
1674
|
"predicate": "serves",
|
|
1855
1675
|
"cardinality": "many-to-many",
|
|
1856
1676
|
"strength": "medium",
|
|
1857
|
-
"required": false
|
|
1677
|
+
"required": false,
|
|
1678
|
+
"description": "The stored logic provides behaviour that an API operation relies on directly, such as a function exposed through a database-backed API."
|
|
1858
1679
|
},
|
|
1859
1680
|
"data-store.storedlogic.triggers.data-store.storedlogic": {
|
|
1860
1681
|
"id": "data-store.storedlogic.triggers.data-store.storedlogic",
|
|
@@ -1865,7 +1686,8 @@
|
|
|
1865
1686
|
"predicate": "triggers",
|
|
1866
1687
|
"cardinality": "many-to-many",
|
|
1867
1688
|
"strength": "medium",
|
|
1868
|
-
"required": false
|
|
1689
|
+
"required": false,
|
|
1690
|
+
"description": "The stored logic calls or schedules another routine."
|
|
1869
1691
|
},
|
|
1870
1692
|
"data-store.storedlogic.triggers.data-store.view": {
|
|
1871
1693
|
"id": "data-store.storedlogic.triggers.data-store.view",
|
|
@@ -1876,51 +1698,32 @@
|
|
|
1876
1698
|
"predicate": "triggers",
|
|
1877
1699
|
"cardinality": "many-to-many",
|
|
1878
1700
|
"strength": "medium",
|
|
1879
|
-
"required": false
|
|
1701
|
+
"required": false,
|
|
1702
|
+
"description": "The stored logic refreshes the view, such as a job that runs REFRESH MATERIALIZED VIEW."
|
|
1880
1703
|
},
|
|
1881
|
-
"data-store.
|
|
1882
|
-
"id": "data-store.
|
|
1883
|
-
"source_spec_node_id": "data-store.
|
|
1884
|
-
"source_layer": "data-store",
|
|
1885
|
-
"destination_spec_node_id": "technology.technologyservice",
|
|
1886
|
-
"destination_layer": "technology",
|
|
1887
|
-
"predicate": "uses",
|
|
1888
|
-
"cardinality": "many-to-many",
|
|
1889
|
-
"strength": "medium",
|
|
1890
|
-
"required": false
|
|
1891
|
-
},
|
|
1892
|
-
"data-store.storedlogic.validates.data-store.collection": {
|
|
1893
|
-
"id": "data-store.storedlogic.validates.data-store.collection",
|
|
1894
|
-
"source_spec_node_id": "data-store.storedlogic",
|
|
1704
|
+
"data-store.validationrule.cascades-to.data-store.collection": {
|
|
1705
|
+
"id": "data-store.validationrule.cascades-to.data-store.collection",
|
|
1706
|
+
"source_spec_node_id": "data-store.validationrule",
|
|
1895
1707
|
"source_layer": "data-store",
|
|
1896
1708
|
"destination_spec_node_id": "data-store.collection",
|
|
1897
1709
|
"destination_layer": "data-store",
|
|
1898
|
-
"predicate": "
|
|
1710
|
+
"predicate": "cascades-to",
|
|
1899
1711
|
"cardinality": "many-to-many",
|
|
1900
1712
|
"strength": "medium",
|
|
1901
|
-
"required": false
|
|
1713
|
+
"required": false,
|
|
1714
|
+
"description": "Deleting or updating a referenced record cascades to the collection, through a foreign key with ON DELETE or ON UPDATE CASCADE. Only referential rules cascade."
|
|
1902
1715
|
},
|
|
1903
|
-
"data-store.validationrule.
|
|
1904
|
-
"id": "data-store.validationrule.
|
|
1716
|
+
"data-store.validationrule.references.data-store.field": {
|
|
1717
|
+
"id": "data-store.validationrule.references.data-store.field",
|
|
1905
1718
|
"source_spec_node_id": "data-store.validationrule",
|
|
1906
1719
|
"source_layer": "data-store",
|
|
1907
1720
|
"destination_spec_node_id": "data-store.field",
|
|
1908
1721
|
"destination_layer": "data-store",
|
|
1909
|
-
"predicate": "
|
|
1910
|
-
"cardinality": "many-to-many",
|
|
1911
|
-
"strength": "medium",
|
|
1912
|
-
"required": false
|
|
1913
|
-
},
|
|
1914
|
-
"data-store.validationrule.cascades-to.data-store.collection": {
|
|
1915
|
-
"id": "data-store.validationrule.cascades-to.data-store.collection",
|
|
1916
|
-
"source_spec_node_id": "data-store.validationrule",
|
|
1917
|
-
"source_layer": "data-store",
|
|
1918
|
-
"destination_spec_node_id": "data-store.collection",
|
|
1919
|
-
"destination_layer": "data-store",
|
|
1920
|
-
"predicate": "cascades-to",
|
|
1722
|
+
"predicate": "references",
|
|
1921
1723
|
"cardinality": "many-to-many",
|
|
1922
1724
|
"strength": "medium",
|
|
1923
|
-
"required": false
|
|
1725
|
+
"required": false,
|
|
1726
|
+
"description": "The rule constrains the field, such as a CHECK on a column or a UNIQUE constraint over several columns."
|
|
1924
1727
|
},
|
|
1925
1728
|
"data-store.validationrule.satisfies.motivation.requirement": {
|
|
1926
1729
|
"id": "data-store.validationrule.satisfies.motivation.requirement",
|
|
@@ -1931,18 +1734,8 @@
|
|
|
1931
1734
|
"predicate": "satisfies",
|
|
1932
1735
|
"cardinality": "many-to-many",
|
|
1933
1736
|
"strength": "medium",
|
|
1934
|
-
"required": false
|
|
1935
|
-
|
|
1936
|
-
"data-store.view.aggregates.data-store.collection": {
|
|
1937
|
-
"id": "data-store.view.aggregates.data-store.collection",
|
|
1938
|
-
"source_spec_node_id": "data-store.view",
|
|
1939
|
-
"source_layer": "data-store",
|
|
1940
|
-
"destination_spec_node_id": "data-store.collection",
|
|
1941
|
-
"destination_layer": "data-store",
|
|
1942
|
-
"predicate": "aggregates",
|
|
1943
|
-
"cardinality": "many-to-many",
|
|
1944
|
-
"strength": "medium",
|
|
1945
|
-
"required": false
|
|
1737
|
+
"required": false,
|
|
1738
|
+
"description": "The rule meets a requirement on data integrity, such as 'every order has a customer'."
|
|
1946
1739
|
},
|
|
1947
1740
|
"data-store.view.aggregates.data-store.field": {
|
|
1948
1741
|
"id": "data-store.view.aggregates.data-store.field",
|
|
@@ -1953,7 +1746,8 @@
|
|
|
1953
1746
|
"predicate": "aggregates",
|
|
1954
1747
|
"cardinality": "many-to-many",
|
|
1955
1748
|
"strength": "medium",
|
|
1956
|
-
"required": false
|
|
1749
|
+
"required": false,
|
|
1750
|
+
"description": "The view exposes the field from its source collections; the field belongs to its collection."
|
|
1957
1751
|
},
|
|
1958
1752
|
"data-store.view.composes.data-store.index": {
|
|
1959
1753
|
"id": "data-store.view.composes.data-store.index",
|
|
@@ -1964,7 +1758,8 @@
|
|
|
1964
1758
|
"predicate": "composes",
|
|
1965
1759
|
"cardinality": "many-to-many",
|
|
1966
1760
|
"strength": "medium",
|
|
1967
|
-
"required": false
|
|
1761
|
+
"required": false,
|
|
1762
|
+
"description": "The index is maintained over the view's rows, such as an index on a materialized view."
|
|
1968
1763
|
},
|
|
1969
1764
|
"data-store.view.derives-from.data-store.collection": {
|
|
1970
1765
|
"id": "data-store.view.derives-from.data-store.collection",
|
|
@@ -1975,7 +1770,8 @@
|
|
|
1975
1770
|
"predicate": "derives-from",
|
|
1976
1771
|
"cardinality": "many-to-many",
|
|
1977
1772
|
"strength": "medium",
|
|
1978
|
-
"required": false
|
|
1773
|
+
"required": false,
|
|
1774
|
+
"description": "The view's contents are computed from the collection."
|
|
1979
1775
|
},
|
|
1980
1776
|
"data-store.view.derives-from.data-store.view": {
|
|
1981
1777
|
"id": "data-store.view.derives-from.data-store.view",
|
|
@@ -1986,40 +1782,20 @@
|
|
|
1986
1782
|
"predicate": "derives-from",
|
|
1987
1783
|
"cardinality": "many-to-many",
|
|
1988
1784
|
"strength": "medium",
|
|
1989
|
-
"required": false
|
|
1785
|
+
"required": false,
|
|
1786
|
+
"description": "The view's contents are computed from another view."
|
|
1990
1787
|
},
|
|
1991
|
-
"data-store.view.
|
|
1992
|
-
"id": "data-store.view.
|
|
1788
|
+
"data-store.view.maps-to.api.response": {
|
|
1789
|
+
"id": "data-store.view.maps-to.api.response",
|
|
1993
1790
|
"source_spec_node_id": "data-store.view",
|
|
1994
1791
|
"source_layer": "data-store",
|
|
1995
1792
|
"destination_spec_node_id": "api.response",
|
|
1996
1793
|
"destination_layer": "api",
|
|
1997
|
-
"predicate": "
|
|
1998
|
-
"cardinality": "many-to-many",
|
|
1999
|
-
"strength": "medium",
|
|
2000
|
-
"required": false
|
|
2001
|
-
},
|
|
2002
|
-
"data-store.view.serves.application.applicationservice": {
|
|
2003
|
-
"id": "data-store.view.serves.application.applicationservice",
|
|
2004
|
-
"source_spec_node_id": "data-store.view",
|
|
2005
|
-
"source_layer": "data-store",
|
|
2006
|
-
"destination_spec_node_id": "application.applicationservice",
|
|
2007
|
-
"destination_layer": "application",
|
|
2008
|
-
"predicate": "serves",
|
|
2009
|
-
"cardinality": "many-to-many",
|
|
2010
|
-
"strength": "medium",
|
|
2011
|
-
"required": false
|
|
2012
|
-
},
|
|
2013
|
-
"data-store.view.serves.business.businessservice": {
|
|
2014
|
-
"id": "data-store.view.serves.business.businessservice",
|
|
2015
|
-
"source_spec_node_id": "data-store.view",
|
|
2016
|
-
"source_layer": "data-store",
|
|
2017
|
-
"destination_spec_node_id": "business.businessservice",
|
|
2018
|
-
"destination_layer": "business",
|
|
2019
|
-
"predicate": "serves",
|
|
1794
|
+
"predicate": "maps-to",
|
|
2020
1795
|
"cardinality": "many-to-many",
|
|
2021
1796
|
"strength": "medium",
|
|
2022
|
-
"required": false
|
|
1797
|
+
"required": false,
|
|
1798
|
+
"description": "The view holds the same data an API response returns, such as a reporting view behind a summary endpoint."
|
|
2023
1799
|
}
|
|
2024
1800
|
}
|
|
2025
1801
|
}
|