@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
|
@@ -10,6 +10,7 @@ const helpers_1 = require("./helpers");
|
|
|
10
10
|
const uri_1 = require("../uri");
|
|
11
11
|
const order_by_1 = require("../order-by");
|
|
12
12
|
const expressions_1 = require("../expressions");
|
|
13
|
+
const query_where_policy_1 = require("../query-where-policy");
|
|
13
14
|
class SelectQueryBuilder {
|
|
14
15
|
constructor(session, fields) {
|
|
15
16
|
this.session = session;
|
|
@@ -40,23 +41,19 @@ class SelectQueryBuilder {
|
|
|
40
41
|
/**
|
|
41
42
|
* Add WHERE conditions to the query
|
|
42
43
|
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
44
|
+
* Public where() is collection-oriented.
|
|
45
|
+
* Exact-target reads must use findByLocator()/findByIri().
|
|
45
46
|
*/
|
|
46
47
|
where(conditions) {
|
|
47
48
|
if (conditions instanceof drizzle_orm_1.SQL) {
|
|
48
49
|
this.sql = conditions;
|
|
49
50
|
}
|
|
50
51
|
else if (this.isQueryCondition(conditions)) {
|
|
52
|
+
(0, query_where_policy_1.assertPublicWhereCondition)('select', conditions);
|
|
51
53
|
this.processQueryCondition(conditions);
|
|
52
54
|
}
|
|
53
55
|
else {
|
|
54
|
-
|
|
55
|
-
if (conditions && typeof conditions === 'object' && '@id' in conditions) {
|
|
56
|
-
throw new Error(`Using '@id' in where() is not supported. ` +
|
|
57
|
-
`Use db.findByIri(table, iri) for IRI-based lookups, ` +
|
|
58
|
-
`or use { id: 'value' } for id-based lookups.`);
|
|
59
|
-
}
|
|
56
|
+
(0, query_where_policy_1.assertPublicWhereObject)('select', conditions);
|
|
60
57
|
this.processWhereObject(conditions);
|
|
61
58
|
}
|
|
62
59
|
return this;
|
|
@@ -265,7 +262,7 @@ class SelectQueryBuilder {
|
|
|
265
262
|
}
|
|
266
263
|
return { table, alias, column };
|
|
267
264
|
}
|
|
268
|
-
throw new Error('Unsupported column
|
|
265
|
+
throw new Error('Unsupported column link type');
|
|
269
266
|
}
|
|
270
267
|
parseColumnReferenceString(reference) {
|
|
271
268
|
const trimmed = reference.trim();
|
|
@@ -304,6 +301,10 @@ class SelectQueryBuilder {
|
|
|
304
301
|
this.whereConditions = simpleConditions;
|
|
305
302
|
}
|
|
306
303
|
}
|
|
304
|
+
applyInternalQueryCondition(condition) {
|
|
305
|
+
this.processQueryCondition(condition);
|
|
306
|
+
return this;
|
|
307
|
+
}
|
|
307
308
|
normalizeWhereConditions() {
|
|
308
309
|
if (this.conditionTree) {
|
|
309
310
|
return this.conditionTree;
|
|
@@ -457,9 +458,12 @@ class SelectQueryBuilder {
|
|
|
457
458
|
limit: undefined,
|
|
458
459
|
offset: undefined,
|
|
459
460
|
orderBy: undefined,
|
|
461
|
+
...(hasJoins ? { joins: undefined, joinFilters: undefined } : {}),
|
|
460
462
|
...(useAggregateFallback ? { groupBy: undefined, having: undefined } : {}),
|
|
461
463
|
}
|
|
462
|
-
:
|
|
464
|
+
: (hasJoins
|
|
465
|
+
? { ...plan, joins: undefined, joinFilters: undefined }
|
|
466
|
+
: plan);
|
|
463
467
|
const operation = {
|
|
464
468
|
type: 'select',
|
|
465
469
|
table: this.selectedTable,
|
|
@@ -497,6 +501,7 @@ class SelectQueryBuilder {
|
|
|
497
501
|
}
|
|
498
502
|
if (hasJoins) {
|
|
499
503
|
intermediateRows = this.normalizeBaseRows(intermediateRows);
|
|
504
|
+
intermediateRows = this.mergeRowsBySubject(intermediateRows);
|
|
500
505
|
intermediateRows = await this.applyJoinFallback(intermediateRows);
|
|
501
506
|
intermediateRows = this.applyJoinFilters(intermediateRows);
|
|
502
507
|
}
|
|
@@ -517,7 +522,7 @@ class SelectQueryBuilder {
|
|
|
517
522
|
if (this.selectedTable) {
|
|
518
523
|
finalRows = await this.hydrateInlineColumns(finalRows, this.selectedTable, !hasJoins);
|
|
519
524
|
// 处理引用字段:将 URI 转换回 ID
|
|
520
|
-
finalRows = this.
|
|
525
|
+
finalRows = this.resolveLinkIds(finalRows, this.selectedTable);
|
|
521
526
|
}
|
|
522
527
|
if (hasJoins) {
|
|
523
528
|
finalRows = this.applyDeferredOrderBy(finalRows);
|
|
@@ -913,10 +918,19 @@ class SelectQueryBuilder {
|
|
|
913
918
|
applySubjectMetadata(rows) {
|
|
914
919
|
return rows.map((row) => this.attachSubjectMetadata(row));
|
|
915
920
|
}
|
|
921
|
+
extractSubjectValue(row) {
|
|
922
|
+
const candidate = row.subject ?? row['@id'] ?? row.uri;
|
|
923
|
+
if (typeof candidate === 'object' && candidate && 'value' in candidate) {
|
|
924
|
+
const value = candidate.value;
|
|
925
|
+
return typeof value === 'string' && value.length > 0 ? value : undefined;
|
|
926
|
+
}
|
|
927
|
+
if (typeof candidate === 'string' && candidate.length > 0) {
|
|
928
|
+
return candidate;
|
|
929
|
+
}
|
|
930
|
+
return undefined;
|
|
931
|
+
}
|
|
916
932
|
attachSubjectMetadata(row) {
|
|
917
|
-
const subjectValue =
|
|
918
|
-
? row.subject.value
|
|
919
|
-
: row.subject;
|
|
933
|
+
const subjectValue = this.extractSubjectValue(row);
|
|
920
934
|
if (typeof subjectValue === 'string' && subjectValue.length > 0) {
|
|
921
935
|
if (row['@id'] === undefined) {
|
|
922
936
|
row['@id'] = subjectValue;
|
|
@@ -946,7 +960,7 @@ class SelectQueryBuilder {
|
|
|
946
960
|
}
|
|
947
961
|
result[`${alias}.${key}`] = value;
|
|
948
962
|
}
|
|
949
|
-
const subjectValue = row
|
|
963
|
+
const subjectValue = this.extractSubjectValue(row);
|
|
950
964
|
if (subjectValue) {
|
|
951
965
|
result.subject = subjectValue;
|
|
952
966
|
result['@id'] = subjectValue;
|
|
@@ -1072,16 +1086,16 @@ class SelectQueryBuilder {
|
|
|
1072
1086
|
/**
|
|
1073
1087
|
* 处理引用字段:将 URI 转换回简单 ID
|
|
1074
1088
|
*
|
|
1075
|
-
* 对于配置了 .
|
|
1089
|
+
* 对于配置了 .link() 的列,将存储的完整 URI 转换回用户友好的 ID
|
|
1076
1090
|
* 例如:http://pod/.data/chat/chat-123/index.ttl#this -> chat-123
|
|
1077
1091
|
*/
|
|
1078
|
-
|
|
1092
|
+
resolveLinkIds(rows, table) {
|
|
1079
1093
|
if (!rows.length)
|
|
1080
1094
|
return rows;
|
|
1081
|
-
//
|
|
1095
|
+
// 找出所有链接列
|
|
1082
1096
|
const columns = Object.values(table.columns ?? {});
|
|
1083
|
-
const
|
|
1084
|
-
if (
|
|
1097
|
+
const linkColumns = columns.filter(col => col.isLink?.());
|
|
1098
|
+
if (linkColumns.length === 0)
|
|
1085
1099
|
return rows;
|
|
1086
1100
|
// 获取 URI 解析器和上下文
|
|
1087
1101
|
const dialect = this.session.getDialect?.();
|
|
@@ -1094,7 +1108,7 @@ class SelectQueryBuilder {
|
|
|
1094
1108
|
};
|
|
1095
1109
|
return rows.map(row => {
|
|
1096
1110
|
const result = { ...row };
|
|
1097
|
-
for (const col of
|
|
1111
|
+
for (const col of linkColumns) {
|
|
1098
1112
|
const value = row[col.name];
|
|
1099
1113
|
if (!value)
|
|
1100
1114
|
continue;
|
|
@@ -1102,13 +1116,13 @@ class SelectQueryBuilder {
|
|
|
1102
1116
|
if (Array.isArray(value)) {
|
|
1103
1117
|
result[col.name] = value.map(v => {
|
|
1104
1118
|
if (typeof v === 'string') {
|
|
1105
|
-
return resolver.
|
|
1119
|
+
return resolver.extractLinkId(v, col, uriContext);
|
|
1106
1120
|
}
|
|
1107
1121
|
return v;
|
|
1108
1122
|
});
|
|
1109
1123
|
}
|
|
1110
1124
|
else if (typeof value === 'string') {
|
|
1111
|
-
result[col.name] = resolver.
|
|
1125
|
+
result[col.name] = resolver.extractLinkId(value, col, uriContext);
|
|
1112
1126
|
}
|
|
1113
1127
|
}
|
|
1114
1128
|
return result;
|
|
@@ -1234,7 +1248,17 @@ class SelectQueryBuilder {
|
|
|
1234
1248
|
return;
|
|
1235
1249
|
}
|
|
1236
1250
|
if (!merged.has(key)) {
|
|
1237
|
-
|
|
1251
|
+
const normalizedRow = { ...row };
|
|
1252
|
+
Object.entries(normalizedRow).forEach(([col, value]) => {
|
|
1253
|
+
if (value === undefined)
|
|
1254
|
+
return;
|
|
1255
|
+
const colDef = this.getColumnDefinitionForRowKey(col);
|
|
1256
|
+
const isArrayType = colDef?.options?.isArray || colDef?.dataType === 'array';
|
|
1257
|
+
if (isArrayType && !Array.isArray(value)) {
|
|
1258
|
+
normalizedRow[col] = [value];
|
|
1259
|
+
}
|
|
1260
|
+
});
|
|
1261
|
+
merged.set(key, normalizedRow);
|
|
1238
1262
|
order.push(key);
|
|
1239
1263
|
return;
|
|
1240
1264
|
}
|
|
@@ -1274,7 +1298,7 @@ class SelectQueryBuilder {
|
|
|
1274
1298
|
combined.push(entry);
|
|
1275
1299
|
}
|
|
1276
1300
|
});
|
|
1277
|
-
const colDef = this.
|
|
1301
|
+
const colDef = this.getColumnDefinitionForRowKey(col);
|
|
1278
1302
|
const isArrayType = colDef?.options?.isArray || colDef?.dataType === 'array';
|
|
1279
1303
|
if (!isArrayType && combined.length > 1) {
|
|
1280
1304
|
console.warn(`[Data Integrity] Multiple values found for single-value column '${col}' on subject '${key}'. Using first value.`);
|
|
@@ -1294,6 +1318,22 @@ class SelectQueryBuilder {
|
|
|
1294
1318
|
const result = order.map((key) => merged.get(key));
|
|
1295
1319
|
return result;
|
|
1296
1320
|
}
|
|
1321
|
+
getColumnDefinitionForRowKey(key) {
|
|
1322
|
+
if (!key) {
|
|
1323
|
+
return undefined;
|
|
1324
|
+
}
|
|
1325
|
+
if (!key.includes('.')) {
|
|
1326
|
+
return this.selectedTable?.columns[key];
|
|
1327
|
+
}
|
|
1328
|
+
const [alias, columnName] = key.split('.', 2);
|
|
1329
|
+
if (!alias || !columnName) {
|
|
1330
|
+
return undefined;
|
|
1331
|
+
}
|
|
1332
|
+
if (alias === this.primaryAlias) {
|
|
1333
|
+
return this.selectedTable?.columns[columnName];
|
|
1334
|
+
}
|
|
1335
|
+
return this.aliasToTable.get(alias)?.columns?.[columnName];
|
|
1336
|
+
}
|
|
1297
1337
|
inferSourceFromChild(childIri, table) {
|
|
1298
1338
|
if (!childIri) {
|
|
1299
1339
|
return this.session.getDialect().getPodUrl();
|
|
@@ -1357,21 +1397,154 @@ class SelectQueryBuilder {
|
|
|
1357
1397
|
return [];
|
|
1358
1398
|
}
|
|
1359
1399
|
const valuesArray = Array.from(uniqueValues.values());
|
|
1400
|
+
const buildJoinQuery = () => this.session.select().from(join.table);
|
|
1360
1401
|
const joinColumnInstance = join.table.getColumn(joinRef.column);
|
|
1361
|
-
|
|
1362
|
-
if (
|
|
1363
|
-
|
|
1402
|
+
const exactJoinConditions = this.buildExactJoinLookupConditions(join, baseRows);
|
|
1403
|
+
if (exactJoinConditions && exactJoinConditions.length > 0) {
|
|
1404
|
+
const exactJoinRows = [];
|
|
1405
|
+
for (const joinCondition of exactJoinConditions) {
|
|
1406
|
+
const joinQuery = buildJoinQuery();
|
|
1407
|
+
const conditionedJoinQuery = (0, query_where_policy_1.conditionTargetsReservedIdentifier)(joinCondition)
|
|
1408
|
+
? joinQuery.applyInternalQueryCondition(joinCondition)
|
|
1409
|
+
: joinQuery.where(joinCondition);
|
|
1410
|
+
const joinRows = await conditionedJoinQuery;
|
|
1411
|
+
exactJoinRows.push(...joinRows);
|
|
1412
|
+
}
|
|
1413
|
+
return this.mergeRowsBySubject(this.normalizeJoinRows(join, exactJoinRows));
|
|
1414
|
+
}
|
|
1415
|
+
const joinLookupCondition = this.buildJoinLookupCondition(joinColumnInstance, valuesArray);
|
|
1416
|
+
if (joinLookupCondition) {
|
|
1417
|
+
const joinQuery = buildJoinQuery();
|
|
1418
|
+
const filteredJoinQuery = (0, query_where_policy_1.conditionTargetsReservedIdentifier)(joinLookupCondition)
|
|
1419
|
+
? joinQuery.applyInternalQueryCondition(joinLookupCondition)
|
|
1420
|
+
: joinQuery.where(joinLookupCondition);
|
|
1421
|
+
const joinRows = await filteredJoinQuery;
|
|
1422
|
+
return this.normalizeJoinRows(join, joinRows);
|
|
1364
1423
|
}
|
|
1365
|
-
const joinRows = await
|
|
1424
|
+
const joinRows = await buildJoinQuery();
|
|
1366
1425
|
return this.normalizeJoinRows(join, joinRows);
|
|
1367
1426
|
}
|
|
1427
|
+
buildExactJoinLookupConditions(join, baseRows) {
|
|
1428
|
+
const conditions = join.resolvedConditions ?? [];
|
|
1429
|
+
if (conditions.length === 0) {
|
|
1430
|
+
return undefined;
|
|
1431
|
+
}
|
|
1432
|
+
const [primaryCondition] = conditions;
|
|
1433
|
+
const primaryJoinRef = primaryCondition.left.alias === join.alias ? primaryCondition.left : primaryCondition.right;
|
|
1434
|
+
const primaryBaseRef = primaryJoinRef === primaryCondition.left ? primaryCondition.right : primaryCondition.left;
|
|
1435
|
+
const requiredLocatorVars = this.getRequiredSubjectTemplateVariables(join.table);
|
|
1436
|
+
const joinUsesTemplateScopedId = primaryJoinRef.column === 'id' && requiredLocatorVars.length > 0;
|
|
1437
|
+
if (!joinUsesTemplateScopedId && conditions.length === 1) {
|
|
1438
|
+
return undefined;
|
|
1439
|
+
}
|
|
1440
|
+
const locatorConditionMap = new Map();
|
|
1441
|
+
for (const condition of conditions) {
|
|
1442
|
+
const joinRef = condition.left.alias === join.alias ? condition.left : condition.right;
|
|
1443
|
+
locatorConditionMap.set(joinRef.column, condition);
|
|
1444
|
+
}
|
|
1445
|
+
const exactConditions = [];
|
|
1446
|
+
const seen = new Set();
|
|
1447
|
+
for (const baseRow of baseRows) {
|
|
1448
|
+
const primaryValue = this.getRowValueForColumn(baseRow, primaryBaseRef);
|
|
1449
|
+
if (primaryValue === undefined || primaryValue === null) {
|
|
1450
|
+
continue;
|
|
1451
|
+
}
|
|
1452
|
+
const primaryIsAbsoluteIri = typeof primaryValue === 'string' && this.isAbsoluteIri(primaryValue);
|
|
1453
|
+
const clauses = [];
|
|
1454
|
+
const dedupeParts = [];
|
|
1455
|
+
let skipRow = false;
|
|
1456
|
+
for (const condition of conditions) {
|
|
1457
|
+
const joinRef = condition.left.alias === join.alias ? condition.left : condition.right;
|
|
1458
|
+
const baseRef = joinRef === condition.left ? condition.right : condition.left;
|
|
1459
|
+
const baseValue = this.getRowValueForColumn(baseRow, baseRef);
|
|
1460
|
+
if (baseValue === undefined || baseValue === null) {
|
|
1461
|
+
if (joinUsesTemplateScopedId && !primaryIsAbsoluteIri && requiredLocatorVars.includes(joinRef.column)) {
|
|
1462
|
+
throw new Error(this.buildMissingJoinLocatorError(join, requiredLocatorVars.filter((variable) => {
|
|
1463
|
+
const variableCondition = locatorConditionMap.get(variable);
|
|
1464
|
+
if (!variableCondition) {
|
|
1465
|
+
return true;
|
|
1466
|
+
}
|
|
1467
|
+
const variableJoinRef = variableCondition.left.alias === join.alias ? variableCondition.left : variableCondition.right;
|
|
1468
|
+
const variableBaseRef = variableJoinRef === variableCondition.left ? variableCondition.right : variableCondition.left;
|
|
1469
|
+
const variableValue = this.getRowValueForColumn(baseRow, variableBaseRef);
|
|
1470
|
+
return variableValue === undefined || variableValue === null;
|
|
1471
|
+
})));
|
|
1472
|
+
}
|
|
1473
|
+
skipRow = true;
|
|
1474
|
+
break;
|
|
1475
|
+
}
|
|
1476
|
+
const joinColumn = join.table.getColumn(joinRef.column);
|
|
1477
|
+
if (!joinColumn) {
|
|
1478
|
+
skipRow = true;
|
|
1479
|
+
break;
|
|
1480
|
+
}
|
|
1481
|
+
clauses.push((0, query_conditions_1.eq)(joinColumn, baseValue));
|
|
1482
|
+
dedupeParts.push(`${joinRef.column}:${this.serializeValueForKey(baseValue)}`);
|
|
1483
|
+
}
|
|
1484
|
+
if (skipRow) {
|
|
1485
|
+
continue;
|
|
1486
|
+
}
|
|
1487
|
+
if (joinUsesTemplateScopedId && !primaryIsAbsoluteIri) {
|
|
1488
|
+
const missingLocatorVars = requiredLocatorVars.filter((variable) => {
|
|
1489
|
+
const variableCondition = locatorConditionMap.get(variable);
|
|
1490
|
+
if (!variableCondition) {
|
|
1491
|
+
return true;
|
|
1492
|
+
}
|
|
1493
|
+
const variableJoinRef = variableCondition.left.alias === join.alias ? variableCondition.left : variableCondition.right;
|
|
1494
|
+
const variableBaseRef = variableJoinRef === variableCondition.left ? variableCondition.right : variableCondition.left;
|
|
1495
|
+
const variableValue = this.getRowValueForColumn(baseRow, variableBaseRef);
|
|
1496
|
+
return variableValue === undefined || variableValue === null;
|
|
1497
|
+
});
|
|
1498
|
+
if (missingLocatorVars.length > 0) {
|
|
1499
|
+
throw new Error(this.buildMissingJoinLocatorError(join, missingLocatorVars));
|
|
1500
|
+
}
|
|
1501
|
+
}
|
|
1502
|
+
if (clauses.length === 0) {
|
|
1503
|
+
continue;
|
|
1504
|
+
}
|
|
1505
|
+
const dedupeKey = dedupeParts.join('|');
|
|
1506
|
+
if (seen.has(dedupeKey)) {
|
|
1507
|
+
continue;
|
|
1508
|
+
}
|
|
1509
|
+
seen.add(dedupeKey);
|
|
1510
|
+
exactConditions.push(clauses.length === 1 ? clauses[0] : (0, query_conditions_1.and)(...clauses));
|
|
1511
|
+
}
|
|
1512
|
+
return exactConditions.length > 0 ? exactConditions : undefined;
|
|
1513
|
+
}
|
|
1514
|
+
buildJoinLookupCondition(joinColumnInstance, valuesArray) {
|
|
1515
|
+
if (!joinColumnInstance || valuesArray.length === 0) {
|
|
1516
|
+
return undefined;
|
|
1517
|
+
}
|
|
1518
|
+
if (valuesArray.length === 1) {
|
|
1519
|
+
return (0, query_conditions_1.eq)(joinColumnInstance, valuesArray[0]);
|
|
1520
|
+
}
|
|
1521
|
+
return (0, query_conditions_1.inArray)(joinColumnInstance, valuesArray);
|
|
1522
|
+
}
|
|
1523
|
+
getRequiredSubjectTemplateVariables(table) {
|
|
1524
|
+
const template = table.getSubjectTemplate?.() ?? table.config?.subjectTemplate ?? '';
|
|
1525
|
+
return Array.from(template.matchAll(/\{([^}]+)\}/g))
|
|
1526
|
+
.map((match) => match[1])
|
|
1527
|
+
.filter((variable) => variable !== 'id' && variable !== 'index');
|
|
1528
|
+
}
|
|
1529
|
+
isAbsoluteIri(value) {
|
|
1530
|
+
return /^[a-zA-Z][\w+.-]*:\/\//.test(value);
|
|
1531
|
+
}
|
|
1532
|
+
buildMissingJoinLocatorError(join, missingVariables) {
|
|
1533
|
+
const template = join.table.getSubjectTemplate?.() ?? join.table.config?.subjectTemplate ?? '{id}';
|
|
1534
|
+
const uniqueMissingVariables = Array.from(new Set(missingVariables));
|
|
1535
|
+
const exampleVariable = uniqueMissingVariables[0] ?? '...';
|
|
1536
|
+
return (`Cannot join table "${join.table.config.name ?? 'unknown'}" by id with subjectTemplate "${template}" ` +
|
|
1537
|
+
`because locator variable(s) [${uniqueMissingVariables.join(', ')}] are missing. ` +
|
|
1538
|
+
`Add join conditions for all required template variables (for example eq(base.${exampleVariable}, join.${exampleVariable})) ` +
|
|
1539
|
+
`or join via full IRI values.`);
|
|
1540
|
+
}
|
|
1368
1541
|
normalizeJoinRows(join, rows) {
|
|
1369
1542
|
return rows.map((row) => {
|
|
1370
1543
|
const normalized = {};
|
|
1371
1544
|
for (const [key, value] of Object.entries(row)) {
|
|
1372
1545
|
normalized[`${join.alias}.${key}`] = value;
|
|
1373
1546
|
}
|
|
1374
|
-
const subjectValue = row
|
|
1547
|
+
const subjectValue = this.extractSubjectValue(row);
|
|
1375
1548
|
if (subjectValue) {
|
|
1376
1549
|
normalized.subject = subjectValue;
|
|
1377
1550
|
normalized['@id'] = subjectValue;
|
|
@@ -1423,7 +1596,8 @@ class SelectQueryBuilder {
|
|
|
1423
1596
|
for (const baseRow of baseRows) {
|
|
1424
1597
|
const baseValue = this.getRowValueForColumn(baseRow, baseRef);
|
|
1425
1598
|
const key = this.serializeValueForKey(baseValue);
|
|
1426
|
-
const
|
|
1599
|
+
const primaryMatches = baseValue !== undefined && baseValue !== null ? joinValueMap.get(key) ?? [] : [];
|
|
1600
|
+
const matches = primaryMatches.filter((joinRow) => this.joinRowMatchesAllConditions(baseRow, joinRow, join.alias, conditions));
|
|
1427
1601
|
if (matches.length === 0) {
|
|
1428
1602
|
if (join.type === 'innerJoin') {
|
|
1429
1603
|
continue;
|
|
@@ -1437,6 +1611,18 @@ class SelectQueryBuilder {
|
|
|
1437
1611
|
}
|
|
1438
1612
|
return merged;
|
|
1439
1613
|
}
|
|
1614
|
+
joinRowMatchesAllConditions(baseRow, joinRow, joinAlias, conditions) {
|
|
1615
|
+
return conditions.every((condition) => {
|
|
1616
|
+
const joinRef = condition.left.alias === joinAlias ? condition.left : condition.right;
|
|
1617
|
+
const baseRef = joinRef === condition.left ? condition.right : condition.left;
|
|
1618
|
+
const baseValue = this.getRowValueForColumn(baseRow, baseRef);
|
|
1619
|
+
const joinValue = this.getRowValueForColumn(joinRow, joinRef);
|
|
1620
|
+
if (baseValue === undefined || baseValue === null || joinValue === undefined || joinValue === null) {
|
|
1621
|
+
return false;
|
|
1622
|
+
}
|
|
1623
|
+
return this.serializeValueForKey(baseValue) === this.serializeValueForKey(joinValue);
|
|
1624
|
+
});
|
|
1625
|
+
}
|
|
1440
1626
|
createEmptyJoinRow(join) {
|
|
1441
1627
|
const empty = {};
|
|
1442
1628
|
for (const columnName of Object.keys(join.table.columns)) {
|