@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
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { entityKind, SQL } from 'drizzle-orm';
|
|
2
2
|
import { PodTable, PodColumnBase, InferTableData } from '../schema';
|
|
3
|
-
import { QueryCondition } from '../query-conditions';
|
|
3
|
+
import { QueryCondition, type PublicQueryCondition, type PublicWhereObject } from '../query-conditions';
|
|
4
4
|
import { SelectQueryPlan } from '../select-plan';
|
|
5
5
|
import { SelectFieldMap, SessionInterface } from './types';
|
|
6
6
|
import { type OrderByExpression } from '../order-by';
|
|
@@ -32,10 +32,10 @@ export declare class SelectQueryBuilder<TTable extends PodTable<any> = PodTable<
|
|
|
32
32
|
/**
|
|
33
33
|
* Add WHERE conditions to the query
|
|
34
34
|
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
35
|
+
* Public where() is collection-oriented.
|
|
36
|
+
* Exact-target reads must use findByLocator()/findByIri().
|
|
37
37
|
*/
|
|
38
|
-
where(conditions:
|
|
38
|
+
where(conditions: PublicWhereObject | SQL | PublicQueryCondition): this;
|
|
39
39
|
/**
|
|
40
40
|
* Internal method that allows @id in conditions.
|
|
41
41
|
* Used by *ByIri methods internally.
|
|
@@ -62,6 +62,7 @@ export declare class SelectQueryBuilder<TTable extends PodTable<any> = PodTable<
|
|
|
62
62
|
private parseColumnReferenceString;
|
|
63
63
|
private processWhereObject;
|
|
64
64
|
private processQueryCondition;
|
|
65
|
+
private applyInternalQueryCondition;
|
|
65
66
|
private normalizeWhereConditions;
|
|
66
67
|
toIR(): SelectQueryPlan;
|
|
67
68
|
private buildQueryPlan;
|
|
@@ -97,16 +98,17 @@ export declare class SelectQueryBuilder<TTable extends PodTable<any> = PodTable<
|
|
|
97
98
|
private hasAggregateSelection;
|
|
98
99
|
private hasMixedAggregateSelection;
|
|
99
100
|
private applySubjectMetadata;
|
|
101
|
+
private extractSubjectValue;
|
|
100
102
|
private attachSubjectMetadata;
|
|
101
103
|
private normalizeBaseRows;
|
|
102
104
|
private hydrateInlineColumns;
|
|
103
105
|
/**
|
|
104
106
|
* 处理引用字段:将 URI 转换回简单 ID
|
|
105
107
|
*
|
|
106
|
-
* 对于配置了 .
|
|
108
|
+
* 对于配置了 .link() 的列,将存储的完整 URI 转换回用户友好的 ID
|
|
107
109
|
* 例如:http://pod/.data/chat/chat-123/index.ttl#this -> chat-123
|
|
108
110
|
*/
|
|
109
|
-
private
|
|
111
|
+
private resolveLinkIds;
|
|
110
112
|
private normalizeInlinePredicateKey;
|
|
111
113
|
private normalizeInlineObjectValue;
|
|
112
114
|
private normalizeInlineIri;
|
|
@@ -116,12 +118,19 @@ export declare class SelectQueryBuilder<TTable extends PodTable<any> = PodTable<
|
|
|
116
118
|
private getOrderByValue;
|
|
117
119
|
private compareOrderByValues;
|
|
118
120
|
private mergeRowsBySubject;
|
|
121
|
+
private getColumnDefinitionForRowKey;
|
|
119
122
|
private inferSourceFromChild;
|
|
120
123
|
private isInlineObjectColumn;
|
|
121
124
|
private applyJoinFallback;
|
|
122
125
|
private fetchJoinRows;
|
|
126
|
+
private buildExactJoinLookupConditions;
|
|
127
|
+
private buildJoinLookupCondition;
|
|
128
|
+
private getRequiredSubjectTemplateVariables;
|
|
129
|
+
private isAbsoluteIri;
|
|
130
|
+
private buildMissingJoinLocatorError;
|
|
123
131
|
private normalizeJoinRows;
|
|
124
132
|
private mergeRowsWithJoin;
|
|
133
|
+
private joinRowMatchesAllConditions;
|
|
125
134
|
private createEmptyJoinRow;
|
|
126
135
|
private applyJoinFilters;
|
|
127
136
|
private applyHavingFilter;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"select-query-builder.d.ts","sourceRoot":"","sources":["../../../../src/core/query-builders/select-query-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACpE,OAAO,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"select-query-builder.d.ts","sourceRoot":"","sources":["../../../../src/core/query-builders/select-query-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,KAAK,oBAAoB,EAAE,KAAK,iBAAiB,EAAoB,MAAM,qBAAqB,CAAC;AAG1H,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EACQ,cAAc,EAAoD,gBAAgB,EAChG,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAuB,KAAK,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAG1D,qBAAa,kBAAkB,CAAC,MAAM,SAAS,QAAQ,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC;IA2BvD,OAAO,EAAE,gBAAgB;IA1B5C,MAAM,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,wBAAwB;IAE7C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7C,OAAO,CAAC,aAAa,CAAC,CAAiB;IAChC,GAAG,CAAC,EAAE,GAAG,CAAC;IACjB,OAAO,CAAC,KAAK,CAML;IACR,OAAO,CAAC,UAAU,CAAC,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAC,CAAS;IAC7B,OAAO,CAAC,cAAc,CAA4D;IAClF,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,YAAY,CAAoC;IACxD,OAAO,CAAC,YAAY,CAAoC;IACxD,OAAO,CAAC,UAAU,CAA6B;IAC/C,OAAO,CAAC,YAAY,CAAC,CAAS;IAC9B,OAAO,CAAC,WAAW,CAAwB;IAC3C,OAAO,CAAC,cAAc,CAAyB;IAC/C,OAAO,CAAC,eAAe,CAAC,CAAiB;gBAEtB,OAAO,EAAE,gBAAgB,EAAE,MAAM,CAAC,EAAE,cAAc;IAMrE,IAAI,CAAC,UAAU,SAAS,QAAQ,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,UAAU,GAAG,kBAAkB,CAAC,UAAU,CAAC;IAMzF,OAAO,CAAC,MAAM,EAAE,cAAc;IAK9B,OAAO,CAAC,iBAAiB;IAIzB;;;;;OAKG;IACH,KAAK,CAAC,UAAU,EAAE,iBAAiB,GAAG,GAAG,GAAG,oBAAoB;IAahE;;;;OAIG;IACH,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE;IAKjC,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,6BAA6B;IAgCrC,OAAO,CAAC,yBAAyB;IAqBjC,QAAQ,CAAC,UAAU,SAAS,QAAQ,CAAC,GAAG,CAAC,EACvC,KAAK,EAAE,UAAU,EACjB,SAAS,EAAE,GAAG,GACb,kBAAkB,CAAC,MAAM,CAAC;IAI7B,SAAS,CAAC,UAAU,SAAS,QAAQ,CAAC,GAAG,CAAC,EACxC,KAAK,EAAE,UAAU,EACjB,SAAS,EAAE,GAAG,GACb,kBAAkB,CAAC,MAAM,CAAC;IAI7B,SAAS,CAAC,UAAU,SAAS,QAAQ,CAAC,GAAG,CAAC,EACxC,KAAK,EAAE,UAAU,EACjB,SAAS,EAAE,GAAG,GACb,kBAAkB,CAAC,MAAM,CAAC;IAI7B,QAAQ,CAAC,UAAU,SAAS,QAAQ,CAAC,GAAG,CAAC,EACvC,KAAK,EAAE,UAAU,EACjB,SAAS,EAAE,GAAG,GACb,kBAAkB,CAAC,MAAM,CAAC;IAI7B,SAAS,CAAC,UAAU,SAAS,QAAQ,CAAC,GAAG,CAAC,EACxC,KAAK,EAAE,UAAU,GAChB,kBAAkB,CAAC,MAAM,CAAC;IAI7B,OAAO,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,aAAa,GAAG,MAAM,CAAC,GAAG,kBAAkB,CAAC,MAAM,CAAC;IAM7E,MAAM,CACJ,SAAS,EAAE,cAAc,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,KAAK,cAAc,CAAC,GACjG,kBAAkB,CAAC,MAAM,CAAC;IAO7B,OAAO,CAAC,0BAA0B;IAUlC,OAAO,CAAC,OAAO;IAyBf,OAAO,CAAC,mBAAmB;IAiB3B,OAAO,CAAC,qBAAqB;IA0B7B,OAAO,CAAC,8BAA8B;IA8BtC,OAAO,CAAC,2BAA2B;IAoBnC,OAAO,CAAC,sBAAsB;IA0B9B,OAAO,CAAC,0BAA0B;IASlC,OAAO,CAAC,kBAAkB;IAsB1B,OAAO,CAAC,qBAAqB;IAe7B,OAAO,CAAC,2BAA2B;IAKnC,OAAO,CAAC,wBAAwB;IAQzB,IAAI,IAAI,eAAe;IAK9B,OAAO,CAAC,cAAc;IAwCtB,KAAK,CAAC,KAAK,EAAE,MAAM;IAQnB,MAAM,CAAC,KAAK,EAAE,MAAM;IAQpB,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,aAAa,GAAG,MAAM,GAAG,iBAAiB,GAAG,KAAK,GAAG,MAAM,CAAC;IA+BnF,QAAQ,CAAC,MAAM,UAAO;IAMtB,OAAO,CAAC,gBAAgB;IA8BxB,QAAQ;IAIR,QAAQ;IAIF,OAAO,IAAI,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;IA6HlD,OAAO,CAAC,kBAAkB;IAQ1B,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,iBAAiB;IAoCzB,OAAO,CAAC,iBAAiB;IAuBzB,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,uBAAuB;IA2B/B,OAAO,CAAC,qBAAqB;IAc7B,OAAO,CAAC,6BAA6B;IA0BrC,OAAO,CAAC,2BAA2B;IAkBnC,OAAO,CAAC,0BAA0B;IAqBlC,OAAO,CAAC,iBAAiB;IAgBzB,OAAO,CAAC,qBAAqB;IAyC7B,OAAO,CAAC,yBAAyB;IAwBjC,OAAO,CAAC,qBAAqB;IAqB7B,OAAO,CAAC,oBAAoB;IA6B5B,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,uBAAuB;IAwB/B,OAAO,CAAC,yBAAyB;IAsCjC,OAAO,CAAC,qBAAqB;IAsB7B,OAAO,CAAC,wBAAwB;IAYhC,OAAO,CAAC,qBAAqB;IAQ7B,OAAO,CAAC,0BAA0B;IAUlC,OAAO,CAAC,oBAAoB;IAI5B,OAAO,CAAC,mBAAmB;IAe3B,OAAO,CAAC,qBAAqB;IAoB7B,OAAO,CAAC,iBAAiB;YAqCX,oBAAoB;IA2HlC;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IA4CtB,OAAO,CAAC,2BAA2B;IAkBnC,OAAO,CAAC,0BAA0B;IASlC,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,oBAAoB;IAsB5B,OAAO,CAAC,iBAAiB;IAmBzB,OAAO,CAAC,2BAA2B;IAWnC,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,oBAAoB;IAoB5B,OAAO,CAAC,kBAAkB;IAkF1B,OAAO,CAAC,4BAA4B;IAqBpC,OAAO,CAAC,oBAAoB;IAkB5B,OAAO,CAAC,oBAAoB;YAUd,iBAAiB;YAWjB,aAAa;IAyE3B,OAAO,CAAC,8BAA8B;IAmHtC,OAAO,CAAC,wBAAwB;IAehC,OAAO,CAAC,mCAAmC;IAO3C,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,4BAA4B;IAgBpC,OAAO,CAAC,iBAAiB;IA+BzB,OAAO,CAAC,iBAAiB;IAqEzB,OAAO,CAAC,2BAA2B;IAkBnC,OAAO,CAAC,kBAAkB;IAU1B,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,iBAAiB;IAazB,OAAO,CAAC,uBAAuB;IAqC/B,OAAO,CAAC,sBAAsB;IAwB9B,OAAO,CAAC,wBAAwB;IAYhC,OAAO,CAAC,4BAA4B;IAiBpC,OAAO,CAAC,sBAAsB;IAU9B,OAAO,CAAC,oBAAoB;IAU5B,OAAO,CAAC,oBAAoB;IAU5B,OAAO,CAAC,oBAAoB;IAoC5B,OAAO,CAAC,gBAAgB;IAOlB,oBAAoB,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAYzF,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,GAAG,KAAK,EAC1F,WAAW,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,GAAG,SAAS,GAAG,IAAI,EAC1I,UAAU,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,GAAG,KAAK,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,GAAG,SAAS,GAAG,IAAI,GAClF,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;CAGhC"}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
var _a;
|
|
2
2
|
import { entityKind, SQL } from 'drizzle-orm';
|
|
3
3
|
import { PodTable, PodColumnBase } from '../schema';
|
|
4
|
-
import { inArray } from '../query-conditions';
|
|
4
|
+
import { and, eq, inArray } from '../query-conditions';
|
|
5
5
|
import { isAggregateExpression } from '../aggregates';
|
|
6
6
|
import { createLiteralCondition, buildConditionTreeFromObject, inferSPARQLQueryType } from './helpers';
|
|
7
7
|
import { UriResolverImpl } from '../uri';
|
|
8
8
|
import { isOrderByExpression } from '../order-by';
|
|
9
9
|
import { SelectionAliasExpression } from '../expressions';
|
|
10
|
+
import { assertPublicWhereCondition, assertPublicWhereObject, conditionTargetsReservedIdentifier } from '../query-where-policy';
|
|
10
11
|
export class SelectQueryBuilder {
|
|
11
12
|
constructor(session, fields) {
|
|
12
13
|
this.session = session;
|
|
@@ -37,23 +38,19 @@ export class SelectQueryBuilder {
|
|
|
37
38
|
/**
|
|
38
39
|
* Add WHERE conditions to the query
|
|
39
40
|
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
41
|
+
* Public where() is collection-oriented.
|
|
42
|
+
* Exact-target reads must use findByLocator()/findByIri().
|
|
42
43
|
*/
|
|
43
44
|
where(conditions) {
|
|
44
45
|
if (conditions instanceof SQL) {
|
|
45
46
|
this.sql = conditions;
|
|
46
47
|
}
|
|
47
48
|
else if (this.isQueryCondition(conditions)) {
|
|
49
|
+
assertPublicWhereCondition('select', conditions);
|
|
48
50
|
this.processQueryCondition(conditions);
|
|
49
51
|
}
|
|
50
52
|
else {
|
|
51
|
-
|
|
52
|
-
if (conditions && typeof conditions === 'object' && '@id' in conditions) {
|
|
53
|
-
throw new Error(`Using '@id' in where() is not supported. ` +
|
|
54
|
-
`Use db.findByIri(table, iri) for IRI-based lookups, ` +
|
|
55
|
-
`or use { id: 'value' } for id-based lookups.`);
|
|
56
|
-
}
|
|
53
|
+
assertPublicWhereObject('select', conditions);
|
|
57
54
|
this.processWhereObject(conditions);
|
|
58
55
|
}
|
|
59
56
|
return this;
|
|
@@ -262,7 +259,7 @@ export class SelectQueryBuilder {
|
|
|
262
259
|
}
|
|
263
260
|
return { table, alias, column };
|
|
264
261
|
}
|
|
265
|
-
throw new Error('Unsupported column
|
|
262
|
+
throw new Error('Unsupported column link type');
|
|
266
263
|
}
|
|
267
264
|
parseColumnReferenceString(reference) {
|
|
268
265
|
const trimmed = reference.trim();
|
|
@@ -301,6 +298,10 @@ export class SelectQueryBuilder {
|
|
|
301
298
|
this.whereConditions = simpleConditions;
|
|
302
299
|
}
|
|
303
300
|
}
|
|
301
|
+
applyInternalQueryCondition(condition) {
|
|
302
|
+
this.processQueryCondition(condition);
|
|
303
|
+
return this;
|
|
304
|
+
}
|
|
304
305
|
normalizeWhereConditions() {
|
|
305
306
|
if (this.conditionTree) {
|
|
306
307
|
return this.conditionTree;
|
|
@@ -454,9 +455,12 @@ export class SelectQueryBuilder {
|
|
|
454
455
|
limit: undefined,
|
|
455
456
|
offset: undefined,
|
|
456
457
|
orderBy: undefined,
|
|
458
|
+
...(hasJoins ? { joins: undefined, joinFilters: undefined } : {}),
|
|
457
459
|
...(useAggregateFallback ? { groupBy: undefined, having: undefined } : {}),
|
|
458
460
|
}
|
|
459
|
-
:
|
|
461
|
+
: (hasJoins
|
|
462
|
+
? { ...plan, joins: undefined, joinFilters: undefined }
|
|
463
|
+
: plan);
|
|
460
464
|
const operation = {
|
|
461
465
|
type: 'select',
|
|
462
466
|
table: this.selectedTable,
|
|
@@ -494,6 +498,7 @@ export class SelectQueryBuilder {
|
|
|
494
498
|
}
|
|
495
499
|
if (hasJoins) {
|
|
496
500
|
intermediateRows = this.normalizeBaseRows(intermediateRows);
|
|
501
|
+
intermediateRows = this.mergeRowsBySubject(intermediateRows);
|
|
497
502
|
intermediateRows = await this.applyJoinFallback(intermediateRows);
|
|
498
503
|
intermediateRows = this.applyJoinFilters(intermediateRows);
|
|
499
504
|
}
|
|
@@ -514,7 +519,7 @@ export class SelectQueryBuilder {
|
|
|
514
519
|
if (this.selectedTable) {
|
|
515
520
|
finalRows = await this.hydrateInlineColumns(finalRows, this.selectedTable, !hasJoins);
|
|
516
521
|
// 处理引用字段:将 URI 转换回 ID
|
|
517
|
-
finalRows = this.
|
|
522
|
+
finalRows = this.resolveLinkIds(finalRows, this.selectedTable);
|
|
518
523
|
}
|
|
519
524
|
if (hasJoins) {
|
|
520
525
|
finalRows = this.applyDeferredOrderBy(finalRows);
|
|
@@ -910,10 +915,19 @@ export class SelectQueryBuilder {
|
|
|
910
915
|
applySubjectMetadata(rows) {
|
|
911
916
|
return rows.map((row) => this.attachSubjectMetadata(row));
|
|
912
917
|
}
|
|
918
|
+
extractSubjectValue(row) {
|
|
919
|
+
const candidate = row.subject ?? row['@id'] ?? row.uri;
|
|
920
|
+
if (typeof candidate === 'object' && candidate && 'value' in candidate) {
|
|
921
|
+
const value = candidate.value;
|
|
922
|
+
return typeof value === 'string' && value.length > 0 ? value : undefined;
|
|
923
|
+
}
|
|
924
|
+
if (typeof candidate === 'string' && candidate.length > 0) {
|
|
925
|
+
return candidate;
|
|
926
|
+
}
|
|
927
|
+
return undefined;
|
|
928
|
+
}
|
|
913
929
|
attachSubjectMetadata(row) {
|
|
914
|
-
const subjectValue =
|
|
915
|
-
? row.subject.value
|
|
916
|
-
: row.subject;
|
|
930
|
+
const subjectValue = this.extractSubjectValue(row);
|
|
917
931
|
if (typeof subjectValue === 'string' && subjectValue.length > 0) {
|
|
918
932
|
if (row['@id'] === undefined) {
|
|
919
933
|
row['@id'] = subjectValue;
|
|
@@ -943,7 +957,7 @@ export class SelectQueryBuilder {
|
|
|
943
957
|
}
|
|
944
958
|
result[`${alias}.${key}`] = value;
|
|
945
959
|
}
|
|
946
|
-
const subjectValue = row
|
|
960
|
+
const subjectValue = this.extractSubjectValue(row);
|
|
947
961
|
if (subjectValue) {
|
|
948
962
|
result.subject = subjectValue;
|
|
949
963
|
result['@id'] = subjectValue;
|
|
@@ -1069,16 +1083,16 @@ export class SelectQueryBuilder {
|
|
|
1069
1083
|
/**
|
|
1070
1084
|
* 处理引用字段:将 URI 转换回简单 ID
|
|
1071
1085
|
*
|
|
1072
|
-
* 对于配置了 .
|
|
1086
|
+
* 对于配置了 .link() 的列,将存储的完整 URI 转换回用户友好的 ID
|
|
1073
1087
|
* 例如:http://pod/.data/chat/chat-123/index.ttl#this -> chat-123
|
|
1074
1088
|
*/
|
|
1075
|
-
|
|
1089
|
+
resolveLinkIds(rows, table) {
|
|
1076
1090
|
if (!rows.length)
|
|
1077
1091
|
return rows;
|
|
1078
|
-
//
|
|
1092
|
+
// 找出所有链接列
|
|
1079
1093
|
const columns = Object.values(table.columns ?? {});
|
|
1080
|
-
const
|
|
1081
|
-
if (
|
|
1094
|
+
const linkColumns = columns.filter(col => col.isLink?.());
|
|
1095
|
+
if (linkColumns.length === 0)
|
|
1082
1096
|
return rows;
|
|
1083
1097
|
// 获取 URI 解析器和上下文
|
|
1084
1098
|
const dialect = this.session.getDialect?.();
|
|
@@ -1091,7 +1105,7 @@ export class SelectQueryBuilder {
|
|
|
1091
1105
|
};
|
|
1092
1106
|
return rows.map(row => {
|
|
1093
1107
|
const result = { ...row };
|
|
1094
|
-
for (const col of
|
|
1108
|
+
for (const col of linkColumns) {
|
|
1095
1109
|
const value = row[col.name];
|
|
1096
1110
|
if (!value)
|
|
1097
1111
|
continue;
|
|
@@ -1099,13 +1113,13 @@ export class SelectQueryBuilder {
|
|
|
1099
1113
|
if (Array.isArray(value)) {
|
|
1100
1114
|
result[col.name] = value.map(v => {
|
|
1101
1115
|
if (typeof v === 'string') {
|
|
1102
|
-
return resolver.
|
|
1116
|
+
return resolver.extractLinkId(v, col, uriContext);
|
|
1103
1117
|
}
|
|
1104
1118
|
return v;
|
|
1105
1119
|
});
|
|
1106
1120
|
}
|
|
1107
1121
|
else if (typeof value === 'string') {
|
|
1108
|
-
result[col.name] = resolver.
|
|
1122
|
+
result[col.name] = resolver.extractLinkId(value, col, uriContext);
|
|
1109
1123
|
}
|
|
1110
1124
|
}
|
|
1111
1125
|
return result;
|
|
@@ -1231,7 +1245,17 @@ export class SelectQueryBuilder {
|
|
|
1231
1245
|
return;
|
|
1232
1246
|
}
|
|
1233
1247
|
if (!merged.has(key)) {
|
|
1234
|
-
|
|
1248
|
+
const normalizedRow = { ...row };
|
|
1249
|
+
Object.entries(normalizedRow).forEach(([col, value]) => {
|
|
1250
|
+
if (value === undefined)
|
|
1251
|
+
return;
|
|
1252
|
+
const colDef = this.getColumnDefinitionForRowKey(col);
|
|
1253
|
+
const isArrayType = colDef?.options?.isArray || colDef?.dataType === 'array';
|
|
1254
|
+
if (isArrayType && !Array.isArray(value)) {
|
|
1255
|
+
normalizedRow[col] = [value];
|
|
1256
|
+
}
|
|
1257
|
+
});
|
|
1258
|
+
merged.set(key, normalizedRow);
|
|
1235
1259
|
order.push(key);
|
|
1236
1260
|
return;
|
|
1237
1261
|
}
|
|
@@ -1271,7 +1295,7 @@ export class SelectQueryBuilder {
|
|
|
1271
1295
|
combined.push(entry);
|
|
1272
1296
|
}
|
|
1273
1297
|
});
|
|
1274
|
-
const colDef = this.
|
|
1298
|
+
const colDef = this.getColumnDefinitionForRowKey(col);
|
|
1275
1299
|
const isArrayType = colDef?.options?.isArray || colDef?.dataType === 'array';
|
|
1276
1300
|
if (!isArrayType && combined.length > 1) {
|
|
1277
1301
|
console.warn(`[Data Integrity] Multiple values found for single-value column '${col}' on subject '${key}'. Using first value.`);
|
|
@@ -1291,6 +1315,22 @@ export class SelectQueryBuilder {
|
|
|
1291
1315
|
const result = order.map((key) => merged.get(key));
|
|
1292
1316
|
return result;
|
|
1293
1317
|
}
|
|
1318
|
+
getColumnDefinitionForRowKey(key) {
|
|
1319
|
+
if (!key) {
|
|
1320
|
+
return undefined;
|
|
1321
|
+
}
|
|
1322
|
+
if (!key.includes('.')) {
|
|
1323
|
+
return this.selectedTable?.columns[key];
|
|
1324
|
+
}
|
|
1325
|
+
const [alias, columnName] = key.split('.', 2);
|
|
1326
|
+
if (!alias || !columnName) {
|
|
1327
|
+
return undefined;
|
|
1328
|
+
}
|
|
1329
|
+
if (alias === this.primaryAlias) {
|
|
1330
|
+
return this.selectedTable?.columns[columnName];
|
|
1331
|
+
}
|
|
1332
|
+
return this.aliasToTable.get(alias)?.columns?.[columnName];
|
|
1333
|
+
}
|
|
1294
1334
|
inferSourceFromChild(childIri, table) {
|
|
1295
1335
|
if (!childIri) {
|
|
1296
1336
|
return this.session.getDialect().getPodUrl();
|
|
@@ -1354,21 +1394,154 @@ export class SelectQueryBuilder {
|
|
|
1354
1394
|
return [];
|
|
1355
1395
|
}
|
|
1356
1396
|
const valuesArray = Array.from(uniqueValues.values());
|
|
1397
|
+
const buildJoinQuery = () => this.session.select().from(join.table);
|
|
1357
1398
|
const joinColumnInstance = join.table.getColumn(joinRef.column);
|
|
1358
|
-
|
|
1359
|
-
if (
|
|
1360
|
-
|
|
1399
|
+
const exactJoinConditions = this.buildExactJoinLookupConditions(join, baseRows);
|
|
1400
|
+
if (exactJoinConditions && exactJoinConditions.length > 0) {
|
|
1401
|
+
const exactJoinRows = [];
|
|
1402
|
+
for (const joinCondition of exactJoinConditions) {
|
|
1403
|
+
const joinQuery = buildJoinQuery();
|
|
1404
|
+
const conditionedJoinQuery = conditionTargetsReservedIdentifier(joinCondition)
|
|
1405
|
+
? joinQuery.applyInternalQueryCondition(joinCondition)
|
|
1406
|
+
: joinQuery.where(joinCondition);
|
|
1407
|
+
const joinRows = await conditionedJoinQuery;
|
|
1408
|
+
exactJoinRows.push(...joinRows);
|
|
1409
|
+
}
|
|
1410
|
+
return this.mergeRowsBySubject(this.normalizeJoinRows(join, exactJoinRows));
|
|
1411
|
+
}
|
|
1412
|
+
const joinLookupCondition = this.buildJoinLookupCondition(joinColumnInstance, valuesArray);
|
|
1413
|
+
if (joinLookupCondition) {
|
|
1414
|
+
const joinQuery = buildJoinQuery();
|
|
1415
|
+
const filteredJoinQuery = conditionTargetsReservedIdentifier(joinLookupCondition)
|
|
1416
|
+
? joinQuery.applyInternalQueryCondition(joinLookupCondition)
|
|
1417
|
+
: joinQuery.where(joinLookupCondition);
|
|
1418
|
+
const joinRows = await filteredJoinQuery;
|
|
1419
|
+
return this.normalizeJoinRows(join, joinRows);
|
|
1361
1420
|
}
|
|
1362
|
-
const joinRows = await
|
|
1421
|
+
const joinRows = await buildJoinQuery();
|
|
1363
1422
|
return this.normalizeJoinRows(join, joinRows);
|
|
1364
1423
|
}
|
|
1424
|
+
buildExactJoinLookupConditions(join, baseRows) {
|
|
1425
|
+
const conditions = join.resolvedConditions ?? [];
|
|
1426
|
+
if (conditions.length === 0) {
|
|
1427
|
+
return undefined;
|
|
1428
|
+
}
|
|
1429
|
+
const [primaryCondition] = conditions;
|
|
1430
|
+
const primaryJoinRef = primaryCondition.left.alias === join.alias ? primaryCondition.left : primaryCondition.right;
|
|
1431
|
+
const primaryBaseRef = primaryJoinRef === primaryCondition.left ? primaryCondition.right : primaryCondition.left;
|
|
1432
|
+
const requiredLocatorVars = this.getRequiredSubjectTemplateVariables(join.table);
|
|
1433
|
+
const joinUsesTemplateScopedId = primaryJoinRef.column === 'id' && requiredLocatorVars.length > 0;
|
|
1434
|
+
if (!joinUsesTemplateScopedId && conditions.length === 1) {
|
|
1435
|
+
return undefined;
|
|
1436
|
+
}
|
|
1437
|
+
const locatorConditionMap = new Map();
|
|
1438
|
+
for (const condition of conditions) {
|
|
1439
|
+
const joinRef = condition.left.alias === join.alias ? condition.left : condition.right;
|
|
1440
|
+
locatorConditionMap.set(joinRef.column, condition);
|
|
1441
|
+
}
|
|
1442
|
+
const exactConditions = [];
|
|
1443
|
+
const seen = new Set();
|
|
1444
|
+
for (const baseRow of baseRows) {
|
|
1445
|
+
const primaryValue = this.getRowValueForColumn(baseRow, primaryBaseRef);
|
|
1446
|
+
if (primaryValue === undefined || primaryValue === null) {
|
|
1447
|
+
continue;
|
|
1448
|
+
}
|
|
1449
|
+
const primaryIsAbsoluteIri = typeof primaryValue === 'string' && this.isAbsoluteIri(primaryValue);
|
|
1450
|
+
const clauses = [];
|
|
1451
|
+
const dedupeParts = [];
|
|
1452
|
+
let skipRow = false;
|
|
1453
|
+
for (const condition of conditions) {
|
|
1454
|
+
const joinRef = condition.left.alias === join.alias ? condition.left : condition.right;
|
|
1455
|
+
const baseRef = joinRef === condition.left ? condition.right : condition.left;
|
|
1456
|
+
const baseValue = this.getRowValueForColumn(baseRow, baseRef);
|
|
1457
|
+
if (baseValue === undefined || baseValue === null) {
|
|
1458
|
+
if (joinUsesTemplateScopedId && !primaryIsAbsoluteIri && requiredLocatorVars.includes(joinRef.column)) {
|
|
1459
|
+
throw new Error(this.buildMissingJoinLocatorError(join, requiredLocatorVars.filter((variable) => {
|
|
1460
|
+
const variableCondition = locatorConditionMap.get(variable);
|
|
1461
|
+
if (!variableCondition) {
|
|
1462
|
+
return true;
|
|
1463
|
+
}
|
|
1464
|
+
const variableJoinRef = variableCondition.left.alias === join.alias ? variableCondition.left : variableCondition.right;
|
|
1465
|
+
const variableBaseRef = variableJoinRef === variableCondition.left ? variableCondition.right : variableCondition.left;
|
|
1466
|
+
const variableValue = this.getRowValueForColumn(baseRow, variableBaseRef);
|
|
1467
|
+
return variableValue === undefined || variableValue === null;
|
|
1468
|
+
})));
|
|
1469
|
+
}
|
|
1470
|
+
skipRow = true;
|
|
1471
|
+
break;
|
|
1472
|
+
}
|
|
1473
|
+
const joinColumn = join.table.getColumn(joinRef.column);
|
|
1474
|
+
if (!joinColumn) {
|
|
1475
|
+
skipRow = true;
|
|
1476
|
+
break;
|
|
1477
|
+
}
|
|
1478
|
+
clauses.push(eq(joinColumn, baseValue));
|
|
1479
|
+
dedupeParts.push(`${joinRef.column}:${this.serializeValueForKey(baseValue)}`);
|
|
1480
|
+
}
|
|
1481
|
+
if (skipRow) {
|
|
1482
|
+
continue;
|
|
1483
|
+
}
|
|
1484
|
+
if (joinUsesTemplateScopedId && !primaryIsAbsoluteIri) {
|
|
1485
|
+
const missingLocatorVars = requiredLocatorVars.filter((variable) => {
|
|
1486
|
+
const variableCondition = locatorConditionMap.get(variable);
|
|
1487
|
+
if (!variableCondition) {
|
|
1488
|
+
return true;
|
|
1489
|
+
}
|
|
1490
|
+
const variableJoinRef = variableCondition.left.alias === join.alias ? variableCondition.left : variableCondition.right;
|
|
1491
|
+
const variableBaseRef = variableJoinRef === variableCondition.left ? variableCondition.right : variableCondition.left;
|
|
1492
|
+
const variableValue = this.getRowValueForColumn(baseRow, variableBaseRef);
|
|
1493
|
+
return variableValue === undefined || variableValue === null;
|
|
1494
|
+
});
|
|
1495
|
+
if (missingLocatorVars.length > 0) {
|
|
1496
|
+
throw new Error(this.buildMissingJoinLocatorError(join, missingLocatorVars));
|
|
1497
|
+
}
|
|
1498
|
+
}
|
|
1499
|
+
if (clauses.length === 0) {
|
|
1500
|
+
continue;
|
|
1501
|
+
}
|
|
1502
|
+
const dedupeKey = dedupeParts.join('|');
|
|
1503
|
+
if (seen.has(dedupeKey)) {
|
|
1504
|
+
continue;
|
|
1505
|
+
}
|
|
1506
|
+
seen.add(dedupeKey);
|
|
1507
|
+
exactConditions.push(clauses.length === 1 ? clauses[0] : and(...clauses));
|
|
1508
|
+
}
|
|
1509
|
+
return exactConditions.length > 0 ? exactConditions : undefined;
|
|
1510
|
+
}
|
|
1511
|
+
buildJoinLookupCondition(joinColumnInstance, valuesArray) {
|
|
1512
|
+
if (!joinColumnInstance || valuesArray.length === 0) {
|
|
1513
|
+
return undefined;
|
|
1514
|
+
}
|
|
1515
|
+
if (valuesArray.length === 1) {
|
|
1516
|
+
return eq(joinColumnInstance, valuesArray[0]);
|
|
1517
|
+
}
|
|
1518
|
+
return inArray(joinColumnInstance, valuesArray);
|
|
1519
|
+
}
|
|
1520
|
+
getRequiredSubjectTemplateVariables(table) {
|
|
1521
|
+
const template = table.getSubjectTemplate?.() ?? table.config?.subjectTemplate ?? '';
|
|
1522
|
+
return Array.from(template.matchAll(/\{([^}]+)\}/g))
|
|
1523
|
+
.map((match) => match[1])
|
|
1524
|
+
.filter((variable) => variable !== 'id' && variable !== 'index');
|
|
1525
|
+
}
|
|
1526
|
+
isAbsoluteIri(value) {
|
|
1527
|
+
return /^[a-zA-Z][\w+.-]*:\/\//.test(value);
|
|
1528
|
+
}
|
|
1529
|
+
buildMissingJoinLocatorError(join, missingVariables) {
|
|
1530
|
+
const template = join.table.getSubjectTemplate?.() ?? join.table.config?.subjectTemplate ?? '{id}';
|
|
1531
|
+
const uniqueMissingVariables = Array.from(new Set(missingVariables));
|
|
1532
|
+
const exampleVariable = uniqueMissingVariables[0] ?? '...';
|
|
1533
|
+
return (`Cannot join table "${join.table.config.name ?? 'unknown'}" by id with subjectTemplate "${template}" ` +
|
|
1534
|
+
`because locator variable(s) [${uniqueMissingVariables.join(', ')}] are missing. ` +
|
|
1535
|
+
`Add join conditions for all required template variables (for example eq(base.${exampleVariable}, join.${exampleVariable})) ` +
|
|
1536
|
+
`or join via full IRI values.`);
|
|
1537
|
+
}
|
|
1365
1538
|
normalizeJoinRows(join, rows) {
|
|
1366
1539
|
return rows.map((row) => {
|
|
1367
1540
|
const normalized = {};
|
|
1368
1541
|
for (const [key, value] of Object.entries(row)) {
|
|
1369
1542
|
normalized[`${join.alias}.${key}`] = value;
|
|
1370
1543
|
}
|
|
1371
|
-
const subjectValue = row
|
|
1544
|
+
const subjectValue = this.extractSubjectValue(row);
|
|
1372
1545
|
if (subjectValue) {
|
|
1373
1546
|
normalized.subject = subjectValue;
|
|
1374
1547
|
normalized['@id'] = subjectValue;
|
|
@@ -1420,7 +1593,8 @@ export class SelectQueryBuilder {
|
|
|
1420
1593
|
for (const baseRow of baseRows) {
|
|
1421
1594
|
const baseValue = this.getRowValueForColumn(baseRow, baseRef);
|
|
1422
1595
|
const key = this.serializeValueForKey(baseValue);
|
|
1423
|
-
const
|
|
1596
|
+
const primaryMatches = baseValue !== undefined && baseValue !== null ? joinValueMap.get(key) ?? [] : [];
|
|
1597
|
+
const matches = primaryMatches.filter((joinRow) => this.joinRowMatchesAllConditions(baseRow, joinRow, join.alias, conditions));
|
|
1424
1598
|
if (matches.length === 0) {
|
|
1425
1599
|
if (join.type === 'innerJoin') {
|
|
1426
1600
|
continue;
|
|
@@ -1434,6 +1608,18 @@ export class SelectQueryBuilder {
|
|
|
1434
1608
|
}
|
|
1435
1609
|
return merged;
|
|
1436
1610
|
}
|
|
1611
|
+
joinRowMatchesAllConditions(baseRow, joinRow, joinAlias, conditions) {
|
|
1612
|
+
return conditions.every((condition) => {
|
|
1613
|
+
const joinRef = condition.left.alias === joinAlias ? condition.left : condition.right;
|
|
1614
|
+
const baseRef = joinRef === condition.left ? condition.right : condition.left;
|
|
1615
|
+
const baseValue = this.getRowValueForColumn(baseRow, baseRef);
|
|
1616
|
+
const joinValue = this.getRowValueForColumn(joinRow, joinRef);
|
|
1617
|
+
if (baseValue === undefined || baseValue === null || joinValue === undefined || joinValue === null) {
|
|
1618
|
+
return false;
|
|
1619
|
+
}
|
|
1620
|
+
return this.serializeValueForKey(baseValue) === this.serializeValueForKey(joinValue);
|
|
1621
|
+
});
|
|
1622
|
+
}
|
|
1437
1623
|
createEmptyJoinRow(join) {
|
|
1438
1624
|
const empty = {};
|
|
1439
1625
|
for (const columnName of Object.keys(join.table.columns)) {
|