@undefineds.co/drizzle-solid 0.2.13 → 0.3.1
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/CHANGELOG-DRAFT.md +1 -1
- package/README.md +163 -248
- package/dist/core/ast-to-sparql.d.ts +32 -25
- package/dist/core/ast-to-sparql.d.ts.map +1 -1
- package/dist/core/ast-to-sparql.js +1 -1
- package/dist/core/ast-to-sparql.js.map +1 -1
- package/dist/core/compile-time-types.d.ts +10 -7
- package/dist/core/compile-time-types.d.ts.map +1 -1
- package/dist/core/compile-time-types.js +6 -4
- package/dist/core/compile-time-types.js.map +1 -1
- package/dist/core/comunica-patch.d.ts +1 -6
- package/dist/core/comunica-patch.d.ts.map +1 -1
- package/dist/core/comunica-patch.js +16 -20
- package/dist/core/comunica-patch.js.map +1 -1
- package/dist/core/conflict-resolution.d.ts.map +1 -1
- package/dist/core/conflict-resolution.js +3 -2
- package/dist/core/conflict-resolution.js.map +1 -1
- package/dist/core/discovery/typeindex-discovery.d.ts.map +1 -1
- package/dist/core/discovery/typeindex-discovery.js +0 -2
- package/dist/core/discovery/typeindex-discovery.js.map +1 -1
- package/dist/core/execution/ldp-executor.d.ts.map +1 -1
- package/dist/core/execution/ldp-executor.js +2 -21
- package/dist/core/execution/ldp-executor.js.map +1 -1
- package/dist/core/execution/pod-executor.d.ts.map +1 -1
- package/dist/core/execution/pod-executor.js +2 -4
- package/dist/core/execution/pod-executor.js.map +1 -1
- package/dist/core/execution/sparql-strategy.d.ts +8 -40
- package/dist/core/execution/sparql-strategy.d.ts.map +1 -1
- package/dist/core/execution/sparql-strategy.js +24 -186
- package/dist/core/execution/sparql-strategy.js.map +1 -1
- package/dist/core/execution/strategy-factory.d.ts +7 -20
- package/dist/core/execution/strategy-factory.d.ts.map +1 -1
- package/dist/core/execution/strategy-factory.js +2 -17
- package/dist/core/execution/strategy-factory.js.map +1 -1
- package/dist/core/expressions.d.ts +10 -9
- package/dist/core/expressions.d.ts.map +1 -1
- package/dist/core/expressions.js.map +1 -1
- package/dist/core/pod-database.d.ts +62 -18
- package/dist/core/pod-database.d.ts.map +1 -1
- package/dist/core/pod-database.js +136 -72
- package/dist/core/pod-database.js.map +1 -1
- package/dist/core/pod-dialect.d.ts +7 -1
- package/dist/core/pod-dialect.d.ts.map +1 -1
- package/dist/core/pod-dialect.js +36 -29
- package/dist/core/pod-dialect.js.map +1 -1
- package/dist/core/pod-session.d.ts +10 -9
- package/dist/core/pod-session.d.ts.map +1 -1
- package/dist/core/pod-session.js.map +1 -1
- package/dist/core/query-builders/delete-query-builder.d.ts +2 -2
- package/dist/core/query-builders/delete-query-builder.d.ts.map +1 -1
- package/dist/core/query-builders/delete-query-builder.js +8 -6
- package/dist/core/query-builders/delete-query-builder.js.map +1 -1
- package/dist/core/query-builders/select-query-builder.d.ts +15 -6
- package/dist/core/query-builders/select-query-builder.d.ts.map +1 -1
- package/dist/core/query-builders/select-query-builder.js +217 -31
- package/dist/core/query-builders/select-query-builder.js.map +1 -1
- package/dist/core/query-builders/update-query-builder.d.ts +2 -2
- package/dist/core/query-builders/update-query-builder.d.ts.map +1 -1
- package/dist/core/query-builders/update-query-builder.js +7 -5
- package/dist/core/query-builders/update-query-builder.js.map +1 -1
- package/dist/core/query-conditions.d.ts +18 -11
- package/dist/core/query-conditions.d.ts.map +1 -1
- package/dist/core/query-conditions.js.map +1 -1
- package/dist/core/query-where-policy.d.ts +7 -0
- package/dist/core/query-where-policy.d.ts.map +1 -0
- package/dist/core/query-where-policy.js +83 -0
- package/dist/core/query-where-policy.js.map +1 -0
- package/dist/core/resource-resolver/base-resolver.d.ts +1 -0
- package/dist/core/resource-resolver/base-resolver.d.ts.map +1 -1
- package/dist/core/resource-resolver/base-resolver.js +33 -39
- package/dist/core/resource-resolver/base-resolver.js.map +1 -1
- package/dist/core/resource-resolver/document-resolver.d.ts +2 -1
- package/dist/core/resource-resolver/document-resolver.d.ts.map +1 -1
- package/dist/core/resource-resolver/document-resolver.js +17 -46
- package/dist/core/resource-resolver/document-resolver.js.map +1 -1
- package/dist/core/runtime/pod-runtime.d.ts.map +1 -1
- package/dist/core/runtime/pod-runtime.js +0 -6
- package/dist/core/runtime/pod-runtime.js.map +1 -1
- package/dist/core/schema/columns.d.ts +6 -6
- package/dist/core/schema/columns.d.ts.map +1 -1
- package/dist/core/schema/columns.js +18 -18
- package/dist/core/schema/columns.js.map +1 -1
- package/dist/core/schema/defs.d.ts +4 -4
- package/dist/core/schema/defs.d.ts.map +1 -1
- package/dist/core/schema/pod-table.js +2 -2
- package/dist/core/schema/pod-table.js.map +1 -1
- package/dist/core/select-plan.d.ts +9 -7
- package/dist/core/select-plan.d.ts.map +1 -1
- package/dist/core/services/pod-services.d.ts +7 -5
- package/dist/core/services/pod-services.d.ts.map +1 -1
- package/dist/core/services/pod-services.js +7 -5
- package/dist/core/services/pod-services.js.map +1 -1
- package/dist/core/shape/generator.js +3 -3
- package/dist/core/shape/generator.js.map +1 -1
- package/dist/core/shape/manager.js +5 -5
- package/dist/core/shape/manager.js.map +1 -1
- package/dist/core/solid-n3-client.d.ts.map +1 -1
- package/dist/core/solid-n3-client.js +20 -9
- package/dist/core/solid-n3-client.js.map +1 -1
- package/dist/core/sparql/builder/expression-builder.d.ts +14 -16
- package/dist/core/sparql/builder/expression-builder.d.ts.map +1 -1
- package/dist/core/sparql/builder/expression-builder.js +177 -74
- package/dist/core/sparql/builder/expression-builder.js.map +1 -1
- package/dist/core/sparql/builder/select-builder.d.ts +1 -1
- package/dist/core/sparql/builder/select-builder.d.ts.map +1 -1
- package/dist/core/sparql/builder/select-builder.js +19 -5
- package/dist/core/sparql/builder/select-builder.js.map +1 -1
- package/dist/core/sparql/builder/update-builder.d.ts +1 -1
- package/dist/core/sparql/builder/update-builder.d.ts.map +1 -1
- package/dist/core/sparql/builder/update-builder.js +4 -15
- package/dist/core/sparql/builder/update-builder.js.map +1 -1
- package/dist/core/sparql/helpers.js +3 -3
- package/dist/core/sparql/helpers.js.map +1 -1
- package/dist/core/sparql-engine.d.ts +16 -0
- package/dist/core/sparql-engine.d.ts.map +1 -0
- package/dist/core/sparql-engine.js +128 -0
- package/dist/core/sparql-engine.js.map +1 -0
- package/dist/core/sparql-executor.d.ts +12 -7
- package/dist/core/sparql-executor.d.ts.map +1 -1
- package/dist/core/sparql-executor.js +56 -47
- package/dist/core/sparql-executor.js.map +1 -1
- package/dist/core/triple/handlers/inverse.js +4 -4
- package/dist/core/triple/handlers/inverse.js.map +1 -1
- package/dist/core/triple/handlers/uri.d.ts +1 -1
- package/dist/core/triple/handlers/uri.js +3 -3
- package/dist/core/triple/handlers/uri.js.map +1 -1
- package/dist/core/typeindex-manager.d.ts.map +1 -1
- package/dist/core/typeindex-manager.js +3 -0
- package/dist/core/typeindex-manager.js.map +1 -1
- package/dist/core/types.d.ts +3 -3
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/uri/resolver.d.ts +9 -9
- package/dist/core/uri/resolver.d.ts.map +1 -1
- package/dist/core/uri/resolver.js +51 -51
- package/dist/core/uri/resolver.js.map +1 -1
- package/dist/core/uri/types.d.ts +10 -10
- package/dist/core/uri/types.d.ts.map +1 -1
- package/dist/core/zod-integration.d.ts +9 -7
- package/dist/core/zod-integration.d.ts.map +1 -1
- package/dist/core/zod-integration.js.map +1 -1
- package/dist/driver.d.ts +10 -1
- package/dist/driver.d.ts.map +1 -1
- package/dist/driver.js +1 -5
- package/dist/driver.js.map +1 -1
- package/dist/esm/core/ast-to-sparql.d.ts +32 -25
- package/dist/esm/core/ast-to-sparql.d.ts.map +1 -1
- package/dist/esm/core/ast-to-sparql.js +1 -1
- package/dist/esm/core/ast-to-sparql.js.map +1 -1
- package/dist/esm/core/compile-time-types.d.ts +10 -7
- package/dist/esm/core/compile-time-types.d.ts.map +1 -1
- package/dist/esm/core/compile-time-types.js +6 -4
- package/dist/esm/core/compile-time-types.js.map +1 -1
- package/dist/esm/core/comunica-patch.d.ts +1 -6
- package/dist/esm/core/comunica-patch.d.ts.map +1 -1
- package/dist/esm/core/comunica-patch.js +13 -21
- package/dist/esm/core/comunica-patch.js.map +1 -1
- package/dist/esm/core/conflict-resolution.d.ts.map +1 -1
- package/dist/esm/core/conflict-resolution.js +3 -2
- package/dist/esm/core/conflict-resolution.js.map +1 -1
- package/dist/esm/core/discovery/typeindex-discovery.d.ts.map +1 -1
- package/dist/esm/core/discovery/typeindex-discovery.js +0 -2
- package/dist/esm/core/discovery/typeindex-discovery.js.map +1 -1
- package/dist/esm/core/execution/ldp-executor.d.ts.map +1 -1
- package/dist/esm/core/execution/ldp-executor.js +2 -21
- package/dist/esm/core/execution/ldp-executor.js.map +1 -1
- package/dist/esm/core/execution/pod-executor.d.ts.map +1 -1
- package/dist/esm/core/execution/pod-executor.js +2 -4
- package/dist/esm/core/execution/pod-executor.js.map +1 -1
- package/dist/esm/core/execution/sparql-strategy.d.ts +8 -40
- package/dist/esm/core/execution/sparql-strategy.d.ts.map +1 -1
- package/dist/esm/core/execution/sparql-strategy.js +25 -187
- package/dist/esm/core/execution/sparql-strategy.js.map +1 -1
- package/dist/esm/core/execution/strategy-factory.d.ts +7 -20
- package/dist/esm/core/execution/strategy-factory.d.ts.map +1 -1
- package/dist/esm/core/execution/strategy-factory.js +2 -17
- package/dist/esm/core/execution/strategy-factory.js.map +1 -1
- package/dist/esm/core/expressions.d.ts +10 -9
- package/dist/esm/core/expressions.d.ts.map +1 -1
- package/dist/esm/core/expressions.js.map +1 -1
- package/dist/esm/core/pod-database.d.ts +62 -18
- package/dist/esm/core/pod-database.d.ts.map +1 -1
- package/dist/esm/core/pod-database.js +136 -72
- package/dist/esm/core/pod-database.js.map +1 -1
- package/dist/esm/core/pod-dialect.d.ts +7 -1
- package/dist/esm/core/pod-dialect.d.ts.map +1 -1
- package/dist/esm/core/pod-dialect.js +37 -30
- package/dist/esm/core/pod-dialect.js.map +1 -1
- package/dist/esm/core/pod-session.d.ts +10 -9
- package/dist/esm/core/pod-session.d.ts.map +1 -1
- package/dist/esm/core/pod-session.js.map +1 -1
- package/dist/esm/core/query-builders/delete-query-builder.d.ts +2 -2
- package/dist/esm/core/query-builders/delete-query-builder.d.ts.map +1 -1
- package/dist/esm/core/query-builders/delete-query-builder.js +8 -6
- package/dist/esm/core/query-builders/delete-query-builder.js.map +1 -1
- package/dist/esm/core/query-builders/select-query-builder.d.ts +15 -6
- package/dist/esm/core/query-builders/select-query-builder.d.ts.map +1 -1
- package/dist/esm/core/query-builders/select-query-builder.js +218 -32
- package/dist/esm/core/query-builders/select-query-builder.js.map +1 -1
- package/dist/esm/core/query-builders/update-query-builder.d.ts +2 -2
- package/dist/esm/core/query-builders/update-query-builder.d.ts.map +1 -1
- package/dist/esm/core/query-builders/update-query-builder.js +7 -5
- package/dist/esm/core/query-builders/update-query-builder.js.map +1 -1
- package/dist/esm/core/query-conditions.d.ts +18 -11
- package/dist/esm/core/query-conditions.d.ts.map +1 -1
- package/dist/esm/core/query-conditions.js.map +1 -1
- package/dist/esm/core/query-where-policy.d.ts +7 -0
- package/dist/esm/core/query-where-policy.d.ts.map +1 -0
- package/dist/esm/core/query-where-policy.js +78 -0
- package/dist/esm/core/query-where-policy.js.map +1 -0
- package/dist/esm/core/resource-resolver/base-resolver.d.ts +1 -0
- package/dist/esm/core/resource-resolver/base-resolver.d.ts.map +1 -1
- package/dist/esm/core/resource-resolver/base-resolver.js +33 -39
- package/dist/esm/core/resource-resolver/base-resolver.js.map +1 -1
- package/dist/esm/core/resource-resolver/document-resolver.d.ts +2 -1
- package/dist/esm/core/resource-resolver/document-resolver.d.ts.map +1 -1
- package/dist/esm/core/resource-resolver/document-resolver.js +17 -46
- package/dist/esm/core/resource-resolver/document-resolver.js.map +1 -1
- package/dist/esm/core/runtime/pod-runtime.d.ts.map +1 -1
- package/dist/esm/core/runtime/pod-runtime.js +0 -6
- package/dist/esm/core/runtime/pod-runtime.js.map +1 -1
- package/dist/esm/core/schema/columns.d.ts +6 -6
- package/dist/esm/core/schema/columns.d.ts.map +1 -1
- package/dist/esm/core/schema/columns.js +18 -18
- package/dist/esm/core/schema/columns.js.map +1 -1
- package/dist/esm/core/schema/defs.d.ts +4 -4
- package/dist/esm/core/schema/defs.d.ts.map +1 -1
- package/dist/esm/core/schema/pod-table.js +2 -2
- package/dist/esm/core/schema/pod-table.js.map +1 -1
- package/dist/esm/core/select-plan.d.ts +9 -7
- package/dist/esm/core/select-plan.d.ts.map +1 -1
- package/dist/esm/core/services/pod-services.d.ts +7 -5
- package/dist/esm/core/services/pod-services.d.ts.map +1 -1
- package/dist/esm/core/services/pod-services.js +7 -5
- package/dist/esm/core/services/pod-services.js.map +1 -1
- package/dist/esm/core/shape/generator.js +3 -3
- package/dist/esm/core/shape/generator.js.map +1 -1
- package/dist/esm/core/shape/manager.js +5 -5
- package/dist/esm/core/shape/manager.js.map +1 -1
- package/dist/esm/core/solid-n3-client.d.ts.map +1 -1
- package/dist/esm/core/solid-n3-client.js +20 -9
- package/dist/esm/core/solid-n3-client.js.map +1 -1
- package/dist/esm/core/sparql/builder/expression-builder.d.ts +14 -16
- package/dist/esm/core/sparql/builder/expression-builder.d.ts.map +1 -1
- package/dist/esm/core/sparql/builder/expression-builder.js +177 -74
- package/dist/esm/core/sparql/builder/expression-builder.js.map +1 -1
- package/dist/esm/core/sparql/builder/select-builder.d.ts +1 -1
- package/dist/esm/core/sparql/builder/select-builder.d.ts.map +1 -1
- package/dist/esm/core/sparql/builder/select-builder.js +19 -5
- package/dist/esm/core/sparql/builder/select-builder.js.map +1 -1
- package/dist/esm/core/sparql/builder/update-builder.d.ts +1 -1
- package/dist/esm/core/sparql/builder/update-builder.d.ts.map +1 -1
- package/dist/esm/core/sparql/builder/update-builder.js +4 -15
- package/dist/esm/core/sparql/builder/update-builder.js.map +1 -1
- package/dist/esm/core/sparql/helpers.js +3 -3
- package/dist/esm/core/sparql/helpers.js.map +1 -1
- package/dist/esm/core/sparql-engine.d.ts +16 -0
- package/dist/esm/core/sparql-engine.d.ts.map +1 -0
- package/dist/esm/core/sparql-engine.js +89 -0
- package/dist/esm/core/sparql-engine.js.map +1 -0
- package/dist/esm/core/sparql-executor.d.ts +12 -7
- package/dist/esm/core/sparql-executor.d.ts.map +1 -1
- package/dist/esm/core/sparql-executor.js +56 -47
- package/dist/esm/core/sparql-executor.js.map +1 -1
- package/dist/esm/core/triple/handlers/inverse.js +4 -4
- package/dist/esm/core/triple/handlers/inverse.js.map +1 -1
- package/dist/esm/core/triple/handlers/uri.d.ts +1 -1
- package/dist/esm/core/triple/handlers/uri.js +3 -3
- package/dist/esm/core/triple/handlers/uri.js.map +1 -1
- package/dist/esm/core/typeindex-manager.d.ts.map +1 -1
- package/dist/esm/core/typeindex-manager.js +3 -0
- package/dist/esm/core/typeindex-manager.js.map +1 -1
- package/dist/esm/core/types.d.ts +3 -3
- package/dist/esm/core/types.d.ts.map +1 -1
- package/dist/esm/core/uri/resolver.d.ts +9 -9
- package/dist/esm/core/uri/resolver.d.ts.map +1 -1
- package/dist/esm/core/uri/resolver.js +51 -51
- package/dist/esm/core/uri/resolver.js.map +1 -1
- package/dist/esm/core/uri/types.d.ts +10 -10
- package/dist/esm/core/uri/types.d.ts.map +1 -1
- package/dist/esm/core/zod-integration.d.ts +9 -7
- package/dist/esm/core/zod-integration.d.ts.map +1 -1
- package/dist/esm/core/zod-integration.js.map +1 -1
- package/dist/esm/driver.d.ts +10 -1
- package/dist/esm/driver.d.ts.map +1 -1
- package/dist/esm/driver.js +1 -5
- package/dist/esm/driver.js.map +1 -1
- package/dist/esm/index.d.ts +3 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +4 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/pod.d.ts +118 -0
- package/dist/esm/pod.d.ts.map +1 -0
- package/dist/esm/pod.js +146 -0
- package/dist/esm/pod.js.map +1 -0
- package/dist/esm/utils/find-by-iri.d.ts +4 -2
- package/dist/esm/utils/find-by-iri.d.ts.map +1 -1
- package/dist/esm/utils/find-by-iri.js +8 -8
- package/dist/esm/utils/find-by-iri.js.map +1 -1
- package/dist/esm/utils/helpers.d.ts +2 -2
- package/dist/esm/utils/helpers.d.ts.map +1 -1
- package/dist/esm/utils/rdf-helpers.d.ts +2 -2
- package/dist/esm/utils/rdf-helpers.d.ts.map +1 -1
- package/dist/esm/utils/rdf-helpers.js +9 -6
- package/dist/esm/utils/rdf-helpers.js.map +1 -1
- package/dist/esm/utils/rdf-validation.d.ts +5 -3
- package/dist/esm/utils/rdf-validation.d.ts.map +1 -1
- package/dist/esm/utils/rdf-validation.js +47 -8
- package/dist/esm/utils/rdf-validation.js.map +1 -1
- package/dist/esm/utils/webid-resolver.d.ts +1 -2
- package/dist/esm/utils/webid-resolver.d.ts.map +1 -1
- package/dist/esm/utils/webid-resolver.js +37 -31
- package/dist/esm/utils/webid-resolver.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -4
- package/dist/index.js.map +1 -1
- package/dist/pod.d.ts +118 -0
- package/dist/pod.d.ts.map +1 -0
- package/dist/pod.js +153 -0
- package/dist/pod.js.map +1 -0
- package/dist/utils/find-by-iri.d.ts +4 -2
- package/dist/utils/find-by-iri.d.ts.map +1 -1
- package/dist/utils/find-by-iri.js +8 -8
- package/dist/utils/find-by-iri.js.map +1 -1
- package/dist/utils/helpers.d.ts +2 -2
- package/dist/utils/helpers.d.ts.map +1 -1
- package/dist/utils/rdf-helpers.d.ts +2 -2
- package/dist/utils/rdf-helpers.d.ts.map +1 -1
- package/dist/utils/rdf-helpers.js +9 -6
- package/dist/utils/rdf-helpers.js.map +1 -1
- package/dist/utils/rdf-validation.d.ts +5 -3
- package/dist/utils/rdf-validation.d.ts.map +1 -1
- package/dist/utils/rdf-validation.js +47 -8
- package/dist/utils/rdf-validation.js.map +1 -1
- package/dist/utils/webid-resolver.d.ts +1 -2
- package/dist/utils/webid-resolver.d.ts.map +1 -1
- package/dist/utils/webid-resolver.js +37 -31
- package/dist/utils/webid-resolver.js.map +1 -1
- package/package.json +13 -4
package/CHANGELOG-DRAFT.md
CHANGED
|
@@ -392,7 +392,7 @@ npm test
|
|
|
392
392
|
- [CSS Notifications](./docs/guides/css-notifications.md) - 实时通知支持(79KB)
|
|
393
393
|
|
|
394
394
|
### 开发指南
|
|
395
|
-
- [
|
|
395
|
+
- [测试指南](./docs/guides/testing.md) - 当前测试方法、分层和验证要求
|
|
396
396
|
- [快速开始](./docs/quick-start-local.md) - 本地开发入门
|
|
397
397
|
- [文档索引](./docs/README.md) - 完整文档导航
|
|
398
398
|
|
package/README.md
CHANGED
|
@@ -1,123 +1,103 @@
|
|
|
1
1
|
# drizzle-solid
|
|
2
2
|
|
|
3
|
-
`drizzle-solid` is a Drizzle-aligned
|
|
3
|
+
`drizzle-solid` is a Drizzle-aligned data layer for application-owned data in Solid Pods.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
这次变化的重点不是强迫你把构造函数名字从 `drizzle()` 换成别的东西,而是把语义讲清楚:
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
- `table` 更接近 **resource layout / collection definition**
|
|
8
|
+
- `link` 字段更接近 **RDF link / IRI link**
|
|
9
|
+
- 实体最终身份更接近 **IRI / @id**,而不只是本地主键
|
|
10
|
+
- 读取和写入不再默认共享 SQL 式语义
|
|
8
11
|
|
|
9
|
-
##
|
|
12
|
+
## Scope
|
|
10
13
|
|
|
11
|
-
|
|
12
|
-
- Mapping fields to RDF predicates and resource layouts
|
|
13
|
-
- Using a Drizzle-style CRUD/query builder over Pod data
|
|
14
|
-
- Performing exact entity operations through full IRIs
|
|
15
|
-
- Building discovery, federation, and notification flows on top of Solid-native storage
|
|
14
|
+
Current v1 solves one problem well:
|
|
16
15
|
|
|
17
|
-
|
|
16
|
+
- persist application-owned data into Solid Pods with typed schemas
|
|
17
|
+
- keep Pod layout explicit through `base` and `subjectTemplate`
|
|
18
|
+
- make full IRIs part of the public API instead of hiding them behind local-only IDs
|
|
19
|
+
- give Drizzle users a migration-friendly surface without pretending Solid is a SQL database
|
|
20
|
+
- support adjacent Solid flows such as discovery, notifications, and federation where they fit the Pod model
|
|
18
21
|
|
|
19
|
-
|
|
20
|
-
- **IRI-native**: treat IRIs as first-class identity, not as an afterthought over local IDs
|
|
21
|
-
- **Pod-aware**: keep resource layout, links, network, and access constraints explicit
|
|
22
|
-
- **Drizzle-aligned**: stay close to Drizzle's builder surface and ergonomics where it makes sense
|
|
23
|
-
- **SPARQL-native**: the native query model is SPARQL/Solid, not SQL emulation
|
|
22
|
+
Not in v1:
|
|
24
23
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
-
|
|
28
|
-
-
|
|
29
|
-
-
|
|
30
|
-
|
|
31
|
-
## What it isn't
|
|
32
|
-
|
|
33
|
-
- Not a general-purpose SQL ORM
|
|
34
|
-
- Not a universal abstraction over arbitrary RDF on the open web
|
|
35
|
-
- Not a graph database or SPARQL engine replacement
|
|
36
|
-
- Not a black box that hides Pod boundaries, permissions, or network behavior
|
|
37
|
-
- Not a promise that every SQL/driver-specific Drizzle feature maps cleanly to Solid
|
|
38
|
-
|
|
39
|
-
## Core concepts
|
|
40
|
-
|
|
41
|
-
### Resource
|
|
42
|
-
|
|
43
|
-
A resource is the persisted unit in a Pod, usually a Turtle or JSON-LD document addressed by URL.
|
|
44
|
-
|
|
45
|
-
### Document
|
|
46
|
-
|
|
47
|
-
A document may contain one entity or many entities. Document layout is part of application design, not an implementation detail.
|
|
48
|
-
|
|
49
|
-
### Entity
|
|
50
|
-
|
|
51
|
-
An entity is a typed RDF subject stored in a document. It is closer to a linked-data subject than to a relational row.
|
|
24
|
+
- full SQL/database feature parity
|
|
25
|
+
- raw SQL as the primary abstraction
|
|
26
|
+
- hiding Pod boundaries, permissions, or network behavior
|
|
27
|
+
- implicit scan-based `updateMany/deleteMany` on backends that do not support set-based mutation
|
|
28
|
+
- universal querying over arbitrary open-world RDF as the main goal
|
|
52
29
|
|
|
53
|
-
|
|
30
|
+
## Constructor Choice
|
|
54
31
|
|
|
55
|
-
|
|
32
|
+
仓库文档与 examples 默认先用 `pod(session, config?)` 讲主线语义:
|
|
56
33
|
|
|
57
|
-
|
|
34
|
+
- `pod(session, config?)`
|
|
35
|
+
- `drizzle(session, config?)`
|
|
58
36
|
|
|
59
|
-
|
|
37
|
+
建议这样理解:
|
|
60
38
|
|
|
61
|
-
|
|
39
|
+
- `pod()` 是语义优先的正式入口,方便把 API 组织成 `collection()` / `entity()` / `bind()`
|
|
40
|
+
- `drizzle()` 是同一运行时上的 Drizzle-aligned 入口,适合迁移或保留 builder/query 代码形状
|
|
41
|
+
- 重要的不是“入口名”,而是下面这些语义:`base`、`subjectTemplate`、`IRI`、exact-target mutation
|
|
62
42
|
|
|
63
|
-
|
|
43
|
+
## Public Surface
|
|
64
44
|
|
|
65
|
-
|
|
66
|
-
- `solidSchema(...)` + `db.createTable(...)`: reusable schema separated from where data is stored
|
|
45
|
+
当前公开表面可以分成两层:
|
|
67
46
|
|
|
68
|
-
###
|
|
47
|
+
### Semantic-first surface
|
|
69
48
|
|
|
70
|
-
`
|
|
49
|
+
- `pod(session, config?)`
|
|
50
|
+
- `client.bind(schema, options)`
|
|
51
|
+
- `client.collection(table)`
|
|
52
|
+
- `client.entity(table, iri)`
|
|
53
|
+
- `client.sparql(query)`
|
|
71
54
|
|
|
72
|
-
|
|
55
|
+
### Drizzle-aligned surface
|
|
73
56
|
|
|
74
|
-
|
|
57
|
+
- `drizzle(session, config?)`
|
|
58
|
+
- `podTable(name, columns, config)`
|
|
59
|
+
- `solidSchema(...)`
|
|
60
|
+
- `select / insert / update / delete`
|
|
61
|
+
- `db.query.*` read facade
|
|
75
62
|
|
|
76
|
-
|
|
77
|
-
2. **Where does that data live in Pods?**
|
|
63
|
+
## Install
|
|
78
64
|
|
|
79
|
-
|
|
65
|
+
```bash
|
|
66
|
+
yarn add @undefineds.co/drizzle-solid drizzle-orm
|
|
67
|
+
# optional, when your app wants the default SPARQL client engine
|
|
68
|
+
yarn add @comunica/query-sparql-solid
|
|
69
|
+
```
|
|
80
70
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
71
|
+
```bash
|
|
72
|
+
npm install @undefineds.co/drizzle-solid drizzle-orm
|
|
73
|
+
npm install @comunica/query-sparql-solid
|
|
74
|
+
```
|
|
84
75
|
|
|
85
|
-
|
|
76
|
+
`@comunica/query-sparql-solid` is an optional peer dependency.
|
|
86
77
|
|
|
87
|
-
|
|
78
|
+
Install it in the consuming app when you need built-in SPARQL query execution or direct SPARQL workflows.
|
|
88
79
|
|
|
89
|
-
|
|
80
|
+
Without a SPARQL endpoint or index, plain-LDP document mode is limited to exact-target access (`findByLocator` / `findByIri` and the matching update/delete APIs). Collection queries are not implicitly expanded into scans.
|
|
90
81
|
|
|
91
|
-
|
|
82
|
+
Current public compatibility stance:
|
|
92
83
|
|
|
93
|
-
-
|
|
94
|
-
-
|
|
95
|
-
- which resources should be public, private, or shared
|
|
96
|
-
- how links should work across documents and Pods
|
|
84
|
+
- officially supported: `@comunica/query-sparql-solid` `4.x`
|
|
85
|
+
- not currently in the supported matrix: `3.x`
|
|
97
86
|
|
|
98
|
-
|
|
87
|
+
If another in-process runtime already carries Comunica (for example `xpod`), inject that engine instead of forcing a second copy. See `docs/api/README.md` and `docs/guides/installation.md`.
|
|
99
88
|
|
|
100
89
|
## Quick start
|
|
101
90
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
```bash
|
|
105
|
-
yarn add @undefineds.co/drizzle-solid
|
|
106
|
-
# or
|
|
107
|
-
npm install @undefineds.co/drizzle-solid
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
> In this repository, the examples import `drizzle-solid` through a local TypeScript path alias. In external applications, import the published package name: `@undefineds.co/drizzle-solid`.
|
|
91
|
+
仓库里的主线 quick start 默认使用 `pod(session)`,因为它会把 `collection()` / `entity()` / `bind()` 语义直接写在代码里。
|
|
111
92
|
|
|
112
|
-
|
|
93
|
+
如果你已有大量 Drizzle 风格代码,`drizzle(session)` 仍然是正式可用入口。
|
|
113
94
|
|
|
114
95
|
```ts
|
|
115
96
|
import {
|
|
116
|
-
|
|
97
|
+
pod,
|
|
117
98
|
podTable,
|
|
118
99
|
string,
|
|
119
100
|
datetime,
|
|
120
|
-
eq,
|
|
121
101
|
} from '@undefineds.co/drizzle-solid';
|
|
122
102
|
|
|
123
103
|
const posts = podTable('posts', {
|
|
@@ -131,115 +111,100 @@ const posts = podTable('posts', {
|
|
|
131
111
|
type: 'http://schema.org/CreativeWork',
|
|
132
112
|
});
|
|
133
113
|
|
|
134
|
-
const
|
|
135
|
-
await
|
|
114
|
+
const client = pod(session);
|
|
115
|
+
await client.init(posts);
|
|
136
116
|
|
|
137
|
-
|
|
117
|
+
const postsCollection = client.collection(posts);
|
|
118
|
+
|
|
119
|
+
const created = await postsCollection.create({
|
|
138
120
|
id: 'post-1',
|
|
139
121
|
title: 'Hello Solid',
|
|
140
122
|
content: 'Stored as RDF in a Pod document.',
|
|
141
123
|
createdAt: new Date(),
|
|
142
124
|
});
|
|
143
125
|
|
|
144
|
-
const
|
|
145
|
-
|
|
146
|
-
|
|
126
|
+
const first = await postsCollection.first({
|
|
127
|
+
where: { id: 'post-1' },
|
|
128
|
+
});
|
|
147
129
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
130
|
+
const postIri = created?.['@id'] ?? postsCollection.iriFor({
|
|
131
|
+
id: 'post-1',
|
|
132
|
+
title: 'Hello Solid',
|
|
133
|
+
content: 'Stored as RDF in a Pod document.',
|
|
134
|
+
createdAt: new Date(),
|
|
135
|
+
});
|
|
151
136
|
|
|
152
|
-
|
|
153
|
-
|
|
137
|
+
const post = client.entity(posts, postIri);
|
|
138
|
+
await post.update({ title: 'Updated title' });
|
|
139
|
+
await post.delete();
|
|
154
140
|
```
|
|
155
141
|
|
|
156
|
-
|
|
142
|
+
> 如果你保持 `drizzle(session)` 作为入口,语义并不会变:`base`、`subjectTemplate`、`IRI`、精确写目标这些约束仍然完全成立。
|
|
157
143
|
|
|
158
|
-
|
|
159
|
-
import {
|
|
160
|
-
drizzle,
|
|
161
|
-
solidSchema,
|
|
162
|
-
id,
|
|
163
|
-
string,
|
|
164
|
-
} from '@undefineds.co/drizzle-solid';
|
|
144
|
+
## Reusable schema + runtime binding
|
|
165
145
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
146
|
+
Use `solidSchema(...)` when you want to separate the reusable data shape from where that data lives in a Pod.
|
|
147
|
+
|
|
148
|
+
如果你使用 `pod()` façade:
|
|
149
|
+
|
|
150
|
+
```ts
|
|
151
|
+
const client = pod(session);
|
|
152
|
+
const profileTable = client.bind(profileSchema, {
|
|
153
|
+
base: 'https://alice.example/profile/card',
|
|
172
154
|
});
|
|
155
|
+
```
|
|
173
156
|
|
|
174
|
-
|
|
157
|
+
如果你保持 `drizzle()` 入口:
|
|
175
158
|
|
|
159
|
+
```ts
|
|
160
|
+
const db = drizzle(session);
|
|
176
161
|
const profileTable = db.createTable(profileSchema, {
|
|
177
162
|
base: 'https://alice.example/profile/card',
|
|
178
163
|
});
|
|
179
164
|
```
|
|
180
165
|
|
|
181
|
-
##
|
|
166
|
+
## Identity and placement
|
|
182
167
|
|
|
183
|
-
|
|
168
|
+
`subjectTemplate` defines how application identity maps onto Pod resources.
|
|
184
169
|
|
|
185
|
-
|
|
186
|
-
- `db.updateByIri(table, iri, data)`
|
|
187
|
-
- `db.deleteByIri(table, iri)`
|
|
188
|
-
- `db.subscribeByIri(table, iri, options)`
|
|
170
|
+
Common patterns:
|
|
189
171
|
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
agentTable,
|
|
195
|
-
'https://alice.example/data/agents.ttl#assistant',
|
|
196
|
-
{ description: 'Updated through explicit IRI' },
|
|
197
|
-
);
|
|
198
|
-
|
|
199
|
-
await db.deleteByIri(
|
|
200
|
-
agentTable,
|
|
201
|
-
'https://alice.example/data/agents.ttl#assistant',
|
|
202
|
-
);
|
|
203
|
-
```
|
|
172
|
+
- `#{id}`: many entities inside one document
|
|
173
|
+
- `{id}.ttl`: one document per entity
|
|
174
|
+
- `{id}.ttl#it`: one document per entity with stable in-document fragment
|
|
175
|
+
- `{chatId}/messages.ttl#{id}`: multi-variable layouts and partitioned resources
|
|
204
176
|
|
|
205
|
-
|
|
177
|
+
If a layout uses multiple template variables, exact lookup is only exact when all required locator variables are present, or when you already hold the full IRI.
|
|
206
178
|
|
|
207
|
-
|
|
179
|
+
这不是命名细节,而是持久化语义本身。
|
|
208
180
|
|
|
209
|
-
|
|
181
|
+
## Type hierarchy
|
|
210
182
|
|
|
211
|
-
|
|
212
|
-
- `{id}.ttl`: document mode, one file per entity
|
|
213
|
-
- `{id}.ttl#it`: document mode with stable in-document fragment
|
|
214
|
-
- `{chatId}/{yyyy}/{MM}/{dd}/messages.ttl#{id}`: multi-variable, date-partitioned layouts
|
|
183
|
+
Class hierarchy and instance typing are not the same thing.
|
|
215
184
|
|
|
216
|
-
|
|
185
|
+
- `type` is the primary persisted `rdf:type` for an entity
|
|
186
|
+
- `subClassOf` expresses schema / vocabulary hierarchy
|
|
187
|
+
- by default, persisted instance data should keep one most-specific, authoritative `rdf:type`
|
|
188
|
+
- do not persist both a base/table type and a business subtype on the same entity unless they carry genuinely different semantics
|
|
189
|
+
- do not introduce parallel string-based type systems when the meaning is already carried by RDF class membership
|
|
190
|
+
- if parent types must be materialized for no-inference environments, treat that as an explicit compatibility mode rather than the default stored shape
|
|
217
191
|
|
|
218
|
-
|
|
219
|
-
const Message = podTable('Message', {
|
|
220
|
-
id: string('id').primaryKey(),
|
|
221
|
-
chatId: string('chatId').predicate('http://example.org/chatId'),
|
|
222
|
-
content: string('content').predicate('http://schema.org/text'),
|
|
223
|
-
timestamp: datetime('timestamp').predicate('http://schema.org/dateCreated'),
|
|
224
|
-
}, {
|
|
225
|
-
base: 'https://alice.example/data/chats/',
|
|
226
|
-
subjectTemplate: '{chatId}/messages.ttl#{id}',
|
|
227
|
-
type: 'http://schema.org/Message',
|
|
228
|
-
});
|
|
229
|
-
```
|
|
192
|
+
## Exact-target mutation semantics
|
|
230
193
|
|
|
231
|
-
|
|
194
|
+
Reads and writes do not intentionally behave the same way.
|
|
232
195
|
|
|
233
|
-
-
|
|
234
|
-
-
|
|
235
|
-
-
|
|
196
|
+
- list / filter reads can stay collection-oriented
|
|
197
|
+
- writes should prefer exact-target semantics
|
|
198
|
+
- if an API path semantically requires exact-target resolution, it should remain exact or fail explicitly; do not silently widen it into scan-style execution
|
|
199
|
+
- incomplete `where(...)` information should not silently degrade into scan + mutate
|
|
200
|
+
- if a subject can only be resolved by multiple template variables, mutation should use an explicit IRI or provide all required variables
|
|
201
|
+
- join on a multi-variable target should also provide all required locator variables, or join via full IRI values
|
|
202
|
+
- do not silently degrade unresolved multi-variable joins into scan-style fallback
|
|
236
203
|
|
|
237
|
-
|
|
204
|
+
所以最重要的变化不是“要不要换成 `pod()`”,而是:
|
|
238
205
|
|
|
239
|
-
-
|
|
240
|
-
-
|
|
241
|
-
- **No implicit scan-based `updateMany/deleteMany` fallback** is performed on backends that do not natively support set-based mutation.
|
|
242
|
-
- **Capability-based enhancement**: if a backend explicitly supports filter-based multi-row mutation in the future (for example, an xpod capability), `drizzle-solid` can expose that path there without pretending every Solid server supports it.
|
|
206
|
+
- 什么时候你只是在做集合读取
|
|
207
|
+
- 什么时候你已经需要一个确定的实体目标
|
|
243
208
|
|
|
244
209
|
## Server support
|
|
245
210
|
|
|
@@ -247,118 +212,68 @@ Read-path and write-path semantics are intentionally different:
|
|
|
247
212
|
|
|
248
213
|
| Capability | Community Solid Server | xpod |
|
|
249
214
|
| --- | --- | --- |
|
|
250
|
-
| Basic CRUD | ✅
|
|
251
|
-
|
|
|
252
|
-
|
|
|
253
|
-
|
|
|
215
|
+
| Basic CRUD | ✅ | ✅ |
|
|
216
|
+
| Document notifications | ✅ | ✅ |
|
|
217
|
+
| Drizzle-style read facade | ✅ | ✅ |
|
|
218
|
+
| SPARQL pushdown | ⚠️ Limited / often client-assisted | ✅ Better in-process support |
|
|
219
|
+
| Filter / aggregation pushdown | ❌ Mostly fallback execution | ✅ Better server-side support |
|
|
254
220
|
| Federated queries | ⚠️ Client-side federation | ⚠️ Client-side federation |
|
|
255
|
-
|
|
|
256
|
-
| In-process test runtime | ⚠️ External CSS setup | ✅ via `@undefineds.co/xpod` |
|
|
257
|
-
|
|
258
|
-
### Community Solid Server (CSS)
|
|
259
|
-
|
|
260
|
-
On plain CSS, `drizzle-solid` keeps working, but many queries are resolved through client-side execution and Solid-aware fallbacks. This is the compatibility baseline.
|
|
261
|
-
|
|
262
|
-
### xpod
|
|
221
|
+
| In-process local runtime | ⚠️ External setup | ✅ via `@undefineds.co/xpod` |
|
|
263
222
|
|
|
264
|
-
`xpod`
|
|
265
|
-
|
|
266
|
-
See `docs/xpod-features.md` for more detail.
|
|
223
|
+
If `xpod` already ships its own Comunica stack, `drizzle-solid` can reuse that copy instead of requiring another app-level install.
|
|
267
224
|
|
|
268
225
|
## Verified examples
|
|
269
226
|
|
|
270
|
-
The canonical examples in `examples/` are
|
|
271
|
-
|
|
272
|
-
- `examples/01-quick-start.ts` — CRUD quick start
|
|
273
|
-
- `examples/02-relational-query.ts` — relational query API surface
|
|
274
|
-
- `examples/03-zero-config-discovery.ts` — zero-config discovery flow
|
|
275
|
-
- `examples/04-notifications.ts` — Solid notifications
|
|
276
|
-
- `examples/05-data-discovery.ts` — discovery API
|
|
277
|
-
- `examples/06-federated-query.ts` — federated query across Pods
|
|
278
|
-
- `examples/07-hooks-and-profile.ts` — hooks and profile management
|
|
279
|
-
- `examples/08-iri-based-operations.ts` — explicit IRI operations
|
|
280
|
-
- `examples/08-schema-inheritance.ts` — schema inheritance
|
|
281
|
-
- `examples/09-multi-variable-templates.ts` — multi-variable subject templates
|
|
282
|
-
|
|
283
|
-
The example manifest lives at `examples/manifest.json`, and the integration verification lives at `tests/integration/css/examples-verification.test.ts`.
|
|
284
|
-
|
|
285
|
-
## Query surface and SQL scope
|
|
286
|
-
|
|
287
|
-
`drizzle-solid` aims to stay close to Drizzle's public builder surface where that maps cleanly to Solid.
|
|
227
|
+
The canonical examples in `examples/` are part of the real integration verification flow:
|
|
288
228
|
|
|
289
|
-
|
|
229
|
+
- `examples/01-quick-start.ts`
|
|
230
|
+
- `examples/02-relational-query.ts`
|
|
231
|
+
- `examples/03-zero-config-discovery.ts`
|
|
232
|
+
- `examples/04-notifications.ts`
|
|
233
|
+
- `examples/05-data-discovery.ts`
|
|
234
|
+
- `examples/06-federated-query.ts`
|
|
235
|
+
- `examples/07-hooks-and-profile.ts`
|
|
236
|
+
- `examples/08-iri-based-operations.ts`
|
|
237
|
+
- `examples/08-schema-inheritance.ts`
|
|
238
|
+
- `examples/09-multi-variable-templates.ts`
|
|
290
239
|
|
|
291
|
-
|
|
292
|
-
- Read-oriented query facade: `db.query.*.findMany`, `findFirst`, `findById`, `findByIRI`, `count`
|
|
293
|
-
- Conditions: `eq`, `ne`, `gt`, `gte`, `lt`, `lte`, `like`, `ilike`, `inArray`, `exists`, `and`, `or`, `not`
|
|
294
|
-
- Query features: joins, ordering, limits, offsets, distinct
|
|
295
|
-
- Aggregations: `count`, `sum`, `avg`, `min`, `max`
|
|
296
|
-
- Batch and `returning()` support where implemented by the dialect
|
|
297
|
-
- Raw **SPARQL** workflows where you need explicit graph-native control
|
|
298
|
-
|
|
299
|
-
Not the mainline contract:
|
|
300
|
-
|
|
301
|
-
- raw SQL as the primary abstraction
|
|
302
|
-
- transaction semantics identical to SQL databases
|
|
303
|
-
- implicit scan-based `updateMany/deleteMany` on backends that do not support set-based mutation
|
|
304
|
-
- driver-specific DDL, auto-increment, foreign keys, or SQL engine behaviors
|
|
240
|
+
See `examples/manifest.json` and `tests/integration/css/examples-verification.test.ts`.
|
|
305
241
|
|
|
306
|
-
|
|
242
|
+
## Migration
|
|
307
243
|
|
|
308
|
-
|
|
244
|
+
If you already know `drizzle-orm`, start here:
|
|
309
245
|
|
|
310
|
-
|
|
246
|
+
- `docs/guides/migrating-from-drizzle-orm.md`
|
|
311
247
|
|
|
312
|
-
|
|
313
|
-
- TypeIndex-driven location discovery
|
|
314
|
-
- shape-aware table generation
|
|
315
|
-
- federated queries across discovered Pod locations
|
|
316
|
-
- notifications for resource/entity updates
|
|
248
|
+
那份指南重点解释的是:
|
|
317
249
|
|
|
318
|
-
|
|
250
|
+
- `table/row` → `resource/document/entity/IRI`
|
|
251
|
+
- `link` / relation fields → RDF link / IRI link
|
|
252
|
+
- `where`-style mutation → exact-target mutation
|
|
253
|
+
- `toSQL()` / raw SQL 主心智 → `toSPARQL()` / SPARQL 主心智
|
|
319
254
|
|
|
320
|
-
|
|
321
|
-
- `docs/guides/notifications.md`
|
|
322
|
-
- `docs/guides/css-notifications.md`
|
|
323
|
-
- `docs/federated-queries.md`
|
|
324
|
-
- `docs/guides/multi-variable-templates.md`
|
|
255
|
+
而不是要求你第一步先改掉构造函数名。
|
|
325
256
|
|
|
326
257
|
## Documentation map
|
|
327
258
|
|
|
328
|
-
- `
|
|
329
|
-
- `docs/
|
|
259
|
+
- `docs/api/README.md` — current public API and constructor positioning
|
|
260
|
+
- `docs/guides/installation.md` — installation and SPARQL engine setup
|
|
261
|
+
- `docs/guides/migrating-from-drizzle-orm.md` — migration guide for Drizzle users
|
|
262
|
+
- `docs/guides/testing.md` — canonical testing policy, verification layers, and execution-path guardrails
|
|
263
|
+
- `docs/guides/context7-and-skills.md` — Context7 publication scope, skills plan, and feedback flow
|
|
264
|
+
- `docs/guides/issue-triage.md` — classify code, docs, tooling, and decision issues
|
|
265
|
+
- `docs/guides/modeling-consensus.md` — when modeling questions require multi-AI consensus instead of a single answer
|
|
266
|
+
- `docs/guides/decisions/README.md` — decision records and the template for stable repo-wide conclusions
|
|
267
|
+
- `skills/README.md` — canonical public skill pack source for future Context7 Skills publishing
|
|
268
|
+
- `examples/README.md` — curated runnable examples
|
|
330
269
|
- `docs/guides/data-discovery.md` — discovery workflows
|
|
331
|
-
- `docs/guides/
|
|
332
|
-
- `docs/
|
|
333
|
-
- `ACTION-PLAN.md` —
|
|
334
|
-
|
|
335
|
-
## Planned scope
|
|
336
|
-
|
|
337
|
-
### Current direction
|
|
338
|
-
|
|
339
|
-
The current focus is:
|
|
340
|
-
|
|
341
|
-
- typed models for application-owned Pod data
|
|
342
|
-
- explicit document and subject placement
|
|
343
|
-
- Drizzle-aligned query ergonomics
|
|
344
|
-
- practical CRUD, discovery, federation, and notification flows
|
|
345
|
-
|
|
346
|
-
### Likely next steps
|
|
347
|
-
|
|
348
|
-
- better modeling ergonomics around reusable schemas and links
|
|
349
|
-
- clearer guidance around multi-resource layouts and identity strategies
|
|
350
|
-
- continued Drizzle parity on Solid-relevant behaviors
|
|
351
|
-
- stronger documentation around Solid-native tradeoffs and migration paths
|
|
352
|
-
|
|
353
|
-
### Out of scope
|
|
354
|
-
|
|
355
|
-
- hiding Solid behind a fake SQL database mental model
|
|
356
|
-
- universal querying over arbitrary open-world RDF as the primary goal
|
|
357
|
-
- promising full relational/database feature parity where Solid semantics differ
|
|
270
|
+
- `docs/guides/notifications.md` — notification flows
|
|
271
|
+
- `docs/xpod-features.md` — xpod runtime notes
|
|
272
|
+
- `ACTION-PLAN.md` — testing/parity backlog and execution log, not the testing policy
|
|
358
273
|
|
|
359
274
|
## Contributing
|
|
360
275
|
|
|
361
|
-
Before
|
|
276
|
+
Before pushing:
|
|
362
277
|
|
|
363
278
|
```bash
|
|
364
279
|
yarn build
|
|
@@ -1,9 +1,25 @@
|
|
|
1
1
|
import { SQL } from 'drizzle-orm';
|
|
2
|
-
import { PodTable } from './schema';
|
|
2
|
+
import { PodColumnBase, PodTable } from './schema';
|
|
3
3
|
import { SPARQLQuery } from './sparql/types';
|
|
4
4
|
import { SelectQueryPlan } from './select-plan';
|
|
5
|
+
import { QueryCondition } from './query-conditions';
|
|
5
6
|
import type { UriResolver } from './uri';
|
|
6
7
|
export type { SPARQLQuery };
|
|
8
|
+
interface SimpleSelectOperation {
|
|
9
|
+
table: PodTable;
|
|
10
|
+
where?: Record<string, unknown>;
|
|
11
|
+
limit?: number;
|
|
12
|
+
offset?: number;
|
|
13
|
+
orderBy?: Array<{
|
|
14
|
+
column: string;
|
|
15
|
+
direction: 'asc' | 'desc';
|
|
16
|
+
}>;
|
|
17
|
+
distinct?: boolean;
|
|
18
|
+
}
|
|
19
|
+
interface InsertPlanInput {
|
|
20
|
+
table: PodTable;
|
|
21
|
+
rows: Array<Record<string, unknown>>;
|
|
22
|
+
}
|
|
7
23
|
/**
|
|
8
24
|
* Table registry context for URI resolution
|
|
9
25
|
*/
|
|
@@ -23,35 +39,26 @@ export declare class ASTToSPARQLConverter {
|
|
|
23
39
|
private prefixes;
|
|
24
40
|
constructor(podUrl: string, webId?: string | undefined, uriResolver?: UriResolver);
|
|
25
41
|
/**
|
|
26
|
-
* Set table registry for URI
|
|
42
|
+
* Set table registry for URI link resolution
|
|
27
43
|
*/
|
|
28
44
|
setTableRegistry(tableRegistry: Map<string, PodTable[]>, tableNameRegistry: Map<string, PodTable>, baseUri?: string): void;
|
|
29
|
-
convertSelect(ast:
|
|
30
|
-
buildWhereClauseForCondition(whereAst:
|
|
45
|
+
convertSelect(ast: Record<string, unknown>, table: PodTable, targetGraph?: string, fromSources?: string[], allowGraphVariable?: boolean): SPARQLQuery;
|
|
46
|
+
buildWhereClauseForCondition(whereAst: QueryCondition, table: PodTable): string;
|
|
31
47
|
convertSelectPlan(plan: SelectQueryPlan, targetGraph?: string, fromSources?: string[], allowGraphVariable?: boolean): SPARQLQuery;
|
|
32
|
-
convertSimpleSelect(operation:
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
offset?: number;
|
|
37
|
-
orderBy?: Array<{
|
|
38
|
-
column: string;
|
|
39
|
-
direction: 'asc' | 'desc';
|
|
40
|
-
}>;
|
|
41
|
-
distinct?: boolean;
|
|
42
|
-
}, targetGraph?: string, fromSources?: string[], allowGraphVariable?: boolean): SPARQLQuery;
|
|
43
|
-
convertInsert(valuesOrPlan: any[] | {
|
|
44
|
-
table: PodTable;
|
|
45
|
-
rows: any[];
|
|
46
|
-
}, table?: PodTable, targetGraph?: string): SPARQLQuery;
|
|
47
|
-
convertUpdate(setData: any, whereConditions: any, table: PodTable, targetGraph?: string): SPARQLQuery;
|
|
48
|
-
convertDelete(whereConditions: any, table: PodTable, targetGraph?: string): SPARQLQuery;
|
|
48
|
+
convertSimpleSelect(operation: SimpleSelectOperation, targetGraph?: string, fromSources?: string[], allowGraphVariable?: boolean): SPARQLQuery;
|
|
49
|
+
convertInsert(valuesOrPlan: Array<Record<string, unknown>> | InsertPlanInput, table?: PodTable, targetGraph?: string): SPARQLQuery;
|
|
50
|
+
convertUpdate(setData: Record<string, unknown>, whereConditions: QueryCondition | Record<string, unknown>, table: PodTable, targetGraph?: string): SPARQLQuery;
|
|
51
|
+
convertDelete(whereConditions: QueryCondition | Record<string, unknown>, table: PodTable, targetGraph?: string): SPARQLQuery;
|
|
49
52
|
getPrefixes(): Record<string, string>;
|
|
50
53
|
addPrefix(prefix: string, uri: string): void;
|
|
51
|
-
getPredicateForColumnPublic(column:
|
|
52
|
-
formatLiteralValue(value:
|
|
53
|
-
generateSubjectUri(record:
|
|
54
|
-
parseDrizzleAST(sql: SQL, _table?: PodTable):
|
|
54
|
+
getPredicateForColumnPublic(column: PodColumnBase | string | Record<string, unknown>, table: PodTable): string;
|
|
55
|
+
formatLiteralValue(value: unknown, column?: PodColumnBase | Record<string, unknown>): string | string[];
|
|
56
|
+
generateSubjectUri(record: Record<string, unknown>, table: PodTable): string;
|
|
57
|
+
parseDrizzleAST(sql: SQL, _table?: PodTable): {
|
|
58
|
+
type: 'select';
|
|
59
|
+
columns: '*';
|
|
60
|
+
where: Record<string, never>;
|
|
61
|
+
};
|
|
55
62
|
private parseWhereClause;
|
|
56
63
|
}
|
|
57
64
|
//# sourceMappingURL=ast-to-sparql.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ast-to-sparql.d.ts","sourceRoot":"","sources":["../../src/core/ast-to-sparql.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"ast-to-sparql.d.ts","sourceRoot":"","sources":["../../src/core/ast-to-sparql.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,7 +26,7 @@ class ASTToSPARQLConverter {
|
|
|
26
26
|
this.expressionBuilder = new expression_builder_1.ExpressionBuilder(this.uriResolver);
|
|
27
27
|
}
|
|
28
28
|
/**
|
|
29
|
-
* Set table registry for URI
|
|
29
|
+
* Set table registry for URI link resolution
|
|
30
30
|
*/
|
|
31
31
|
setTableRegistry(tableRegistry, tableNameRegistry, baseUri) {
|
|
32
32
|
this.tableContext = { tableRegistry, tableNameRegistry, baseUri };
|