@undefineds.co/drizzle-solid 0.2.6
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 +444 -0
- package/LICENSE +21 -0
- package/README.md +563 -0
- package/dist/core/aggregates.d.ts +19 -0
- package/dist/core/aggregates.d.ts.map +1 -0
- package/dist/core/aggregates.js +51 -0
- package/dist/core/aggregates.js.map +1 -0
- package/dist/core/ast-to-sparql.d.ts +62 -0
- package/dist/core/ast-to-sparql.d.ts.map +1 -0
- package/dist/core/ast-to-sparql.js +107 -0
- package/dist/core/ast-to-sparql.js.map +1 -0
- package/dist/core/compile-time-types.d.ts +37 -0
- package/dist/core/compile-time-types.d.ts.map +1 -0
- package/dist/core/compile-time-types.js +71 -0
- package/dist/core/compile-time-types.js.map +1 -0
- package/dist/core/comunica-patch.d.ts +7 -0
- package/dist/core/comunica-patch.d.ts.map +1 -0
- package/dist/core/comunica-patch.js +76 -0
- package/dist/core/comunica-patch.js.map +1 -0
- package/dist/core/conflict-resolution.d.ts +110 -0
- package/dist/core/conflict-resolution.d.ts.map +1 -0
- package/dist/core/conflict-resolution.js +251 -0
- package/dist/core/conflict-resolution.js.map +1 -0
- package/dist/core/discovery/composite-discovery.d.ts +18 -0
- package/dist/core/discovery/composite-discovery.d.ts.map +1 -0
- package/dist/core/discovery/composite-discovery.js +118 -0
- package/dist/core/discovery/composite-discovery.js.map +1 -0
- package/dist/core/discovery/index.d.ts +7 -0
- package/dist/core/discovery/index.d.ts.map +1 -0
- package/dist/core/discovery/index.js +23 -0
- package/dist/core/discovery/index.js.map +1 -0
- package/dist/core/discovery/interop-discovery.d.ts +36 -0
- package/dist/core/discovery/interop-discovery.d.ts.map +1 -0
- package/dist/core/discovery/interop-discovery.js +646 -0
- package/dist/core/discovery/interop-discovery.js.map +1 -0
- package/dist/core/discovery/interop-tables.d.ts +37 -0
- package/dist/core/discovery/interop-tables.d.ts.map +1 -0
- package/dist/core/discovery/interop-tables.js +68 -0
- package/dist/core/discovery/interop-tables.js.map +1 -0
- package/dist/core/discovery/interop-types.d.ts +36 -0
- package/dist/core/discovery/interop-types.d.ts.map +1 -0
- package/dist/core/discovery/interop-types.js +42 -0
- package/dist/core/discovery/interop-types.js.map +1 -0
- package/dist/core/discovery/provider-cache.d.ts +99 -0
- package/dist/core/discovery/provider-cache.d.ts.map +1 -0
- package/dist/core/discovery/provider-cache.js +296 -0
- package/dist/core/discovery/provider-cache.js.map +1 -0
- package/dist/core/discovery/typeindex-discovery.d.ts +30 -0
- package/dist/core/discovery/typeindex-discovery.d.ts.map +1 -0
- package/dist/core/discovery/typeindex-discovery.js +136 -0
- package/dist/core/discovery/typeindex-discovery.js.map +1 -0
- package/dist/core/discovery/types.d.ts +128 -0
- package/dist/core/discovery/types.d.ts.map +1 -0
- package/dist/core/discovery/types.js +3 -0
- package/dist/core/discovery/types.js.map +1 -0
- package/dist/core/execution/index.d.ts +14 -0
- package/dist/core/execution/index.d.ts.map +1 -0
- package/dist/core/execution/index.js +20 -0
- package/dist/core/execution/index.js.map +1 -0
- package/dist/core/execution/ldp-executor.d.ts +66 -0
- package/dist/core/execution/ldp-executor.d.ts.map +1 -0
- package/dist/core/execution/ldp-executor.js +584 -0
- package/dist/core/execution/ldp-executor.js.map +1 -0
- package/dist/core/execution/ldp-strategy.d.ts +53 -0
- package/dist/core/execution/ldp-strategy.d.ts.map +1 -0
- package/dist/core/execution/ldp-strategy.js +104 -0
- package/dist/core/execution/ldp-strategy.js.map +1 -0
- package/dist/core/execution/pod-executor-types.d.ts +9 -0
- package/dist/core/execution/pod-executor-types.d.ts.map +1 -0
- package/dist/core/execution/pod-executor-types.js +3 -0
- package/dist/core/execution/pod-executor-types.js.map +1 -0
- package/dist/core/execution/pod-executor.d.ts +59 -0
- package/dist/core/execution/pod-executor.d.ts.map +1 -0
- package/dist/core/execution/pod-executor.js +221 -0
- package/dist/core/execution/pod-executor.js.map +1 -0
- package/dist/core/execution/sparql-strategy.d.ts +80 -0
- package/dist/core/execution/sparql-strategy.d.ts.map +1 -0
- package/dist/core/execution/sparql-strategy.js +306 -0
- package/dist/core/execution/sparql-strategy.js.map +1 -0
- package/dist/core/execution/strategy-factory.d.ts +54 -0
- package/dist/core/execution/strategy-factory.d.ts.map +1 -0
- package/dist/core/execution/strategy-factory.js +78 -0
- package/dist/core/execution/strategy-factory.js.map +1 -0
- package/dist/core/execution/types.d.ts +80 -0
- package/dist/core/execution/types.d.ts.map +1 -0
- package/dist/core/execution/types.js +8 -0
- package/dist/core/execution/types.js.map +1 -0
- package/dist/core/expressions.d.ts +35 -0
- package/dist/core/expressions.d.ts.map +1 -0
- package/dist/core/expressions.js +53 -0
- package/dist/core/expressions.js.map +1 -0
- package/dist/core/federated/executor.d.ts +95 -0
- package/dist/core/federated/executor.d.ts.map +1 -0
- package/dist/core/federated/executor.js +425 -0
- package/dist/core/federated/executor.js.map +1 -0
- package/dist/core/federated/index.d.ts +3 -0
- package/dist/core/federated/index.d.ts.map +1 -0
- package/dist/core/federated/index.js +19 -0
- package/dist/core/federated/index.js.map +1 -0
- package/dist/core/federated/types.d.ts +69 -0
- package/dist/core/federated/types.d.ts.map +1 -0
- package/dist/core/federated/types.js +8 -0
- package/dist/core/federated/types.js.map +1 -0
- package/dist/core/notifications/channels/base-channel.d.ts +29 -0
- package/dist/core/notifications/channels/base-channel.d.ts.map +1 -0
- package/dist/core/notifications/channels/base-channel.js +63 -0
- package/dist/core/notifications/channels/base-channel.js.map +1 -0
- package/dist/core/notifications/channels/index.d.ts +4 -0
- package/dist/core/notifications/channels/index.d.ts.map +1 -0
- package/dist/core/notifications/channels/index.js +11 -0
- package/dist/core/notifications/channels/index.js.map +1 -0
- package/dist/core/notifications/channels/sse-channel.d.ts +50 -0
- package/dist/core/notifications/channels/sse-channel.d.ts.map +1 -0
- package/dist/core/notifications/channels/sse-channel.js +210 -0
- package/dist/core/notifications/channels/sse-channel.js.map +1 -0
- package/dist/core/notifications/channels/websocket-channel.d.ts +16 -0
- package/dist/core/notifications/channels/websocket-channel.d.ts.map +1 -0
- package/dist/core/notifications/channels/websocket-channel.js +87 -0
- package/dist/core/notifications/channels/websocket-channel.js.map +1 -0
- package/dist/core/notifications/index.d.ts +3 -0
- package/dist/core/notifications/index.d.ts.map +1 -0
- package/dist/core/notifications/index.js +6 -0
- package/dist/core/notifications/index.js.map +1 -0
- package/dist/core/notifications/notifications-client.d.ts +87 -0
- package/dist/core/notifications/notifications-client.d.ts.map +1 -0
- package/dist/core/notifications/notifications-client.js +460 -0
- package/dist/core/notifications/notifications-client.js.map +1 -0
- package/dist/core/notifications/types.d.ts +228 -0
- package/dist/core/notifications/types.d.ts.map +1 -0
- package/dist/core/notifications/types.js +7 -0
- package/dist/core/notifications/types.js.map +1 -0
- package/dist/core/pod-database.d.ts +383 -0
- package/dist/core/pod-database.d.ts.map +1 -0
- package/dist/core/pod-database.js +1212 -0
- package/dist/core/pod-database.js.map +1 -0
- package/dist/core/pod-dialect.d.ts +294 -0
- package/dist/core/pod-dialect.d.ts.map +1 -0
- package/dist/core/pod-dialect.js +1300 -0
- package/dist/core/pod-dialect.js.map +1 -0
- package/dist/core/pod-discovery.d.ts +20 -0
- package/dist/core/pod-discovery.d.ts.map +1 -0
- package/dist/core/pod-discovery.js +115 -0
- package/dist/core/pod-discovery.js.map +1 -0
- package/dist/core/pod-session.d.ts +44 -0
- package/dist/core/pod-session.d.ts.map +1 -0
- package/dist/core/pod-session.js +116 -0
- package/dist/core/pod-session.js.map +1 -0
- package/dist/core/pod-table.d.ts +710 -0
- package/dist/core/pod-table.d.ts.map +1 -0
- package/dist/core/pod-table.js +1300 -0
- package/dist/core/pod-table.js.map +1 -0
- package/dist/core/profile-manager.d.ts +90 -0
- package/dist/core/profile-manager.d.ts.map +1 -0
- package/dist/core/profile-manager.js +168 -0
- package/dist/core/profile-manager.js.map +1 -0
- package/dist/core/publish-manager.d.ts +90 -0
- package/dist/core/publish-manager.d.ts.map +1 -0
- package/dist/core/publish-manager.js +147 -0
- package/dist/core/publish-manager.js.map +1 -0
- package/dist/core/query-builders/delete-query-builder.d.ts +36 -0
- package/dist/core/query-builders/delete-query-builder.d.ts.map +1 -0
- package/dist/core/query-builders/delete-query-builder.js +144 -0
- package/dist/core/query-builders/delete-query-builder.js.map +1 -0
- package/dist/core/query-builders/helpers.d.ts +4 -0
- package/dist/core/query-builders/helpers.d.ts.map +1 -0
- package/dist/core/query-builders/helpers.js +30 -0
- package/dist/core/query-builders/helpers.js.map +1 -0
- package/dist/core/query-builders/index.d.ts +6 -0
- package/dist/core/query-builders/index.d.ts.map +1 -0
- package/dist/core/query-builders/index.js +12 -0
- package/dist/core/query-builders/index.js.map +1 -0
- package/dist/core/query-builders/insert-query-builder.d.ts +27 -0
- package/dist/core/query-builders/insert-query-builder.d.ts.map +1 -0
- package/dist/core/query-builders/insert-query-builder.js +128 -0
- package/dist/core/query-builders/insert-query-builder.js.map +1 -0
- package/dist/core/query-builders/select-query-builder.d.ts +106 -0
- package/dist/core/query-builders/select-query-builder.d.ts.map +1 -0
- package/dist/core/query-builders/select-query-builder.js +1264 -0
- package/dist/core/query-builders/select-query-builder.js.map +1 -0
- package/dist/core/query-builders/types.d.ts +37 -0
- package/dist/core/query-builders/types.d.ts.map +1 -0
- package/dist/core/query-builders/types.js +3 -0
- package/dist/core/query-builders/types.js.map +1 -0
- package/dist/core/query-builders/update-query-builder.d.ts +38 -0
- package/dist/core/query-builders/update-query-builder.d.ts.map +1 -0
- package/dist/core/query-builders/update-query-builder.js +168 -0
- package/dist/core/query-builders/update-query-builder.js.map +1 -0
- package/dist/core/query-conditions.d.ts +52 -0
- package/dist/core/query-conditions.d.ts.map +1 -0
- package/dist/core/query-conditions.js +134 -0
- package/dist/core/query-conditions.js.map +1 -0
- package/dist/core/rdf-constants.d.ts +16 -0
- package/dist/core/rdf-constants.d.ts.map +1 -0
- package/dist/core/rdf-constants.js +38 -0
- package/dist/core/rdf-constants.js.map +1 -0
- package/dist/core/rdf-schema-parser.d.ts +34 -0
- package/dist/core/rdf-schema-parser.d.ts.map +1 -0
- package/dist/core/rdf-schema-parser.js +143 -0
- package/dist/core/rdf-schema-parser.js.map +1 -0
- package/dist/core/resource-resolver/base-resolver.d.ts +29 -0
- package/dist/core/resource-resolver/base-resolver.d.ts.map +1 -0
- package/dist/core/resource-resolver/base-resolver.js +82 -0
- package/dist/core/resource-resolver/base-resolver.js.map +1 -0
- package/dist/core/resource-resolver/document-resolver.d.ts +20 -0
- package/dist/core/resource-resolver/document-resolver.d.ts.map +1 -0
- package/dist/core/resource-resolver/document-resolver.js +105 -0
- package/dist/core/resource-resolver/document-resolver.js.map +1 -0
- package/dist/core/resource-resolver/factory.d.ts +27 -0
- package/dist/core/resource-resolver/factory.d.ts.map +1 -0
- package/dist/core/resource-resolver/factory.js +58 -0
- package/dist/core/resource-resolver/factory.js.map +1 -0
- package/dist/core/resource-resolver/fragment-resolver.d.ts +20 -0
- package/dist/core/resource-resolver/fragment-resolver.d.ts.map +1 -0
- package/dist/core/resource-resolver/fragment-resolver.js +60 -0
- package/dist/core/resource-resolver/fragment-resolver.js.map +1 -0
- package/dist/core/resource-resolver/index.d.ts +11 -0
- package/dist/core/resource-resolver/index.d.ts.map +1 -0
- package/dist/core/resource-resolver/index.js +18 -0
- package/dist/core/resource-resolver/index.js.map +1 -0
- package/dist/core/resource-resolver/types.d.ts +57 -0
- package/dist/core/resource-resolver/types.d.ts.map +1 -0
- package/dist/core/resource-resolver/types.js +9 -0
- package/dist/core/resource-resolver/types.js.map +1 -0
- package/dist/core/runtime/pod-runtime.d.ts +34 -0
- package/dist/core/runtime/pod-runtime.d.ts.map +1 -0
- package/dist/core/runtime/pod-runtime.js +125 -0
- package/dist/core/runtime/pod-runtime.js.map +1 -0
- package/dist/core/schema/columns.d.ts +74 -0
- package/dist/core/schema/columns.d.ts.map +1 -0
- package/dist/core/schema/columns.js +295 -0
- package/dist/core/schema/columns.js.map +1 -0
- package/dist/core/schema/defs.d.ts +92 -0
- package/dist/core/schema/defs.d.ts.map +1 -0
- package/dist/core/schema/defs.js +43 -0
- package/dist/core/schema/defs.js.map +1 -0
- package/dist/core/schema/factories.d.ts +29 -0
- package/dist/core/schema/factories.d.ts.map +1 -0
- package/dist/core/schema/factories.js +117 -0
- package/dist/core/schema/factories.js.map +1 -0
- package/dist/core/schema/index.d.ts +9 -0
- package/dist/core/schema/index.d.ts.map +1 -0
- package/dist/core/schema/index.js +25 -0
- package/dist/core/schema/index.js.map +1 -0
- package/dist/core/schema/pod-table.d.ts +93 -0
- package/dist/core/schema/pod-table.d.ts.map +1 -0
- package/dist/core/schema/pod-table.js +294 -0
- package/dist/core/schema/pod-table.js.map +1 -0
- package/dist/core/schema/relations.d.ts +26 -0
- package/dist/core/schema/relations.d.ts.map +1 -0
- package/dist/core/schema/relations.js +36 -0
- package/dist/core/schema/relations.js.map +1 -0
- package/dist/core/schema/solid-schema.d.ts +19 -0
- package/dist/core/schema/solid-schema.d.ts.map +1 -0
- package/dist/core/schema/solid-schema.js +93 -0
- package/dist/core/schema/solid-schema.js.map +1 -0
- package/dist/core/schema/types.d.ts +45 -0
- package/dist/core/schema/types.d.ts.map +1 -0
- package/dist/core/schema/types.js +3 -0
- package/dist/core/schema/types.js.map +1 -0
- package/dist/core/schema/utils.d.ts +15 -0
- package/dist/core/schema/utils.d.ts.map +1 -0
- package/dist/core/schema/utils.js +44 -0
- package/dist/core/schema/utils.js.map +1 -0
- package/dist/core/select-plan.d.ts +45 -0
- package/dist/core/select-plan.d.ts.map +1 -0
- package/dist/core/select-plan.js +3 -0
- package/dist/core/select-plan.js.map +1 -0
- package/dist/core/services/pod-services.d.ts +41 -0
- package/dist/core/services/pod-services.d.ts.map +1 -0
- package/dist/core/services/pod-services.js +79 -0
- package/dist/core/services/pod-services.js.map +1 -0
- package/dist/core/shape/generator.d.ts +12 -0
- package/dist/core/shape/generator.d.ts.map +1 -0
- package/dist/core/shape/generator.js +109 -0
- package/dist/core/shape/generator.js.map +1 -0
- package/dist/core/shape/index.d.ts +4 -0
- package/dist/core/shape/index.d.ts.map +1 -0
- package/dist/core/shape/index.js +20 -0
- package/dist/core/shape/index.js.map +1 -0
- package/dist/core/shape/manager.d.ts +45 -0
- package/dist/core/shape/manager.d.ts.map +1 -0
- package/dist/core/shape/manager.js +393 -0
- package/dist/core/shape/manager.js.map +1 -0
- package/dist/core/shape/shacl-parser.d.ts +19 -0
- package/dist/core/shape/shacl-parser.d.ts.map +1 -0
- package/dist/core/shape/shacl-parser.js +215 -0
- package/dist/core/shape/shacl-parser.js.map +1 -0
- package/dist/core/shape/shacl.d.ts +11 -0
- package/dist/core/shape/shacl.d.ts.map +1 -0
- package/dist/core/shape/shacl.js +130 -0
- package/dist/core/shape/shacl.js.map +1 -0
- package/dist/core/shape/types.d.ts +149 -0
- package/dist/core/shape/types.d.ts.map +1 -0
- package/dist/core/shape/types.js +45 -0
- package/dist/core/shape/types.js.map +1 -0
- package/dist/core/shape/validator.d.ts +11 -0
- package/dist/core/shape/validator.d.ts.map +1 -0
- package/dist/core/shape/validator.js +232 -0
- package/dist/core/shape/validator.js.map +1 -0
- package/dist/core/solid-n3-client.d.ts +86 -0
- package/dist/core/solid-n3-client.d.ts.map +1 -0
- package/dist/core/solid-n3-client.js +279 -0
- package/dist/core/solid-n3-client.js.map +1 -0
- package/dist/core/sparql/builder/expression-builder.d.ts +42 -0
- package/dist/core/sparql/builder/expression-builder.d.ts.map +1 -0
- package/dist/core/sparql/builder/expression-builder.js +259 -0
- package/dist/core/sparql/builder/expression-builder.js.map +1 -0
- package/dist/core/sparql/builder/select-builder.d.ts +35 -0
- package/dist/core/sparql/builder/select-builder.d.ts.map +1 -0
- package/dist/core/sparql/builder/select-builder.js +446 -0
- package/dist/core/sparql/builder/select-builder.js.map +1 -0
- package/dist/core/sparql/builder/update-builder.d.ts +33 -0
- package/dist/core/sparql/builder/update-builder.d.ts.map +1 -0
- package/dist/core/sparql/builder/update-builder.js +523 -0
- package/dist/core/sparql/builder/update-builder.js.map +1 -0
- package/dist/core/sparql/helpers.d.ts +19 -0
- package/dist/core/sparql/helpers.d.ts.map +1 -0
- package/dist/core/sparql/helpers.js +172 -0
- package/dist/core/sparql/helpers.js.map +1 -0
- package/dist/core/sparql/types.d.ts +10 -0
- package/dist/core/sparql/types.d.ts.map +1 -0
- package/dist/core/sparql/types.js +3 -0
- package/dist/core/sparql/types.js.map +1 -0
- package/dist/core/sparql-executor.d.ts +34 -0
- package/dist/core/sparql-executor.d.ts.map +1 -0
- package/dist/core/sparql-executor.js +712 -0
- package/dist/core/sparql-executor.js.map +1 -0
- package/dist/core/subject/index.d.ts +29 -0
- package/dist/core/subject/index.d.ts.map +1 -0
- package/dist/core/subject/index.js +51 -0
- package/dist/core/subject/index.js.map +1 -0
- package/dist/core/subject/resolver.d.ts +92 -0
- package/dist/core/subject/resolver.d.ts.map +1 -0
- package/dist/core/subject/resolver.js +359 -0
- package/dist/core/subject/resolver.js.map +1 -0
- package/dist/core/subject/types.d.ts +90 -0
- package/dist/core/subject/types.d.ts.map +1 -0
- package/dist/core/subject/types.js +8 -0
- package/dist/core/subject/types.js.map +1 -0
- package/dist/core/triple/builder.d.ts +86 -0
- package/dist/core/triple/builder.d.ts.map +1 -0
- package/dist/core/triple/builder.js +304 -0
- package/dist/core/triple/builder.js.map +1 -0
- package/dist/core/triple/handlers/array.d.ts +23 -0
- package/dist/core/triple/handlers/array.d.ts.map +1 -0
- package/dist/core/triple/handlers/array.js +119 -0
- package/dist/core/triple/handlers/array.js.map +1 -0
- package/dist/core/triple/handlers/default.d.ts +20 -0
- package/dist/core/triple/handlers/default.d.ts.map +1 -0
- package/dist/core/triple/handlers/default.js +96 -0
- package/dist/core/triple/handlers/default.js.map +1 -0
- package/dist/core/triple/handlers/index.d.ts +35 -0
- package/dist/core/triple/handlers/index.d.ts.map +1 -0
- package/dist/core/triple/handlers/index.js +67 -0
- package/dist/core/triple/handlers/index.js.map +1 -0
- package/dist/core/triple/handlers/inline.d.ts +35 -0
- package/dist/core/triple/handlers/inline.d.ts.map +1 -0
- package/dist/core/triple/handlers/inline.js +190 -0
- package/dist/core/triple/handlers/inline.js.map +1 -0
- package/dist/core/triple/handlers/inverse.d.ts +22 -0
- package/dist/core/triple/handlers/inverse.d.ts.map +1 -0
- package/dist/core/triple/handlers/inverse.js +68 -0
- package/dist/core/triple/handlers/inverse.js.map +1 -0
- package/dist/core/triple/handlers/uri.d.ts +28 -0
- package/dist/core/triple/handlers/uri.d.ts.map +1 -0
- package/dist/core/triple/handlers/uri.js +66 -0
- package/dist/core/triple/handlers/uri.js.map +1 -0
- package/dist/core/triple/index.d.ts +9 -0
- package/dist/core/triple/index.d.ts.map +1 -0
- package/dist/core/triple/index.js +21 -0
- package/dist/core/triple/index.js.map +1 -0
- package/dist/core/triple/types.d.ts +152 -0
- package/dist/core/triple/types.d.ts.map +1 -0
- package/dist/core/triple/types.js +8 -0
- package/dist/core/triple/types.js.map +1 -0
- package/dist/core/typeindex-manager.d.ts +124 -0
- package/dist/core/typeindex-manager.d.ts.map +1 -0
- package/dist/core/typeindex-manager.js +662 -0
- package/dist/core/typeindex-manager.js.map +1 -0
- package/dist/core/types.d.ts +57 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +4 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/uri/index.d.ts +8 -0
- package/dist/core/uri/index.d.ts.map +1 -0
- package/dist/core/uri/index.js +12 -0
- package/dist/core/uri/index.js.map +1 -0
- package/dist/core/uri/resolver.d.ts +79 -0
- package/dist/core/uri/resolver.d.ts.map +1 -0
- package/dist/core/uri/resolver.js +458 -0
- package/dist/core/uri/resolver.js.map +1 -0
- package/dist/core/uri/types.d.ts +143 -0
- package/dist/core/uri/types.d.ts.map +1 -0
- package/dist/core/uri/types.js +8 -0
- package/dist/core/uri/types.js.map +1 -0
- package/dist/core/utils/origin-auth.d.ts +28 -0
- package/dist/core/utils/origin-auth.d.ts.map +1 -0
- package/dist/core/utils/origin-auth.js +46 -0
- package/dist/core/utils/origin-auth.js.map +1 -0
- package/dist/core/utils/pod-root.d.ts +15 -0
- package/dist/core/utils/pod-root.d.ts.map +1 -0
- package/dist/core/utils/pod-root.js +72 -0
- package/dist/core/utils/pod-root.js.map +1 -0
- package/dist/core/zod-integration.d.ts +95 -0
- package/dist/core/zod-integration.d.ts.map +1 -0
- package/dist/core/zod-integration.js +236 -0
- package/dist/core/zod-integration.js.map +1 -0
- package/dist/driver.d.ts +23 -0
- package/dist/driver.d.ts.map +1 -0
- package/dist/driver.js +34 -0
- package/dist/driver.js.map +1 -0
- package/dist/esm/core/aggregates.d.ts +19 -0
- package/dist/esm/core/aggregates.d.ts.map +1 -0
- package/dist/esm/core/aggregates.js +43 -0
- package/dist/esm/core/aggregates.js.map +1 -0
- package/dist/esm/core/ast-to-sparql.d.ts +62 -0
- package/dist/esm/core/ast-to-sparql.d.ts.map +1 -0
- package/dist/esm/core/ast-to-sparql.js +103 -0
- package/dist/esm/core/ast-to-sparql.js.map +1 -0
- package/dist/esm/core/compile-time-types.d.ts +37 -0
- package/dist/esm/core/compile-time-types.d.ts.map +1 -0
- package/dist/esm/core/compile-time-types.js +64 -0
- package/dist/esm/core/compile-time-types.js.map +1 -0
- package/dist/esm/core/comunica-patch.d.ts +7 -0
- package/dist/esm/core/comunica-patch.d.ts.map +1 -0
- package/dist/esm/core/comunica-patch.js +76 -0
- package/dist/esm/core/comunica-patch.js.map +1 -0
- package/dist/esm/core/conflict-resolution.d.ts +110 -0
- package/dist/esm/core/conflict-resolution.d.ts.map +1 -0
- package/dist/esm/core/conflict-resolution.js +245 -0
- package/dist/esm/core/conflict-resolution.js.map +1 -0
- package/dist/esm/core/discovery/composite-discovery.d.ts +18 -0
- package/dist/esm/core/discovery/composite-discovery.d.ts.map +1 -0
- package/dist/esm/core/discovery/composite-discovery.js +114 -0
- package/dist/esm/core/discovery/composite-discovery.js.map +1 -0
- package/dist/esm/core/discovery/index.d.ts +7 -0
- package/dist/esm/core/discovery/index.d.ts.map +1 -0
- package/dist/esm/core/discovery/index.js +7 -0
- package/dist/esm/core/discovery/index.js.map +1 -0
- package/dist/esm/core/discovery/interop-discovery.d.ts +36 -0
- package/dist/esm/core/discovery/interop-discovery.d.ts.map +1 -0
- package/dist/esm/core/discovery/interop-discovery.js +642 -0
- package/dist/esm/core/discovery/interop-discovery.js.map +1 -0
- package/dist/esm/core/discovery/interop-tables.d.ts +37 -0
- package/dist/esm/core/discovery/interop-tables.d.ts.map +1 -0
- package/dist/esm/core/discovery/interop-tables.js +65 -0
- package/dist/esm/core/discovery/interop-tables.js.map +1 -0
- package/dist/esm/core/discovery/interop-types.d.ts +36 -0
- package/dist/esm/core/discovery/interop-types.d.ts.map +1 -0
- package/dist/esm/core/discovery/interop-types.js +39 -0
- package/dist/esm/core/discovery/interop-types.js.map +1 -0
- package/dist/esm/core/discovery/provider-cache.d.ts +99 -0
- package/dist/esm/core/discovery/provider-cache.d.ts.map +1 -0
- package/dist/esm/core/discovery/provider-cache.js +292 -0
- package/dist/esm/core/discovery/provider-cache.js.map +1 -0
- package/dist/esm/core/discovery/typeindex-discovery.d.ts +30 -0
- package/dist/esm/core/discovery/typeindex-discovery.d.ts.map +1 -0
- package/dist/esm/core/discovery/typeindex-discovery.js +132 -0
- package/dist/esm/core/discovery/typeindex-discovery.js.map +1 -0
- package/dist/esm/core/discovery/types.d.ts +128 -0
- package/dist/esm/core/discovery/types.d.ts.map +1 -0
- package/dist/esm/core/discovery/types.js +2 -0
- package/dist/esm/core/discovery/types.js.map +1 -0
- package/dist/esm/core/execution/index.d.ts +14 -0
- package/dist/esm/core/execution/index.d.ts.map +1 -0
- package/dist/esm/core/execution/index.js +13 -0
- package/dist/esm/core/execution/index.js.map +1 -0
- package/dist/esm/core/execution/ldp-executor.d.ts +66 -0
- package/dist/esm/core/execution/ldp-executor.d.ts.map +1 -0
- package/dist/esm/core/execution/ldp-executor.js +580 -0
- package/dist/esm/core/execution/ldp-executor.js.map +1 -0
- package/dist/esm/core/execution/ldp-strategy.d.ts +53 -0
- package/dist/esm/core/execution/ldp-strategy.d.ts.map +1 -0
- package/dist/esm/core/execution/ldp-strategy.js +100 -0
- package/dist/esm/core/execution/ldp-strategy.js.map +1 -0
- package/dist/esm/core/execution/pod-executor-types.d.ts +9 -0
- package/dist/esm/core/execution/pod-executor-types.d.ts.map +1 -0
- package/dist/esm/core/execution/pod-executor-types.js +2 -0
- package/dist/esm/core/execution/pod-executor-types.js.map +1 -0
- package/dist/esm/core/execution/pod-executor.d.ts +59 -0
- package/dist/esm/core/execution/pod-executor.d.ts.map +1 -0
- package/dist/esm/core/execution/pod-executor.js +217 -0
- package/dist/esm/core/execution/pod-executor.js.map +1 -0
- package/dist/esm/core/execution/sparql-strategy.d.ts +80 -0
- package/dist/esm/core/execution/sparql-strategy.d.ts.map +1 -0
- package/dist/esm/core/execution/sparql-strategy.js +269 -0
- package/dist/esm/core/execution/sparql-strategy.js.map +1 -0
- package/dist/esm/core/execution/strategy-factory.d.ts +54 -0
- package/dist/esm/core/execution/strategy-factory.d.ts.map +1 -0
- package/dist/esm/core/execution/strategy-factory.js +74 -0
- package/dist/esm/core/execution/strategy-factory.js.map +1 -0
- package/dist/esm/core/execution/types.d.ts +80 -0
- package/dist/esm/core/execution/types.d.ts.map +1 -0
- package/dist/esm/core/execution/types.js +7 -0
- package/dist/esm/core/execution/types.js.map +1 -0
- package/dist/esm/core/expressions.d.ts +35 -0
- package/dist/esm/core/expressions.d.ts.map +1 -0
- package/dist/esm/core/expressions.js +45 -0
- package/dist/esm/core/expressions.js.map +1 -0
- package/dist/esm/core/federated/executor.d.ts +95 -0
- package/dist/esm/core/federated/executor.d.ts.map +1 -0
- package/dist/esm/core/federated/executor.js +421 -0
- package/dist/esm/core/federated/executor.js.map +1 -0
- package/dist/esm/core/federated/index.d.ts +3 -0
- package/dist/esm/core/federated/index.d.ts.map +1 -0
- package/dist/esm/core/federated/index.js +3 -0
- package/dist/esm/core/federated/index.js.map +1 -0
- package/dist/esm/core/federated/types.d.ts +69 -0
- package/dist/esm/core/federated/types.d.ts.map +1 -0
- package/dist/esm/core/federated/types.js +7 -0
- package/dist/esm/core/federated/types.js.map +1 -0
- package/dist/esm/core/notifications/channels/base-channel.d.ts +29 -0
- package/dist/esm/core/notifications/channels/base-channel.d.ts.map +1 -0
- package/dist/esm/core/notifications/channels/base-channel.js +58 -0
- package/dist/esm/core/notifications/channels/base-channel.js.map +1 -0
- package/dist/esm/core/notifications/channels/index.d.ts +4 -0
- package/dist/esm/core/notifications/channels/index.d.ts.map +1 -0
- package/dist/esm/core/notifications/channels/index.js +4 -0
- package/dist/esm/core/notifications/channels/index.js.map +1 -0
- package/dist/esm/core/notifications/channels/sse-channel.d.ts +50 -0
- package/dist/esm/core/notifications/channels/sse-channel.d.ts.map +1 -0
- package/dist/esm/core/notifications/channels/sse-channel.js +206 -0
- package/dist/esm/core/notifications/channels/sse-channel.js.map +1 -0
- package/dist/esm/core/notifications/channels/websocket-channel.d.ts +16 -0
- package/dist/esm/core/notifications/channels/websocket-channel.d.ts.map +1 -0
- package/dist/esm/core/notifications/channels/websocket-channel.js +83 -0
- package/dist/esm/core/notifications/channels/websocket-channel.js.map +1 -0
- package/dist/esm/core/notifications/index.d.ts +3 -0
- package/dist/esm/core/notifications/index.d.ts.map +1 -0
- package/dist/esm/core/notifications/index.js +2 -0
- package/dist/esm/core/notifications/index.js.map +1 -0
- package/dist/esm/core/notifications/notifications-client.d.ts +87 -0
- package/dist/esm/core/notifications/notifications-client.d.ts.map +1 -0
- package/dist/esm/core/notifications/notifications-client.js +456 -0
- package/dist/esm/core/notifications/notifications-client.js.map +1 -0
- package/dist/esm/core/notifications/types.d.ts +228 -0
- package/dist/esm/core/notifications/types.d.ts.map +1 -0
- package/dist/esm/core/notifications/types.js +6 -0
- package/dist/esm/core/notifications/types.js.map +1 -0
- package/dist/esm/core/pod-database.d.ts +383 -0
- package/dist/esm/core/pod-database.d.ts.map +1 -0
- package/dist/esm/core/pod-database.js +1175 -0
- package/dist/esm/core/pod-database.js.map +1 -0
- package/dist/esm/core/pod-dialect.d.ts +294 -0
- package/dist/esm/core/pod-dialect.d.ts.map +1 -0
- package/dist/esm/core/pod-dialect.js +1296 -0
- package/dist/esm/core/pod-dialect.js.map +1 -0
- package/dist/esm/core/pod-discovery.d.ts +20 -0
- package/dist/esm/core/pod-discovery.d.ts.map +1 -0
- package/dist/esm/core/pod-discovery.js +109 -0
- package/dist/esm/core/pod-discovery.js.map +1 -0
- package/dist/esm/core/pod-session.d.ts +44 -0
- package/dist/esm/core/pod-session.d.ts.map +1 -0
- package/dist/esm/core/pod-session.js +109 -0
- package/dist/esm/core/pod-session.js.map +1 -0
- package/dist/esm/core/pod-table.d.ts +710 -0
- package/dist/esm/core/pod-table.d.ts.map +1 -0
- package/dist/esm/core/pod-table.js +1249 -0
- package/dist/esm/core/pod-table.js.map +1 -0
- package/dist/esm/core/profile-manager.d.ts +90 -0
- package/dist/esm/core/profile-manager.d.ts.map +1 -0
- package/dist/esm/core/profile-manager.js +164 -0
- package/dist/esm/core/profile-manager.js.map +1 -0
- package/dist/esm/core/publish-manager.d.ts +90 -0
- package/dist/esm/core/publish-manager.d.ts.map +1 -0
- package/dist/esm/core/publish-manager.js +143 -0
- package/dist/esm/core/publish-manager.js.map +1 -0
- package/dist/esm/core/query-builders/delete-query-builder.d.ts +36 -0
- package/dist/esm/core/query-builders/delete-query-builder.d.ts.map +1 -0
- package/dist/esm/core/query-builders/delete-query-builder.js +140 -0
- package/dist/esm/core/query-builders/delete-query-builder.js.map +1 -0
- package/dist/esm/core/query-builders/helpers.d.ts +4 -0
- package/dist/esm/core/query-builders/helpers.d.ts.map +1 -0
- package/dist/esm/core/query-builders/helpers.js +26 -0
- package/dist/esm/core/query-builders/helpers.js.map +1 -0
- package/dist/esm/core/query-builders/index.d.ts +6 -0
- package/dist/esm/core/query-builders/index.d.ts.map +1 -0
- package/dist/esm/core/query-builders/index.js +5 -0
- package/dist/esm/core/query-builders/index.js.map +1 -0
- package/dist/esm/core/query-builders/insert-query-builder.d.ts +27 -0
- package/dist/esm/core/query-builders/insert-query-builder.d.ts.map +1 -0
- package/dist/esm/core/query-builders/insert-query-builder.js +124 -0
- package/dist/esm/core/query-builders/insert-query-builder.js.map +1 -0
- package/dist/esm/core/query-builders/select-query-builder.d.ts +106 -0
- package/dist/esm/core/query-builders/select-query-builder.d.ts.map +1 -0
- package/dist/esm/core/query-builders/select-query-builder.js +1260 -0
- package/dist/esm/core/query-builders/select-query-builder.js.map +1 -0
- package/dist/esm/core/query-builders/types.d.ts +37 -0
- package/dist/esm/core/query-builders/types.d.ts.map +1 -0
- package/dist/esm/core/query-builders/types.js +2 -0
- package/dist/esm/core/query-builders/types.js.map +1 -0
- package/dist/esm/core/query-builders/update-query-builder.d.ts +38 -0
- package/dist/esm/core/query-builders/update-query-builder.d.ts.map +1 -0
- package/dist/esm/core/query-builders/update-query-builder.js +164 -0
- package/dist/esm/core/query-builders/update-query-builder.js.map +1 -0
- package/dist/esm/core/query-conditions.d.ts +52 -0
- package/dist/esm/core/query-conditions.d.ts.map +1 -0
- package/dist/esm/core/query-conditions.js +111 -0
- package/dist/esm/core/query-conditions.js.map +1 -0
- package/dist/esm/core/rdf-constants.d.ts +16 -0
- package/dist/esm/core/rdf-constants.d.ts.map +1 -0
- package/dist/esm/core/rdf-constants.js +32 -0
- package/dist/esm/core/rdf-constants.js.map +1 -0
- package/dist/esm/core/rdf-schema-parser.d.ts +34 -0
- package/dist/esm/core/rdf-schema-parser.d.ts.map +1 -0
- package/dist/esm/core/rdf-schema-parser.js +136 -0
- package/dist/esm/core/rdf-schema-parser.js.map +1 -0
- package/dist/esm/core/resource-resolver/base-resolver.d.ts +29 -0
- package/dist/esm/core/resource-resolver/base-resolver.d.ts.map +1 -0
- package/dist/esm/core/resource-resolver/base-resolver.js +78 -0
- package/dist/esm/core/resource-resolver/base-resolver.js.map +1 -0
- package/dist/esm/core/resource-resolver/document-resolver.d.ts +20 -0
- package/dist/esm/core/resource-resolver/document-resolver.d.ts.map +1 -0
- package/dist/esm/core/resource-resolver/document-resolver.js +101 -0
- package/dist/esm/core/resource-resolver/document-resolver.js.map +1 -0
- package/dist/esm/core/resource-resolver/factory.d.ts +27 -0
- package/dist/esm/core/resource-resolver/factory.d.ts.map +1 -0
- package/dist/esm/core/resource-resolver/factory.js +53 -0
- package/dist/esm/core/resource-resolver/factory.js.map +1 -0
- package/dist/esm/core/resource-resolver/fragment-resolver.d.ts +20 -0
- package/dist/esm/core/resource-resolver/fragment-resolver.d.ts.map +1 -0
- package/dist/esm/core/resource-resolver/fragment-resolver.js +56 -0
- package/dist/esm/core/resource-resolver/fragment-resolver.js.map +1 -0
- package/dist/esm/core/resource-resolver/index.d.ts +11 -0
- package/dist/esm/core/resource-resolver/index.d.ts.map +1 -0
- package/dist/esm/core/resource-resolver/index.js +10 -0
- package/dist/esm/core/resource-resolver/index.js.map +1 -0
- package/dist/esm/core/resource-resolver/types.d.ts +57 -0
- package/dist/esm/core/resource-resolver/types.d.ts.map +1 -0
- package/dist/esm/core/resource-resolver/types.js +8 -0
- package/dist/esm/core/resource-resolver/types.js.map +1 -0
- package/dist/esm/core/runtime/pod-runtime.d.ts +34 -0
- package/dist/esm/core/runtime/pod-runtime.d.ts.map +1 -0
- package/dist/esm/core/runtime/pod-runtime.js +121 -0
- package/dist/esm/core/runtime/pod-runtime.js.map +1 -0
- package/dist/esm/core/schema/columns.d.ts +74 -0
- package/dist/esm/core/schema/columns.d.ts.map +1 -0
- package/dist/esm/core/schema/columns.js +282 -0
- package/dist/esm/core/schema/columns.js.map +1 -0
- package/dist/esm/core/schema/defs.d.ts +92 -0
- package/dist/esm/core/schema/defs.d.ts.map +1 -0
- package/dist/esm/core/schema/defs.js +36 -0
- package/dist/esm/core/schema/defs.js.map +1 -0
- package/dist/esm/core/schema/factories.d.ts +29 -0
- package/dist/esm/core/schema/factories.d.ts.map +1 -0
- package/dist/esm/core/schema/factories.js +89 -0
- package/dist/esm/core/schema/factories.js.map +1 -0
- package/dist/esm/core/schema/index.d.ts +9 -0
- package/dist/esm/core/schema/index.d.ts.map +1 -0
- package/dist/esm/core/schema/index.js +9 -0
- package/dist/esm/core/schema/index.js.map +1 -0
- package/dist/esm/core/schema/pod-table.d.ts +93 -0
- package/dist/esm/core/schema/pod-table.d.ts.map +1 -0
- package/dist/esm/core/schema/pod-table.js +289 -0
- package/dist/esm/core/schema/pod-table.js.map +1 -0
- package/dist/esm/core/schema/relations.d.ts +26 -0
- package/dist/esm/core/schema/relations.d.ts.map +1 -0
- package/dist/esm/core/schema/relations.js +33 -0
- package/dist/esm/core/schema/relations.js.map +1 -0
- package/dist/esm/core/schema/solid-schema.d.ts +19 -0
- package/dist/esm/core/schema/solid-schema.d.ts.map +1 -0
- package/dist/esm/core/schema/solid-schema.js +87 -0
- package/dist/esm/core/schema/solid-schema.js.map +1 -0
- package/dist/esm/core/schema/types.d.ts +45 -0
- package/dist/esm/core/schema/types.d.ts.map +1 -0
- package/dist/esm/core/schema/types.js +2 -0
- package/dist/esm/core/schema/types.js.map +1 -0
- package/dist/esm/core/schema/utils.d.ts +15 -0
- package/dist/esm/core/schema/utils.d.ts.map +1 -0
- package/dist/esm/core/schema/utils.js +40 -0
- package/dist/esm/core/schema/utils.js.map +1 -0
- package/dist/esm/core/select-plan.d.ts +45 -0
- package/dist/esm/core/select-plan.d.ts.map +1 -0
- package/dist/esm/core/select-plan.js +2 -0
- package/dist/esm/core/select-plan.js.map +1 -0
- package/dist/esm/core/services/pod-services.d.ts +41 -0
- package/dist/esm/core/services/pod-services.d.ts.map +1 -0
- package/dist/esm/core/services/pod-services.js +75 -0
- package/dist/esm/core/services/pod-services.js.map +1 -0
- package/dist/esm/core/shape/generator.d.ts +12 -0
- package/dist/esm/core/shape/generator.d.ts.map +1 -0
- package/dist/esm/core/shape/generator.js +106 -0
- package/dist/esm/core/shape/generator.js.map +1 -0
- package/dist/esm/core/shape/index.d.ts +4 -0
- package/dist/esm/core/shape/index.d.ts.map +1 -0
- package/dist/esm/core/shape/index.js +4 -0
- package/dist/esm/core/shape/index.js.map +1 -0
- package/dist/esm/core/shape/manager.d.ts +45 -0
- package/dist/esm/core/shape/manager.d.ts.map +1 -0
- package/dist/esm/core/shape/manager.js +389 -0
- package/dist/esm/core/shape/manager.js.map +1 -0
- package/dist/esm/core/shape/shacl-parser.d.ts +19 -0
- package/dist/esm/core/shape/shacl-parser.d.ts.map +1 -0
- package/dist/esm/core/shape/shacl-parser.js +210 -0
- package/dist/esm/core/shape/shacl-parser.js.map +1 -0
- package/dist/esm/core/shape/shacl.d.ts +11 -0
- package/dist/esm/core/shape/shacl.d.ts.map +1 -0
- package/dist/esm/core/shape/shacl.js +127 -0
- package/dist/esm/core/shape/shacl.js.map +1 -0
- package/dist/esm/core/shape/types.d.ts +149 -0
- package/dist/esm/core/shape/types.d.ts.map +1 -0
- package/dist/esm/core/shape/types.js +42 -0
- package/dist/esm/core/shape/types.js.map +1 -0
- package/dist/esm/core/shape/validator.d.ts +11 -0
- package/dist/esm/core/shape/validator.d.ts.map +1 -0
- package/dist/esm/core/shape/validator.js +229 -0
- package/dist/esm/core/shape/validator.js.map +1 -0
- package/dist/esm/core/solid-n3-client.d.ts +86 -0
- package/dist/esm/core/solid-n3-client.d.ts.map +1 -0
- package/dist/esm/core/solid-n3-client.js +275 -0
- package/dist/esm/core/solid-n3-client.js.map +1 -0
- package/dist/esm/core/sparql/builder/expression-builder.d.ts +42 -0
- package/dist/esm/core/sparql/builder/expression-builder.d.ts.map +1 -0
- package/dist/esm/core/sparql/builder/expression-builder.js +255 -0
- package/dist/esm/core/sparql/builder/expression-builder.js.map +1 -0
- package/dist/esm/core/sparql/builder/select-builder.d.ts +35 -0
- package/dist/esm/core/sparql/builder/select-builder.d.ts.map +1 -0
- package/dist/esm/core/sparql/builder/select-builder.js +409 -0
- package/dist/esm/core/sparql/builder/select-builder.js.map +1 -0
- package/dist/esm/core/sparql/builder/update-builder.d.ts +33 -0
- package/dist/esm/core/sparql/builder/update-builder.d.ts.map +1 -0
- package/dist/esm/core/sparql/builder/update-builder.js +486 -0
- package/dist/esm/core/sparql/builder/update-builder.js.map +1 -0
- package/dist/esm/core/sparql/helpers.d.ts +19 -0
- package/dist/esm/core/sparql/helpers.d.ts.map +1 -0
- package/dist/esm/core/sparql/helpers.js +165 -0
- package/dist/esm/core/sparql/helpers.js.map +1 -0
- package/dist/esm/core/sparql/types.d.ts +10 -0
- package/dist/esm/core/sparql/types.d.ts.map +1 -0
- package/dist/esm/core/sparql/types.js +2 -0
- package/dist/esm/core/sparql/types.js.map +1 -0
- package/dist/esm/core/sparql-executor.d.ts +34 -0
- package/dist/esm/core/sparql-executor.d.ts.map +1 -0
- package/dist/esm/core/sparql-executor.js +708 -0
- package/dist/esm/core/sparql-executor.js.map +1 -0
- package/dist/esm/core/subject/index.d.ts +29 -0
- package/dist/esm/core/subject/index.d.ts.map +1 -0
- package/dist/esm/core/subject/index.js +49 -0
- package/dist/esm/core/subject/index.js.map +1 -0
- package/dist/esm/core/subject/resolver.d.ts +92 -0
- package/dist/esm/core/subject/resolver.d.ts.map +1 -0
- package/dist/esm/core/subject/resolver.js +355 -0
- package/dist/esm/core/subject/resolver.js.map +1 -0
- package/dist/esm/core/subject/types.d.ts +90 -0
- package/dist/esm/core/subject/types.d.ts.map +1 -0
- package/dist/esm/core/subject/types.js +7 -0
- package/dist/esm/core/subject/types.js.map +1 -0
- package/dist/esm/core/triple/builder.d.ts +86 -0
- package/dist/esm/core/triple/builder.d.ts.map +1 -0
- package/dist/esm/core/triple/builder.js +300 -0
- package/dist/esm/core/triple/builder.js.map +1 -0
- package/dist/esm/core/triple/handlers/array.d.ts +23 -0
- package/dist/esm/core/triple/handlers/array.d.ts.map +1 -0
- package/dist/esm/core/triple/handlers/array.js +115 -0
- package/dist/esm/core/triple/handlers/array.js.map +1 -0
- package/dist/esm/core/triple/handlers/default.d.ts +20 -0
- package/dist/esm/core/triple/handlers/default.d.ts.map +1 -0
- package/dist/esm/core/triple/handlers/default.js +92 -0
- package/dist/esm/core/triple/handlers/default.js.map +1 -0
- package/dist/esm/core/triple/handlers/index.d.ts +35 -0
- package/dist/esm/core/triple/handlers/index.d.ts.map +1 -0
- package/dist/esm/core/triple/handlers/index.js +59 -0
- package/dist/esm/core/triple/handlers/index.js.map +1 -0
- package/dist/esm/core/triple/handlers/inline.d.ts +35 -0
- package/dist/esm/core/triple/handlers/inline.d.ts.map +1 -0
- package/dist/esm/core/triple/handlers/inline.js +186 -0
- package/dist/esm/core/triple/handlers/inline.js.map +1 -0
- package/dist/esm/core/triple/handlers/inverse.d.ts +22 -0
- package/dist/esm/core/triple/handlers/inverse.d.ts.map +1 -0
- package/dist/esm/core/triple/handlers/inverse.js +64 -0
- package/dist/esm/core/triple/handlers/inverse.js.map +1 -0
- package/dist/esm/core/triple/handlers/uri.d.ts +28 -0
- package/dist/esm/core/triple/handlers/uri.d.ts.map +1 -0
- package/dist/esm/core/triple/handlers/uri.js +62 -0
- package/dist/esm/core/triple/handlers/uri.js.map +1 -0
- package/dist/esm/core/triple/index.d.ts +9 -0
- package/dist/esm/core/triple/index.d.ts.map +1 -0
- package/dist/esm/core/triple/index.js +10 -0
- package/dist/esm/core/triple/index.js.map +1 -0
- package/dist/esm/core/triple/types.d.ts +152 -0
- package/dist/esm/core/triple/types.d.ts.map +1 -0
- package/dist/esm/core/triple/types.js +7 -0
- package/dist/esm/core/triple/types.js.map +1 -0
- package/dist/esm/core/typeindex-manager.d.ts +124 -0
- package/dist/esm/core/typeindex-manager.d.ts.map +1 -0
- package/dist/esm/core/typeindex-manager.js +658 -0
- package/dist/esm/core/typeindex-manager.js.map +1 -0
- package/dist/esm/core/types.d.ts +57 -0
- package/dist/esm/core/types.d.ts.map +1 -0
- package/dist/esm/core/types.js +3 -0
- package/dist/esm/core/types.js.map +1 -0
- package/dist/esm/core/uri/index.d.ts +8 -0
- package/dist/esm/core/uri/index.d.ts.map +1 -0
- package/dist/esm/core/uri/index.js +8 -0
- package/dist/esm/core/uri/index.js.map +1 -0
- package/dist/esm/core/uri/resolver.d.ts +79 -0
- package/dist/esm/core/uri/resolver.d.ts.map +1 -0
- package/dist/esm/core/uri/resolver.js +454 -0
- package/dist/esm/core/uri/resolver.js.map +1 -0
- package/dist/esm/core/uri/types.d.ts +143 -0
- package/dist/esm/core/uri/types.d.ts.map +1 -0
- package/dist/esm/core/uri/types.js +7 -0
- package/dist/esm/core/uri/types.js.map +1 -0
- package/dist/esm/core/utils/origin-auth.d.ts +28 -0
- package/dist/esm/core/utils/origin-auth.d.ts.map +1 -0
- package/dist/esm/core/utils/origin-auth.js +42 -0
- package/dist/esm/core/utils/origin-auth.js.map +1 -0
- package/dist/esm/core/utils/pod-root.d.ts +15 -0
- package/dist/esm/core/utils/pod-root.d.ts.map +1 -0
- package/dist/esm/core/utils/pod-root.js +69 -0
- package/dist/esm/core/utils/pod-root.js.map +1 -0
- package/dist/esm/core/zod-integration.d.ts +95 -0
- package/dist/esm/core/zod-integration.d.ts.map +1 -0
- package/dist/esm/core/zod-integration.js +227 -0
- package/dist/esm/core/zod-integration.js.map +1 -0
- package/dist/esm/driver.d.ts +23 -0
- package/dist/esm/driver.d.ts.map +1 -0
- package/dist/esm/driver.js +30 -0
- package/dist/esm/driver.js.map +1 -0
- package/dist/esm/index.d.ts +23 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +44 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/solid.d.ts +21 -0
- package/dist/esm/solid.d.ts.map +1 -0
- package/dist/esm/solid.js +30 -0
- package/dist/esm/solid.js.map +1 -0
- package/dist/esm/test-utils/real-test-helpers.d.ts +5 -0
- package/dist/esm/test-utils/real-test-helpers.d.ts.map +1 -0
- package/dist/esm/test-utils/real-test-helpers.js +17 -0
- package/dist/esm/test-utils/real-test-helpers.js.map +1 -0
- package/dist/esm/types/sparql-types.d.ts +27 -0
- package/dist/esm/types/sparql-types.d.ts.map +1 -0
- package/dist/esm/types/sparql-types.js +3 -0
- package/dist/esm/types/sparql-types.js.map +1 -0
- package/dist/esm/utils/find-by-iri.d.ts +9 -0
- package/dist/esm/utils/find-by-iri.d.ts.map +1 -0
- package/dist/esm/utils/find-by-iri.js +22 -0
- package/dist/esm/utils/find-by-iri.js.map +1 -0
- package/dist/esm/utils/helpers.d.ts +17 -0
- package/dist/esm/utils/helpers.d.ts.map +1 -0
- package/dist/esm/utils/helpers.js +59 -0
- package/dist/esm/utils/helpers.js.map +1 -0
- package/dist/esm/utils/namespace.d.ts +4 -0
- package/dist/esm/utils/namespace.d.ts.map +1 -0
- package/dist/esm/utils/namespace.js +30 -0
- package/dist/esm/utils/namespace.js.map +1 -0
- package/dist/esm/utils/rdf-helpers.d.ts +17 -0
- package/dist/esm/utils/rdf-helpers.d.ts.map +1 -0
- package/dist/esm/utils/rdf-helpers.js +47 -0
- package/dist/esm/utils/rdf-helpers.js.map +1 -0
- package/dist/esm/utils/rdf-validation.d.ts +25 -0
- package/dist/esm/utils/rdf-validation.d.ts.map +1 -0
- package/dist/esm/utils/rdf-validation.js +288 -0
- package/dist/esm/utils/rdf-validation.js.map +1 -0
- package/dist/esm/utils/thing-operations.d.ts +28 -0
- package/dist/esm/utils/thing-operations.d.ts.map +1 -0
- package/dist/esm/utils/thing-operations.js +249 -0
- package/dist/esm/utils/thing-operations.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +156 -0
- package/dist/index.js.map +1 -0
- package/dist/solid.d.ts +21 -0
- package/dist/solid.d.ts.map +1 -0
- package/dist/solid.js +35 -0
- package/dist/solid.js.map +1 -0
- package/dist/test-utils/real-test-helpers.d.ts +5 -0
- package/dist/test-utils/real-test-helpers.d.ts.map +1 -0
- package/dist/test-utils/real-test-helpers.js +22 -0
- package/dist/test-utils/real-test-helpers.js.map +1 -0
- package/dist/types/sparql-types.d.ts +27 -0
- package/dist/types/sparql-types.d.ts.map +1 -0
- package/dist/types/sparql-types.js +4 -0
- package/dist/types/sparql-types.js.map +1 -0
- package/dist/utils/find-by-iri.d.ts +9 -0
- package/dist/utils/find-by-iri.d.ts.map +1 -0
- package/dist/utils/find-by-iri.js +25 -0
- package/dist/utils/find-by-iri.js.map +1 -0
- package/dist/utils/helpers.d.ts +17 -0
- package/dist/utils/helpers.d.ts.map +1 -0
- package/dist/utils/helpers.js +65 -0
- package/dist/utils/helpers.js.map +1 -0
- package/dist/utils/namespace.d.ts +4 -0
- package/dist/utils/namespace.d.ts.map +1 -0
- package/dist/utils/namespace.js +33 -0
- package/dist/utils/namespace.js.map +1 -0
- package/dist/utils/rdf-helpers.d.ts +17 -0
- package/dist/utils/rdf-helpers.d.ts.map +1 -0
- package/dist/utils/rdf-helpers.js +53 -0
- package/dist/utils/rdf-helpers.js.map +1 -0
- package/dist/utils/rdf-validation.d.ts +25 -0
- package/dist/utils/rdf-validation.d.ts.map +1 -0
- package/dist/utils/rdf-validation.js +292 -0
- package/dist/utils/rdf-validation.js.map +1 -0
- package/dist/utils/thing-operations.d.ts +28 -0
- package/dist/utils/thing-operations.d.ts.map +1 -0
- package/dist/utils/thing-operations.js +256 -0
- package/dist/utils/thing-operations.js.map +1 -0
- package/package.json +98 -0
|
@@ -0,0 +1,1300 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.PodDialect = void 0;
|
|
5
|
+
const drizzle_orm_1 = require("drizzle-orm");
|
|
6
|
+
const expressions_1 = require("./expressions");
|
|
7
|
+
const sparql_executor_1 = require("./sparql-executor");
|
|
8
|
+
const pod_executor_1 = require("./execution/pod-executor");
|
|
9
|
+
const origin_auth_1 = require("./utils/origin-auth");
|
|
10
|
+
const pod_runtime_1 = require("./runtime/pod-runtime");
|
|
11
|
+
const pod_services_1 = require("./services/pod-services");
|
|
12
|
+
class PodDialect {
|
|
13
|
+
constructor(config) {
|
|
14
|
+
this.registeredTables = new Set();
|
|
15
|
+
this.preparedContainers = new Set();
|
|
16
|
+
this.preparedResources = new Set();
|
|
17
|
+
this.config = config;
|
|
18
|
+
const session = config.session;
|
|
19
|
+
// 从session中获取webId
|
|
20
|
+
const webId = session.info.webId;
|
|
21
|
+
const clientId = session.info.clientId || session.info.client_id || process.env.SOLID_CLIENT_ID;
|
|
22
|
+
if (!webId) {
|
|
23
|
+
throw new Error('Session中未找到webId');
|
|
24
|
+
}
|
|
25
|
+
this.runtime = new pod_runtime_1.PodRuntime({
|
|
26
|
+
session,
|
|
27
|
+
webId,
|
|
28
|
+
podUrl: config.podUrl,
|
|
29
|
+
});
|
|
30
|
+
this.webId = this.runtime.getWebId();
|
|
31
|
+
this.podUrl = this.runtime.getPodUrl();
|
|
32
|
+
this.services = new pod_services_1.PodServices({
|
|
33
|
+
runtime: this.runtime,
|
|
34
|
+
clientId,
|
|
35
|
+
disableInteropDiscovery: config.disableInteropDiscovery,
|
|
36
|
+
listContainerResources: (containerUrl) => this.listContainerResources(containerUrl),
|
|
37
|
+
findSubjectsForCondition: (condition, table, resourceUrl) => this.findSubjectsForCondition(condition, table, resourceUrl),
|
|
38
|
+
});
|
|
39
|
+
this.uriResolver = this.services.getUriResolver();
|
|
40
|
+
this.sparqlConverter = this.services.getSparqlConverter();
|
|
41
|
+
this.sparqlExecutor = this.services.getSparqlExecutor();
|
|
42
|
+
this.ldpExecutor = this.services.getLdpExecutor();
|
|
43
|
+
this.typeIndexManager = this.services.getTypeIndexManager();
|
|
44
|
+
this.discovery = this.services.getDiscovery();
|
|
45
|
+
this.shapeManager = this.services.getShapeManager();
|
|
46
|
+
this.resolverFactory = this.services.getResolverFactory();
|
|
47
|
+
this.strategyFactory = this.services.getStrategyFactory();
|
|
48
|
+
this.executor = new pod_executor_1.PodExecutor({
|
|
49
|
+
ensureConnected: async () => {
|
|
50
|
+
if (!this.runtime.isConnected()) {
|
|
51
|
+
await this.connect();
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
ensureTableResourcePath: (table) => this.ensureTableResourcePath(table),
|
|
55
|
+
resolveTableResource: (table) => this.resolveTableResource(table),
|
|
56
|
+
resolveTableUrls: (table) => this.resolveTableUrls(table),
|
|
57
|
+
normalizeResourceUrl: (resourceUrl) => this.normalizeResourceUrl(resourceUrl),
|
|
58
|
+
normalizeContainerKey: (containerUrl) => this.normalizeContainerKey(containerUrl),
|
|
59
|
+
normalizeResourceKey: (resourceUrl) => this.normalizeResourceKey(resourceUrl),
|
|
60
|
+
ensureContainerExists: (containerUrl) => this.ensureContainerExists(containerUrl),
|
|
61
|
+
ensureResourceExists: (resourceUrl, options) => this.ensureResourceExists(resourceUrl, options),
|
|
62
|
+
ensureIdentifierCondition: (condition, table, resourceUrl) => this.ensureIdentifierCondition(condition, table, resourceUrl),
|
|
63
|
+
resourceExists: (resourceUrl) => this.resourceExists(resourceUrl),
|
|
64
|
+
getStrategy: (table) => this.getStrategy(table),
|
|
65
|
+
getLdpStrategy: () => this.strategyFactory.getLdpStrategy(),
|
|
66
|
+
preparedContainers: this.preparedContainers,
|
|
67
|
+
preparedResources: this.preparedResources,
|
|
68
|
+
sparqlConverter: this.sparqlConverter,
|
|
69
|
+
sparqlExecutor: this.sparqlExecutor,
|
|
70
|
+
isSelectPlan: (plan) => this.isSelectPlan(plan),
|
|
71
|
+
isInsertPlan: (plan) => this.isInsertPlan(plan),
|
|
72
|
+
isUpdatePlan: (plan) => this.isUpdatePlan(plan),
|
|
73
|
+
isDeletePlan: (plan) => this.isDeletePlan(plan),
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Get the ResourceResolver for a table
|
|
78
|
+
*/
|
|
79
|
+
getResolver(table) {
|
|
80
|
+
return this.resolverFactory.getResolver(table);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Get the ExecutionStrategy for a table
|
|
84
|
+
*/
|
|
85
|
+
getStrategy(table) {
|
|
86
|
+
return this.strategyFactory.getStrategy(table);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* 获取 ShapeManager 实例
|
|
90
|
+
*/
|
|
91
|
+
getShapeManager() {
|
|
92
|
+
return this.services.getShapeManager();
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* 获取 UriResolver 实例
|
|
96
|
+
*/
|
|
97
|
+
getUriResolver() {
|
|
98
|
+
return this.services.getUriResolver();
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* 获取 DataDiscovery 实例
|
|
102
|
+
*/
|
|
103
|
+
getDiscovery() {
|
|
104
|
+
return this.services.getDiscovery();
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* 设置 schema(表注册表)
|
|
108
|
+
* 用于 URI 引用字段的自动补全
|
|
109
|
+
*
|
|
110
|
+
* 构建两个注册表:
|
|
111
|
+
* - tableRegistry: rdfClass -> tables[](同一 class 可能对应多个表)
|
|
112
|
+
* - tableNameRegistry: tableName -> table(用于明确指定表名时查找)
|
|
113
|
+
*/
|
|
114
|
+
setSchema(schema) {
|
|
115
|
+
const tableRegistry = new Map();
|
|
116
|
+
const tableNameRegistry = new Map();
|
|
117
|
+
for (const [key, value] of Object.entries(schema)) {
|
|
118
|
+
if (value && typeof value === 'object' && 'config' in value) {
|
|
119
|
+
const table = value;
|
|
120
|
+
const rdfClass = table.getType?.() || table.config?.type;
|
|
121
|
+
const tableName = table.config?.name || key;
|
|
122
|
+
// 添加到表名注册表
|
|
123
|
+
tableNameRegistry.set(tableName, table);
|
|
124
|
+
// 添加到 class 注册表(同一 class 可能对应多个表)
|
|
125
|
+
if (rdfClass) {
|
|
126
|
+
const existing = tableRegistry.get(rdfClass) || [];
|
|
127
|
+
existing.push(table);
|
|
128
|
+
tableRegistry.set(rdfClass, existing);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
this.ldpExecutor.setTableRegistry(tableRegistry, tableNameRegistry);
|
|
133
|
+
this.ldpExecutor.setBaseUri(this.podUrl);
|
|
134
|
+
// Also set table registry for SPARQL converter (for reference URI resolution in queries)
|
|
135
|
+
this.sparqlConverter.setTableRegistry(tableRegistry, tableNameRegistry, this.podUrl);
|
|
136
|
+
}
|
|
137
|
+
async findSubjectsForCondition(condition, table, resourceUrl) {
|
|
138
|
+
const plan = this.buildSubjectLookupPlan(table, condition);
|
|
139
|
+
const sparqlQuery = this.sparqlConverter.convertSelectPlan(plan);
|
|
140
|
+
const normalizedUrl = this.normalizeResourceUrl(resourceUrl);
|
|
141
|
+
const rows = await this.executeOnResource(normalizedUrl, sparqlQuery);
|
|
142
|
+
return rows
|
|
143
|
+
.map((row) => this.extractSubjectFromRow(row))
|
|
144
|
+
.filter((value) => Boolean(value));
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* @deprecated 此方法仅被废弃的 executeComplexUpdate 使用
|
|
148
|
+
* 保留仅用于参考
|
|
149
|
+
*/
|
|
150
|
+
buildUpdateQueryForSubject(subject, data, table, columns) {
|
|
151
|
+
const prefixLines = this.buildPrefixLines();
|
|
152
|
+
const deleteStatements = [];
|
|
153
|
+
const insertTriples = [];
|
|
154
|
+
columns.forEach((columnName, index) => {
|
|
155
|
+
const column = table.columns[columnName];
|
|
156
|
+
if (!column) {
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
const predicate = this.sparqlConverter.getPredicateForColumnPublic(column, table);
|
|
160
|
+
deleteStatements.push(`DELETE WHERE {\n <${subject}> <${predicate}> ?value${index} .\n}`);
|
|
161
|
+
const newValue = data[columnName];
|
|
162
|
+
if (newValue === null || newValue === undefined) {
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
const literal = this.sparqlConverter.formatLiteralValue(newValue, column);
|
|
166
|
+
if (literal === 'NULL') {
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
insertTriples.push(` <${subject}> <${predicate}> ${literal} .`);
|
|
170
|
+
});
|
|
171
|
+
if (deleteStatements.length === 0 && insertTriples.length === 0) {
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
const parts = [];
|
|
175
|
+
if (deleteStatements.length > 0) {
|
|
176
|
+
parts.push(deleteStatements.join(';\n'));
|
|
177
|
+
}
|
|
178
|
+
if (insertTriples.length > 0) {
|
|
179
|
+
parts.push(`INSERT DATA {\n${insertTriples.join('\n')}\n}`);
|
|
180
|
+
}
|
|
181
|
+
return `${prefixLines}\n${parts.join(';\n')}`;
|
|
182
|
+
}
|
|
183
|
+
buildPrefixLines() {
|
|
184
|
+
const prefixes = this.sparqlConverter.getPrefixes();
|
|
185
|
+
return Object.entries(prefixes)
|
|
186
|
+
.map(([prefix, uri]) => `PREFIX ${prefix}: <${uri}>`)
|
|
187
|
+
.join('\n');
|
|
188
|
+
}
|
|
189
|
+
isSubjectResolutionError(error) {
|
|
190
|
+
if (!(error instanceof Error)) {
|
|
191
|
+
return false;
|
|
192
|
+
}
|
|
193
|
+
return error.message.includes('requires an id or @id condition');
|
|
194
|
+
}
|
|
195
|
+
async connect() {
|
|
196
|
+
await this.runtime.connect();
|
|
197
|
+
}
|
|
198
|
+
async disconnect() {
|
|
199
|
+
await this.runtime.disconnect();
|
|
200
|
+
}
|
|
201
|
+
isConnected() {
|
|
202
|
+
return this.runtime.isConnected();
|
|
203
|
+
}
|
|
204
|
+
// 从 webId 中提取用户路径
|
|
205
|
+
extractUserPathFromWebId() {
|
|
206
|
+
if (!this.webId) {
|
|
207
|
+
return '';
|
|
208
|
+
}
|
|
209
|
+
try {
|
|
210
|
+
const url = new URL(this.webId);
|
|
211
|
+
// 从 webId 中提取路径,例如:
|
|
212
|
+
// http://localhost:3000/alice/profile/card#me -> /alice/
|
|
213
|
+
// http://localhost:3000/bob/profile/card#me -> /bob/
|
|
214
|
+
const pathParts = url.pathname.split('/');
|
|
215
|
+
if (pathParts.length >= 2) {
|
|
216
|
+
const username = pathParts[1]; // 获取用户名部分
|
|
217
|
+
return `/${username}/`;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
catch (error) {
|
|
221
|
+
console.warn('Failed to parse webId:', this.webId, error);
|
|
222
|
+
}
|
|
223
|
+
return '';
|
|
224
|
+
}
|
|
225
|
+
resolveTableResource(table) {
|
|
226
|
+
const endpointSource = table.getSparqlEndpoint?.();
|
|
227
|
+
if (endpointSource) {
|
|
228
|
+
const endpoint = this.isAbsoluteUrl(endpointSource)
|
|
229
|
+
? endpointSource
|
|
230
|
+
: this.resolveAbsoluteUrl(endpointSource);
|
|
231
|
+
return { mode: 'sparql', endpoint };
|
|
232
|
+
}
|
|
233
|
+
const { containerUrl, resourceUrl } = this.resolveLdpResource(table);
|
|
234
|
+
return { mode: 'ldp', containerUrl, resourceUrl };
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Resolve LDP container/resource URLs for a table.
|
|
238
|
+
*
|
|
239
|
+
* Always returns the physical LDP storage location, regardless of whether
|
|
240
|
+
* the table has a sparqlEndpoint configured. SPARQL strategy will resolve
|
|
241
|
+
* the endpoint URL separately via table.getSparqlEndpoint().
|
|
242
|
+
*/
|
|
243
|
+
resolveTableUrls(table) {
|
|
244
|
+
return this.resolveLdpResource(table);
|
|
245
|
+
}
|
|
246
|
+
resolveLdpResource(table) {
|
|
247
|
+
const configuredResourcePath = typeof table.getResourcePath === 'function'
|
|
248
|
+
? table.getResourcePath()
|
|
249
|
+
: table.config?.resourcePath;
|
|
250
|
+
if (configuredResourcePath) {
|
|
251
|
+
const absoluteResource = this.resolveAbsoluteUrl(configuredResourcePath);
|
|
252
|
+
// Check if this is a container path (ends with /)
|
|
253
|
+
const isContainer = configuredResourcePath.endsWith('/');
|
|
254
|
+
if (isContainer) {
|
|
255
|
+
// Document mode: resourceUrl is the container
|
|
256
|
+
// Actual resource files are determined by subjectTemplate at query time
|
|
257
|
+
const containerUrl = absoluteResource.endsWith('/') ? absoluteResource : `${absoluteResource}/`;
|
|
258
|
+
return {
|
|
259
|
+
containerUrl,
|
|
260
|
+
resourceUrl: containerUrl
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
// File mode (Fragment mode or explicit file path): derive container from resource path
|
|
264
|
+
const normalizedResource = this.normalizeResourceUrl(absoluteResource);
|
|
265
|
+
const lastSlash = normalizedResource.lastIndexOf('/');
|
|
266
|
+
const containerUrl = lastSlash >= 0 ? `${normalizedResource.slice(0, lastSlash + 1)}` : `${normalizedResource}/`;
|
|
267
|
+
return {
|
|
268
|
+
containerUrl,
|
|
269
|
+
resourceUrl: normalizedResource
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
const configuredPath = table.getContainerPath() || '/data/';
|
|
273
|
+
const isAbsolute = configuredPath.startsWith('http://') || configuredPath.startsWith('https://');
|
|
274
|
+
const ensureTrailingSlash = (value) => (value.endsWith('/') ? value : `${value}/`);
|
|
275
|
+
if (isAbsolute) {
|
|
276
|
+
if (configuredPath.endsWith('/')) {
|
|
277
|
+
const containerUrl = ensureTrailingSlash(configuredPath);
|
|
278
|
+
return {
|
|
279
|
+
containerUrl,
|
|
280
|
+
resourceUrl: `${containerUrl}${table.config.name}.ttl`
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
const normalizedResource = configuredPath;
|
|
284
|
+
const lastSlash = normalizedResource.lastIndexOf('/');
|
|
285
|
+
if (lastSlash === -1) {
|
|
286
|
+
throw new Error(`Invalid containerPath for table ${table.config.name}: ${configuredPath}`);
|
|
287
|
+
}
|
|
288
|
+
const containerUrl = ensureTrailingSlash(normalizedResource.slice(0, lastSlash + 1));
|
|
289
|
+
return {
|
|
290
|
+
containerUrl,
|
|
291
|
+
resourceUrl: normalizedResource
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
const userPath = this.extractUserPathFromWebId();
|
|
295
|
+
const trimmedPath = configuredPath.replace(/^\/+/, '');
|
|
296
|
+
const baseUrl = this.podUrl.endsWith('/') ? this.podUrl : `${this.podUrl}/`;
|
|
297
|
+
const userPrefix = userPath.replace(/^\/+/, '');
|
|
298
|
+
const trimHasUserPrefix = userPrefix && trimmedPath.startsWith(userPrefix);
|
|
299
|
+
if (configuredPath.endsWith('/')) {
|
|
300
|
+
const relativeContainer = trimHasUserPrefix ? trimmedPath : `${userPrefix}${trimmedPath}`;
|
|
301
|
+
const containerUrl = ensureTrailingSlash(`${baseUrl}${relativeContainer.replace(/^\/+/, '')}`);
|
|
302
|
+
return {
|
|
303
|
+
containerUrl,
|
|
304
|
+
resourceUrl: `${containerUrl}${table.config.name}.ttl`
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
const resourceRelative = trimHasUserPrefix ? trimmedPath : `${userPrefix}${trimmedPath}`;
|
|
308
|
+
const lastSlash = resourceRelative.lastIndexOf('/');
|
|
309
|
+
const containerRelative = lastSlash >= 0 ? resourceRelative.slice(0, lastSlash + 1) : userPrefix;
|
|
310
|
+
const containerUrl = ensureTrailingSlash(`${baseUrl}${containerRelative.replace(/^\/+/, '')}`);
|
|
311
|
+
const resourceUrl = `${baseUrl}${resourceRelative.replace(/^\/+/, '')}`;
|
|
312
|
+
return { containerUrl, resourceUrl };
|
|
313
|
+
}
|
|
314
|
+
collectSelectSources(plan) {
|
|
315
|
+
const tables = new Set();
|
|
316
|
+
if (plan.baseTable) {
|
|
317
|
+
tables.add(plan.baseTable);
|
|
318
|
+
}
|
|
319
|
+
if (Array.isArray(plan.joins)) {
|
|
320
|
+
for (const join of plan.joins) {
|
|
321
|
+
if (join?.table) {
|
|
322
|
+
tables.add(join.table);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
if (plan.aliasToTable instanceof Map) {
|
|
327
|
+
for (const table of plan.aliasToTable.values()) {
|
|
328
|
+
if (table) {
|
|
329
|
+
tables.add(table);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
const seen = new Set();
|
|
334
|
+
const sources = [];
|
|
335
|
+
for (const table of tables) {
|
|
336
|
+
const descriptor = this.resolveTableResource(table);
|
|
337
|
+
if (descriptor.mode === 'ldp') {
|
|
338
|
+
// Document mode: query the container, not a single file
|
|
339
|
+
const resourceMode = this.uriResolver.getResourceMode(table);
|
|
340
|
+
const sourceUrl = resourceMode === 'document'
|
|
341
|
+
? descriptor.containerUrl
|
|
342
|
+
: descriptor.resourceUrl;
|
|
343
|
+
const key = `ldp:${sourceUrl}`;
|
|
344
|
+
if (!seen.has(key)) {
|
|
345
|
+
seen.add(key);
|
|
346
|
+
sources.push(sourceUrl);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
else {
|
|
350
|
+
const key = `sparql:${descriptor.endpoint}`;
|
|
351
|
+
if (!seen.has(key)) {
|
|
352
|
+
seen.add(key);
|
|
353
|
+
sources.push({ type: 'sparql', value: descriptor.endpoint });
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
return sources;
|
|
358
|
+
}
|
|
359
|
+
async resourceExists(resourceUrl) {
|
|
360
|
+
const normalizedUrl = this.normalizeResourceUrl(resourceUrl);
|
|
361
|
+
if (this.preparedResources.has(normalizedUrl)) {
|
|
362
|
+
return true;
|
|
363
|
+
}
|
|
364
|
+
try {
|
|
365
|
+
const response = await this.runtime.getFetch()(normalizedUrl, { method: 'HEAD' });
|
|
366
|
+
if (response.ok || response.status === 409) {
|
|
367
|
+
this.markResourcePrepared(normalizedUrl);
|
|
368
|
+
return true;
|
|
369
|
+
}
|
|
370
|
+
if (response.status === 404) {
|
|
371
|
+
return false;
|
|
372
|
+
}
|
|
373
|
+
if (response.status === 405) {
|
|
374
|
+
const getResponse = await this.runtime.getFetch()(normalizedUrl, {
|
|
375
|
+
method: 'GET',
|
|
376
|
+
headers: { 'Accept': 'text/turtle' }
|
|
377
|
+
});
|
|
378
|
+
if (getResponse.ok) {
|
|
379
|
+
this.markResourcePrepared(normalizedUrl);
|
|
380
|
+
return true;
|
|
381
|
+
}
|
|
382
|
+
return false;
|
|
383
|
+
}
|
|
384
|
+
if (response.status === 401 || response.status === 403) {
|
|
385
|
+
// 无法验证是否存在,假定存在以避免破坏流程
|
|
386
|
+
this.markResourcePrepared(normalizedUrl);
|
|
387
|
+
return true;
|
|
388
|
+
}
|
|
389
|
+
return response.ok;
|
|
390
|
+
}
|
|
391
|
+
catch (error) {
|
|
392
|
+
console.warn('[PodDialect] Failed to check resource existence via HEAD, falling back to GET', error);
|
|
393
|
+
try {
|
|
394
|
+
const getResponse = await this.runtime.getFetch()(normalizedUrl, {
|
|
395
|
+
method: 'GET',
|
|
396
|
+
headers: { 'Accept': 'text/turtle' }
|
|
397
|
+
});
|
|
398
|
+
if (getResponse.ok) {
|
|
399
|
+
this.markResourcePrepared(normalizedUrl);
|
|
400
|
+
return true;
|
|
401
|
+
}
|
|
402
|
+
return false;
|
|
403
|
+
}
|
|
404
|
+
catch (fallbackError) {
|
|
405
|
+
console.warn('[PodDialect] Resource existence fallback GET failed', fallbackError);
|
|
406
|
+
return false;
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
normalizeResourceUrl(resourceUrl) {
|
|
411
|
+
if (!resourceUrl) {
|
|
412
|
+
return resourceUrl;
|
|
413
|
+
}
|
|
414
|
+
let normalized = resourceUrl;
|
|
415
|
+
while (normalized.endsWith('/') && !normalized.endsWith('://')) {
|
|
416
|
+
normalized = normalized.slice(0, -1);
|
|
417
|
+
}
|
|
418
|
+
return normalized;
|
|
419
|
+
}
|
|
420
|
+
normalizeContainerKey(containerUrl) {
|
|
421
|
+
const absoluteContainer = containerUrl.startsWith('http')
|
|
422
|
+
? containerUrl
|
|
423
|
+
: this.resolveAbsoluteUrl(containerUrl);
|
|
424
|
+
return absoluteContainer.endsWith('/') ? absoluteContainer : `${absoluteContainer}/`;
|
|
425
|
+
}
|
|
426
|
+
normalizeResourceKey(resourceUrl) {
|
|
427
|
+
const absoluteResource = resourceUrl.startsWith('http')
|
|
428
|
+
? resourceUrl
|
|
429
|
+
: this.resolveAbsoluteUrl(resourceUrl);
|
|
430
|
+
return this.normalizeResourceUrl(absoluteResource);
|
|
431
|
+
}
|
|
432
|
+
markContainerPrepared(containerUrl) {
|
|
433
|
+
this.preparedContainers.add(this.normalizeContainerKey(containerUrl));
|
|
434
|
+
}
|
|
435
|
+
markResourcePrepared(resourceUrl) {
|
|
436
|
+
this.preparedResources.add(this.normalizeResourceKey(resourceUrl));
|
|
437
|
+
}
|
|
438
|
+
isAbsoluteUrl(value) {
|
|
439
|
+
return /^https?:\/\//i.test(value);
|
|
440
|
+
}
|
|
441
|
+
resolveAbsoluteUrl(path) {
|
|
442
|
+
if (!path) {
|
|
443
|
+
return this.podUrl.replace(/\/$/, '');
|
|
444
|
+
}
|
|
445
|
+
if (this.isAbsoluteUrl(path)) {
|
|
446
|
+
return path;
|
|
447
|
+
}
|
|
448
|
+
const sanitizedPath = path.replace(/^(\.\/)+/, '');
|
|
449
|
+
const base = this.podUrl.endsWith('/') ? this.podUrl : `${this.podUrl}/`;
|
|
450
|
+
const hasTrailingSlash = sanitizedPath.endsWith('/');
|
|
451
|
+
const rawUserPath = this.extractUserPathFromWebId();
|
|
452
|
+
const normalizedUser = rawUserPath.replace(/^\/+|\/+$/g, '');
|
|
453
|
+
const trimmedPath = sanitizedPath.replace(/^\/+/, '');
|
|
454
|
+
let relativePath = trimmedPath;
|
|
455
|
+
const userPrefixWithSlash = normalizedUser.length > 0 ? `${normalizedUser}/` : '';
|
|
456
|
+
if (normalizedUser.length > 0) {
|
|
457
|
+
let podPathHasUser = false;
|
|
458
|
+
try {
|
|
459
|
+
const podPath = new URL(base).pathname.replace(/^\/+|\/+$/g, '');
|
|
460
|
+
podPathHasUser = podPath.startsWith(normalizedUser);
|
|
461
|
+
}
|
|
462
|
+
catch {
|
|
463
|
+
podPathHasUser = false;
|
|
464
|
+
}
|
|
465
|
+
const needsUserPrefix = (!podPathHasUser) &&
|
|
466
|
+
(relativePath.length === 0 ||
|
|
467
|
+
(relativePath !== normalizedUser && !relativePath.startsWith(userPrefixWithSlash)));
|
|
468
|
+
if (needsUserPrefix) {
|
|
469
|
+
relativePath = relativePath.length > 0
|
|
470
|
+
? `${normalizedUser}/${relativePath}`
|
|
471
|
+
: normalizedUser;
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
if (hasTrailingSlash && !relativePath.endsWith('/')) {
|
|
475
|
+
relativePath = `${relativePath}/`;
|
|
476
|
+
}
|
|
477
|
+
const absolute = new URL(relativePath, base).toString();
|
|
478
|
+
if (!hasTrailingSlash && absolute.endsWith('/')) {
|
|
479
|
+
return absolute.replace(/\/$/, '');
|
|
480
|
+
}
|
|
481
|
+
return absolute;
|
|
482
|
+
}
|
|
483
|
+
async ensureResourceExists(resourceUrl, options = {}) {
|
|
484
|
+
const { createIfMissing = true } = options;
|
|
485
|
+
const normalizedUrl = this.normalizeResourceUrl(resourceUrl);
|
|
486
|
+
if (this.preparedResources.has(normalizedUrl)) {
|
|
487
|
+
return;
|
|
488
|
+
}
|
|
489
|
+
const exists = await this.resourceExists(normalizedUrl);
|
|
490
|
+
if (exists) {
|
|
491
|
+
this.markResourcePrepared(normalizedUrl);
|
|
492
|
+
return;
|
|
493
|
+
}
|
|
494
|
+
if (!createIfMissing) {
|
|
495
|
+
throw new Error(`Resource not found: ${normalizedUrl}`);
|
|
496
|
+
}
|
|
497
|
+
for (let i = 0; i < 3; i++) {
|
|
498
|
+
try {
|
|
499
|
+
const response = await this.runtime.getFetch()(normalizedUrl, {
|
|
500
|
+
method: 'PUT',
|
|
501
|
+
headers: {
|
|
502
|
+
'Content-Type': 'text/turtle'
|
|
503
|
+
},
|
|
504
|
+
body: ''
|
|
505
|
+
});
|
|
506
|
+
if (response.ok || [201, 202, 204, 409].includes(response.status)) {
|
|
507
|
+
// Invalidate cache for the new resource
|
|
508
|
+
await this.sparqlExecutor.invalidateHttpCache(normalizedUrl);
|
|
509
|
+
this.markResourcePrepared(normalizedUrl);
|
|
510
|
+
return;
|
|
511
|
+
}
|
|
512
|
+
if (response.status >= 500) {
|
|
513
|
+
console.warn(`[PodDialect] ensureResourceExists attempt ${i + 1}/3 failed with ${response.status}, retrying...`);
|
|
514
|
+
await new Promise(r => setTimeout(r, 1000));
|
|
515
|
+
continue;
|
|
516
|
+
}
|
|
517
|
+
throw new Error(`Failed to create resource: ${response.status} ${response.statusText}`);
|
|
518
|
+
}
|
|
519
|
+
catch (error) {
|
|
520
|
+
if (i === 2) {
|
|
521
|
+
console.error('[PodDialect] ensureResourceExists failed after 3 attempts:', error);
|
|
522
|
+
throw error;
|
|
523
|
+
}
|
|
524
|
+
console.warn(`[PodDialect] ensureResourceExists attempt ${i + 1}/3 failed with error:`, error);
|
|
525
|
+
await new Promise(r => setTimeout(r, 1000));
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
async executeOnResource(resourceUrl, sparqlQuery, descriptor) {
|
|
530
|
+
const normalizedUrl = this.normalizeResourceUrl(resourceUrl);
|
|
531
|
+
if (descriptor?.mode === 'sparql') {
|
|
532
|
+
return await this.executeOnSparqlEndpoint(descriptor.endpoint, sparqlQuery);
|
|
533
|
+
}
|
|
534
|
+
// LDP 模式:仅允许 SELECT/ASK 通过 Comunica;UPDATE 走 N3 Patch
|
|
535
|
+
if (sparqlQuery.type === 'SELECT' || sparqlQuery.type === 'ASK') {
|
|
536
|
+
return await this.sparqlExecutor.queryContainer(normalizedUrl, sparqlQuery);
|
|
537
|
+
}
|
|
538
|
+
throw new Error('LDP mode does not support SPARQL UPDATE; use N3 patch helpers instead.');
|
|
539
|
+
}
|
|
540
|
+
/**
|
|
541
|
+
* Get the appropriate fetch function for a SPARQL endpoint
|
|
542
|
+
* - Same-origin endpoints (e.g., CSS SPARQL sidecar): use authenticated session.fetch
|
|
543
|
+
* - Cross-origin endpoints: use unauthenticated fetch (standard SPARQL endpoint behavior)
|
|
544
|
+
*/
|
|
545
|
+
getFetchForEndpoint(endpoint) {
|
|
546
|
+
return (0, origin_auth_1.getFetchForOrigin)(endpoint, this.podUrl, this.runtime.getFetch());
|
|
547
|
+
}
|
|
548
|
+
async executeOnSparqlEndpoint(endpoint, sparqlQuery) {
|
|
549
|
+
const fetchFn = this.getFetchForEndpoint(endpoint);
|
|
550
|
+
if (sparqlQuery.type === 'SELECT' || sparqlQuery.type === 'ASK') {
|
|
551
|
+
// For SELECT/ASK, we need to create a temporary executor with the appropriate fetch
|
|
552
|
+
if ((0, origin_auth_1.isSameOrigin)(endpoint, this.podUrl)) {
|
|
553
|
+
// Same origin: use authenticated executor
|
|
554
|
+
return await this.sparqlExecutor.executeQueryWithSource(sparqlQuery, endpoint);
|
|
555
|
+
}
|
|
556
|
+
else {
|
|
557
|
+
// Cross-origin: create an unauthenticated executor
|
|
558
|
+
const unauthExecutor = new sparql_executor_1.ComunicaSPARQLExecutor({
|
|
559
|
+
sources: [endpoint],
|
|
560
|
+
fetch: fetch, // Use standard fetch without auth
|
|
561
|
+
logging: false
|
|
562
|
+
});
|
|
563
|
+
return await unauthExecutor.executeQueryWithSource(sparqlQuery, endpoint);
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
const response = await fetchFn(endpoint, {
|
|
567
|
+
method: 'POST',
|
|
568
|
+
headers: { 'Content-Type': 'application/sparql-update' },
|
|
569
|
+
body: sparqlQuery.query
|
|
570
|
+
});
|
|
571
|
+
if (!response.ok) {
|
|
572
|
+
const text = await response.text().catch(() => '');
|
|
573
|
+
throw new Error(`SPARQL endpoint update failed: ${response.status} ${response.statusText}${text ? ` - ${text}` : ''}`);
|
|
574
|
+
}
|
|
575
|
+
return [{ success: true, source: endpoint, status: response.status, via: 'sparql-endpoint' }];
|
|
576
|
+
}
|
|
577
|
+
/**
|
|
578
|
+
* 确保表有 resourcePath,如果没有则从 TypeIndex 自动发现
|
|
579
|
+
* 如果设置了 typeIndex,优先使用发现的位置(覆盖配置的 base)
|
|
580
|
+
*/
|
|
581
|
+
async ensureTableResourcePath(table) {
|
|
582
|
+
const rdfClass = typeof table.config.type === 'string'
|
|
583
|
+
? table.config.type
|
|
584
|
+
: table.config.type.value || String(table.config.type);
|
|
585
|
+
// 检查是否已经有 resourcePath
|
|
586
|
+
const configuredResourcePath = (typeof table.getResourcePath === 'function' && table.getResourcePath()) ||
|
|
587
|
+
table.config?.resourcePath;
|
|
588
|
+
// 如果没有设置 typeIndex,使用配置的 resourcePath(如果有)
|
|
589
|
+
if (!table.config.typeIndex) {
|
|
590
|
+
if (configuredResourcePath && configuredResourcePath.trim().length > 0) {
|
|
591
|
+
// 已经有 resourcePath,直接使用配置
|
|
592
|
+
return;
|
|
593
|
+
}
|
|
594
|
+
// 没有 resourcePath,使用默认容器
|
|
595
|
+
console.log(`[AutoDiscover] Table ${table.config.name} has no resourcePath, using default container path`);
|
|
596
|
+
table.config.containerPath = '/data/';
|
|
597
|
+
return;
|
|
598
|
+
}
|
|
599
|
+
// 设置了 typeIndex,尝试从 TypeIndex/SAI 发现位置
|
|
600
|
+
// 发现的位置会覆盖配置的 base,实现动态路由
|
|
601
|
+
console.log(`[AutoDiscover] Table ${table.config.name} has typeIndex enabled, discovering from TypeIndex/SAI...`);
|
|
602
|
+
try {
|
|
603
|
+
const locations = await this.discovery.discover(rdfClass);
|
|
604
|
+
const location = locations[0]; // 使用第一个发现的位置
|
|
605
|
+
if (location) {
|
|
606
|
+
// 动态设置 containerPath 和 resourcePath
|
|
607
|
+
// 假设 location.container 是 containerPath 或 URL
|
|
608
|
+
let containerPath = location.container;
|
|
609
|
+
// 如果返回的是绝对 URL,尝试转为相对路径(可选,但保持一致性较好)
|
|
610
|
+
// 这里暂时直接使用
|
|
611
|
+
if (!containerPath.endsWith('/')) {
|
|
612
|
+
containerPath += '/';
|
|
613
|
+
}
|
|
614
|
+
// 如果发现了 subjectTemplate,应用到表配置
|
|
615
|
+
if (location.subjectTemplate && typeof table.setSubjectTemplate === 'function') {
|
|
616
|
+
table.setSubjectTemplate(location.subjectTemplate);
|
|
617
|
+
console.log(`[AutoDiscover] ✓ Applied subjectTemplate from discovery: ${location.subjectTemplate}`);
|
|
618
|
+
}
|
|
619
|
+
// 推断 resourcePath
|
|
620
|
+
// 根据资源模式决定 resourcePath:
|
|
621
|
+
// - Document 模式:resourcePath = containerPath (每条记录独立文件,查询扫描整个容器)
|
|
622
|
+
// - Fragment 模式:resourcePath = containerPath + tableName.ttl (所有记录在同一文件)
|
|
623
|
+
const resourceMode = this.uriResolver.getResourceMode(table);
|
|
624
|
+
let resourcePath;
|
|
625
|
+
if (resourceMode === 'document') {
|
|
626
|
+
// Document 模式:resourcePath 就是容器本身
|
|
627
|
+
// SELECT 查询会扫描容器下的所有 .ttl 文件
|
|
628
|
+
resourcePath = containerPath;
|
|
629
|
+
}
|
|
630
|
+
else {
|
|
631
|
+
// Fragment 模式:resourcePath 指向单个文件
|
|
632
|
+
resourcePath = `${containerPath}${table.config.name}.ttl`;
|
|
633
|
+
}
|
|
634
|
+
console.log(`[AutoDiscover] ✓ Found resource path from TypeIndex: ${resourcePath} (mode: ${resourceMode})`);
|
|
635
|
+
// 动态注入到表配置中
|
|
636
|
+
// 使用 setBase 更新内部状态和 config.base,确保 SubjectResolver 能获取到正确路径
|
|
637
|
+
if (typeof table.setBase === 'function') {
|
|
638
|
+
table.setBase(resourcePath);
|
|
639
|
+
}
|
|
640
|
+
else {
|
|
641
|
+
// Fallback for minimal mock tables
|
|
642
|
+
table.config.containerPath = containerPath;
|
|
643
|
+
table.config.resourcePath = resourcePath;
|
|
644
|
+
table.config.base = resourcePath;
|
|
645
|
+
}
|
|
646
|
+
// 尝试自动发现 SPARQL endpoint
|
|
647
|
+
await this.tryDiscoverSparqlEndpoint(table, containerPath);
|
|
648
|
+
}
|
|
649
|
+
else {
|
|
650
|
+
// Discovery 没有找到位置
|
|
651
|
+
if (configuredResourcePath && configuredResourcePath.trim().length > 0) {
|
|
652
|
+
// 有配置的 resourcePath,使用它作为 fallback
|
|
653
|
+
console.log(`[AutoDiscover] No discovery result, using configured path: ${configuredResourcePath}`);
|
|
654
|
+
return;
|
|
655
|
+
}
|
|
656
|
+
// 没有配置的 resourcePath,抛出错误
|
|
657
|
+
throw new Error(`[AutoDiscover] No data location found for type ${rdfClass}. Please ensure the data is registered in TypeIndex or SAI Registry.`);
|
|
658
|
+
}
|
|
659
|
+
}
|
|
660
|
+
catch (error) {
|
|
661
|
+
// 发现过程出错
|
|
662
|
+
if (configuredResourcePath && configuredResourcePath.trim().length > 0) {
|
|
663
|
+
// 有配置的 resourcePath,使用它作为 fallback
|
|
664
|
+
console.warn('[AutoDiscover] Discovery process failed, using configured path:', configuredResourcePath);
|
|
665
|
+
return;
|
|
666
|
+
}
|
|
667
|
+
console.warn('[AutoDiscover] Discovery process failed:', error);
|
|
668
|
+
throw error; // Re-throw
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
/**
|
|
672
|
+
* 尝试自动发现 SPARQL endpoint
|
|
673
|
+
* 按约定:${base}/-/sparql
|
|
674
|
+
*/
|
|
675
|
+
async tryDiscoverSparqlEndpoint(table, base) {
|
|
676
|
+
// 如果表已经配置了 sparqlEndpoint,跳过
|
|
677
|
+
if (table.getSparqlEndpoint()) {
|
|
678
|
+
return;
|
|
679
|
+
}
|
|
680
|
+
// 构建约定的 endpoint URL
|
|
681
|
+
const potentialEndpoint = `${base.replace(/\/$/, '')}/-/sparql`;
|
|
682
|
+
try {
|
|
683
|
+
const response = await this.runtime.getFetch()(potentialEndpoint, { method: 'HEAD' });
|
|
684
|
+
if (response.ok) {
|
|
685
|
+
console.log(`[AutoDiscover] ✓ Found SPARQL endpoint: ${potentialEndpoint}`);
|
|
686
|
+
if (typeof table.setSparqlEndpoint === 'function') {
|
|
687
|
+
table.setSparqlEndpoint(potentialEndpoint);
|
|
688
|
+
}
|
|
689
|
+
}
|
|
690
|
+
}
|
|
691
|
+
catch {
|
|
692
|
+
// SPARQL endpoint 不存在,继续使用 LDP 模式
|
|
693
|
+
}
|
|
694
|
+
}
|
|
695
|
+
// 核心查询方法 - 通过 ExecutionStrategy 执行
|
|
696
|
+
async query(operation) {
|
|
697
|
+
return this.executor.query(operation);
|
|
698
|
+
}
|
|
699
|
+
buildIdInConditionFromSubjects(subjects) {
|
|
700
|
+
if (!subjects || subjects.length === 0) {
|
|
701
|
+
return undefined;
|
|
702
|
+
}
|
|
703
|
+
return new expressions_1.BinaryExpression('@id', 'IN', subjects);
|
|
704
|
+
}
|
|
705
|
+
isInsertPlan(plan) {
|
|
706
|
+
return Boolean(plan && typeof plan.table !== 'undefined' && Array.isArray(plan.rows));
|
|
707
|
+
}
|
|
708
|
+
isUpdatePlan(plan) {
|
|
709
|
+
return Boolean(plan && typeof plan.table !== 'undefined' && 'data' in plan);
|
|
710
|
+
}
|
|
711
|
+
isDeletePlan(plan) {
|
|
712
|
+
if (!plan) {
|
|
713
|
+
return false;
|
|
714
|
+
}
|
|
715
|
+
const candidate = plan;
|
|
716
|
+
if (typeof candidate.table === 'undefined') {
|
|
717
|
+
return false;
|
|
718
|
+
}
|
|
719
|
+
return typeof candidate.rows === 'undefined' && typeof candidate.data === 'undefined';
|
|
720
|
+
}
|
|
721
|
+
isSelectPlan(plan) {
|
|
722
|
+
if (!plan) {
|
|
723
|
+
return false;
|
|
724
|
+
}
|
|
725
|
+
return typeof plan.baseTable !== 'undefined';
|
|
726
|
+
}
|
|
727
|
+
buildSubjectLookupPlan(table, condition) {
|
|
728
|
+
const alias = table.config.name ?? 'table';
|
|
729
|
+
return {
|
|
730
|
+
baseTable: table,
|
|
731
|
+
baseAlias: alias,
|
|
732
|
+
selectAll: true,
|
|
733
|
+
conditionTree: condition,
|
|
734
|
+
aliasToTable: new Map([[alias, table]]),
|
|
735
|
+
tableToAlias: new Map([[table, alias]])
|
|
736
|
+
};
|
|
737
|
+
}
|
|
738
|
+
buildSubjectUriFromFragment(fragment, table) {
|
|
739
|
+
// This method is used by rewriteWhereConditionWithSubjects and other internal logic
|
|
740
|
+
// Ideally we should use SubjectResolver, but for fragment building relative to base, we need this helper.
|
|
741
|
+
// Or delegate to SubjectResolver if it exposes parsing.
|
|
742
|
+
// SubjectResolver.parse handles URIs.
|
|
743
|
+
// For now, keep this simple helper as it was used by extractSubjectFromRow logic context.
|
|
744
|
+
// Wait, extractSubjectFromRow doesn't use this.
|
|
745
|
+
// But `rewriteWhereConditionWithSubjects` calls `findSubjectsForCondition`.
|
|
746
|
+
// `findSubjectsForCondition` calls `buildSubjectLookupPlan` which is also missing?
|
|
747
|
+
return this.sparqlConverter.generateSubjectUri({ id: fragment }, table);
|
|
748
|
+
}
|
|
749
|
+
extractSubjectFromRow(row) {
|
|
750
|
+
const subject = row.subject ?? row['?subject'];
|
|
751
|
+
if (!subject) {
|
|
752
|
+
return null;
|
|
753
|
+
}
|
|
754
|
+
if (typeof subject === 'string') {
|
|
755
|
+
return subject;
|
|
756
|
+
}
|
|
757
|
+
if (typeof subject.value === 'string') {
|
|
758
|
+
return subject.value;
|
|
759
|
+
}
|
|
760
|
+
return null;
|
|
761
|
+
}
|
|
762
|
+
operationHasInlineObjects(table, data) {
|
|
763
|
+
return Object.entries(data).some(([key, value]) => {
|
|
764
|
+
if (value === undefined)
|
|
765
|
+
return false;
|
|
766
|
+
const col = table.columns?.[key];
|
|
767
|
+
if (!col)
|
|
768
|
+
return false;
|
|
769
|
+
return this.isInlineObjectColumn(col);
|
|
770
|
+
});
|
|
771
|
+
}
|
|
772
|
+
isInlineObjectColumn(column) {
|
|
773
|
+
if (!column)
|
|
774
|
+
return false;
|
|
775
|
+
if (column.dataType === 'object')
|
|
776
|
+
return true;
|
|
777
|
+
if (column.dataType === 'array') {
|
|
778
|
+
const elem = column.elementType ?? column.options?.baseType;
|
|
779
|
+
return elem === 'object';
|
|
780
|
+
}
|
|
781
|
+
return false;
|
|
782
|
+
}
|
|
783
|
+
conditionTargetsIdentifier(condition) {
|
|
784
|
+
if (!condition) {
|
|
785
|
+
return false;
|
|
786
|
+
}
|
|
787
|
+
// BinaryExpression: check 'left' property
|
|
788
|
+
if (condition.type === 'binary_expr') {
|
|
789
|
+
const left = condition.left;
|
|
790
|
+
const colName = typeof left === 'string' ? left : left?.name;
|
|
791
|
+
if (colName === '@id' || colName === 'id') {
|
|
792
|
+
return true;
|
|
793
|
+
}
|
|
794
|
+
}
|
|
795
|
+
// LogicalExpression: check 'expressions' property
|
|
796
|
+
if (condition.type === 'logical_expr') {
|
|
797
|
+
const exprs = condition.expressions;
|
|
798
|
+
if (exprs) {
|
|
799
|
+
return exprs.some((child) => this.conditionTargetsIdentifier(child));
|
|
800
|
+
}
|
|
801
|
+
}
|
|
802
|
+
// UnaryExpression: check 'value' property
|
|
803
|
+
if (condition.type === 'unary_expr') {
|
|
804
|
+
const val = condition.value;
|
|
805
|
+
if (val && typeof val === 'object' && 'type' in val) {
|
|
806
|
+
return this.conditionTargetsIdentifier(val);
|
|
807
|
+
}
|
|
808
|
+
}
|
|
809
|
+
return false;
|
|
810
|
+
}
|
|
811
|
+
async ensureIdentifierCondition(condition, table, resourceUrl) {
|
|
812
|
+
if (!condition) {
|
|
813
|
+
return undefined;
|
|
814
|
+
}
|
|
815
|
+
if (this.conditionTargetsIdentifier(condition)) {
|
|
816
|
+
return condition;
|
|
817
|
+
}
|
|
818
|
+
return await this.rewriteWhereConditionWithSubjects(condition, table, resourceUrl);
|
|
819
|
+
}
|
|
820
|
+
async rewriteWhereConditionWithSubjects(condition, table, resourceUrl) {
|
|
821
|
+
if (!condition) {
|
|
822
|
+
return undefined;
|
|
823
|
+
}
|
|
824
|
+
const subjects = await this.findSubjectsForCondition(condition, table, resourceUrl);
|
|
825
|
+
return this.buildIdInConditionFromSubjects(subjects);
|
|
826
|
+
}
|
|
827
|
+
// 处理 Drizzle 的 SQL 对象
|
|
828
|
+
async executeSql(sql, table) {
|
|
829
|
+
// 解析 SQL 对象确定操作类型
|
|
830
|
+
const sqlString = sql.queryChunks.join('');
|
|
831
|
+
let operationType;
|
|
832
|
+
if (sqlString.toLowerCase().includes('select')) {
|
|
833
|
+
operationType = 'select';
|
|
834
|
+
}
|
|
835
|
+
else if (sqlString.toLowerCase().includes('insert')) {
|
|
836
|
+
operationType = 'insert';
|
|
837
|
+
}
|
|
838
|
+
else if (sqlString.toLowerCase().includes('update')) {
|
|
839
|
+
operationType = 'update';
|
|
840
|
+
}
|
|
841
|
+
else if (sqlString.toLowerCase().includes('delete')) {
|
|
842
|
+
operationType = 'delete';
|
|
843
|
+
}
|
|
844
|
+
else {
|
|
845
|
+
throw new Error(`Unsupported SQL operation: ${sqlString}`);
|
|
846
|
+
}
|
|
847
|
+
const operation = {
|
|
848
|
+
type: operationType,
|
|
849
|
+
table,
|
|
850
|
+
sql,
|
|
851
|
+
values: sql.params || [] // 参数作为值
|
|
852
|
+
};
|
|
853
|
+
return this.query(operation);
|
|
854
|
+
}
|
|
855
|
+
// 添加自定义命名空间到 SPARQL 转换器
|
|
856
|
+
addNamespace(prefix, uri) {
|
|
857
|
+
this.sparqlConverter.addPrefix(prefix, uri);
|
|
858
|
+
}
|
|
859
|
+
// 获取配置信息
|
|
860
|
+
getConfig() {
|
|
861
|
+
return {
|
|
862
|
+
podUrl: this.podUrl,
|
|
863
|
+
webId: this.webId,
|
|
864
|
+
connected: this.runtime.isConnected()
|
|
865
|
+
};
|
|
866
|
+
}
|
|
867
|
+
/**
|
|
868
|
+
* 获取认证的 fetch 函数
|
|
869
|
+
* 用于需要认证访问的操作(如 Notifications)
|
|
870
|
+
*/
|
|
871
|
+
getAuthenticatedFetch() {
|
|
872
|
+
return this.runtime.getFetch();
|
|
873
|
+
}
|
|
874
|
+
// 获取 SPARQL 转换器(用于调试)
|
|
875
|
+
getSPARQLConverter() {
|
|
876
|
+
return this.sparqlConverter;
|
|
877
|
+
}
|
|
878
|
+
// 获取 SPARQL 执行器(用于调试)
|
|
879
|
+
getSPARQLExecutor() {
|
|
880
|
+
return this.sparqlExecutor;
|
|
881
|
+
}
|
|
882
|
+
getPodUrl() {
|
|
883
|
+
return this.runtime.getPodUrl();
|
|
884
|
+
}
|
|
885
|
+
/**
|
|
886
|
+
* 获取用户的 WebID
|
|
887
|
+
*/
|
|
888
|
+
getWebId() {
|
|
889
|
+
return this.runtime.getWebId();
|
|
890
|
+
}
|
|
891
|
+
/**
|
|
892
|
+
* 发现特定 RDF 类型的数据位置
|
|
893
|
+
* 通过 TypeIndex 和 Interop 发现
|
|
894
|
+
*
|
|
895
|
+
* @param rdfClass RDF 类型 URI
|
|
896
|
+
* @returns 数据位置列表
|
|
897
|
+
*/
|
|
898
|
+
async discoverDataLocations(rdfClass, options) {
|
|
899
|
+
return this.discovery.discover(rdfClass, options);
|
|
900
|
+
}
|
|
901
|
+
/**
|
|
902
|
+
* 获取所有数据注册信息
|
|
903
|
+
*/
|
|
904
|
+
async discoverAll() {
|
|
905
|
+
if (this.discovery.discoverAll) {
|
|
906
|
+
return this.discovery.discoverAll();
|
|
907
|
+
}
|
|
908
|
+
return [];
|
|
909
|
+
}
|
|
910
|
+
/**
|
|
911
|
+
* 按应用 ID 发现数据位置
|
|
912
|
+
*/
|
|
913
|
+
async discoverByApp(appId) {
|
|
914
|
+
if (this.discovery.discoverByApp) {
|
|
915
|
+
return this.discovery.discoverByApp(appId);
|
|
916
|
+
}
|
|
917
|
+
return [];
|
|
918
|
+
}
|
|
919
|
+
// 添加数据源进行联邦查询(高级用法)
|
|
920
|
+
// 注意:正常情况下不需要手动添加数据源,表定义中的 containerPath 会自动使用
|
|
921
|
+
addSource(source) {
|
|
922
|
+
console.warn('⚠️ addSource 是高级用法,通常不需要手动管理数据源。表定义中的 containerPath 会自动使用。');
|
|
923
|
+
this.sparqlExecutor.addSource(source);
|
|
924
|
+
}
|
|
925
|
+
// 移除数据源
|
|
926
|
+
removeSource(source) {
|
|
927
|
+
this.sparqlExecutor.removeSource(source);
|
|
928
|
+
}
|
|
929
|
+
// 获取当前数据源列表
|
|
930
|
+
getSources() {
|
|
931
|
+
return this.sparqlExecutor.getSources();
|
|
932
|
+
}
|
|
933
|
+
// 自动从 TypeIndex 添加数据源(推荐用法)
|
|
934
|
+
async addSourcesFromTypeIndex() {
|
|
935
|
+
try {
|
|
936
|
+
const typeIndexEntries = await this.typeIndexManager.discoverTypes();
|
|
937
|
+
for (const entry of typeIndexEntries) {
|
|
938
|
+
if (entry.instanceContainer) {
|
|
939
|
+
// 使用实例容器路径作为数据源
|
|
940
|
+
this.sparqlExecutor.addSource(entry.instanceContainer);
|
|
941
|
+
}
|
|
942
|
+
else if (entry.containerPath) {
|
|
943
|
+
// 使用容器路径作为数据源
|
|
944
|
+
const fullPath = entry.containerPath.startsWith('http')
|
|
945
|
+
? entry.containerPath
|
|
946
|
+
: `${this.podUrl}${entry.containerPath}`;
|
|
947
|
+
this.sparqlExecutor.addSource(fullPath);
|
|
948
|
+
}
|
|
949
|
+
}
|
|
950
|
+
console.log(`✅ 从 TypeIndex 自动添加了 ${typeIndexEntries.length} 个数据源`);
|
|
951
|
+
}
|
|
952
|
+
catch (error) {
|
|
953
|
+
console.warn('⚠️ 无法从 TypeIndex 自动添加数据源:', error);
|
|
954
|
+
}
|
|
955
|
+
}
|
|
956
|
+
// 查询特定容器
|
|
957
|
+
async queryContainer(containerPath, sql, table) {
|
|
958
|
+
// Use proper AST conversion with table context
|
|
959
|
+
const ast = this.sparqlConverter.parseDrizzleAST(sql, table);
|
|
960
|
+
const sparqlQuery = this.sparqlConverter.convertSelect(ast, table);
|
|
961
|
+
// 使用表定义中的容器路径,如果提供了的话
|
|
962
|
+
const targetPath = table?.config?.containerPath || containerPath;
|
|
963
|
+
return this.sparqlExecutor.queryContainer(targetPath, sparqlQuery);
|
|
964
|
+
}
|
|
965
|
+
// 获取 Pod 元数据
|
|
966
|
+
async getPodMetadata() {
|
|
967
|
+
if (!this.runtime.isConnected()) {
|
|
968
|
+
throw new Error('Not connected to Pod');
|
|
969
|
+
}
|
|
970
|
+
return {
|
|
971
|
+
podUrl: this.podUrl,
|
|
972
|
+
webId: this.webId,
|
|
973
|
+
connected: this.runtime.isConnected(),
|
|
974
|
+
sources: this.sparqlExecutor.getSources()
|
|
975
|
+
};
|
|
976
|
+
}
|
|
977
|
+
// 直接执行 SPARQL 查询(高级用法)
|
|
978
|
+
async executeSPARQL(query) {
|
|
979
|
+
if (!this.runtime.isConnected()) {
|
|
980
|
+
throw new Error('Not connected to Pod');
|
|
981
|
+
}
|
|
982
|
+
const sparqlQuery = {
|
|
983
|
+
type: 'SELECT',
|
|
984
|
+
query,
|
|
985
|
+
prefixes: {}
|
|
986
|
+
};
|
|
987
|
+
return this.sparqlExecutor.executeQuery(sparqlQuery);
|
|
988
|
+
}
|
|
989
|
+
// 事务支持
|
|
990
|
+
async transaction(transaction) {
|
|
991
|
+
console.log('Starting transaction');
|
|
992
|
+
try {
|
|
993
|
+
const result = await transaction(this);
|
|
994
|
+
console.log('Transaction completed successfully');
|
|
995
|
+
return result;
|
|
996
|
+
}
|
|
997
|
+
catch (error) {
|
|
998
|
+
console.error('Transaction failed:', error);
|
|
999
|
+
throw error;
|
|
1000
|
+
}
|
|
1001
|
+
}
|
|
1002
|
+
// ========== TypeIndex 相关方法 ==========
|
|
1003
|
+
/**
|
|
1004
|
+
* 注册表到 TypeIndex
|
|
1005
|
+
*/
|
|
1006
|
+
async registerTable(table) {
|
|
1007
|
+
if (table.config.autoRegister === false) {
|
|
1008
|
+
return;
|
|
1009
|
+
}
|
|
1010
|
+
const tableKey = table.config.name ?? JSON.stringify(table.config);
|
|
1011
|
+
if (this.registeredTables.has(tableKey)) {
|
|
1012
|
+
return;
|
|
1013
|
+
}
|
|
1014
|
+
try {
|
|
1015
|
+
const descriptor = this.resolveTableResource(table);
|
|
1016
|
+
if (descriptor.mode === 'sparql') {
|
|
1017
|
+
// No probe needed - if endpoint fails, the actual query will report the error
|
|
1018
|
+
}
|
|
1019
|
+
else {
|
|
1020
|
+
await this.ensureContainerExists(descriptor.containerUrl);
|
|
1021
|
+
try {
|
|
1022
|
+
await this.ensureResourceExists(descriptor.resourceUrl, { createIfMissing: true });
|
|
1023
|
+
this.markResourcePrepared(descriptor.resourceUrl);
|
|
1024
|
+
}
|
|
1025
|
+
catch (error) {
|
|
1026
|
+
console.warn(`[registerTable] ensureResourceExists failed for ${descriptor.resourceUrl}:`, error);
|
|
1027
|
+
// 不标记为已准备,让后续 INSERT 有机会重试创建
|
|
1028
|
+
}
|
|
1029
|
+
this.markContainerPrepared(descriptor.containerUrl);
|
|
1030
|
+
// 将表的 base 固定为已解析的绝对资源路径,避免后续重复 TypeIndex 解析
|
|
1031
|
+
try {
|
|
1032
|
+
table.setBase?.(descriptor.resourceUrl);
|
|
1033
|
+
}
|
|
1034
|
+
catch (error) {
|
|
1035
|
+
console.warn(`[registerTable] setBase failed for ${table.config.name}:`, error);
|
|
1036
|
+
}
|
|
1037
|
+
}
|
|
1038
|
+
}
|
|
1039
|
+
catch (error) {
|
|
1040
|
+
console.warn(`[registerTable] Resource preparation failed for ${table.config.name}:`, error);
|
|
1041
|
+
}
|
|
1042
|
+
this.registeredTables.add(tableKey);
|
|
1043
|
+
// 委托给 DataDiscovery 进行注册
|
|
1044
|
+
await this.discovery.register(table, {
|
|
1045
|
+
registryPath: table.config.saiRegistryPath,
|
|
1046
|
+
});
|
|
1047
|
+
}
|
|
1048
|
+
/**
|
|
1049
|
+
* 查找用户的 TypeIndex
|
|
1050
|
+
*/
|
|
1051
|
+
async findTypeIndex() {
|
|
1052
|
+
return this.typeIndexManager.findTypeIndex();
|
|
1053
|
+
}
|
|
1054
|
+
/**
|
|
1055
|
+
* 创建 TypeIndex
|
|
1056
|
+
*/
|
|
1057
|
+
async createTypeIndex() {
|
|
1058
|
+
return this.typeIndexManager.createTypeIndex();
|
|
1059
|
+
}
|
|
1060
|
+
/**
|
|
1061
|
+
* 发现已注册的类型
|
|
1062
|
+
*/
|
|
1063
|
+
async discoverTypes(typeIndexUrl) {
|
|
1064
|
+
return this.typeIndexManager.discoverTypes(typeIndexUrl);
|
|
1065
|
+
}
|
|
1066
|
+
/**
|
|
1067
|
+
* 自动发现和注册类型(用于数据消费方)
|
|
1068
|
+
*/
|
|
1069
|
+
async autoDiscoverAndRegister(webId) {
|
|
1070
|
+
return this.typeIndexManager.autoDiscoverAndRegister(webId);
|
|
1071
|
+
}
|
|
1072
|
+
/**
|
|
1073
|
+
* 从 Profile 中自动发现类型(不依赖 TypeIndex)
|
|
1074
|
+
*/
|
|
1075
|
+
async discoverTypesFromProfile() {
|
|
1076
|
+
return this.typeIndexManager.discoverTypesFromProfile();
|
|
1077
|
+
}
|
|
1078
|
+
/**
|
|
1079
|
+
* 发现特定的类型定义(按需发现)
|
|
1080
|
+
* @param rdfClassUri 要发现的 RDF 类型 URI
|
|
1081
|
+
*/
|
|
1082
|
+
async discoverSpecificType(rdfClassUri) {
|
|
1083
|
+
return this.typeIndexManager.discoverSpecificType(rdfClassUri);
|
|
1084
|
+
}
|
|
1085
|
+
/**
|
|
1086
|
+
* 发现多个特定类型
|
|
1087
|
+
* @param rdfClassUris 要发现的 RDF 类型 URI 数组
|
|
1088
|
+
*/
|
|
1089
|
+
async discoverSpecificTypes(rdfClassUris) {
|
|
1090
|
+
return this.typeIndexManager.discoverSpecificTypes(rdfClassUris);
|
|
1091
|
+
}
|
|
1092
|
+
/**
|
|
1093
|
+
* 发现并创建可用的表定义
|
|
1094
|
+
* @param rdfClassUri 要发现的 RDF 类型 URI
|
|
1095
|
+
* @returns 可用的表定义,如果未找到则返回 null
|
|
1096
|
+
*/
|
|
1097
|
+
async discoverTable(rdfClassUri) {
|
|
1098
|
+
return this.typeIndexManager.discoverTable(rdfClassUri);
|
|
1099
|
+
}
|
|
1100
|
+
/**
|
|
1101
|
+
* 发现并创建多个可用的表定义
|
|
1102
|
+
* @param rdfClassUris 要发现的 RDF 类型 URI 数组
|
|
1103
|
+
* @returns 可用的表定义数组
|
|
1104
|
+
*/
|
|
1105
|
+
async discoverTables(rdfClassUris) {
|
|
1106
|
+
return this.typeIndexManager.discoverTables(rdfClassUris);
|
|
1107
|
+
}
|
|
1108
|
+
/**
|
|
1109
|
+
* 检查类型是否已注册
|
|
1110
|
+
*/
|
|
1111
|
+
async isTypeRegistered(type, typeIndexUrl) {
|
|
1112
|
+
return this.typeIndexManager.isTypeRegistered(type, typeIndexUrl);
|
|
1113
|
+
}
|
|
1114
|
+
/**
|
|
1115
|
+
* 获取 TypeIndex 管理器
|
|
1116
|
+
*/
|
|
1117
|
+
getTypeIndexManager() {
|
|
1118
|
+
return this.typeIndexManager;
|
|
1119
|
+
}
|
|
1120
|
+
/**
|
|
1121
|
+
* @deprecated 此方法已废弃,不再使用
|
|
1122
|
+
*
|
|
1123
|
+
* 原因:
|
|
1124
|
+
* 1. 每次 GET 整个容器内容效率极低(对于大容器可能有几 MB)
|
|
1125
|
+
* 2. 使用字符串匹配检查资源存在性不够可靠
|
|
1126
|
+
* 3. SPARQL INSERT 本身不会覆盖已存在的三元组,重复插入只会添加新的三元组
|
|
1127
|
+
* 4. 如果需要防止重复插入,应该由业务层处理(使用 INSERT WHERE NOT EXISTS)
|
|
1128
|
+
*
|
|
1129
|
+
* 改进的资源存在性检查 - 使用直接 HTTP 而不是 Comunica ASK
|
|
1130
|
+
* 这解决了 409 冲突问题:当 ASK 查询失败时,不应该继续 INSERT
|
|
1131
|
+
*/
|
|
1132
|
+
async checkResourceExistence(values, table, containerUrl) {
|
|
1133
|
+
console.warn('[DEPRECATED] checkResourceExistence is deprecated and should not be used');
|
|
1134
|
+
try {
|
|
1135
|
+
let targetContainer = containerUrl.startsWith('http')
|
|
1136
|
+
? containerUrl
|
|
1137
|
+
: this.resolveAbsoluteUrl(containerUrl);
|
|
1138
|
+
if (!targetContainer.endsWith('/')) {
|
|
1139
|
+
targetContainer = `${targetContainer}/`;
|
|
1140
|
+
}
|
|
1141
|
+
console.log(`🔍 检查资源存在性: ${targetContainer}`);
|
|
1142
|
+
// 直接读取容器内容,检查是否包含我们要插入的资源
|
|
1143
|
+
const response = await this.runtime.getFetch()(targetContainer, {
|
|
1144
|
+
method: 'GET',
|
|
1145
|
+
headers: {
|
|
1146
|
+
'Accept': 'text/turtle'
|
|
1147
|
+
}
|
|
1148
|
+
});
|
|
1149
|
+
if (!response.ok) {
|
|
1150
|
+
if (response.status === 404) {
|
|
1151
|
+
// 容器不存在,资源肯定不存在
|
|
1152
|
+
console.log(`✅ 容器不存在,可以执行 INSERT`);
|
|
1153
|
+
return true; // 可以继续 INSERT
|
|
1154
|
+
}
|
|
1155
|
+
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
1156
|
+
}
|
|
1157
|
+
const turtleData = await response.text();
|
|
1158
|
+
console.log(`📖 容器内容长度: ${turtleData.length} 字符`);
|
|
1159
|
+
// 检查每个要插入的资源是否已存在
|
|
1160
|
+
for (const record of values) {
|
|
1161
|
+
const subjectUri = this.sparqlConverter.generateSubjectUri(record, table);
|
|
1162
|
+
// 检查 Turtle 数据中是否包含这个资源 URI
|
|
1163
|
+
if (turtleData.includes(subjectUri)) {
|
|
1164
|
+
console.log(`❌ 发现已存在的资源: ${subjectUri}`);
|
|
1165
|
+
return false; // 资源已存在,不能 INSERT
|
|
1166
|
+
}
|
|
1167
|
+
}
|
|
1168
|
+
console.log(`✅ 资源存在性检查通过,可以执行 INSERT`);
|
|
1169
|
+
return true; // 所有资源都不存在,可以 INSERT
|
|
1170
|
+
}
|
|
1171
|
+
catch (error) {
|
|
1172
|
+
console.error('❌ 资源存在性检查失败:', error);
|
|
1173
|
+
throw error;
|
|
1174
|
+
}
|
|
1175
|
+
}
|
|
1176
|
+
// 确保容器存在(递归创建父目录)
|
|
1177
|
+
async ensureContainerExists(containerUrl) {
|
|
1178
|
+
try {
|
|
1179
|
+
const targetContainer = this.normalizeContainerKey(containerUrl);
|
|
1180
|
+
if (this.preparedContainers.has(targetContainer)) {
|
|
1181
|
+
return;
|
|
1182
|
+
}
|
|
1183
|
+
const checkResponse = await this.runtime.getFetch()(targetContainer, {
|
|
1184
|
+
method: 'HEAD'
|
|
1185
|
+
});
|
|
1186
|
+
if (checkResponse.status === 401 || checkResponse.status === 403) {
|
|
1187
|
+
console.log(`[Container] ${targetContainer} 不允许 HEAD,视为已存在`);
|
|
1188
|
+
this.markContainerPrepared(targetContainer);
|
|
1189
|
+
return;
|
|
1190
|
+
}
|
|
1191
|
+
if (checkResponse.status === 404) {
|
|
1192
|
+
// 先递归创建父容器
|
|
1193
|
+
const parentContainer = this.getParentContainer(targetContainer);
|
|
1194
|
+
if (parentContainer && parentContainer !== targetContainer) {
|
|
1195
|
+
console.log(`[Container] 先创建父容器: ${parentContainer}`);
|
|
1196
|
+
await this.ensureContainerExists(parentContainer);
|
|
1197
|
+
}
|
|
1198
|
+
// 再创建当前容器
|
|
1199
|
+
console.log(`[Container] 创建容器: ${targetContainer}`);
|
|
1200
|
+
const createResponse = await this.runtime.getFetch()(targetContainer, {
|
|
1201
|
+
method: 'PUT',
|
|
1202
|
+
headers: {
|
|
1203
|
+
'Content-Type': 'text/turtle',
|
|
1204
|
+
'Link': '<http://www.w3.org/ns/ldp#BasicContainer>; rel="type"'
|
|
1205
|
+
}
|
|
1206
|
+
});
|
|
1207
|
+
if (createResponse.ok) {
|
|
1208
|
+
console.log(`[Container] 容器创建成功: ${createResponse.status}`);
|
|
1209
|
+
await this.sparqlExecutor.invalidateHttpCache(targetContainer);
|
|
1210
|
+
this.markContainerPrepared(targetContainer);
|
|
1211
|
+
}
|
|
1212
|
+
else if (createResponse.status === 409) {
|
|
1213
|
+
console.log(`[Container] 容器已存在(409冲突): ${targetContainer}`);
|
|
1214
|
+
this.markContainerPrepared(targetContainer);
|
|
1215
|
+
}
|
|
1216
|
+
else {
|
|
1217
|
+
throw new Error(`Failed to create container: ${createResponse.status} ${createResponse.statusText}`);
|
|
1218
|
+
}
|
|
1219
|
+
}
|
|
1220
|
+
else if (checkResponse.status === 200) {
|
|
1221
|
+
console.log(`[Container] 容器已存在: ${targetContainer}`);
|
|
1222
|
+
this.markContainerPrepared(targetContainer);
|
|
1223
|
+
}
|
|
1224
|
+
else if (checkResponse.status === 409) {
|
|
1225
|
+
console.log(`[Container] 容器已存在(409冲突): ${targetContainer}`);
|
|
1226
|
+
this.markContainerPrepared(targetContainer);
|
|
1227
|
+
}
|
|
1228
|
+
else if (!checkResponse.ok) {
|
|
1229
|
+
throw new Error(`Failed to check container: ${checkResponse.status} ${checkResponse.statusText}`);
|
|
1230
|
+
}
|
|
1231
|
+
}
|
|
1232
|
+
catch (error) {
|
|
1233
|
+
console.error('[Container] 确保容器存在时出错:', error);
|
|
1234
|
+
throw error;
|
|
1235
|
+
}
|
|
1236
|
+
}
|
|
1237
|
+
/**
|
|
1238
|
+
* 获取父容器 URL
|
|
1239
|
+
* 例如: https://pod.com/alice/data/users/ -> https://pod.com/alice/data/
|
|
1240
|
+
*/
|
|
1241
|
+
getParentContainer(containerUrl) {
|
|
1242
|
+
try {
|
|
1243
|
+
const url = new URL(containerUrl);
|
|
1244
|
+
const pathParts = url.pathname.split('/').filter(part => part.length > 0);
|
|
1245
|
+
// 如果已经是根目录或只有一层,返回 null
|
|
1246
|
+
if (pathParts.length <= 1) {
|
|
1247
|
+
return null;
|
|
1248
|
+
}
|
|
1249
|
+
// 移除最后一个路径部分
|
|
1250
|
+
pathParts.pop();
|
|
1251
|
+
// 重建父容器 URL
|
|
1252
|
+
url.pathname = '/' + pathParts.join('/') + '/';
|
|
1253
|
+
return url.toString();
|
|
1254
|
+
}
|
|
1255
|
+
catch (error) {
|
|
1256
|
+
console.error('[Container] 解析父容器 URL 失败:', error);
|
|
1257
|
+
return null;
|
|
1258
|
+
}
|
|
1259
|
+
}
|
|
1260
|
+
/**
|
|
1261
|
+
* List all resources in a container
|
|
1262
|
+
* Uses LDP containment triples to discover resources
|
|
1263
|
+
*/
|
|
1264
|
+
async listContainerResources(containerUrl) {
|
|
1265
|
+
const normalizedUrl = this.normalizeContainerKey(containerUrl);
|
|
1266
|
+
const resources = [];
|
|
1267
|
+
try {
|
|
1268
|
+
// Query the container for ldp:contains relationships via SPARQL
|
|
1269
|
+
// This is more reliable than parsing Turtle as it handles all serialization formats
|
|
1270
|
+
const sparql = {
|
|
1271
|
+
type: 'SELECT',
|
|
1272
|
+
query: `
|
|
1273
|
+
PREFIX ldp: <http://www.w3.org/ns/ldp#>
|
|
1274
|
+
SELECT ?resource WHERE {
|
|
1275
|
+
<${normalizedUrl}> ldp:contains ?resource .
|
|
1276
|
+
}
|
|
1277
|
+
`,
|
|
1278
|
+
prefixes: { ldp: 'http://www.w3.org/ns/ldp#' }
|
|
1279
|
+
};
|
|
1280
|
+
const results = await this.sparqlExecutor.queryContainer(normalizedUrl, sparql);
|
|
1281
|
+
for (const row of results) {
|
|
1282
|
+
const resource = row.resource;
|
|
1283
|
+
if (resource) {
|
|
1284
|
+
const resourceUrl = typeof resource === 'object' && resource.value
|
|
1285
|
+
? resource.value
|
|
1286
|
+
: String(resource);
|
|
1287
|
+
resources.push(resourceUrl);
|
|
1288
|
+
}
|
|
1289
|
+
}
|
|
1290
|
+
}
|
|
1291
|
+
catch (e) {
|
|
1292
|
+
console.warn('[listContainerResources] SPARQL query failed:', e);
|
|
1293
|
+
}
|
|
1294
|
+
return resources;
|
|
1295
|
+
}
|
|
1296
|
+
}
|
|
1297
|
+
exports.PodDialect = PodDialect;
|
|
1298
|
+
_a = drizzle_orm_1.entityKind;
|
|
1299
|
+
PodDialect[_a] = 'PodDialect';
|
|
1300
|
+
//# sourceMappingURL=pod-dialect.js.map
|