@undefineds.co/xpod 0.3.75 → 0.4.0-rc.139
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/bin/xpod.js +43 -8
- package/config/bun.json +45 -48
- package/config/cloud.json +13 -90
- package/config/components-ignore.json +0 -1
- package/config/local.json +111 -63
- package/config/resolver.json +4 -2
- package/config/terminal.json +4 -1
- package/config/xpod.base.json +16 -8
- package/config/xpod.json +51 -54
- package/dist/acceptance/PublicCloudSemanticConformance.d.ts +4 -0
- package/dist/acceptance/PublicCloudSemanticConformance.js +214 -0
- package/dist/acceptance/QleverSearchConformance.d.ts +39 -0
- package/dist/acceptance/QleverSearchConformance.js +686 -0
- package/dist/acceptance/QleverSemanticConformance.d.ts +3 -0
- package/dist/acceptance/QleverSemanticConformance.js +178 -0
- package/dist/acceptance/RdfSemanticConformance.d.ts +114 -0
- package/dist/acceptance/RdfSemanticConformance.js +307 -0
- package/dist/acceptance/run-installed-qlever-conformance.d.ts +12 -0
- package/dist/acceptance/run-installed-qlever-conformance.js +87 -0
- package/dist/acceptance/run-installed-rdf-conformance.d.ts +12 -0
- package/dist/acceptance/run-installed-rdf-conformance.js +88 -0
- package/dist/ai/service/EmbeddingProviderError.d.ts +7 -0
- package/dist/ai/service/EmbeddingProviderError.js +42 -0
- package/dist/api/ai-gateway/connect/index.js +5 -2
- package/dist/api/auth/AuthContext.d.ts +5 -0
- package/dist/api/auth/AuthContext.js +10 -0
- package/dist/api/container/common.js +20 -1
- package/dist/api/container/rdf.d.ts +1 -0
- package/dist/api/container/rdf.js +43 -4
- package/dist/api/container/types.d.ts +4 -0
- package/dist/api/runs/InngestRunExecutionBackend.d.ts +2 -2
- package/dist/api/runs/PiAgentRuntimeDriver.d.ts +2 -0
- package/dist/api/runs/PiAgentRuntimeDriver.js +1 -0
- package/dist/api/runs/RdfRunContextRetriever.d.ts +8 -0
- package/dist/api/runs/RdfRunContextRetriever.js +23 -1
- package/dist/api/runtime.js +20 -6
- package/dist/api/service/RdfSearchIndexingService.d.ts +37 -3
- package/dist/api/service/RdfSearchIndexingService.js +130 -18
- package/dist/api/service/RdfSearchIndexingSolidFsSyncer.d.ts +8 -0
- package/dist/api/service/RdfSearchIndexingSolidFsSyncer.js +102 -15
- package/dist/api/service/RdfSearchReconciliationWorker.d.ts +76 -0
- package/dist/api/service/RdfSearchReconciliationWorker.js +294 -0
- package/dist/api/tasks/InngestTaskScheduler.d.ts +4 -4
- package/dist/components/components.jsonld +9 -12
- package/dist/components/context.jsonld +227 -348
- package/dist/document/MarkdownRetrievalPointProjector.d.ts +33 -0
- package/dist/document/MarkdownRetrievalPointProjector.js +196 -0
- package/dist/document/MarkdownRetrievalPointProjector.jsonld +135 -0
- package/dist/document/ReaderMaterialization.d.ts +34 -0
- package/dist/document/ReaderMaterialization.js +3 -0
- package/dist/document/ReaderMaterialization.jsonld +151 -0
- package/dist/document/ReaderMaterializationRepository.d.ts +27 -0
- package/dist/document/ReaderMaterializationRepository.js +400 -0
- package/dist/document/ReaderMaterializationRepository.jsonld +84 -0
- package/dist/document/index.d.ts +3 -1
- package/dist/document/index.js +3 -1
- package/dist/http/SubgraphSparqlHttpHandler.js +34 -54
- package/dist/http/search/SearchHttpHandler.js +14 -12
- package/dist/http/terminal/TerminalHttpHandler.d.ts +3 -0
- package/dist/http/terminal/TerminalHttpHandler.js +1 -0
- package/dist/http/terminal/TerminalHttpHandler.jsonld +11 -0
- package/dist/identity/drizzle/DrizzleIndexedStorage.js +19 -39
- package/dist/identity/drizzle/db.d.ts +1 -0
- package/dist/identity/drizzle/db.js +35 -0
- package/dist/index.d.ts +9 -17
- package/dist/index.js +14 -22
- package/dist/provision/ProvisionPodCreator.d.ts +1 -1
- package/dist/provision/ProvisionPodCreator.js +4 -3
- package/dist/search/RdfSearchIntentSink.d.ts +17 -0
- package/dist/search/RdfSearchIntentSink.js +46 -0
- package/dist/search/RdfSearchIntentSink.jsonld +47 -0
- package/dist/search/RdfSearchReconciliationRepository.d.ts +81 -0
- package/dist/search/RdfSearchReconciliationRepository.js +771 -0
- package/dist/solidfs/LocalRdfAuthorityRecoveryInitializer.d.ts +15 -0
- package/dist/solidfs/LocalRdfAuthorityRecoveryInitializer.js +48 -0
- package/dist/solidfs/LocalRdfAuthorityRecoveryInitializer.jsonld +99 -0
- package/dist/solidfs/RdfIndexSolidFsSyncer.js +22 -4
- package/dist/solidfs/SolidFsSyncJournal.d.ts +7 -1
- package/dist/solidfs/SolidFsSyncJournal.js +20 -5
- package/dist/solidfs/SolidFsSyncJournal.jsonld +43 -0
- package/dist/solidfs/index.d.ts +1 -0
- package/dist/solidfs/index.js +1 -0
- package/dist/storage/SparqlUpdateResourceStore.js +3 -3
- package/dist/storage/accessors/MixDataAccessor.d.ts +21 -29
- package/dist/storage/accessors/MixDataAccessor.js +182 -399
- package/dist/storage/accessors/MixDataAccessor.jsonld +109 -87
- package/dist/storage/accessors/SolidRdfDataAccessor.d.ts +12 -8
- package/dist/storage/accessors/SolidRdfDataAccessor.js +189 -59
- package/dist/storage/accessors/SolidRdfDataAccessor.jsonld +14 -29
- package/dist/storage/rdf/LocalQleverNativeSparqlClient.d.ts +55 -0
- package/dist/storage/rdf/LocalQleverNativeSparqlClient.js +519 -0
- package/dist/storage/rdf/LocalQleverNativeSparqlClient.jsonld +314 -0
- package/dist/storage/rdf/PostgresRdfEngine.d.ts +3 -1
- package/dist/storage/rdf/PostgresRdfEngine.js +111 -74
- package/dist/storage/rdf/PostgresRdfEngine.jsonld +12 -22
- package/dist/storage/rdf/PostgresRdfSchemaValidation.d.ts +8 -0
- package/dist/storage/rdf/PostgresRdfSchemaValidation.js +82 -0
- package/dist/storage/rdf/PostgresRdfTextIndex.d.ts +6 -3
- package/dist/storage/rdf/PostgresRdfTextIndex.js +158 -80
- package/dist/storage/rdf/PostgresRdfTextIndex.jsonld +16 -4
- package/dist/storage/rdf/PostgresRdfVectorIndex.d.ts +4 -5
- package/dist/storage/rdf/PostgresRdfVectorIndex.js +124 -120
- package/dist/storage/rdf/PostgresRdfVectorIndex.jsonld +14 -18
- package/dist/storage/rdf/QleverSparqlEngine.d.ts +35 -0
- package/dist/storage/rdf/QleverSparqlEngine.js +185 -0
- package/dist/storage/rdf/QleverSparqlEngine.jsonld +70 -0
- package/dist/storage/rdf/Rdf3xIndex.js +20 -16
- package/dist/storage/rdf/RdfAccessScope.d.ts +4 -0
- package/dist/storage/rdf/RdfAccessScope.js +74 -9
- package/dist/storage/rdf/RdfAccessScope.jsonld +16 -0
- package/dist/storage/rdf/RdfEngineRdfJsSource.d.ts +14 -0
- package/dist/storage/rdf/RdfEngineRdfJsSource.js +179 -0
- package/dist/storage/rdf/RdfQuadIndex.d.ts +13 -14
- package/dist/storage/rdf/RdfQuadIndex.js +286 -99
- package/dist/storage/rdf/RdfQuadIndex.jsonld +10 -22
- package/dist/storage/rdf/RdfQueryExecutor.js +10 -4
- package/dist/storage/rdf/RdfQuerySparqlEngine.d.ts +33 -0
- package/dist/storage/rdf/RdfQuerySparqlEngine.js +215 -0
- package/dist/storage/rdf/RdfQuerySparqlEngine.jsonld +78 -0
- package/dist/storage/rdf/RdfSparqlAdapter.d.ts +0 -4
- package/dist/storage/rdf/RdfSparqlAdapter.js +75 -173
- package/dist/storage/rdf/RdfSparqlBoundary.d.ts +37 -0
- package/dist/storage/rdf/RdfSparqlBoundary.js +247 -0
- package/dist/storage/rdf/RdfSparqlSerialization.d.ts +3 -0
- package/dist/storage/rdf/RdfSparqlSerialization.js +19 -0
- package/dist/storage/rdf/RdfSqliteConnection.d.ts +7 -0
- package/dist/storage/rdf/RdfSqliteConnection.js +23 -0
- package/dist/storage/rdf/RdfTermDictionary.d.ts +0 -8
- package/dist/storage/rdf/RdfTermDictionary.js +0 -136
- package/dist/storage/rdf/RdfTermDictionary.jsonld +0 -32
- package/dist/storage/rdf/RdfTermSemantics.d.ts +6 -0
- package/dist/storage/rdf/RdfTermSemantics.js +29 -0
- package/dist/storage/rdf/RdfTextIndex.d.ts +5 -6
- package/dist/storage/rdf/RdfTextIndex.js +187 -115
- package/dist/storage/rdf/RdfTextIndex.jsonld +10 -14
- package/dist/storage/rdf/RdfVectorIndex.d.ts +4 -4
- package/dist/storage/rdf/RdfVectorIndex.js +156 -233
- package/dist/storage/rdf/RdfVectorIndex.jsonld +10 -14
- package/dist/storage/rdf/SolidRdfEngine.d.ts +16 -21
- package/dist/storage/rdf/SolidRdfEngine.js +28 -308
- package/dist/storage/rdf/SolidRdfEngine.jsonld +26 -148
- package/dist/storage/rdf/XpodComunicaQueryEngine.d.ts +10 -0
- package/dist/storage/rdf/XpodComunicaQueryEngine.js +72 -0
- package/dist/storage/rdf/index.d.ts +7 -6
- package/dist/storage/rdf/index.js +17 -12
- package/dist/storage/rdf/models-benchmark.d.ts +5 -1
- package/dist/storage/rdf/models-benchmark.js +17 -19
- package/dist/storage/rdf/types.d.ts +68 -6
- package/dist/storage/rdf/types.jsonld +69 -0
- package/dist/storage/sparql/SubgraphQueryEngine.d.ts +13 -7
- package/dist/storage/sparql/SubgraphQueryEngine.js +6 -6
- package/dist/storage/vector/index.d.ts +0 -1
- package/dist/storage/vector/index.js +0 -1
- package/dist/terminal/AclPermissionService.d.ts +4 -5
- package/dist/terminal/AclPermissionService.js +55 -75
- package/dist/terminal/TerminalSessionManager.d.ts +3 -2
- package/dist/terminal/TerminalSessionManager.js +3 -3
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/ldp-executor.d.ts +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/ldp-executor.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/ldp-executor.js +29 -26
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/ldp-executor.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/sparql-strategy.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/sparql-strategy.js +9 -4
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/sparql-strategy.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/notifications/notifications-client.d.ts +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/notifications/notifications-client.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/notifications/notifications-client.js +6 -3
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/notifications/notifications-client.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-database.js +3 -3
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-database.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/select-query-builder.d.ts +6 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/select-query-builder.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/select-query-builder.js +13 -3
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/select-query-builder.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-where-policy.d.ts +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-where-policy.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-where-policy.js +31 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-where-policy.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/sparql/builder/expression-builder.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/sparql/builder/expression-builder.js +5 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/sparql/builder/expression-builder.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/sparql-executor.d.ts +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/sparql-executor.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/sparql-executor.js +45 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/sparql-executor.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/ldp-executor.d.ts +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/ldp-executor.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/ldp-executor.js +29 -26
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/ldp-executor.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/sparql-strategy.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/sparql-strategy.js +9 -4
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/sparql-strategy.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/notifications/notifications-client.d.ts +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/notifications/notifications-client.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/notifications/notifications-client.js +6 -3
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/notifications/notifications-client.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-database.js +3 -3
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-database.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/select-query-builder.d.ts +6 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/select-query-builder.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/select-query-builder.js +14 -4
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/select-query-builder.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-where-policy.d.ts +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-where-policy.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-where-policy.js +30 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-where-policy.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/sparql/builder/expression-builder.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/sparql/builder/expression-builder.js +5 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/sparql/builder/expression-builder.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/sparql-executor.d.ts +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/sparql-executor.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/sparql-executor.js +45 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/sparql-executor.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/package.json +5 -4
- package/package.json +19 -8
- package/static/app/assets/{index-36TJKN-3.js → index-BikOyGPu.js} +34 -34
- package/static/app/assets/inrupt-smoke.js +2 -2
- package/static/app/assets/main.css +1 -1
- package/static/app/assets/main.js +11 -11
- package/static/auth-callback/assets/{AiConfigContext-BvBdu_A3.js → AiConfigContext-iQ74JmRZ.js} +1 -1
- package/static/auth-callback/assets/{AiConfigPage-BpDw4jco.js → AiConfigPage-BBDKE1gJ.js} +1 -1
- package/static/auth-callback/assets/{DocumentProcessingPanel-BmZ_jzRr.js → DocumentProcessingPanel-D9NntIEK.js} +1 -1
- package/static/auth-callback/assets/{IndexLifecyclePanel-BfQBjN4z.js → IndexLifecyclePanel-BG07yBdA.js} +1 -1
- package/static/auth-callback/assets/{IndexSubjectPanel-BlsnatPt.js → IndexSubjectPanel-B-bUnU3G.js} +1 -1
- package/static/auth-callback/assets/{ModelAssignmentsPanel-KA6Mdndz.js → ModelAssignmentsPanel-C7I-Nqy-.js} +1 -1
- package/static/auth-callback/assets/{ModelsPage-C7jymyIY.js → ModelsPage-C2hxyrmI.js} +1 -1
- package/static/auth-callback/assets/{NetworkPage-k2ShktNm.js → NetworkPage-IGIc2q1Y.js} +1 -1
- package/static/auth-callback/assets/{PaneListHeader-mLMe_dvU.js → PaneListHeader-CebuPl_g.js} +1 -1
- package/static/auth-callback/assets/{SearchIndexingPanel-CqV9um_t.js → SearchIndexingPanel-6HnZSg00.js} +1 -1
- package/static/auth-callback/assets/{StatusSubjectPanel-BgMBTbr2.js → StatusSubjectPanel-votxBkr5.js} +1 -1
- package/static/auth-callback/assets/{StatusWorkspace-zbSyhdG2.js → StatusWorkspace-Cksl61zX.js} +1 -1
- package/static/auth-callback/assets/{SystemSettingsPage-CtW79nW6.js → SystemSettingsPage-CKZFUaZT.js} +1 -1
- package/static/auth-callback/assets/{SystemSettingsSubjectPanel-ZOPKYUtZ.js → SystemSettingsSubjectPanel-pzfUcCf4.js} +1 -1
- package/static/auth-callback/assets/{activity-BQ-CQE3O.js → activity-DQL6kZHZ.js} +1 -1
- package/static/auth-callback/assets/auth-callback-B_s8Ye5Z.css +1 -0
- package/static/auth-callback/assets/{auth-callback-Htr_CB_g.js → auth-callback-BxQMd_Mc.js} +39 -39
- package/static/auth-callback/assets/{badge-D5SGTJeO.js → badge-DvW4LUHH.js} +1 -1
- package/static/auth-callback/assets/{download-DK183Ldo.js → download-Cx_uaCR1.js} +1 -1
- package/static/auth-callback/assets/{external-link-LDHy_4bn.js → external-link-D6L6ExH1.js} +1 -1
- package/static/auth-callback/assets/{index-BWrvgHqK.js → index-BAS_hxGu.js} +1 -1
- package/static/auth-callback/assets/{index-2WmlePQ9.js → index-BmBjpCoD.js} +1 -1
- package/static/auth-callback/assets/{index-browser-DUd4E4-x.js → index-browser-pdn4D3M4.js} +1 -1
- package/static/auth-callback/assets/{key-round-ibX79Kr-.js → key-round-BTBzOggq.js} +1 -1
- package/static/auth-callback/assets/{rotate-ccw-B2_VMaiX.js → rotate-ccw-eV7Cx8sB.js} +1 -1
- package/static/auth-callback/assets/{skeleton-F4nrpycc.js → skeleton-Bg4GYgBM.js} +1 -1
- package/static/auth-callback/assets/{waypoints-DImIq93f.js → waypoints-CJbydf0B.js} +1 -1
- package/static/auth-callback/assets/{workspace-layout-IVCSYU21.js → workspace-layout-C6Hh8Xf-.js} +1 -1
- package/static/auth-callback/auth-callback.html +2 -2
- package/static/dashboard/assets/{AiConfigContext-cjjfYTo9.js → AiConfigContext-BkJj28vK.js} +1 -1
- package/static/dashboard/assets/{AiConfigPage-CO0DSD_j.js → AiConfigPage-Cs9B4uyp.js} +1 -1
- package/static/dashboard/assets/{DocumentProcessingPanel-DMGnH8Oj.js → DocumentProcessingPanel-BBWmM7mS.js} +1 -1
- package/static/dashboard/assets/{IndexLifecyclePanel-DSkIOCL5.js → IndexLifecyclePanel-D5xGTT_i.js} +1 -1
- package/static/dashboard/assets/{IndexSubjectPanel-qWN_DbAp.js → IndexSubjectPanel-d-mjDthn.js} +1 -1
- package/static/dashboard/assets/{ModelAssignmentsPanel-DCf83uM3.js → ModelAssignmentsPanel-C-OLNbqf.js} +1 -1
- package/static/dashboard/assets/{ModelsPage-CMnvSrl5.js → ModelsPage-CBrLjuUn.js} +1 -1
- package/static/dashboard/assets/{NetworkPage-C8Gkwclb.js → NetworkPage-BlYk8L1z.js} +1 -1
- package/static/dashboard/assets/{PaneListHeader-BtU_8cDK.js → PaneListHeader-A5oZJQC0.js} +1 -1
- package/static/dashboard/assets/{SearchIndexingPanel-DEn12pNU.js → SearchIndexingPanel-Bs1j8ZP2.js} +1 -1
- package/static/dashboard/assets/{StatusSubjectPanel-B1_ILg2d.js → StatusSubjectPanel-Qao3orvi.js} +1 -1
- package/static/dashboard/assets/{StatusWorkspace-BG6nMNCo.js → StatusWorkspace-rDM0yDtk.js} +1 -1
- package/static/dashboard/assets/{SystemSettingsPage-BnWYIXaM.js → SystemSettingsPage-FPRPkKaR.js} +1 -1
- package/static/dashboard/assets/{SystemSettingsSubjectPanel-C_mYVPWb.js → SystemSettingsSubjectPanel-CjlJAxnX.js} +1 -1
- package/static/dashboard/assets/{activity-DYJ7PdRl.js → activity-CJ5K6hYC.js} +1 -1
- package/static/dashboard/assets/{badge-BIaZco1P.js → badge-L-NMOi1P.js} +1 -1
- package/static/dashboard/assets/dashboard-B_s8Ye5Z.css +1 -0
- package/static/dashboard/assets/{dashboard-Dl40_MEa.js → dashboard-DyjAyYxx.js} +34 -34
- package/static/dashboard/assets/{download-By16k9VK.js → download-Bi4u5K5B.js} +1 -1
- package/static/dashboard/assets/{external-link-B92xOG_d.js → external-link-jmhLDfvT.js} +1 -1
- package/static/dashboard/assets/{index-BajZpJ48.js → index-BoaGJBxf.js} +1 -1
- package/static/dashboard/assets/{index-wsVPom_x.js → index-C22TAEi4.js} +1 -1
- package/static/dashboard/assets/{key-round-Clo5FOwA.js → key-round-Dk1VmMrn.js} +1 -1
- package/static/dashboard/assets/{rotate-ccw-smWSfi1L.js → rotate-ccw-DIfLsSwi.js} +1 -1
- package/static/dashboard/assets/{skeleton-BrTaGeJw.js → skeleton-BGPJMHb-.js} +1 -1
- package/static/dashboard/assets/{waypoints-DGPQInE7.js → waypoints-CY53egpu.js} +1 -1
- package/static/dashboard/assets/{workspace-layout-CPU4XRmb.js → workspace-layout-CoHkcx70.js} +1 -1
- package/static/dashboard/dashboard.html +2 -2
- package/static/settings/assets/{AiConfigContext-CT29_OyW.js → AiConfigContext-BcEPlEJe.js} +1 -1
- package/static/settings/assets/{AiConfigPage-WIE95S28.js → AiConfigPage-D-t3ZUhg.js} +1 -1
- package/static/settings/assets/{DocumentProcessingPanel-KG8Sq999.js → DocumentProcessingPanel-m2SasiMO.js} +1 -1
- package/static/settings/assets/{IndexLifecyclePanel-iKvtHDXY.js → IndexLifecyclePanel-BNmAvx8V.js} +1 -1
- package/static/settings/assets/{IndexSubjectPanel-BQdSCkk4.js → IndexSubjectPanel-C5-L2AcW.js} +1 -1
- package/static/settings/assets/{ModelAssignmentsPanel-P8QcVB0F.js → ModelAssignmentsPanel-Cfpkf02Y.js} +1 -1
- package/static/settings/assets/{ModelsPage-UZkZGqor.js → ModelsPage-DZrACwVN.js} +1 -1
- package/static/settings/assets/{NetworkPage-Dcpcvg15.js → NetworkPage-BlrGGfqL.js} +1 -1
- package/static/settings/assets/{PaneListHeader--gHtZws5.js → PaneListHeader-C3TCs1RI.js} +1 -1
- package/static/settings/assets/{SearchIndexingPanel-DdgJSJYQ.js → SearchIndexingPanel-Cyp3CUzX.js} +1 -1
- package/static/settings/assets/{StatusSubjectPanel-UOxp_XVL.js → StatusSubjectPanel-gRkb8WEX.js} +1 -1
- package/static/settings/assets/{StatusWorkspace-CPNXuD12.js → StatusWorkspace-Dptx4Ec2.js} +1 -1
- package/static/settings/assets/{SystemSettingsPage-B6ySeVPw.js → SystemSettingsPage-BWgGUQbs.js} +1 -1
- package/static/settings/assets/{SystemSettingsSubjectPanel-I7zWmpiI.js → SystemSettingsSubjectPanel-VflUvpgC.js} +1 -1
- package/static/settings/assets/{activity-CFhmzahP.js → activity-D7iNhTkQ.js} +1 -1
- package/static/settings/assets/{badge-BBdUc5B-.js → badge-DO0r_RT4.js} +1 -1
- package/static/settings/assets/{download-WJE9-yxQ.js → download-CsJlNSbd.js} +1 -1
- package/static/settings/assets/{external-link-RKoYyCp_.js → external-link-BCR7SHme.js} +1 -1
- package/static/settings/assets/{index-Bq2o0Bif.js → index-Cgq16ekN.js} +1 -1
- package/static/settings/assets/{index-DvxneI5O.js → index-SrhQvcrU.js} +1 -1
- package/static/settings/assets/{index-browser-Qmo6EsFT.js → index-browser-THpcMCnz.js} +1 -1
- package/static/settings/assets/{key-round-r-D9sQUK.js → key-round-Dd3jk1BT.js} +1 -1
- package/static/settings/assets/{rotate-ccw-D3IIhbPH.js → rotate-ccw-tiL14i1d.js} +1 -1
- package/static/settings/assets/settings-B_s8Ye5Z.css +1 -0
- package/static/settings/assets/{settings-D8oDBXWg.js → settings-CVLDPejo.js} +34 -34
- package/static/settings/assets/{skeleton-DrL4RQuw.js → skeleton-DBxLuNgU.js} +1 -1
- package/static/settings/assets/{waypoints-C5sRhpJw.js → waypoints-DS3e3hv7.js} +1 -1
- package/static/settings/assets/{workspace-layout-B4ALmWsM.js → workspace-layout-mucrxyTK.js} +1 -1
- package/static/settings/settings.html +2 -2
- package/config/search.json +0 -66
- package/dist/document/HeadingChunker.jsonld +0 -41
- package/dist/security/secret-cell/DeploymentRootKeyProvider.jsonld +0 -124
- package/dist/security/secret-cell/SecretCellVault.jsonld +0 -207
- package/dist/storage/PostgresDerivedIndexJournal.d.ts +0 -47
- package/dist/storage/PostgresDerivedIndexJournal.js +0 -408
- package/dist/storage/PostgresDerivedIndexJournal.jsonld +0 -303
- package/dist/storage/RdfDerivedIndexingListener.d.ts +0 -32
- package/dist/storage/RdfDerivedIndexingListener.js +0 -135
- package/dist/storage/RdfDerivedIndexingListener.jsonld +0 -228
- package/dist/storage/accessors/QuadstoreSparqlDataAccessor.d.ts +0 -148
- package/dist/storage/accessors/QuadstoreSparqlDataAccessor.js +0 -436
- package/dist/storage/accessors/QuadstoreSparqlDataAccessor.jsonld +0 -172
- package/dist/storage/accessors/QuintStoreSparqlDataAccessor.d.ts +0 -102
- package/dist/storage/accessors/QuintStoreSparqlDataAccessor.js +0 -474
- package/dist/storage/accessors/QuintStoreSparqlDataAccessor.jsonld +0 -192
- package/dist/storage/rdf/RdfSparqlAdapter.jsonld +0 -486
- package/dist/storage/rdf/ShadowRdfQuintStore.d.ts +0 -59
- package/dist/storage/rdf/ShadowRdfQuintStore.js +0 -216
- package/dist/storage/rdf/ShadowRdfQuintStore.jsonld +0 -312
- package/dist/storage/rdf/SolidRdfSparqlEngine.d.ts +0 -107
- package/dist/storage/rdf/SolidRdfSparqlEngine.js +0 -1117
- package/dist/storage/rdf/SolidRdfSparqlEngine.jsonld +0 -312
- package/dist/storage/sparql/AlgebraUtils.d.ts +0 -48
- package/dist/storage/sparql/AlgebraUtils.js +0 -118
- package/dist/storage/sparql/CompatibilitySparqlEngine.d.ts +0 -37
- package/dist/storage/sparql/CompatibilitySparqlEngine.js +0 -96
- package/dist/storage/sparql/CompatibilitySparqlEngine.jsonld +0 -123
- package/dist/storage/sparql/CompatibilitySparqlEngineImpl.d.ts +0 -36
- package/dist/storage/sparql/CompatibilitySparqlEngineImpl.js +0 -124
- package/dist/storage/sparql/ComunicaOptimizedEngine.d.ts +0 -59
- package/dist/storage/sparql/ComunicaOptimizedEngine.js +0 -254
- package/dist/storage/sparql/ComunicaQuintEngine.d.ts +0 -143
- package/dist/storage/sparql/ComunicaQuintEngine.js +0 -781
- package/dist/storage/sparql/ExpressionEvaluator.d.ts +0 -54
- package/dist/storage/sparql/ExpressionEvaluator.js +0 -340
- package/dist/storage/sparql/FilterPushdownExtractor.d.ts +0 -74
- package/dist/storage/sparql/FilterPushdownExtractor.js +0 -421
- package/dist/storage/sparql/OptimizedQuadstoreEngine.d.ts +0 -65
- package/dist/storage/sparql/OptimizedQuadstoreEngine.js +0 -327
- package/dist/storage/sparql/OptimizedQuadstoreSource.d.ts +0 -46
- package/dist/storage/sparql/OptimizedQuadstoreSource.js +0 -118
- package/dist/storage/sparql/PatternBuilder.d.ts +0 -41
- package/dist/storage/sparql/PatternBuilder.js +0 -118
- package/dist/storage/sparql/QueryOptimizer.d.ts +0 -125
- package/dist/storage/sparql/QueryOptimizer.js +0 -375
- package/dist/storage/sparql/QuintEngine.d.ts +0 -92
- package/dist/storage/sparql/QuintEngine.js +0 -150
- package/dist/storage/sparql/QuintQuerySource.d.ts +0 -241
- package/dist/storage/sparql/QuintQuerySource.js +0 -1069
- package/dist/storage/sparql/SimpleSparqlExecutor.d.ts +0 -40
- package/dist/storage/sparql/SimpleSparqlExecutor.js +0 -131
- package/dist/storage/vector/VectorIndexingListener.d.ts +0 -114
- package/dist/storage/vector/VectorIndexingListener.js +0 -346
- package/static/auth-callback/assets/auth-callback-rWdEQY5f.css +0 -1
- package/static/dashboard/assets/dashboard-rWdEQY5f.css +0 -1
- package/static/settings/assets/settings-rWdEQY5f.css +0 -1
|
@@ -1,781 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* ComunicaQuintEngine - Comunica SPARQL engine backed by QuintStore
|
|
4
|
-
*
|
|
5
|
-
* Features:
|
|
6
|
-
* 1. Query pushdown optimization (LIMIT/ORDER BY)
|
|
7
|
-
* 2. FILTER pushdown via IQuerySource interface
|
|
8
|
-
* 3. External filters for security boundaries (ACL)
|
|
9
|
-
* 4. OPTIONAL optimization via QueryOptimizer
|
|
10
|
-
*
|
|
11
|
-
* Architecture:
|
|
12
|
-
* - Uses QuintQuerySource (IQuerySource) for proper FILTER pushdown
|
|
13
|
-
* - Uses QueryOptimizer for OPTIONAL and Compound Query optimization
|
|
14
|
-
* - Comunica pushes FILTER operations down to sources that declare support
|
|
15
|
-
* - QuintQuerySource extracts filters from algebra and applies them to QuintStore
|
|
16
|
-
*/
|
|
17
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
-
exports.ComunicaQuintEngine = void 0;
|
|
19
|
-
const events_1 = require("events");
|
|
20
|
-
const query_sparql_rdfjs_1 = require("@comunica/query-sparql-rdfjs");
|
|
21
|
-
const utils_bindings_factory_1 = require("@comunica/utils-bindings-factory");
|
|
22
|
-
const sparqlalgebrajs_1 = require("sparqlalgebrajs");
|
|
23
|
-
const asynciterator_1 = require("asynciterator");
|
|
24
|
-
const rdf_data_factory_1 = require("rdf-data-factory");
|
|
25
|
-
const QuintQuerySource_1 = require("./QuintQuerySource");
|
|
26
|
-
const QueryOptimizer_1 = require("./QueryOptimizer");
|
|
27
|
-
// Context key names - must match Comunica's internal keys
|
|
28
|
-
const CONTEXT_KEY_QUERY_SOURCES = '@comunica/bus-query-operation:querySources';
|
|
29
|
-
const dataFactory = new rdf_data_factory_1.DataFactory();
|
|
30
|
-
/**
|
|
31
|
-
* Custom RDF/JS Store backed by QuintStore
|
|
32
|
-
* Used for UPDATE operations (INSERT/DELETE) which don't need FILTER pushdown
|
|
33
|
-
*/
|
|
34
|
-
class QuintRdfStore {
|
|
35
|
-
constructor(store, getSecurityFilters, debug) {
|
|
36
|
-
this.store = store;
|
|
37
|
-
this.getSecurityFilters = getSecurityFilters;
|
|
38
|
-
this.debug = debug;
|
|
39
|
-
}
|
|
40
|
-
match(subject, predicate, object, graph) {
|
|
41
|
-
// Build QuintPattern
|
|
42
|
-
const pattern = {};
|
|
43
|
-
if (subject && subject.termType !== 'Variable') {
|
|
44
|
-
pattern.subject = subject;
|
|
45
|
-
}
|
|
46
|
-
if (predicate && predicate.termType !== 'Variable') {
|
|
47
|
-
pattern.predicate = predicate;
|
|
48
|
-
}
|
|
49
|
-
if (object && object.termType !== 'Variable') {
|
|
50
|
-
pattern.object = object;
|
|
51
|
-
}
|
|
52
|
-
if (graph && graph.termType !== 'Variable' && graph.termType !== 'DefaultGraph') {
|
|
53
|
-
pattern.graph = graph;
|
|
54
|
-
}
|
|
55
|
-
// Apply security filters (from upstream, e.g., ACL)
|
|
56
|
-
const securityFilters = this.getSecurityFilters();
|
|
57
|
-
if (securityFilters) {
|
|
58
|
-
if (securityFilters.subject && !pattern.subject) {
|
|
59
|
-
pattern.subject = securityFilters.subject;
|
|
60
|
-
}
|
|
61
|
-
if (securityFilters.predicate && !pattern.predicate) {
|
|
62
|
-
pattern.predicate = securityFilters.predicate;
|
|
63
|
-
}
|
|
64
|
-
if (securityFilters.object && !pattern.object) {
|
|
65
|
-
pattern.object = securityFilters.object;
|
|
66
|
-
}
|
|
67
|
-
if (securityFilters.graph && !pattern.graph) {
|
|
68
|
-
pattern.graph = securityFilters.graph;
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
if (this.debug) {
|
|
72
|
-
console.log(`[QuintRdfStore] match() called`);
|
|
73
|
-
console.log(` pattern:`, pattern);
|
|
74
|
-
}
|
|
75
|
-
// Use wrap to convert Promise<Array> to AsyncIterator
|
|
76
|
-
const promiseIterator = (0, asynciterator_1.wrap)(this.store.get(pattern));
|
|
77
|
-
return promiseIterator;
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* Import quads from a stream (Sink interface)
|
|
81
|
-
*/
|
|
82
|
-
import(stream) {
|
|
83
|
-
const emitter = new events_1.EventEmitter();
|
|
84
|
-
const quads = [];
|
|
85
|
-
let ended = false;
|
|
86
|
-
// Handle data events
|
|
87
|
-
stream.on('data', (quad) => {
|
|
88
|
-
quads.push(quad);
|
|
89
|
-
});
|
|
90
|
-
const handleEnd = () => {
|
|
91
|
-
if (ended)
|
|
92
|
-
return;
|
|
93
|
-
ended = true;
|
|
94
|
-
if (quads.length > 0) {
|
|
95
|
-
this.store.multiPut(quads)
|
|
96
|
-
.then(() => emitter.emit('end'))
|
|
97
|
-
.catch((err) => emitter.emit('error', err));
|
|
98
|
-
}
|
|
99
|
-
else {
|
|
100
|
-
emitter.emit('end');
|
|
101
|
-
}
|
|
102
|
-
};
|
|
103
|
-
stream.on('end', handleEnd);
|
|
104
|
-
stream.on('error', (err) => {
|
|
105
|
-
emitter.emit('error', err);
|
|
106
|
-
});
|
|
107
|
-
// Handle already-ended streams (synchronous streams)
|
|
108
|
-
// Use setImmediate to ensure we check after all synchronous data events
|
|
109
|
-
setImmediate(() => {
|
|
110
|
-
if (stream.readableEnded || stream.closed) {
|
|
111
|
-
handleEnd();
|
|
112
|
-
}
|
|
113
|
-
});
|
|
114
|
-
return emitter;
|
|
115
|
-
}
|
|
116
|
-
/**
|
|
117
|
-
* Remove quads from a stream (Store interface)
|
|
118
|
-
*/
|
|
119
|
-
remove(stream) {
|
|
120
|
-
const emitter = new events_1.EventEmitter();
|
|
121
|
-
const deletePromises = [];
|
|
122
|
-
let ended = false;
|
|
123
|
-
stream.on('data', (quad) => {
|
|
124
|
-
const pattern = {
|
|
125
|
-
subject: quad.subject,
|
|
126
|
-
predicate: quad.predicate,
|
|
127
|
-
object: quad.object,
|
|
128
|
-
};
|
|
129
|
-
if (quad.graph && quad.graph.termType !== 'DefaultGraph') {
|
|
130
|
-
pattern.graph = quad.graph;
|
|
131
|
-
}
|
|
132
|
-
deletePromises.push(this.store.del(pattern));
|
|
133
|
-
});
|
|
134
|
-
const handleEnd = () => {
|
|
135
|
-
if (ended)
|
|
136
|
-
return;
|
|
137
|
-
ended = true;
|
|
138
|
-
Promise.all(deletePromises)
|
|
139
|
-
.then(() => emitter.emit('end'))
|
|
140
|
-
.catch((err) => emitter.emit('error', err));
|
|
141
|
-
};
|
|
142
|
-
stream.on('end', handleEnd);
|
|
143
|
-
stream.on('error', (err) => {
|
|
144
|
-
emitter.emit('error', err);
|
|
145
|
-
});
|
|
146
|
-
// Handle already-ended streams (synchronous streams)
|
|
147
|
-
setImmediate(() => {
|
|
148
|
-
if (stream.readableEnded || stream.closed) {
|
|
149
|
-
handleEnd();
|
|
150
|
-
}
|
|
151
|
-
});
|
|
152
|
-
return emitter;
|
|
153
|
-
}
|
|
154
|
-
/**
|
|
155
|
-
* Remove all matching quads (Store interface)
|
|
156
|
-
*/
|
|
157
|
-
removeMatches(subject, predicate, object, graph) {
|
|
158
|
-
const emitter = new events_1.EventEmitter();
|
|
159
|
-
if (this.debug) {
|
|
160
|
-
console.log(`[QuintRdfStore] removeMatches()`, { subject, predicate, object, graph });
|
|
161
|
-
}
|
|
162
|
-
const pattern = {};
|
|
163
|
-
if (subject && subject.termType !== 'Variable') {
|
|
164
|
-
pattern.subject = subject;
|
|
165
|
-
}
|
|
166
|
-
if (predicate && predicate.termType !== 'Variable') {
|
|
167
|
-
pattern.predicate = predicate;
|
|
168
|
-
}
|
|
169
|
-
if (object && object.termType !== 'Variable') {
|
|
170
|
-
pattern.object = object;
|
|
171
|
-
}
|
|
172
|
-
if (graph && graph.termType !== 'Variable' && graph.termType !== 'DefaultGraph') {
|
|
173
|
-
pattern.graph = graph;
|
|
174
|
-
}
|
|
175
|
-
this.store.del(pattern)
|
|
176
|
-
.then(() => emitter.emit('end'))
|
|
177
|
-
.catch((err) => emitter.emit('error', err));
|
|
178
|
-
return emitter;
|
|
179
|
-
}
|
|
180
|
-
/**
|
|
181
|
-
* Delete a named graph (Store interface)
|
|
182
|
-
*/
|
|
183
|
-
deleteGraph(graph) {
|
|
184
|
-
const emitter = new events_1.EventEmitter();
|
|
185
|
-
const graphTerm = typeof graph === 'string'
|
|
186
|
-
? { termType: 'NamedNode', value: graph }
|
|
187
|
-
: graph;
|
|
188
|
-
const pattern = { graph: graphTerm };
|
|
189
|
-
this.store.del(pattern)
|
|
190
|
-
.then(() => emitter.emit('end'))
|
|
191
|
-
.catch((err) => emitter.emit('error', err));
|
|
192
|
-
return emitter;
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
class ComunicaQuintEngine {
|
|
196
|
-
constructor(store, options) {
|
|
197
|
-
// Current query optimization params
|
|
198
|
-
this.currentOptimizeParams = null;
|
|
199
|
-
// Current query's FILTER expressions for pushdown
|
|
200
|
-
this.currentFilterExpressions = new Map();
|
|
201
|
-
this.store = store;
|
|
202
|
-
this.debug = options?.debug ?? false;
|
|
203
|
-
// Create RdfStore for UPDATE operations
|
|
204
|
-
this.rdfStore = new QuintRdfStore(store, () => this.currentSecurityFilters, this.debug);
|
|
205
|
-
// Create BindingsFactory
|
|
206
|
-
this.bindingsFactory = new utils_bindings_factory_1.BindingsFactory(dataFactory);
|
|
207
|
-
// Create QuintQuerySource with IQuerySource interface for proper FILTER pushdown
|
|
208
|
-
this.querySource = new QuintQuerySource_1.QuintQuerySource(store, {
|
|
209
|
-
debug: this.debug,
|
|
210
|
-
bindingsFactory: this.bindingsFactory,
|
|
211
|
-
getSecurityFilters: () => this.currentSecurityFilters,
|
|
212
|
-
getOptimizeParams: () => this.currentOptimizeParams,
|
|
213
|
-
getFilterExpression: (varName) => this.currentFilterExpressions.get(varName),
|
|
214
|
-
});
|
|
215
|
-
// Create QueryOptimizer for OPTIONAL and Compound Query optimization
|
|
216
|
-
this.queryOptimizer = new QueryOptimizer_1.QueryOptimizer(store, {
|
|
217
|
-
debug: this.debug,
|
|
218
|
-
bindingsFactory: this.bindingsFactory,
|
|
219
|
-
});
|
|
220
|
-
this.engine = new query_sparql_rdfjs_1.QueryEngine();
|
|
221
|
-
}
|
|
222
|
-
/**
|
|
223
|
-
* Analyze a query's pushdown potential (stateless)
|
|
224
|
-
* Returns analysis of what can/cannot be pushed down without executing the query
|
|
225
|
-
*/
|
|
226
|
-
analyzeQuery(query) {
|
|
227
|
-
const algebra = (0, sparqlalgebrajs_1.translate)(query);
|
|
228
|
-
return this.analyzeAlgebra(algebra);
|
|
229
|
-
}
|
|
230
|
-
/**
|
|
231
|
-
* Analyze algebra tree for pushdown potential
|
|
232
|
-
*/
|
|
233
|
-
analyzeAlgebra(op) {
|
|
234
|
-
const result = {
|
|
235
|
-
hasFilter: false,
|
|
236
|
-
filterTypes: [],
|
|
237
|
-
pushdownable: [],
|
|
238
|
-
nonPushdownable: [],
|
|
239
|
-
estimatedPushdownRate: 1.0,
|
|
240
|
-
};
|
|
241
|
-
this.walkAlgebra(op, result);
|
|
242
|
-
// Calculate pushdown rate
|
|
243
|
-
const total = result.pushdownable.length + result.nonPushdownable.length;
|
|
244
|
-
if (total > 0) {
|
|
245
|
-
result.estimatedPushdownRate = result.pushdownable.length / total;
|
|
246
|
-
}
|
|
247
|
-
return result;
|
|
248
|
-
}
|
|
249
|
-
/**
|
|
250
|
-
* Walk algebra tree and collect filter info
|
|
251
|
-
*/
|
|
252
|
-
walkAlgebra(op, result) {
|
|
253
|
-
if (op.type === 'filter') {
|
|
254
|
-
result.hasFilter = true;
|
|
255
|
-
const filterOp = op;
|
|
256
|
-
this.analyzeExpression(filterOp.expression, result);
|
|
257
|
-
this.walkAlgebra(filterOp.input, result);
|
|
258
|
-
}
|
|
259
|
-
else if ('input' in op && op.input) {
|
|
260
|
-
this.walkAlgebra(op.input, result);
|
|
261
|
-
}
|
|
262
|
-
if ('left' in op && op.left) {
|
|
263
|
-
this.walkAlgebra(op.left, result);
|
|
264
|
-
}
|
|
265
|
-
if ('right' in op && op.right) {
|
|
266
|
-
this.walkAlgebra(op.right, result);
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
/**
|
|
270
|
-
* Analyze a filter expression
|
|
271
|
-
*/
|
|
272
|
-
analyzeExpression(expr, result) {
|
|
273
|
-
if (expr.expressionType === 'operator') {
|
|
274
|
-
const opExpr = expr;
|
|
275
|
-
const op = opExpr.operator.toLowerCase();
|
|
276
|
-
// Classify the operator
|
|
277
|
-
if (['=', '!='].includes(op)) {
|
|
278
|
-
result.filterTypes.push('equality');
|
|
279
|
-
result.pushdownable.push(op);
|
|
280
|
-
}
|
|
281
|
-
else if (['<', '>', '<=', '>='].includes(op)) {
|
|
282
|
-
result.filterTypes.push('range');
|
|
283
|
-
result.pushdownable.push(op);
|
|
284
|
-
}
|
|
285
|
-
else if (['in', 'notin'].includes(op)) {
|
|
286
|
-
result.filterTypes.push('equality');
|
|
287
|
-
result.pushdownable.push(op);
|
|
288
|
-
}
|
|
289
|
-
else if (['strstarts', 'strends', 'contains', 'regex'].includes(op)) {
|
|
290
|
-
result.filterTypes.push('string');
|
|
291
|
-
result.pushdownable.push(op);
|
|
292
|
-
}
|
|
293
|
-
else if (op === 'bound') {
|
|
294
|
-
result.filterTypes.push('bound');
|
|
295
|
-
result.pushdownable.push(op);
|
|
296
|
-
}
|
|
297
|
-
else if (['isiri', 'isuri', 'isblank', 'isliteral', 'isnumeric'].includes(op)) {
|
|
298
|
-
// Type checking functions - can be pushed down
|
|
299
|
-
result.filterTypes.push('typecheck');
|
|
300
|
-
result.pushdownable.push(op);
|
|
301
|
-
}
|
|
302
|
-
else if (op === 'langmatches') {
|
|
303
|
-
// LANGMATCHES can be pushed down using $endsWith on serialized format
|
|
304
|
-
result.filterTypes.push('language');
|
|
305
|
-
result.pushdownable.push(op);
|
|
306
|
-
}
|
|
307
|
-
else if (['&&', '||', '!'].includes(op)) {
|
|
308
|
-
result.filterTypes.push('logical');
|
|
309
|
-
// Recurse into logical operators
|
|
310
|
-
for (const arg of opExpr.args) {
|
|
311
|
-
this.analyzeExpression(arg, result);
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
else {
|
|
315
|
-
// Non-pushdownable functions
|
|
316
|
-
result.filterTypes.push('function');
|
|
317
|
-
result.nonPushdownable.push(op);
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
else if (expr.expressionType === 'existence') {
|
|
321
|
-
result.filterTypes.push('exists');
|
|
322
|
-
result.pushdownable.push('exists');
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
/**
|
|
326
|
-
* Execute SELECT query
|
|
327
|
-
* Uses IQuerySource for proper FILTER pushdown
|
|
328
|
-
*
|
|
329
|
-
* OPTIONAL 优化:
|
|
330
|
-
* 如果查询包含多个 OPTIONAL 且只是获取属性(不参与过滤),
|
|
331
|
-
* 则先执行核心条件获取 subjects,再批量获取属性
|
|
332
|
-
*/
|
|
333
|
-
async queryBindings(query, context) {
|
|
334
|
-
const params = this.extractOptimizeParams(query);
|
|
335
|
-
this.currentOptimizeParams = params;
|
|
336
|
-
this.currentSecurityFilters = context?.filters;
|
|
337
|
-
// Extract FILTER expressions from the query for pushdown
|
|
338
|
-
// Note: We don't clear these in finally because the stream is lazy-evaluated
|
|
339
|
-
// and sub-queries may need access to filters after this function returns
|
|
340
|
-
this.extractAndStoreFilters(query);
|
|
341
|
-
if (this.debug) {
|
|
342
|
-
console.log(`[ComunicaQuintEngine] Query optimization:`, this.currentOptimizeParams);
|
|
343
|
-
console.log(`[ComunicaQuintEngine] Security filters:`, this.currentSecurityFilters);
|
|
344
|
-
console.log(`[ComunicaQuintEngine] Filter expressions for pushdown:`, this.currentFilterExpressions.size);
|
|
345
|
-
}
|
|
346
|
-
// 尝试 OPTIONAL 优化(使用 QueryOptimizer)
|
|
347
|
-
try {
|
|
348
|
-
const algebra = (0, sparqlalgebrajs_1.translate)(query, { quads: true });
|
|
349
|
-
const optResult = this.queryOptimizer.analyzeQuery(algebra);
|
|
350
|
-
if (optResult.type === 'optional' && optResult.analysis) {
|
|
351
|
-
const optionalAnalysis = optResult.analysis;
|
|
352
|
-
if (this.debug) {
|
|
353
|
-
console.log(`[ComunicaQuintEngine] OPTIONAL optimization available:`, {
|
|
354
|
-
subjectVar: optionalAnalysis.subjectVar,
|
|
355
|
-
predicates: optionalAnalysis.optionalPredicates?.length,
|
|
356
|
-
});
|
|
357
|
-
}
|
|
358
|
-
// 执行核心查询获取 subjects
|
|
359
|
-
const coreBindings = await this.executeCoreQuery(optionalAnalysis.coreOperation, context);
|
|
360
|
-
// 使用 QueryOptimizer 执行优化查询(排序也在 QueryOptimizer 中处理)
|
|
361
|
-
const orderOptions = params?.orderVarName
|
|
362
|
-
? { varName: params.orderVarName, reverse: params.reverse }
|
|
363
|
-
: undefined;
|
|
364
|
-
let results = await this.queryOptimizer.executeOptionalOptimized(optionalAnalysis, coreBindings, orderOptions);
|
|
365
|
-
// 应用 LIMIT 和 OFFSET
|
|
366
|
-
if (params?.offset || params?.limit) {
|
|
367
|
-
const start = params.offset ?? 0;
|
|
368
|
-
const end = params.limit ? start + params.limit : undefined;
|
|
369
|
-
results = results.slice(start, end);
|
|
370
|
-
}
|
|
371
|
-
if (this.debug) {
|
|
372
|
-
console.log(`[ComunicaQuintEngine] OPTIONAL optimized: ${results.length} results`);
|
|
373
|
-
}
|
|
374
|
-
const resultStream = (0, asynciterator_1.wrap)(Promise.resolve(results));
|
|
375
|
-
return resultStream;
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
catch (error) {
|
|
379
|
-
if (this.debug) {
|
|
380
|
-
console.log(`[ComunicaQuintEngine] OPTIONAL optimization failed, falling back:`, error);
|
|
381
|
-
}
|
|
382
|
-
}
|
|
383
|
-
// Create context with pre-identified source to bypass source identification
|
|
384
|
-
// This allows us to use our IQuerySource directly
|
|
385
|
-
// IMPORTANT: Use plain object instead of ActionContext to avoid version mismatch
|
|
386
|
-
// between the root @comunica/core and the one bundled with @comunica/query-sparql-rdfjs
|
|
387
|
-
// The engine will convert it to ActionContext using its internal @comunica/core
|
|
388
|
-
const { sources: _ignored, filters: _filters, ...restContext } = context || {};
|
|
389
|
-
const queryContext = {
|
|
390
|
-
...restContext,
|
|
391
|
-
// Set the identified sources directly - this skips ActorContextPreprocessQuerySourceIdentify
|
|
392
|
-
[CONTEXT_KEY_QUERY_SOURCES]: [{ source: this.querySource }],
|
|
393
|
-
};
|
|
394
|
-
return await this.engine.queryBindings(query, queryContext);
|
|
395
|
-
}
|
|
396
|
-
/**
|
|
397
|
-
* 执行核心查询(不含 OPTIONAL)
|
|
398
|
-
*/
|
|
399
|
-
async executeCoreQuery(coreOperation, _context) {
|
|
400
|
-
const bindings = [];
|
|
401
|
-
const savedOptimizeParams = this.currentOptimizeParams;
|
|
402
|
-
const mockContext = {
|
|
403
|
-
get: () => undefined,
|
|
404
|
-
getSafe: () => { throw new Error('Not implemented'); },
|
|
405
|
-
has: () => false,
|
|
406
|
-
};
|
|
407
|
-
try {
|
|
408
|
-
if (savedOptimizeParams) {
|
|
409
|
-
this.currentOptimizeParams = {
|
|
410
|
-
...savedOptimizeParams,
|
|
411
|
-
limit: undefined,
|
|
412
|
-
offset: undefined,
|
|
413
|
-
};
|
|
414
|
-
}
|
|
415
|
-
const stream = this.querySource.queryBindings(coreOperation, mockContext, undefined);
|
|
416
|
-
for await (const binding of stream) {
|
|
417
|
-
bindings.push(binding);
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
finally {
|
|
421
|
-
this.currentOptimizeParams = savedOptimizeParams;
|
|
422
|
-
}
|
|
423
|
-
return bindings;
|
|
424
|
-
}
|
|
425
|
-
/**
|
|
426
|
-
* Extract FILTER expressions from query and store them for later pushdown
|
|
427
|
-
* Maps variable names to their filter expressions
|
|
428
|
-
*/
|
|
429
|
-
extractAndStoreFilters(query) {
|
|
430
|
-
this.currentFilterExpressions.clear();
|
|
431
|
-
try {
|
|
432
|
-
const algebra = (0, sparqlalgebrajs_1.translate)(query, { quads: true });
|
|
433
|
-
this.collectFilterExpressions(algebra);
|
|
434
|
-
}
|
|
435
|
-
catch (error) {
|
|
436
|
-
if (this.debug) {
|
|
437
|
-
console.log(`[ComunicaQuintEngine] Failed to extract filters:`, error);
|
|
438
|
-
}
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
/**
|
|
442
|
-
* Recursively collect FILTER expressions and their variable bindings
|
|
443
|
-
*/
|
|
444
|
-
collectFilterExpressions(op) {
|
|
445
|
-
if (op.type === 'filter') {
|
|
446
|
-
const filterOp = op;
|
|
447
|
-
const expression = filterOp.expression;
|
|
448
|
-
// Extract variables from the expression
|
|
449
|
-
const variables = this.getExpressionVariables(expression);
|
|
450
|
-
// Store the expression for each variable
|
|
451
|
-
for (const varName of variables) {
|
|
452
|
-
// Merge with existing expressions for this variable
|
|
453
|
-
const existing = this.currentFilterExpressions.get(varName);
|
|
454
|
-
if (existing) {
|
|
455
|
-
// Combine with AND
|
|
456
|
-
this.currentFilterExpressions.set(varName, {
|
|
457
|
-
type: 'expression',
|
|
458
|
-
expressionType: 'operator',
|
|
459
|
-
operator: '&&',
|
|
460
|
-
args: [existing, expression],
|
|
461
|
-
});
|
|
462
|
-
}
|
|
463
|
-
else {
|
|
464
|
-
this.currentFilterExpressions.set(varName, expression);
|
|
465
|
-
}
|
|
466
|
-
}
|
|
467
|
-
// Continue to nested operations
|
|
468
|
-
this.collectFilterExpressions(filterOp.input);
|
|
469
|
-
}
|
|
470
|
-
else if ('input' in op && op.input) {
|
|
471
|
-
if (Array.isArray(op.input)) {
|
|
472
|
-
for (const child of op.input) {
|
|
473
|
-
this.collectFilterExpressions(child);
|
|
474
|
-
}
|
|
475
|
-
}
|
|
476
|
-
else {
|
|
477
|
-
this.collectFilterExpressions(op.input);
|
|
478
|
-
}
|
|
479
|
-
}
|
|
480
|
-
if ('left' in op && op.left) {
|
|
481
|
-
this.collectFilterExpressions(op.left);
|
|
482
|
-
}
|
|
483
|
-
if ('right' in op && op.right) {
|
|
484
|
-
this.collectFilterExpressions(op.right);
|
|
485
|
-
}
|
|
486
|
-
}
|
|
487
|
-
/**
|
|
488
|
-
* Get variable names from an expression
|
|
489
|
-
*/
|
|
490
|
-
getExpressionVariables(expr) {
|
|
491
|
-
const variables = [];
|
|
492
|
-
const collectVars = (e) => {
|
|
493
|
-
if (e.expressionType === 'term') {
|
|
494
|
-
const term = e.term;
|
|
495
|
-
if (term.termType === 'Variable') {
|
|
496
|
-
variables.push(term.value);
|
|
497
|
-
}
|
|
498
|
-
}
|
|
499
|
-
else if (e.expressionType === 'operator') {
|
|
500
|
-
const opExpr = e;
|
|
501
|
-
for (const arg of opExpr.args) {
|
|
502
|
-
collectVars(arg);
|
|
503
|
-
}
|
|
504
|
-
}
|
|
505
|
-
};
|
|
506
|
-
collectVars(expr);
|
|
507
|
-
return variables;
|
|
508
|
-
}
|
|
509
|
-
/**
|
|
510
|
-
* Get the current filter expression for a variable (used by QuintQuerySource)
|
|
511
|
-
*/
|
|
512
|
-
getFilterExpressionForVariable(varName) {
|
|
513
|
-
return this.currentFilterExpressions.get(varName);
|
|
514
|
-
}
|
|
515
|
-
/**
|
|
516
|
-
* Execute ASK query
|
|
517
|
-
*/
|
|
518
|
-
async queryBoolean(query, context) {
|
|
519
|
-
const params = this.extractOptimizeParams(query);
|
|
520
|
-
this.currentOptimizeParams = params;
|
|
521
|
-
this.currentSecurityFilters = context?.filters;
|
|
522
|
-
// Optimize ASK with limit=1
|
|
523
|
-
if (!this.currentOptimizeParams) {
|
|
524
|
-
this.currentOptimizeParams = { limit: 1 };
|
|
525
|
-
}
|
|
526
|
-
else if (this.currentOptimizeParams.limit === undefined) {
|
|
527
|
-
this.currentOptimizeParams.limit = 1;
|
|
528
|
-
}
|
|
529
|
-
try {
|
|
530
|
-
const { sources: _ignored, filters: _filters, ...restContext } = context || {};
|
|
531
|
-
const queryContext = {
|
|
532
|
-
...restContext,
|
|
533
|
-
[CONTEXT_KEY_QUERY_SOURCES]: [{ source: this.querySource }],
|
|
534
|
-
};
|
|
535
|
-
return await this.engine.queryBoolean(query, queryContext);
|
|
536
|
-
}
|
|
537
|
-
finally {
|
|
538
|
-
this.currentOptimizeParams = null;
|
|
539
|
-
this.currentSecurityFilters = undefined;
|
|
540
|
-
}
|
|
541
|
-
}
|
|
542
|
-
/**
|
|
543
|
-
* Execute CONSTRUCT/DESCRIBE query
|
|
544
|
-
*/
|
|
545
|
-
async queryQuads(query, context) {
|
|
546
|
-
console.log(`[ComunicaQuintEngine.queryQuads] Starting: ${query.slice(0, 100)}...`);
|
|
547
|
-
const params = this.extractOptimizeParams(query);
|
|
548
|
-
this.currentOptimizeParams = params;
|
|
549
|
-
this.currentSecurityFilters = context?.filters;
|
|
550
|
-
try {
|
|
551
|
-
const start = Date.now();
|
|
552
|
-
const { sources: _ignored, filters: _filters, ...restContext } = context || {};
|
|
553
|
-
const queryContext = {
|
|
554
|
-
...restContext,
|
|
555
|
-
[CONTEXT_KEY_QUERY_SOURCES]: [{ source: this.querySource }],
|
|
556
|
-
};
|
|
557
|
-
const result = await this.engine.queryQuads(query, queryContext);
|
|
558
|
-
console.log(`[ComunicaQuintEngine.queryQuads] Completed in ${Date.now() - start}ms`);
|
|
559
|
-
return result;
|
|
560
|
-
}
|
|
561
|
-
catch (err) {
|
|
562
|
-
console.error(`[ComunicaQuintEngine.queryQuads] Failed:`, err);
|
|
563
|
-
throw err;
|
|
564
|
-
}
|
|
565
|
-
finally {
|
|
566
|
-
this.currentOptimizeParams = null;
|
|
567
|
-
this.currentSecurityFilters = undefined;
|
|
568
|
-
}
|
|
569
|
-
}
|
|
570
|
-
/**
|
|
571
|
-
* Execute UPDATE query (INSERT/DELETE)
|
|
572
|
-
* Uses RDF.Store interface since UPDATE doesn't need FILTER pushdown
|
|
573
|
-
*/
|
|
574
|
-
async queryVoid(query, context) {
|
|
575
|
-
this.currentSecurityFilters = context?.filters;
|
|
576
|
-
try {
|
|
577
|
-
// Comunica does not properly await the RDF.Store remove() EventEmitter
|
|
578
|
-
// before proceeding to the next operation. This causes DELETE WHERE to
|
|
579
|
-
// complete after INSERT DATA, deleting newly inserted triples.
|
|
580
|
-
// Fix: split compound updates and handle DELETE WHERE directly via QuintStore.
|
|
581
|
-
const statements = this.splitUpdateStatements(query);
|
|
582
|
-
for (const stmt of statements) {
|
|
583
|
-
const deleteGraphUri = this.parseDeleteWhereGraph(stmt);
|
|
584
|
-
if (deleteGraphUri) {
|
|
585
|
-
// Execute DELETE WHERE directly via QuintStore.del()
|
|
586
|
-
await this.store.del({ graph: { termType: 'NamedNode', value: deleteGraphUri } });
|
|
587
|
-
}
|
|
588
|
-
else {
|
|
589
|
-
await this.engine.queryVoid(stmt, {
|
|
590
|
-
sources: [this.rdfStore],
|
|
591
|
-
...context,
|
|
592
|
-
});
|
|
593
|
-
}
|
|
594
|
-
}
|
|
595
|
-
}
|
|
596
|
-
catch (err) {
|
|
597
|
-
throw err;
|
|
598
|
-
}
|
|
599
|
-
finally {
|
|
600
|
-
this.currentSecurityFilters = undefined;
|
|
601
|
-
}
|
|
602
|
-
}
|
|
603
|
-
/**
|
|
604
|
-
* Parse "DELETE WHERE { GRAPH <uri> { ?s ?p ?o. } }" and return the graph URI.
|
|
605
|
-
* Returns null if the statement doesn't match this pattern.
|
|
606
|
-
*/
|
|
607
|
-
parseDeleteWhereGraph(stmt) {
|
|
608
|
-
const m = stmt.match(/^\s*DELETE\s+WHERE\s*\{\s*GRAPH\s*<([^>]+)>\s*\{\s*\?(\w+)\s+\?(\w+)\s+\?(\w+)\s*\.?\s*\}\s*\}\s*$/i);
|
|
609
|
-
return m ? m[1] : null;
|
|
610
|
-
}
|
|
611
|
-
/**
|
|
612
|
-
* Split a compound SPARQL UPDATE into individual statements.
|
|
613
|
-
*/
|
|
614
|
-
splitUpdateStatements(query) {
|
|
615
|
-
const statements = [];
|
|
616
|
-
let depth = 0;
|
|
617
|
-
let start = 0;
|
|
618
|
-
for (let i = 0; i < query.length; i++) {
|
|
619
|
-
if (query[i] === '{')
|
|
620
|
-
depth++;
|
|
621
|
-
else if (query[i] === '}')
|
|
622
|
-
depth--;
|
|
623
|
-
else if (query[i] === ';' && depth === 0) {
|
|
624
|
-
const stmt = query.slice(start, i).trim();
|
|
625
|
-
if (stmt)
|
|
626
|
-
statements.push(stmt);
|
|
627
|
-
start = i + 1;
|
|
628
|
-
}
|
|
629
|
-
}
|
|
630
|
-
const last = query.slice(start).trim();
|
|
631
|
-
if (last)
|
|
632
|
-
statements.push(last);
|
|
633
|
-
return statements;
|
|
634
|
-
}
|
|
635
|
-
/**
|
|
636
|
-
* Extract optimization params from SPARQL query
|
|
637
|
-
*/
|
|
638
|
-
extractOptimizeParams(query) {
|
|
639
|
-
try {
|
|
640
|
-
const algebra = (0, sparqlalgebrajs_1.translate)(query, { quads: true });
|
|
641
|
-
return this.extractOptimizeParamsFromAlgebra(algebra);
|
|
642
|
-
}
|
|
643
|
-
catch (error) {
|
|
644
|
-
if (this.debug) {
|
|
645
|
-
console.log(`[ComunicaQuintEngine] Failed to analyze query:`, error);
|
|
646
|
-
}
|
|
647
|
-
return null;
|
|
648
|
-
}
|
|
649
|
-
}
|
|
650
|
-
/**
|
|
651
|
-
* Extract optimization params from SPARQL algebra
|
|
652
|
-
*/
|
|
653
|
-
extractOptimizeParamsFromAlgebra(algebra) {
|
|
654
|
-
let limit;
|
|
655
|
-
let offset;
|
|
656
|
-
let order;
|
|
657
|
-
let orderVarName;
|
|
658
|
-
let reverse;
|
|
659
|
-
let currentOp = algebra;
|
|
660
|
-
let canPushLimit = true;
|
|
661
|
-
while (currentOp) {
|
|
662
|
-
switch (currentOp.type) {
|
|
663
|
-
case 'slice': {
|
|
664
|
-
const slice = currentOp;
|
|
665
|
-
if (slice.length !== undefined) {
|
|
666
|
-
limit = slice.length;
|
|
667
|
-
}
|
|
668
|
-
if (slice.start !== undefined) {
|
|
669
|
-
offset = slice.start;
|
|
670
|
-
}
|
|
671
|
-
currentOp = slice.input;
|
|
672
|
-
break;
|
|
673
|
-
}
|
|
674
|
-
case 'orderby': {
|
|
675
|
-
const orderBy = currentOp;
|
|
676
|
-
if (orderBy.expressions.length === 1) {
|
|
677
|
-
const expr = orderBy.expressions[0];
|
|
678
|
-
// 提取变量名和排序方向
|
|
679
|
-
// ORDER BY ?name: { expressionType: "term", term: { value: "name" } }
|
|
680
|
-
// ORDER BY DESC(?name): { expressionType: "operator", operator: "desc", args: [{ expressionType: "term", term: {...} }] }
|
|
681
|
-
let varName;
|
|
682
|
-
reverse = false;
|
|
683
|
-
if (expr.expressionType === 'term') {
|
|
684
|
-
const termExpr = expr;
|
|
685
|
-
if (termExpr.term?.termType === 'Variable') {
|
|
686
|
-
varName = termExpr.term.value;
|
|
687
|
-
}
|
|
688
|
-
}
|
|
689
|
-
else if (expr.expressionType === 'operator') {
|
|
690
|
-
const opExpr = expr;
|
|
691
|
-
if (opExpr.operator === 'desc' && opExpr.args.length === 1) {
|
|
692
|
-
reverse = true;
|
|
693
|
-
const innerExpr = opExpr.args[0];
|
|
694
|
-
if (innerExpr.expressionType === 'term') {
|
|
695
|
-
const termExpr = innerExpr;
|
|
696
|
-
if (termExpr.term?.termType === 'Variable') {
|
|
697
|
-
varName = termExpr.term.value;
|
|
698
|
-
}
|
|
699
|
-
}
|
|
700
|
-
}
|
|
701
|
-
else if (opExpr.operator === 'asc' && opExpr.args.length === 1) {
|
|
702
|
-
const innerExpr = opExpr.args[0];
|
|
703
|
-
if (innerExpr.expressionType === 'term') {
|
|
704
|
-
const termExpr = innerExpr;
|
|
705
|
-
if (termExpr.term?.termType === 'Variable') {
|
|
706
|
-
varName = termExpr.term.value;
|
|
707
|
-
}
|
|
708
|
-
}
|
|
709
|
-
}
|
|
710
|
-
}
|
|
711
|
-
if (varName) {
|
|
712
|
-
orderVarName = varName; // 保存原始变量名
|
|
713
|
-
// 尝试直接映射(s/p/o/g)
|
|
714
|
-
const termName = this.variableToTermName(varName);
|
|
715
|
-
if (termName) {
|
|
716
|
-
order = [termName];
|
|
717
|
-
}
|
|
718
|
-
// 如果直接映射失败,QuintQuerySource 会通过 pattern 分析来确定
|
|
719
|
-
}
|
|
720
|
-
}
|
|
721
|
-
currentOp = orderBy.input;
|
|
722
|
-
break;
|
|
723
|
-
}
|
|
724
|
-
case 'project':
|
|
725
|
-
case 'distinct':
|
|
726
|
-
case 'reduced': {
|
|
727
|
-
currentOp = currentOp.input;
|
|
728
|
-
break;
|
|
729
|
-
}
|
|
730
|
-
case 'bgp': {
|
|
731
|
-
const bgp = currentOp;
|
|
732
|
-
if (bgp.patterns.length === 1) {
|
|
733
|
-
return { limit, offset, order, orderVarName, reverse };
|
|
734
|
-
}
|
|
735
|
-
canPushLimit = false;
|
|
736
|
-
return canPushLimit ? { limit, offset, order, orderVarName, reverse } : null;
|
|
737
|
-
}
|
|
738
|
-
case 'join':
|
|
739
|
-
case 'leftjoin':
|
|
740
|
-
case 'union':
|
|
741
|
-
case 'minus':
|
|
742
|
-
// 虽然不能下推 LIMIT,但仍然返回 ORDER BY 参数
|
|
743
|
-
// 因为 OPTIONAL 优化路径会自己处理排序
|
|
744
|
-
canPushLimit = false;
|
|
745
|
-
if (orderVarName) {
|
|
746
|
-
return { limit, offset, order, orderVarName, reverse };
|
|
747
|
-
}
|
|
748
|
-
return null;
|
|
749
|
-
case 'filter':
|
|
750
|
-
case 'extend':
|
|
751
|
-
case 'group':
|
|
752
|
-
// 同样,返回 ORDER BY 参数供 OPTIONAL 优化路径使用
|
|
753
|
-
if (orderVarName) {
|
|
754
|
-
return { limit, offset, order, orderVarName, reverse };
|
|
755
|
-
}
|
|
756
|
-
return null;
|
|
757
|
-
default:
|
|
758
|
-
return null;
|
|
759
|
-
}
|
|
760
|
-
}
|
|
761
|
-
return null;
|
|
762
|
-
}
|
|
763
|
-
/**
|
|
764
|
-
* Map SPARQL variable name to TermName
|
|
765
|
-
*/
|
|
766
|
-
variableToTermName(varName) {
|
|
767
|
-
const mapping = {
|
|
768
|
-
's': 'subject',
|
|
769
|
-
'subject': 'subject',
|
|
770
|
-
'p': 'predicate',
|
|
771
|
-
'predicate': 'predicate',
|
|
772
|
-
'o': 'object',
|
|
773
|
-
'object': 'object',
|
|
774
|
-
'g': 'graph',
|
|
775
|
-
'graph': 'graph',
|
|
776
|
-
};
|
|
777
|
-
return mapping[varName.toLowerCase()] ?? null;
|
|
778
|
-
}
|
|
779
|
-
}
|
|
780
|
-
exports.ComunicaQuintEngine = ComunicaQuintEngine;
|
|
781
|
-
//# sourceMappingURL=ComunicaQuintEngine.js.map
|