@undefineds.co/xpod 0.2.44 → 0.3.0
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/dist/agents/AgentExecutorFactory.js +12 -13
- package/dist/agents/AgentExecutorFactory.js.map +1 -1
- package/dist/agents/config/agent-meta-schema.d.ts +31 -3
- package/dist/agents/config/agent-meta-schema.js +37 -3
- package/dist/agents/config/agent-meta-schema.js.map +1 -1
- package/dist/agents/config/index.d.ts +5 -5
- package/dist/agents/config/index.js +7 -6
- package/dist/agents/config/index.js.map +1 -1
- package/dist/agents/config/parse-agent-instructions.d.ts +12 -0
- package/dist/agents/config/parse-agent-instructions.js +23 -0
- package/dist/agents/config/parse-agent-instructions.js.map +1 -0
- package/dist/agents/config/resolve.d.ts +7 -12
- package/dist/agents/config/resolve.js +272 -156
- package/dist/agents/config/resolve.js.map +1 -1
- package/dist/agents/config/types.d.ts +33 -36
- package/dist/agents/config/types.js +4 -4
- package/dist/agents/config/types.js.map +1 -1
- package/dist/agents/index.d.ts +2 -7
- package/dist/agents/index.js +4 -14
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/types.d.ts +2 -2
- package/dist/agents/types.js.map +1 -1
- package/dist/ai/service/CredentialReaderImpl.js +9 -14
- package/dist/ai/service/CredentialReaderImpl.js.map +1 -1
- package/dist/api/ApiServer.d.ts +7 -0
- package/dist/api/ApiServer.js +5 -1
- package/dist/api/ApiServer.js.map +1 -1
- package/dist/api/chatkit/default-agent.js +1 -1
- package/dist/api/chatkit/default-agent.js.map +1 -1
- package/dist/api/chatkit/index.d.ts +8 -0
- package/dist/api/chatkit/index.js +15 -1
- package/dist/api/chatkit/index.js.map +1 -1
- package/dist/api/chatkit/pod-store.d.ts +80 -17
- package/dist/api/chatkit/pod-store.js +816 -162
- package/dist/api/chatkit/pod-store.js.map +1 -1
- package/dist/api/chatkit/runtime/AcpAgentRuntime.d.ts +41 -0
- package/dist/api/chatkit/runtime/AcpAgentRuntime.js +573 -0
- package/dist/api/chatkit/runtime/AcpAgentRuntime.js.map +1 -0
- package/dist/api/chatkit/runtime/CodexRuntimeProjector.d.ts +27 -0
- package/dist/api/chatkit/runtime/CodexRuntimeProjector.js +157 -0
- package/dist/api/chatkit/runtime/CodexRuntimeProjector.js.map +1 -0
- package/dist/api/chatkit/schema.d.ts +53 -133
- package/dist/api/chatkit/schema.js +11 -175
- package/dist/api/chatkit/schema.js.map +1 -1
- package/dist/api/chatkit/service.d.ts +15 -9
- package/dist/api/chatkit/service.js +82 -234
- package/dist/api/chatkit/service.js.map +1 -1
- package/dist/api/chatkit/store.d.ts +35 -3
- package/dist/api/chatkit/store.js +157 -3
- package/dist/api/chatkit/store.js.map +1 -1
- package/dist/api/chatkit/types.d.ts +16 -2
- package/dist/api/chatkit/types.js +24 -5
- package/dist/api/chatkit/types.js.map +1 -1
- package/dist/api/container/common.js +59 -2
- package/dist/api/container/common.js.map +1 -1
- package/dist/api/container/index.js +15 -0
- package/dist/api/container/index.js.map +1 -1
- package/dist/api/container/routes.js +11 -0
- package/dist/api/container/routes.js.map +1 -1
- package/dist/api/container/types.d.ts +26 -0
- package/dist/api/container/types.js.map +1 -1
- package/dist/api/handlers/InngestHandler.d.ts +11 -0
- package/dist/api/handlers/InngestHandler.js +19 -0
- package/dist/api/handlers/InngestHandler.js.map +1 -0
- package/dist/api/handlers/RunHandler.d.ts +7 -0
- package/dist/api/handlers/RunHandler.js +169 -0
- package/dist/api/handlers/RunHandler.js.map +1 -0
- package/dist/api/handlers/index.d.ts +1 -0
- package/dist/api/handlers/index.js +1 -0
- package/dist/api/handlers/index.js.map +1 -1
- package/dist/api/models/namespaces.d.ts +2 -2
- package/dist/api/models/namespaces.js +1 -4
- package/dist/api/models/namespaces.js.map +1 -1
- package/dist/api/runs/AgentRuntimeTypes.d.ts +83 -0
- package/dist/api/runs/AgentRuntimeTypes.js +3 -0
- package/dist/api/runs/AgentRuntimeTypes.js.map +1 -0
- package/dist/api/runs/EmbeddedInngestService.d.ts +47 -0
- package/dist/api/runs/EmbeddedInngestService.js +203 -0
- package/dist/api/runs/EmbeddedInngestService.js.map +1 -0
- package/dist/api/runs/InngestRunExecutionBackend.d.ts +416 -0
- package/dist/api/runs/InngestRunExecutionBackend.js +225 -0
- package/dist/api/runs/InngestRunExecutionBackend.js.map +1 -0
- package/dist/api/runs/ManagedRunWorker.d.ts +52 -0
- package/dist/api/runs/ManagedRunWorker.js +452 -0
- package/dist/api/runs/ManagedRunWorker.js.map +1 -0
- package/dist/api/runs/PiAgentRuntimeDriver.d.ts +66 -0
- package/dist/api/runs/PiAgentRuntimeDriver.js +614 -0
- package/dist/api/runs/PiAgentRuntimeDriver.js.map +1 -0
- package/dist/api/runs/PiAgentRuntimeWorker.d.ts +1 -0
- package/dist/api/runs/PiAgentRuntimeWorker.js +33 -0
- package/dist/api/runs/PiAgentRuntimeWorker.js.map +1 -0
- package/dist/api/runs/RunAuthContextRegistry.d.ts +19 -0
- package/dist/api/runs/RunAuthContextRegistry.js +59 -0
- package/dist/api/runs/RunAuthContextRegistry.js.map +1 -0
- package/dist/api/runs/RunExecutionBackend.d.ts +57 -0
- package/dist/api/runs/RunExecutionBackend.js +3 -0
- package/dist/api/runs/RunExecutionBackend.js.map +1 -0
- package/dist/api/runs/RunStateCenter.d.ts +82 -0
- package/dist/api/runs/RunStateCenter.js +665 -0
- package/dist/api/runs/RunStateCenter.js.map +1 -0
- package/dist/api/runs/schema.d.ts +55 -0
- package/dist/api/runs/schema.js +14 -0
- package/dist/api/runs/schema.js.map +1 -0
- package/dist/api/runs/store.d.ts +105 -0
- package/dist/api/runs/store.js +116 -0
- package/dist/api/runs/store.js.map +1 -0
- package/dist/api/runtime.d.ts +2 -0
- package/dist/api/runtime.js +40 -1
- package/dist/api/runtime.js.map +1 -1
- package/dist/api/service/VectorStoreService.d.ts +1 -0
- package/dist/api/service/VectorStoreService.js +27 -34
- package/dist/api/service/VectorStoreService.js.map +1 -1
- package/dist/api/service/provider-registry.d.ts +1 -1
- package/dist/api/service/provider-registry.js +1 -1
- package/dist/api/service/provider-registry.js.map +1 -1
- package/dist/api/tasks/InngestTaskScheduler.d.ts +751 -0
- package/dist/api/tasks/InngestTaskScheduler.js +209 -0
- package/dist/api/tasks/InngestTaskScheduler.js.map +1 -0
- package/dist/api/tasks/TaskAuthBinding.d.ts +68 -0
- package/dist/api/tasks/TaskAuthBinding.js +162 -0
- package/dist/api/tasks/TaskAuthBinding.js.map +1 -0
- package/dist/api/tasks/TaskMaterializer.d.ts +55 -0
- package/dist/api/tasks/TaskMaterializer.js +452 -0
- package/dist/api/tasks/TaskMaterializer.js.map +1 -0
- package/dist/api/tasks/TaskService.d.ts +57 -0
- package/dist/api/tasks/TaskService.js +235 -0
- package/dist/api/tasks/TaskService.js.map +1 -0
- package/dist/api/tasks/index.d.ts +6 -0
- package/dist/api/tasks/index.js +25 -0
- package/dist/api/tasks/index.js.map +1 -0
- package/dist/api/tasks/schema.d.ts +23 -0
- package/dist/api/tasks/schema.js +8 -0
- package/dist/api/tasks/schema.js.map +1 -0
- package/dist/api/tasks/store.d.ts +40 -0
- package/dist/api/tasks/store.js +34 -0
- package/dist/api/tasks/store.js.map +1 -0
- package/dist/api/workspace/types.d.ts +3 -0
- package/dist/api/workspace/types.js +23 -0
- package/dist/api/workspace/types.js.map +1 -0
- package/dist/cli/commands/config.d.ts +8 -7
- package/dist/cli/commands/config.js +72 -48
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/login.d.ts +10 -8
- package/dist/cli/commands/login.js +84 -84
- package/dist/cli/commands/login.js.map +1 -1
- package/dist/cli/index.js +3 -124
- package/dist/cli/index.js.map +1 -1
- package/dist/http/search/SearchHttpHandler.js +13 -18
- package/dist/http/search/SearchHttpHandler.js.map +1 -1
- package/dist/runtime/configure-drizzle-solid.js +52 -0
- package/dist/runtime/configure-drizzle-solid.js.map +1 -1
- package/dist/storage/quint/PgQuintStore.d.ts +6 -0
- package/dist/storage/quint/PgQuintStore.js +83 -5
- package/dist/storage/quint/PgQuintStore.js.map +1 -1
- package/dist/storage/quint/PgQuintStore.jsonld +24 -0
- package/dist/storage/quint/SqliteQuintStore.d.ts +1 -0
- package/dist/storage/quint/SqliteQuintStore.js +52 -0
- package/dist/storage/quint/SqliteQuintStore.js.map +1 -1
- package/dist/storage/quint/SqliteQuintStore.jsonld +4 -0
- package/dist/storage/quint/types.d.ts +6 -0
- package/dist/storage/quint/types.js.map +1 -1
- package/dist/storage/sparql/FilterPushdownExtractor.js +23 -11
- package/dist/storage/sparql/FilterPushdownExtractor.js.map +1 -1
- package/dist/storage/vector/VectorIndexingListener.js +13 -18
- package/dist/storage/vector/VectorIndexingListener.js.map +1 -1
- package/dist/util/identifiers/ClusterIdentifierStrategy.js +29 -1
- package/dist/util/identifiers/ClusterIdentifierStrategy.js.map +1 -1
- package/dist/vocab/index.d.ts +2 -6
- package/dist/vocab/index.js +2 -6
- package/dist/vocab/index.js.map +1 -1
- package/dist/vocab/udfs.d.ts +12 -0
- package/dist/vocab/udfs.js +12 -0
- package/dist/vocab/udfs.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/README.md +52 -24
- package/node_modules/@undefineds.co/drizzle-solid/README.zh-CN.md +30 -24
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/discovery/types.d.ts +6 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/discovery/types.d.ts.map +1 -1
- 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 +43 -10
- 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/ldp-strategy.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/ldp-strategy.js +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/ldp-strategy.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/pod-executor.d.ts +5 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/pod-executor.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/pod-executor.js +44 -13
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/pod-executor.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/sparql-strategy.d.ts +1 -0
- 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 +21 -2
- 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/execution/types.d.ts +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/types.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/expressions.d.ts +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/expressions.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-database.d.ts +76 -41
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-database.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-database.js +443 -114
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-database.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-dialect.d.ts +28 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-dialect.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-dialect.js +142 -31
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-dialect.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-session.d.ts +3 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-session.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-session.js +84 -6
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-session.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/insert-query-builder.d.ts +3 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/insert-query-builder.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/insert-query-builder.js +29 -9
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/insert-query-builder.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/select-query-builder.d.ts +2 -8
- 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 +19 -51
- 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-builders/types.d.ts +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/types.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-conditions.d.ts +2 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-conditions.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-where-policy.js +6 -6
- 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/resource-reference.d.ts +4 -4
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-reference.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-reference.js +56 -23
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-reference.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/base-resolver.d.ts +14 -10
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/base-resolver.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/base-resolver.js +55 -23
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/base-resolver.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/document-resolver.d.ts +3 -3
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/document-resolver.js +6 -6
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/document-resolver.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/fragment-resolver.d.ts +3 -3
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/fragment-resolver.js +4 -4
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/fragment-resolver.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/runtime/pod-runtime.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/runtime/pod-runtime.js +33 -8
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/runtime/pod-runtime.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/defs.d.ts +11 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/defs.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/factories.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/factories.js +3 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/factories.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/pod-table.d.ts +13 -8
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/pod-table.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/pod-table.js +24 -22
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/pod-table.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/solid-schema.d.ts +3 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/solid-schema.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/solid-schema.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/subject/resolver.d.ts +3 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/subject/resolver.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/subject/resolver.js +28 -14
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/subject/resolver.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/triple/handlers/inline.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/triple/handlers/inline.js +3 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/triple/handlers/inline.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/uri/resolver.d.ts +9 -9
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/uri/resolver.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/uri/resolver.js +56 -22
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/uri/resolver.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/driver.d.ts +9 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/driver.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/driver.js +2 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/driver.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/discovery/types.d.ts +6 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/discovery/types.d.ts.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 +43 -10
- 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/ldp-strategy.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/ldp-strategy.js +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/ldp-strategy.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/pod-executor.d.ts +5 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/pod-executor.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/pod-executor.js +44 -13
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/pod-executor.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/sparql-strategy.d.ts +1 -0
- 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 +21 -2
- 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/execution/types.d.ts +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/types.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/expressions.d.ts +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/expressions.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-database.d.ts +76 -41
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-database.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-database.js +443 -114
- 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/pod-dialect.d.ts +28 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-dialect.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-dialect.js +142 -31
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-dialect.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-session.d.ts +3 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-session.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-session.js +84 -6
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-session.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/insert-query-builder.d.ts +3 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/insert-query-builder.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/insert-query-builder.js +29 -9
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/insert-query-builder.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/select-query-builder.d.ts +2 -8
- 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 +19 -51
- 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-builders/types.d.ts +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/types.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-conditions.d.ts +2 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-conditions.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-where-policy.js +6 -6
- 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/resource-reference.d.ts +4 -4
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-reference.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-reference.js +56 -23
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-reference.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/base-resolver.d.ts +14 -10
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/base-resolver.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/base-resolver.js +55 -23
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/base-resolver.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/document-resolver.d.ts +3 -3
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/document-resolver.js +6 -6
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/document-resolver.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/fragment-resolver.d.ts +3 -3
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/fragment-resolver.js +4 -4
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/fragment-resolver.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/runtime/pod-runtime.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/runtime/pod-runtime.js +33 -8
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/runtime/pod-runtime.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/defs.d.ts +11 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/defs.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/factories.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/factories.js +3 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/factories.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/pod-table.d.ts +13 -8
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/pod-table.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/pod-table.js +24 -22
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/pod-table.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/solid-schema.d.ts +3 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/solid-schema.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/solid-schema.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/subject/resolver.d.ts +3 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/subject/resolver.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/subject/resolver.js +28 -14
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/subject/resolver.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/triple/handlers/inline.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/triple/handlers/inline.js +3 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/triple/handlers/inline.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/uri/resolver.d.ts +9 -9
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/uri/resolver.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/uri/resolver.js +56 -22
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/uri/resolver.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/driver.d.ts +9 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/driver.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/driver.js +2 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/driver.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/pod.d.ts +16 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/pod.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/utils/find-by-iri.js +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/utils/find-by-iri.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/pod.d.ts +16 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/pod.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/utils/find-by-iri.js +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/utils/find-by-iri.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/package.json +1 -1
- package/package.json +5 -3
- package/scripts/patch-jose.js +62 -12
- package/dist/agents/AgentManager.d.ts +0 -116
- package/dist/agents/AgentManager.js +0 -290
- package/dist/agents/AgentManager.js.map +0 -1
- package/dist/agents/IndexAgent.d.ts +0 -70
- package/dist/agents/IndexAgent.js +0 -417
- package/dist/agents/IndexAgent.js.map +0 -1
- package/dist/agents/config/parse-agent-md.d.ts +0 -33
- package/dist/agents/config/parse-agent-md.js +0 -75
- package/dist/agents/config/parse-agent-md.js.map +0 -1
- package/dist/agents/schema/agent-config.d.ts +0 -2
- package/dist/agents/schema/agent-config.js +0 -32
- package/dist/agents/schema/agent-config.js.map +0 -1
- package/dist/agents/schema/create-agent-schema.d.ts +0 -25
- package/dist/agents/schema/create-agent-schema.js +0 -35
- package/dist/agents/schema/create-agent-schema.js.map +0 -1
- package/dist/api/chatkit/runtime/PtyThreadRuntime.d.ts +0 -127
- package/dist/api/chatkit/runtime/PtyThreadRuntime.js +0 -791
- package/dist/api/chatkit/runtime/PtyThreadRuntime.js.map +0 -1
- package/dist/cli/lib/agent-session.d.ts +0 -37
- package/dist/cli/lib/agent-session.js +0 -211
- package/dist/cli/lib/agent-session.js.map +0 -1
- package/dist/cli/lib/ensure-ai-credentials.d.ts +0 -13
- package/dist/cli/lib/ensure-ai-credentials.js +0 -40
- package/dist/cli/lib/ensure-ai-credentials.js.map +0 -1
- package/dist/cli/lib/model-manager.d.ts +0 -37
- package/dist/cli/lib/model-manager.js +0 -251
- package/dist/cli/lib/model-manager.js.map +0 -1
- package/dist/cli/lib/oauth-credential-manager.d.ts +0 -37
- package/dist/cli/lib/oauth-credential-manager.js +0 -129
- package/dist/cli/lib/oauth-credential-manager.js.map +0 -1
- package/dist/cli/lib/oauth-providers/codebuddy.d.ts +0 -25
- package/dist/cli/lib/oauth-providers/codebuddy.js +0 -69
- package/dist/cli/lib/oauth-providers/codebuddy.js.map +0 -1
- package/dist/cli/lib/oauth-providers/index.d.ts +0 -12
- package/dist/cli/lib/oauth-providers/index.js +0 -23
- package/dist/cli/lib/oauth-providers/index.js.map +0 -1
- package/dist/cli/lib/pi-optional.d.ts +0 -84
- package/dist/cli/lib/pi-optional.js +0 -35
- package/dist/cli/lib/pi-optional.js.map +0 -1
- package/dist/cli/lib/pod-ai-config.d.ts +0 -26
- package/dist/cli/lib/pod-ai-config.js +0 -99
- package/dist/cli/lib/pod-ai-config.js.map +0 -1
- package/dist/cli/lib/pod-thread-store.d.ts +0 -57
- package/dist/cli/lib/pod-thread-store.js +0 -312
- package/dist/cli/lib/pod-thread-store.js.map +0 -1
- package/dist/cli/lib/secretary-prompt.d.ts +0 -6
- package/dist/cli/lib/secretary-prompt.js +0 -85
- package/dist/cli/lib/secretary-prompt.js.map +0 -1
- package/dist/task/DrizzleTaskQueue.d.ts +0 -56
- package/dist/task/DrizzleTaskQueue.js +0 -171
- package/dist/task/DrizzleTaskQueue.js.map +0 -1
- package/dist/task/TaskExecutor.d.ts +0 -82
- package/dist/task/TaskExecutor.js +0 -198
- package/dist/task/TaskExecutor.js.map +0 -1
- package/dist/task/index.d.ts +0 -10
- package/dist/task/index.js +0 -20
- package/dist/task/index.js.map +0 -1
- package/dist/task/schema.d.ts +0 -53
- package/dist/task/schema.js +0 -71
- package/dist/task/schema.js.map +0 -1
- package/dist/task/types.d.ts +0 -186
- package/dist/task/types.js +0 -12
- package/dist/task/types.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SqliteQuintStore.js","sourceRoot":"","sources":["../../../src/storage/quint/SqliteQuintStore.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * SqliteQuintStore - SQLite implementation of QuintStore using Drizzle ORM\n */\n\nimport { existsSync, mkdirSync } from 'node:fs';\nimport { dirname } from 'node:path';\nimport { eq, ne, and, gte, gt, lt, lte, like, inArray, notInArray, isNull, isNotNull, sql } from 'drizzle-orm';\nimport type { SQL } from 'drizzle-orm';\nimport { wrap, AsyncIterator } from 'asynciterator';\nimport { DataFactory } from 'n3';\nimport type { Term, Quad } from '@rdfjs/types';\n\nimport { quints, type QuintRow, type NewQuintRow } from './schema';\nimport {\n quadToRow,\n rowToQuad,\n parseVector,\n termToId,\n serializeObject,\n deserializeObject,\n fpEncode,\n SEP,\n isSerializedObjectValue,\n} from './serialization';\nimport { getSqliteRuntime, type SqliteDatabase } from '../SqliteRuntime';\nimport type {\n Quint,\n QuintPattern,\n QuintStore,\n QuintStoreOptions,\n QueryOptions,\n StoreStats,\n TermMatch,\n TermOperators,\n CompoundPattern,\n CompoundResult,\n OperatorValue,\n} from './types';\nimport { isTerm } from './types';\n\nconst SQLITE_UNBOUNDED_LIMIT = Number.MAX_SAFE_INTEGER;\n\nexport interface SqliteQuintStoreOptions extends QuintStoreOptions {\n /** SQLite database file path, use ':memory:' for in-memory database */\n path: string;\n}\n\nexport class SqliteQuintStore {\n private sqlite: SqliteDatabase | null = null;\n private db: any | null = null;\n private options: SqliteQuintStoreOptions;\n private readonly sqliteRuntime = getSqliteRuntime();\n\n constructor(options: SqliteQuintStoreOptions) {\n // Handle sqlite: prefix\n let path = options.path;\n if (path.startsWith('sqlite:')) {\n path = path.slice(7);\n }\n this.options = { ...options, path };\n }\n\n // ============================================\n // Lifecycle\n // ============================================\n\n async open(): Promise<void> {\n // Idempotent: if already open, do nothing\n if (this.sqlite) {\n return;\n }\n\n const dbPath = this.options.path;\n \n // Ensure directory exists (unless it's in-memory)\n if (dbPath !== ':memory:') {\n const dir = dirname(dbPath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n }\n \n this.sqlite = this.sqliteRuntime.openDatabase(dbPath);\n this.db = this.sqliteRuntime.createDrizzleDatabase(this.sqlite);\n\n // Create table and indexes\n this.sqlite.exec(`\n CREATE TABLE IF NOT EXISTS quints (\n graph TEXT NOT NULL,\n subject TEXT NOT NULL,\n predicate TEXT NOT NULL,\n object TEXT NOT NULL,\n vector TEXT,\n PRIMARY KEY (graph, subject, predicate, object)\n );\n\n CREATE INDEX IF NOT EXISTS idx_spog ON quints (subject, predicate, object, graph);\n CREATE INDEX IF NOT EXISTS idx_ogsp ON quints (object, graph, subject, predicate);\n CREATE INDEX IF NOT EXISTS idx_gspo ON quints (graph, subject, predicate, object);\n CREATE INDEX IF NOT EXISTS idx_sopg ON quints (subject, object, predicate, graph);\n CREATE INDEX IF NOT EXISTS idx_pogs ON quints (predicate, object, graph, subject);\n CREATE INDEX IF NOT EXISTS idx_gpos ON quints (graph, predicate, object, subject);\n `);\n }\n\n async close(): Promise<void> {\n if (this.sqlite) {\n this.sqlite.close();\n this.sqlite = null;\n this.db = null;\n }\n }\n\n // ============================================\n // Query Operations\n // ============================================\n\n async get(pattern: QuintPattern, options?: QueryOptions): Promise<Quint[]> {\n this.ensureOpen();\n\n const conditions = this.buildConditions(pattern);\n \n let query = this.db!.select().from(quints);\n \n if (conditions.length > 0) {\n query = query.where(and(...conditions)) as any;\n }\n\n // ORDER BY 支持\n if (options?.order && options.order.length > 0) {\n // 使用 sql 模板构建 ORDER BY\n const orderCol = options.order[0]; // 目前只支持单列排序\n const direction = options.reverse ? 'DESC' : 'ASC';\n query = query.orderBy(sql.raw(`${orderCol} ${direction}`)) as any;\n }\n\n if (options?.limit !== undefined) {\n query = query.limit(options.limit) as any;\n }\n if (options?.offset !== undefined) {\n // SQLite requires LIMIT when using OFFSET\n if (options?.limit === undefined) {\n query = query.limit(SQLITE_UNBOUNDED_LIMIT) as any;\n }\n query = query.offset(options.offset) as any;\n }\n\n const rows = await query;\n return rows.map((row: QuintRow) => this.rowToQuint(row));\n }\n\n match(\n subject?: Term | null,\n predicate?: Term | null,\n object?: Term | null,\n graph?: Term | null,\n ): AsyncIterator<Quint> {\n const pattern: QuintPattern = {};\n if (subject) pattern.subject = subject;\n if (predicate) pattern.predicate = predicate;\n if (object) pattern.object = object;\n if (graph) pattern.graph = graph;\n\n return wrap(this.get(pattern));\n }\n\n async getByGraphPrefix(prefix: string, options?: QueryOptions): Promise<Quint[]> {\n return this.get({ graph: { $startsWith: prefix } }, options);\n }\n\n async count(pattern: QuintPattern): Promise<number> {\n this.ensureOpen();\n\n const conditions = this.buildConditions(pattern);\n\n let query = this.db!.select({ count: sql<number>`count(*)` }).from(quints);\n\n if (conditions.length > 0) {\n query = query.where(and(...conditions)) as any;\n }\n\n const result = await query;\n return result[0]?.count ?? 0;\n }\n\n /**\n * Compound query - multiple patterns JOINed by a common field\n * This executes a single SQL query with JOINs, letting SQLite optimize the execution plan\n */\n async getCompound(compound: CompoundPattern, options?: QueryOptions): Promise<CompoundResult[]> {\n this.ensureOpen();\n\n const { patterns, joinOn, select } = compound;\n \n if (patterns.length === 0) {\n return [];\n }\n\n if (patterns.length === 1) {\n // Single pattern, fall back to regular get\n const quads = await this.get(patterns[0], options);\n return quads.map(q => ({\n joinValue: termToId((q as any)[joinOn]),\n bindings: {},\n quads: [q],\n }));\n }\n\n // Build JOIN SQL\n const { sql: sqlQuery, params } = this.buildCompoundSQL(compound, options);\n \n if (this.options.debug) {\n console.log('[SqliteQuintStore] Compound SQL:', sqlQuery);\n console.log('[SqliteQuintStore] Params:', params);\n }\n\n // Execute raw SQL\n const stmt = this.sqlite!.prepare(sqlQuery);\n const rows = stmt.all(...params) as Record<string, string>[];\n\n // Convert rows to CompoundResult\n return rows.map(row => {\n const bindings: Record<string, string> = {};\n \n // Extract bindings based on select config or default naming\n if (select) {\n for (const s of select) {\n bindings[s.alias] = row[s.alias];\n }\n } else {\n // Default: include all fields from all patterns\n for (const key of Object.keys(row)) {\n if (key !== 'join_value') {\n bindings[key] = row[key];\n }\n }\n }\n\n return {\n joinValue: row.join_value,\n bindings,\n };\n });\n }\n\n /**\n * 批量获取多个 subject 的多个属性\n * \n * 用于优化 OPTIONAL 查询:避免每个 OPTIONAL 变成一次 LEFT JOIN\n * \n * SQL: SELECT subject, predicate, object FROM quints \n * WHERE subject IN (...) AND predicate IN (...)\n */\n async getAttributes(\n subjects: string[],\n predicates: string[],\n graph?: Term\n ): Promise<Map<string, Map<string, Term[]>>> {\n this.ensureOpen();\n\n if (subjects.length === 0 || predicates.length === 0) {\n return new Map();\n }\n\n // Build SQL with IN clauses\n const params: string[] = [];\n let sql = `SELECT subject, predicate, object FROM quints WHERE subject IN (${\n subjects.map(() => '?').join(', ')\n }) AND predicate IN (${\n predicates.map(() => '?').join(', ')\n })`;\n \n params.push(...subjects);\n params.push(...predicates);\n\n // Add graph filter if specified\n if (graph && graph.termType !== 'DefaultGraph') {\n sql += ` AND graph = ?`;\n params.push(termToId(graph as any));\n }\n\n if (this.options.debug) {\n console.log('[SqliteQuintStore] getAttributes SQL:', sql);\n console.log('[SqliteQuintStore] Params:', params.length, 'subjects:', subjects.length, 'predicates:', predicates.length);\n }\n\n const stmt = this.sqlite!.prepare(sql);\n const rows = stmt.all(...params) as { subject: string; predicate: string; object: string }[];\n\n // Build result map: subject -> predicate -> object[]\n const result = new Map<string, Map<string, Term[]>>();\n\n for (const row of rows) {\n if (!result.has(row.subject)) {\n result.set(row.subject, new Map());\n }\n const predicateMap = result.get(row.subject)!;\n \n if (!predicateMap.has(row.predicate)) {\n predicateMap.set(row.predicate, []);\n }\n \n // Deserialize object back to Term\n const objectTerm = deserializeObject(row.object);\n predicateMap.get(row.predicate)!.push(objectTerm);\n }\n\n if (this.options.debug) {\n console.log('[SqliteQuintStore] getAttributes returned', result.size, 'subjects');\n }\n\n return result;\n }\n\n /**\n * Build SQL for compound query with JOINs\n */\n private buildCompoundSQL(\n compound: CompoundPattern,\n options?: QueryOptions\n ): { sql: string; params: (string | number)[] } {\n const { patterns, joinOn, select } = compound;\n const params: (string | number)[] = [];\n \n // Map joinOn to column name\n const joinColumn = joinOn; // 'subject' | 'predicate' | 'object' | 'graph'\n\n // Build SELECT clause\n let selectClause = `q0.${joinColumn} as join_value`;\n \n if (select) {\n for (const s of select) {\n selectClause += `, q${s.pattern}.${s.field} as ${s.alias}`;\n }\n } else {\n // Default: select object from each pattern as p0_object, p1_object, etc.\n for (let i = 0; i < patterns.length; i++) {\n selectClause += `, q${i}.object as p${i}_object`;\n selectClause += `, q${i}.predicate as p${i}_predicate`;\n }\n }\n\n // Build FROM clause with JOINs\n let fromClause = 'quints q0';\n for (let i = 1; i < patterns.length; i++) {\n fromClause += ` JOIN quints q${i} ON q0.${joinColumn} = q${i}.${joinColumn}`;\n // Also join on graph to ensure same graph\n fromClause += ` AND q0.graph = q${i}.graph`;\n }\n\n // Build WHERE clause\n const whereParts: string[] = [];\n \n for (let i = 0; i < patterns.length; i++) {\n const pattern = patterns[i];\n const alias = `q${i}`;\n \n const conditions = this.buildConditionsForAlias(pattern, alias, params);\n whereParts.push(...conditions);\n }\n\n let sql = `SELECT ${selectClause} FROM ${fromClause}`;\n \n if (whereParts.length > 0) {\n sql += ` WHERE ${whereParts.join(' AND ')}`;\n }\n\n // Add LIMIT/OFFSET\n if (options?.limit) {\n sql += ` LIMIT ?`;\n params.push(options.limit);\n }\n if (options?.offset) {\n if (!options?.limit) {\n sql += ` LIMIT -1`;\n }\n sql += ` OFFSET ?`;\n params.push(options.offset);\n }\n\n return { sql, params };\n }\n\n /**\n * Build WHERE conditions for a specific table alias\n */\n private buildConditionsForAlias(\n pattern: QuintPattern,\n alias: string,\n params: (string | number)[]\n ): string[] {\n const conditions: string[] = [];\n\n /**\n * Serialize operator value for comparison\n * - Term: use serializeObject/termToId\n * - number: for exact match ($eq, $ne, $in, $notIn) use full serialization\n * for range comparison ($gt, $gte, $lt, $lte) use fpstring\n * - string: assume already serialized or use as-is\n */\n const serializeOpValue = (value: OperatorValue, isObject: boolean, filterOp: string): string | number => {\n if (typeof value === 'object' && 'termType' in value) {\n // It's a Term - use full serialization\n return isObject ? serializeObject(value as any) : termToId(value as any);\n }\n \n if (typeof value === 'number') {\n if (isObject) {\n // For exact match operations, use full serialization (includes datatype and original value)\n if (filterOp === '$eq' || filterOp === '$ne' || filterOp === '$in' || filterOp === '$notIn') {\n const lit = DataFactory.literal(String(value), DataFactory.namedNode('http://www.w3.org/2001/XMLSchema#integer'));\n return serializeObject(lit);\n }\n // For range comparisons, use fpstring\n const fpValue = `N${SEP}${fpEncode(value)}`;\n // $gt and $lte need max suffix to compare correctly\n if (filterOp === '$gt' || filterOp === '$lte') {\n return fpValue + SEP + '\\uffff';\n }\n // $lt and $gte use prefix only\n return fpValue;\n }\n return value;\n }\n \n if (isObject) {\n if (isSerializedObjectValue(value)) {\n return value;\n }\n return `\"${value}\"`;\n }\n return value;\n };\n\n const addCondition = (\n column: string,\n match: TermMatch | undefined,\n isObject: boolean = false\n ) => {\n if (!match) return;\n\n const fullColumn = `${alias}.${column}`;\n\n if (isTerm(match)) {\n conditions.push(`${fullColumn} = ?`);\n params.push(isObject ? serializeObject(match as any) : termToId(match as any));\n } else {\n const ops = match as TermOperators;\n\n if (ops.$eq !== undefined) {\n conditions.push(`${fullColumn} = ?`);\n params.push(serializeOpValue(ops.$eq, isObject, '$eq'));\n }\n if (ops.$ne !== undefined) {\n conditions.push(`${fullColumn} != ?`);\n params.push(serializeOpValue(ops.$ne, isObject, '$ne'));\n }\n if (ops.$gt !== undefined) {\n conditions.push(`${fullColumn} > ?`);\n params.push(serializeOpValue(ops.$gt, isObject, '$gt'));\n }\n if (ops.$gte !== undefined) {\n conditions.push(`${fullColumn} >= ?`);\n params.push(serializeOpValue(ops.$gte, isObject, '$gte'));\n }\n if (ops.$lt !== undefined) {\n conditions.push(`${fullColumn} < ?`);\n params.push(serializeOpValue(ops.$lt, isObject, '$lt'));\n }\n if (ops.$lte !== undefined) {\n conditions.push(`${fullColumn} <= ?`);\n params.push(serializeOpValue(ops.$lte, isObject, '$lte'));\n }\n if (ops.$in !== undefined && ops.$in.length > 0) {\n const placeholders = ops.$in.map(() => '?').join(', ');\n conditions.push(`${fullColumn} IN (${placeholders})`);\n params.push(...ops.$in.map(v => serializeOpValue(v, isObject, '$in')));\n }\n if (ops.$notIn !== undefined && ops.$notIn.length > 0) {\n const placeholders = ops.$notIn.map(() => '?').join(', ');\n conditions.push(`${fullColumn} NOT IN (${placeholders})`);\n params.push(...ops.$notIn.map(v => serializeOpValue(v, isObject, '$notIn')));\n }\n if (ops.$startsWith !== undefined) {\n conditions.push(`${fullColumn} >= ?`);\n conditions.push(`${fullColumn} < ?`);\n params.push(ops.$startsWith);\n params.push(ops.$startsWith + '\\uffff');\n }\n if (ops.$endsWith !== undefined) {\n conditions.push(`${fullColumn} LIKE ?`);\n params.push(`%${ops.$endsWith}`);\n }\n if (ops.$contains !== undefined) {\n conditions.push(`${fullColumn} LIKE ?`);\n params.push(`%${ops.$contains}%`);\n }\n if (ops.$isNull === true) {\n conditions.push(`${fullColumn} IS NULL`);\n }\n if (ops.$isNull === false) {\n conditions.push(`${fullColumn} IS NOT NULL`);\n }\n }\n };\n\n addCondition('graph', pattern.graph);\n addCondition('subject', pattern.subject);\n addCondition('predicate', pattern.predicate);\n addCondition('object', pattern.object, true);\n\n return conditions;\n }\n\n // ============================================\n // Write Operations\n // ============================================\n\n async put(quint: Quint): Promise<void> {\n this.ensureOpen();\n\n const row = this.quintToRow(quint);\n\n await this.db!.insert(quints)\n .values(row)\n .onConflictDoUpdate({\n target: [quints.graph, quints.subject, quints.predicate, quints.object],\n set: { vector: row.vector },\n });\n }\n\n async multiPut(quintList: Quint[]): Promise<void> {\n this.ensureOpen();\n\n if (quintList.length === 0) return;\n\n const rows = quintList.map(q => this.quintToRow(q));\n\n // Use transaction for batch insert\n this.sqlite!.transaction(() => {\n for (const row of rows) {\n this.db!.insert(quints)\n .values(row)\n .onConflictDoUpdate({\n target: [quints.graph, quints.subject, quints.predicate, quints.object],\n set: { vector: row.vector },\n })\n .run();\n }\n })();\n }\n\n async updateEmbedding(pattern: QuintPattern, embedding: number[]): Promise<number> {\n this.ensureOpen();\n\n const conditions = this.buildConditions(pattern);\n const vectorJson = JSON.stringify(embedding);\n\n if (conditions.length === 0) {\n const result = await this.db!.update(quints)\n .set({ vector: vectorJson });\n return result.changes;\n }\n\n const result = await this.db!.update(quints)\n .set({ vector: vectorJson })\n .where(and(...conditions));\n\n return result.changes;\n }\n\n // ============================================\n // Delete Operations\n // ============================================\n\n async del(pattern: QuintPattern): Promise<number> {\n this.ensureOpen();\n\n const conditions = this.buildConditions(pattern);\n\n if (conditions.length === 0) {\n // Delete all - dangerous!\n const result = await this.db!.delete(quints);\n return result.changes;\n }\n\n const result = await this.db!.delete(quints).where(and(...conditions));\n return result.changes;\n }\n\n async multiDel(quintList: Quint[]): Promise<void> {\n this.ensureOpen();\n\n if (quintList.length === 0) return;\n\n this.sqlite!.transaction(() => {\n for (const quint of quintList) {\n const g = termToId(quint.graph as any);\n const s = termToId(quint.subject as any);\n const p = termToId(quint.predicate as any);\n const o = serializeObject(quint.object as any);\n\n this.db!.delete(quints)\n .where(\n and(\n eq(quints.graph, g),\n eq(quints.subject, s),\n eq(quints.predicate, p),\n eq(quints.object, o),\n ),\n )\n .run();\n }\n })();\n }\n\n // ============================================\n // Management\n // ============================================\n\n async stats(): Promise<StoreStats> {\n this.ensureOpen();\n\n const totalResult = await this.db!\n .select({ count: sql<number>`count(*)` })\n .from(quints);\n\n const vectorResult = await this.db!\n .select({ count: sql<number>`count(*)` })\n .from(quints)\n .where(sql`${quints.vector} IS NOT NULL`);\n\n const graphResult = await this.db!\n .select({ count: sql<number>`COUNT(DISTINCT ${quints.graph})` })\n .from(quints);\n\n return {\n totalCount: totalResult[0]?.count ?? 0,\n vectorCount: vectorResult[0]?.count ?? 0,\n graphCount: graphResult[0]?.count ?? 0,\n };\n }\n\n async clear(): Promise<void> {\n this.ensureOpen();\n await this.db!.delete(quints);\n }\n\n // ============================================\n // Private Helpers\n // ============================================\n\n private ensureOpen(): void {\n if (!this.db) {\n throw new Error('Store not open. Call open() first.');\n }\n }\n\n private buildConditions(pattern: QuintPattern): SQL[] {\n const conditions: SQL[] = [];\n\n /**\n * Serialize operator value for comparison\n * - Term: use serializeObject/termToId\n * - number: for exact match ($eq, $ne, $in, $notIn) use full serialization\n * for range comparison ($gt, $gte, $lt, $lte) use fpstring\n * - string: assume already serialized or use as-is\n */\n const serializeOpValue = (value: OperatorValue, isObject: boolean, filterOp: string): any => {\n if (typeof value === 'object' && 'termType' in value) {\n return isObject ? serializeObject(value as any) : termToId(value as any);\n }\n \n if (typeof value === 'number') {\n if (isObject) {\n // For exact match operations, use full serialization (includes datatype and original value)\n if (filterOp === '$eq' || filterOp === '$ne' || filterOp === '$in' || filterOp === '$notIn') {\n const lit = DataFactory.literal(String(value), DataFactory.namedNode('http://www.w3.org/2001/XMLSchema#integer'));\n return serializeObject(lit);\n }\n // For range comparisons, use fpstring\n const fpValue = `N${SEP}${fpEncode(value)}`;\n // $gt and $lte need max suffix\n if (filterOp === '$gt' || filterOp === '$lte') {\n return fpValue + SEP + '\\uffff';\n }\n return fpValue;\n }\n return value;\n }\n \n if (isObject && !isSerializedObjectValue(value)) {\n return `\"${value}\"`;\n }\n return value;\n };\n\n const addTermConditions = (\n column: typeof quints.graph | typeof quints.subject | typeof quints.predicate | typeof quints.object,\n match: TermMatch | undefined,\n isObject: boolean = false\n ) => {\n if (!match) return;\n\n if (isTerm(match)) {\n // Exact Term match\n conditions.push(eq(column, isObject ? serializeObject(match as any) : termToId(match as any)));\n } else {\n // Operator match\n const ops = match as TermOperators;\n\n if (ops.$eq !== undefined) {\n conditions.push(eq(column, serializeOpValue(ops.$eq, isObject, '$eq')));\n }\n if (ops.$ne !== undefined) {\n conditions.push(ne(column, serializeOpValue(ops.$ne, isObject, '$ne')));\n }\n if (ops.$gt !== undefined) {\n conditions.push(gt(column, serializeOpValue(ops.$gt, isObject, '$gt')));\n }\n if (ops.$gte !== undefined) {\n conditions.push(gte(column, serializeOpValue(ops.$gte, isObject, '$gte')));\n }\n if (ops.$lt !== undefined) {\n conditions.push(lt(column, serializeOpValue(ops.$lt, isObject, '$lt')));\n }\n if (ops.$lte !== undefined) {\n conditions.push(lte(column, serializeOpValue(ops.$lte, isObject, '$lte')));\n }\n if (ops.$in !== undefined && ops.$in.length > 0) {\n const serializedValues = ops.$in.map(v => serializeOpValue(v, isObject, '$in'));\n conditions.push(inArray(column, serializedValues));\n }\n if (ops.$notIn !== undefined && ops.$notIn.length > 0) {\n const serializedValues = ops.$notIn.map(v => serializeOpValue(v, isObject, '$notIn'));\n conditions.push(notInArray(column, serializedValues));\n }\n if (ops.$startsWith !== undefined) {\n // Use range query for prefix matching (index-friendly)\n conditions.push(gte(column, ops.$startsWith));\n conditions.push(lt(column, ops.$startsWith + '\\uffff'));\n }\n if (ops.$endsWith !== undefined) {\n conditions.push(like(column, `%${ops.$endsWith}`));\n }\n if (ops.$contains !== undefined) {\n conditions.push(like(column, `%${ops.$contains}%`));\n }\n if (ops.$regex !== undefined) {\n // SQLite uses GLOB as regex approximation\n conditions.push(sql`${column} GLOB ${ops.$regex.replace(/\\.\\*/g, '*').replace(/\\./g, '?')}`);\n }\n if (ops.$isNull === true) {\n conditions.push(isNull(column));\n }\n if (ops.$isNull === false) {\n conditions.push(isNotNull(column));\n }\n }\n };\n\n addTermConditions(quints.graph, pattern.graph);\n addTermConditions(quints.subject, pattern.subject);\n addTermConditions(quints.predicate, pattern.predicate);\n addTermConditions(quints.object, pattern.object, true);\n\n return conditions;\n }\n\n private quintToRow(quint: Quint): NewQuintRow {\n return {\n graph: termToId(quint.graph as any),\n subject: termToId(quint.subject as any),\n predicate: termToId(quint.predicate as any),\n object: serializeObject(quint.object as any),\n vector: quint.vector ? JSON.stringify(quint.vector) : null,\n };\n }\n\n private rowToQuint(row: QuintRow): Quint {\n const quad = rowToQuad(row);\n const quint: Quint = quad as Quint;\n if (row.vector) {\n quint.vector = parseVector(row.vector);\n }\n return quint;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"SqliteQuintStore.js","sourceRoot":"","sources":["../../../src/storage/quint/SqliteQuintStore.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * SqliteQuintStore - SQLite implementation of QuintStore using Drizzle ORM\n */\n\nimport { existsSync, mkdirSync } from 'node:fs';\nimport { dirname } from 'node:path';\nimport { eq, ne, and, gte, gt, lt, lte, like, inArray, notInArray, isNull, isNotNull, sql } from 'drizzle-orm';\nimport type { SQL } from 'drizzle-orm';\nimport { wrap, AsyncIterator } from 'asynciterator';\nimport { DataFactory } from 'n3';\nimport type { Term, Quad } from '@rdfjs/types';\n\nimport { quints, type QuintRow, type NewQuintRow } from './schema';\nimport {\n quadToRow,\n rowToQuad,\n parseVector,\n termToId,\n serializeObject,\n deserializeObject,\n fpEncode,\n SEP,\n isSerializedObjectValue,\n} from './serialization';\nimport { getSqliteRuntime, type SqliteDatabase } from '../SqliteRuntime';\nimport type {\n Quint,\n QuintPattern,\n QuintStore,\n QuintStoreOptions,\n QueryOptions,\n StoreStats,\n TermMatch,\n TermOperators,\n CompoundPattern,\n CompoundResult,\n OperatorValue,\n} from './types';\nimport { isTerm } from './types';\n\nconst SQLITE_UNBOUNDED_LIMIT = Number.MAX_SAFE_INTEGER;\n\nexport interface SqliteQuintStoreOptions extends QuintStoreOptions {\n /** SQLite database file path, use ':memory:' for in-memory database */\n path: string;\n}\n\nexport class SqliteQuintStore {\n private sqlite: SqliteDatabase | null = null;\n private db: any | null = null;\n private options: SqliteQuintStoreOptions;\n private readonly sqliteRuntime = getSqliteRuntime();\n\n constructor(options: SqliteQuintStoreOptions) {\n // Handle sqlite: prefix\n let path = options.path;\n if (path.startsWith('sqlite:')) {\n path = path.slice(7);\n }\n this.options = { ...options, path };\n }\n\n // ============================================\n // Lifecycle\n // ============================================\n\n async open(): Promise<void> {\n // Idempotent: if already open, do nothing\n if (this.sqlite) {\n return;\n }\n\n const dbPath = this.options.path;\n \n // Ensure directory exists (unless it's in-memory)\n if (dbPath !== ':memory:') {\n const dir = dirname(dbPath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n }\n \n this.sqlite = this.sqliteRuntime.openDatabase(dbPath);\n this.db = this.sqliteRuntime.createDrizzleDatabase(this.sqlite);\n\n // Create table and indexes\n this.sqlite.exec(`\n CREATE TABLE IF NOT EXISTS quints (\n graph TEXT NOT NULL,\n subject TEXT NOT NULL,\n predicate TEXT NOT NULL,\n object TEXT NOT NULL,\n vector TEXT,\n PRIMARY KEY (graph, subject, predicate, object)\n );\n\n CREATE INDEX IF NOT EXISTS idx_spog ON quints (subject, predicate, object, graph);\n CREATE INDEX IF NOT EXISTS idx_ogsp ON quints (object, graph, subject, predicate);\n CREATE INDEX IF NOT EXISTS idx_gspo ON quints (graph, subject, predicate, object);\n CREATE INDEX IF NOT EXISTS idx_sopg ON quints (subject, object, predicate, graph);\n CREATE INDEX IF NOT EXISTS idx_pogs ON quints (predicate, object, graph, subject);\n CREATE INDEX IF NOT EXISTS idx_gpos ON quints (graph, predicate, object, subject);\n `);\n }\n\n async close(): Promise<void> {\n if (this.sqlite) {\n this.sqlite.close();\n this.sqlite = null;\n this.db = null;\n }\n }\n\n // ============================================\n // Query Operations\n // ============================================\n\n async get(pattern: QuintPattern, options?: QueryOptions): Promise<Quint[]> {\n this.ensureOpen();\n\n const conditions = this.buildConditions(pattern);\n \n let query = this.db!.select().from(quints);\n \n if (conditions.length > 0) {\n query = query.where(and(...conditions)) as any;\n }\n\n // ORDER BY 支持\n if (options?.order && options.order.length > 0) {\n // 使用 sql 模板构建 ORDER BY\n const orderCol = options.order[0]; // 目前只支持单列排序\n const direction = options.reverse ? 'DESC' : 'ASC';\n query = query.orderBy(sql.raw(`${orderCol} ${direction}`)) as any;\n }\n\n if (options?.limit !== undefined) {\n query = query.limit(options.limit) as any;\n }\n if (options?.offset !== undefined) {\n // SQLite requires LIMIT when using OFFSET\n if (options?.limit === undefined) {\n query = query.limit(SQLITE_UNBOUNDED_LIMIT) as any;\n }\n query = query.offset(options.offset) as any;\n }\n\n const rows = await query;\n return rows.map((row: QuintRow) => this.rowToQuint(row));\n }\n\n match(\n subject?: Term | null,\n predicate?: Term | null,\n object?: Term | null,\n graph?: Term | null,\n ): AsyncIterator<Quint> {\n const pattern: QuintPattern = {};\n if (subject) pattern.subject = subject;\n if (predicate) pattern.predicate = predicate;\n if (object) pattern.object = object;\n if (graph) pattern.graph = graph;\n\n return wrap(this.get(pattern));\n }\n\n async getByGraphPrefix(prefix: string, options?: QueryOptions): Promise<Quint[]> {\n return this.get({ graph: { $startsWith: prefix } }, options);\n }\n\n async count(pattern: QuintPattern): Promise<number> {\n this.ensureOpen();\n\n const conditions = this.buildConditions(pattern);\n\n let query = this.db!.select({ count: sql<number>`count(*)` }).from(quints);\n\n if (conditions.length > 0) {\n query = query.where(and(...conditions)) as any;\n }\n\n const result = await query;\n return result[0]?.count ?? 0;\n }\n\n /**\n * Compound query - multiple patterns JOINed by a common field\n * This executes a single SQL query with JOINs, letting SQLite optimize the execution plan\n */\n async getCompound(compound: CompoundPattern, options?: QueryOptions): Promise<CompoundResult[]> {\n this.ensureOpen();\n\n const { patterns, joinOn, select } = compound;\n \n if (patterns.length === 0) {\n return [];\n }\n\n if (patterns.length === 1) {\n // Single pattern, fall back to regular get\n const quads = await this.get(patterns[0], options);\n return quads.map(q => ({\n joinValue: termToId((q as any)[joinOn]),\n bindings: {},\n quads: [q],\n }));\n }\n\n // Build JOIN SQL\n const { sql: sqlQuery, params } = this.buildCompoundSQL(compound, options);\n \n if (this.options.debug) {\n console.log('[SqliteQuintStore] Compound SQL:', sqlQuery);\n console.log('[SqliteQuintStore] Params:', params);\n }\n\n // Execute raw SQL\n const stmt = this.sqlite!.prepare(sqlQuery);\n const rows = stmt.all(...params) as Record<string, string>[];\n\n // Convert rows to CompoundResult\n return rows.map(row => {\n const bindings: Record<string, string> = {};\n \n // Extract bindings based on select config or default naming\n if (select) {\n for (const s of select) {\n bindings[s.alias] = row[s.alias];\n }\n } else {\n // Default: include all fields from all patterns\n for (const key of Object.keys(row)) {\n if (key !== 'join_value') {\n bindings[key] = row[key];\n }\n }\n }\n\n return {\n joinValue: row.join_value,\n bindings,\n };\n });\n }\n\n /**\n * 批量获取多个 subject 的多个属性\n * \n * 用于优化 OPTIONAL 查询:避免每个 OPTIONAL 变成一次 LEFT JOIN\n * \n * SQL: SELECT subject, predicate, object FROM quints \n * WHERE subject IN (...) AND predicate IN (...)\n */\n async getAttributes(\n subjects: string[],\n predicates: string[],\n graph?: Term\n ): Promise<Map<string, Map<string, Term[]>>> {\n this.ensureOpen();\n\n if (subjects.length === 0 || predicates.length === 0) {\n return new Map();\n }\n\n // Build SQL with IN clauses\n const params: string[] = [];\n let sql = `SELECT subject, predicate, object FROM quints WHERE subject IN (${\n subjects.map(() => '?').join(', ')\n }) AND predicate IN (${\n predicates.map(() => '?').join(', ')\n })`;\n \n params.push(...subjects);\n params.push(...predicates);\n\n // Add graph filter if specified\n if (graph && graph.termType !== 'DefaultGraph') {\n sql += ` AND graph = ?`;\n params.push(termToId(graph as any));\n }\n\n if (this.options.debug) {\n console.log('[SqliteQuintStore] getAttributes SQL:', sql);\n console.log('[SqliteQuintStore] Params:', params.length, 'subjects:', subjects.length, 'predicates:', predicates.length);\n }\n\n const stmt = this.sqlite!.prepare(sql);\n const rows = stmt.all(...params) as { subject: string; predicate: string; object: string }[];\n\n // Build result map: subject -> predicate -> object[]\n const result = new Map<string, Map<string, Term[]>>();\n\n for (const row of rows) {\n if (!result.has(row.subject)) {\n result.set(row.subject, new Map());\n }\n const predicateMap = result.get(row.subject)!;\n \n if (!predicateMap.has(row.predicate)) {\n predicateMap.set(row.predicate, []);\n }\n \n // Deserialize object back to Term\n const objectTerm = deserializeObject(row.object);\n predicateMap.get(row.predicate)!.push(objectTerm);\n }\n\n if (this.options.debug) {\n console.log('[SqliteQuintStore] getAttributes returned', result.size, 'subjects');\n }\n\n return result;\n }\n\n /**\n * Build SQL for compound query with JOINs\n */\n private buildCompoundSQL(\n compound: CompoundPattern,\n options?: QueryOptions\n ): { sql: string; params: (string | number)[] } {\n const { patterns, joinOn, select } = compound;\n const params: (string | number)[] = [];\n \n // Map joinOn to column name\n const joinColumn = joinOn; // 'subject' | 'predicate' | 'object' | 'graph'\n\n // Build SELECT clause\n let selectClause = `q0.${joinColumn} as join_value`;\n \n if (select) {\n for (const s of select) {\n selectClause += `, q${s.pattern}.${s.field} as ${s.alias}`;\n }\n } else {\n // Default: select object from each pattern as p0_object, p1_object, etc.\n for (let i = 0; i < patterns.length; i++) {\n selectClause += `, q${i}.object as p${i}_object`;\n selectClause += `, q${i}.predicate as p${i}_predicate`;\n }\n }\n\n // Build FROM clause with JOINs\n let fromClause = 'quints q0';\n for (let i = 1; i < patterns.length; i++) {\n fromClause += ` JOIN quints q${i} ON q0.${joinColumn} = q${i}.${joinColumn}`;\n // Also join on graph to ensure same graph\n fromClause += ` AND q0.graph = q${i}.graph`;\n }\n\n // Build WHERE clause\n const whereParts: string[] = [];\n \n for (let i = 0; i < patterns.length; i++) {\n const pattern = patterns[i];\n const alias = `q${i}`;\n \n const conditions = this.buildConditionsForAlias(pattern, alias, params);\n whereParts.push(...conditions);\n }\n\n let sql = `SELECT ${selectClause} FROM ${fromClause}`;\n \n if (whereParts.length > 0) {\n sql += ` WHERE ${whereParts.join(' AND ')}`;\n }\n\n // Add LIMIT/OFFSET\n if (options?.limit) {\n sql += ` LIMIT ?`;\n params.push(options.limit);\n }\n if (options?.offset) {\n if (!options?.limit) {\n sql += ` LIMIT -1`;\n }\n sql += ` OFFSET ?`;\n params.push(options.offset);\n }\n\n return { sql, params };\n }\n\n /**\n * Build WHERE conditions for a specific table alias\n */\n private buildConditionsForAlias(\n pattern: QuintPattern,\n alias: string,\n params: (string | number)[]\n ): string[] {\n const conditions: string[] = [];\n\n /**\n * Serialize operator value for comparison\n * - Term: use serializeObject/termToId\n * - number: for exact match ($eq, $ne, $in, $notIn) use full serialization\n * for range comparison ($gt, $gte, $lt, $lte) use fpstring\n * - string: assume already serialized or use as-is\n */\n const serializeOpValue = (value: OperatorValue, isObject: boolean, filterOp: string): string | number => {\n if (typeof value === 'object' && 'termType' in value) {\n // It's a Term - use full serialization\n return isObject ? serializeObject(value as any) : termToId(value as any);\n }\n \n if (typeof value === 'number') {\n if (isObject) {\n // For exact match operations, use full serialization (includes datatype and original value)\n if (filterOp === '$eq' || filterOp === '$ne' || filterOp === '$in' || filterOp === '$notIn') {\n const lit = DataFactory.literal(String(value), DataFactory.namedNode('http://www.w3.org/2001/XMLSchema#integer'));\n return serializeObject(lit);\n }\n // For range comparisons, use fpstring\n const fpValue = `N${SEP}${fpEncode(value)}`;\n // $gt and $lte need max suffix to compare correctly\n if (filterOp === '$gt' || filterOp === '$lte') {\n return fpValue + SEP + '\\uffff';\n }\n // $lt and $gte use prefix only\n return fpValue;\n }\n return value;\n }\n \n if (isObject) {\n if (isSerializedObjectValue(value)) {\n return value;\n }\n return `\"${value}\"`;\n }\n return value;\n };\n\n const addCondition = (\n column: string,\n match: TermMatch | undefined,\n isObject: boolean = false\n ) => {\n if (!match) return;\n\n const fullColumn = `${alias}.${column}`;\n\n if (isTerm(match)) {\n conditions.push(`${fullColumn} = ?`);\n params.push(isObject ? serializeObject(match as any) : termToId(match as any));\n } else {\n const ops = match as TermOperators;\n\n if (ops.$eq !== undefined) {\n conditions.push(`${fullColumn} = ?`);\n params.push(serializeOpValue(ops.$eq, isObject, '$eq'));\n }\n if (ops.$ne !== undefined) {\n conditions.push(`${fullColumn} != ?`);\n params.push(serializeOpValue(ops.$ne, isObject, '$ne'));\n }\n if (ops.$gt !== undefined) {\n conditions.push(`${fullColumn} > ?`);\n params.push(serializeOpValue(ops.$gt, isObject, '$gt'));\n }\n if (ops.$gte !== undefined) {\n conditions.push(`${fullColumn} >= ?`);\n params.push(serializeOpValue(ops.$gte, isObject, '$gte'));\n }\n if (ops.$lt !== undefined) {\n conditions.push(`${fullColumn} < ?`);\n params.push(serializeOpValue(ops.$lt, isObject, '$lt'));\n }\n if (ops.$lte !== undefined) {\n conditions.push(`${fullColumn} <= ?`);\n params.push(serializeOpValue(ops.$lte, isObject, '$lte'));\n }\n if (ops.$in !== undefined && ops.$in.length > 0) {\n const placeholders = ops.$in.map(() => '?').join(', ');\n conditions.push(`${fullColumn} IN (${placeholders})`);\n params.push(...ops.$in.map(v => serializeOpValue(v, isObject, '$in')));\n }\n if (ops.$notIn !== undefined && ops.$notIn.length > 0) {\n const placeholders = ops.$notIn.map(() => '?').join(', ');\n conditions.push(`${fullColumn} NOT IN (${placeholders})`);\n params.push(...ops.$notIn.map(v => serializeOpValue(v, isObject, '$notIn')));\n }\n if (ops.$startsWith !== undefined) {\n conditions.push(`${fullColumn} >= ?`);\n conditions.push(`${fullColumn} < ?`);\n params.push(ops.$startsWith);\n params.push(ops.$startsWith + '\\uffff');\n }\n if (ops.$endsWith !== undefined) {\n conditions.push(`${fullColumn} LIKE ?`);\n params.push(`%${ops.$endsWith}`);\n }\n if (ops.$contains !== undefined) {\n conditions.push(`${fullColumn} LIKE ?`);\n params.push(`%${ops.$contains}%`);\n }\n if (isObject && ops.$strStartsWith !== undefined) {\n const lexical = this.objectLexicalSql(fullColumn);\n conditions.push(`${lexical} >= ?`);\n conditions.push(`${lexical} < ?`);\n params.push(ops.$strStartsWith);\n params.push(ops.$strStartsWith + '\\uffff');\n }\n if (isObject && ops.$strEndsWith !== undefined) {\n conditions.push(`${this.objectLexicalSql(fullColumn)} LIKE ?`);\n params.push(`%${ops.$strEndsWith}`);\n }\n if (isObject && ops.$strContains !== undefined) {\n conditions.push(`${this.objectLexicalSql(fullColumn)} LIKE ?`);\n params.push(`%${ops.$strContains}%`);\n }\n if (isObject && ops.$strRegex !== undefined) {\n conditions.push(`${this.objectLexicalSql(fullColumn)} GLOB ?`);\n params.push(ops.$strRegex.replace(/\\.\\*/g, '*').replace(/\\./g, '?'));\n }\n if (isObject && ops.$language !== undefined) {\n conditions.push(`lower(${fullColumn}) LIKE ?`);\n params.push(ops.$language === '*' ? '%\"@%' : `%\"@${ops.$language.toLowerCase()}`);\n }\n if (ops.$isNull === true) {\n conditions.push(`${fullColumn} IS NULL`);\n }\n if (ops.$isNull === false) {\n conditions.push(`${fullColumn} IS NOT NULL`);\n }\n }\n };\n\n addCondition('graph', pattern.graph);\n addCondition('subject', pattern.subject);\n addCondition('predicate', pattern.predicate);\n addCondition('object', pattern.object, true);\n\n return conditions;\n }\n\n // ============================================\n // Write Operations\n // ============================================\n\n async put(quint: Quint): Promise<void> {\n this.ensureOpen();\n\n const row = this.quintToRow(quint);\n\n await this.db!.insert(quints)\n .values(row)\n .onConflictDoUpdate({\n target: [quints.graph, quints.subject, quints.predicate, quints.object],\n set: { vector: row.vector },\n });\n }\n\n async multiPut(quintList: Quint[]): Promise<void> {\n this.ensureOpen();\n\n if (quintList.length === 0) return;\n\n const rows = quintList.map(q => this.quintToRow(q));\n\n // Use transaction for batch insert\n this.sqlite!.transaction(() => {\n for (const row of rows) {\n this.db!.insert(quints)\n .values(row)\n .onConflictDoUpdate({\n target: [quints.graph, quints.subject, quints.predicate, quints.object],\n set: { vector: row.vector },\n })\n .run();\n }\n })();\n }\n\n async updateEmbedding(pattern: QuintPattern, embedding: number[]): Promise<number> {\n this.ensureOpen();\n\n const conditions = this.buildConditions(pattern);\n const vectorJson = JSON.stringify(embedding);\n\n if (conditions.length === 0) {\n const result = await this.db!.update(quints)\n .set({ vector: vectorJson });\n return result.changes;\n }\n\n const result = await this.db!.update(quints)\n .set({ vector: vectorJson })\n .where(and(...conditions));\n\n return result.changes;\n }\n\n // ============================================\n // Delete Operations\n // ============================================\n\n async del(pattern: QuintPattern): Promise<number> {\n this.ensureOpen();\n\n const conditions = this.buildConditions(pattern);\n\n if (conditions.length === 0) {\n // Delete all - dangerous!\n const result = await this.db!.delete(quints);\n return result.changes;\n }\n\n const result = await this.db!.delete(quints).where(and(...conditions));\n return result.changes;\n }\n\n async multiDel(quintList: Quint[]): Promise<void> {\n this.ensureOpen();\n\n if (quintList.length === 0) return;\n\n this.sqlite!.transaction(() => {\n for (const quint of quintList) {\n const g = termToId(quint.graph as any);\n const s = termToId(quint.subject as any);\n const p = termToId(quint.predicate as any);\n const o = serializeObject(quint.object as any);\n\n this.db!.delete(quints)\n .where(\n and(\n eq(quints.graph, g),\n eq(quints.subject, s),\n eq(quints.predicate, p),\n eq(quints.object, o),\n ),\n )\n .run();\n }\n })();\n }\n\n // ============================================\n // Management\n // ============================================\n\n async stats(): Promise<StoreStats> {\n this.ensureOpen();\n\n const totalResult = await this.db!\n .select({ count: sql<number>`count(*)` })\n .from(quints);\n\n const vectorResult = await this.db!\n .select({ count: sql<number>`count(*)` })\n .from(quints)\n .where(sql`${quints.vector} IS NOT NULL`);\n\n const graphResult = await this.db!\n .select({ count: sql<number>`COUNT(DISTINCT ${quints.graph})` })\n .from(quints);\n\n return {\n totalCount: totalResult[0]?.count ?? 0,\n vectorCount: vectorResult[0]?.count ?? 0,\n graphCount: graphResult[0]?.count ?? 0,\n };\n }\n\n async clear(): Promise<void> {\n this.ensureOpen();\n await this.db!.delete(quints);\n }\n\n // ============================================\n // Private Helpers\n // ============================================\n\n private ensureOpen(): void {\n if (!this.db) {\n throw new Error('Store not open. Call open() first.');\n }\n }\n\n private buildConditions(pattern: QuintPattern): SQL[] {\n const conditions: SQL[] = [];\n\n /**\n * Serialize operator value for comparison\n * - Term: use serializeObject/termToId\n * - number: for exact match ($eq, $ne, $in, $notIn) use full serialization\n * for range comparison ($gt, $gte, $lt, $lte) use fpstring\n * - string: assume already serialized or use as-is\n */\n const serializeOpValue = (value: OperatorValue, isObject: boolean, filterOp: string): any => {\n if (typeof value === 'object' && 'termType' in value) {\n return isObject ? serializeObject(value as any) : termToId(value as any);\n }\n \n if (typeof value === 'number') {\n if (isObject) {\n // For exact match operations, use full serialization (includes datatype and original value)\n if (filterOp === '$eq' || filterOp === '$ne' || filterOp === '$in' || filterOp === '$notIn') {\n const lit = DataFactory.literal(String(value), DataFactory.namedNode('http://www.w3.org/2001/XMLSchema#integer'));\n return serializeObject(lit);\n }\n // For range comparisons, use fpstring\n const fpValue = `N${SEP}${fpEncode(value)}`;\n // $gt and $lte need max suffix\n if (filterOp === '$gt' || filterOp === '$lte') {\n return fpValue + SEP + '\\uffff';\n }\n return fpValue;\n }\n return value;\n }\n \n if (isObject && !isSerializedObjectValue(value)) {\n return `\"${value}\"`;\n }\n return value;\n };\n\n const addTermConditions = (\n column: typeof quints.graph | typeof quints.subject | typeof quints.predicate | typeof quints.object,\n match: TermMatch | undefined,\n isObject: boolean = false\n ) => {\n if (!match) return;\n\n if (isTerm(match)) {\n // Exact Term match\n conditions.push(eq(column, isObject ? serializeObject(match as any) : termToId(match as any)));\n } else {\n // Operator match\n const ops = match as TermOperators;\n\n if (ops.$eq !== undefined) {\n conditions.push(eq(column, serializeOpValue(ops.$eq, isObject, '$eq')));\n }\n if (ops.$ne !== undefined) {\n conditions.push(ne(column, serializeOpValue(ops.$ne, isObject, '$ne')));\n }\n if (ops.$gt !== undefined) {\n conditions.push(gt(column, serializeOpValue(ops.$gt, isObject, '$gt')));\n }\n if (ops.$gte !== undefined) {\n conditions.push(gte(column, serializeOpValue(ops.$gte, isObject, '$gte')));\n }\n if (ops.$lt !== undefined) {\n conditions.push(lt(column, serializeOpValue(ops.$lt, isObject, '$lt')));\n }\n if (ops.$lte !== undefined) {\n conditions.push(lte(column, serializeOpValue(ops.$lte, isObject, '$lte')));\n }\n if (ops.$in !== undefined && ops.$in.length > 0) {\n const serializedValues = ops.$in.map(v => serializeOpValue(v, isObject, '$in'));\n conditions.push(inArray(column, serializedValues));\n }\n if (ops.$notIn !== undefined && ops.$notIn.length > 0) {\n const serializedValues = ops.$notIn.map(v => serializeOpValue(v, isObject, '$notIn'));\n conditions.push(notInArray(column, serializedValues));\n }\n if (ops.$startsWith !== undefined) {\n // Use range query for prefix matching (index-friendly)\n conditions.push(gte(column, ops.$startsWith));\n conditions.push(lt(column, ops.$startsWith + '\\uffff'));\n }\n if (ops.$endsWith !== undefined) {\n conditions.push(like(column, `%${ops.$endsWith}`));\n }\n if (ops.$contains !== undefined) {\n conditions.push(like(column, `%${ops.$contains}%`));\n }\n if (ops.$regex !== undefined) {\n // SQLite uses GLOB as regex approximation\n conditions.push(sql`${column} GLOB ${ops.$regex.replace(/\\.\\*/g, '*').replace(/\\./g, '?')}`);\n }\n if (isObject && ops.$strStartsWith !== undefined) {\n const lexical = sql.raw(this.objectLexicalSql('object'));\n conditions.push(sql`${lexical} >= ${ops.$strStartsWith}`);\n conditions.push(sql`${lexical} < ${ops.$strStartsWith + '\\uffff'}`);\n }\n if (isObject && ops.$strEndsWith !== undefined) {\n conditions.push(sql`${sql.raw(this.objectLexicalSql('object'))} LIKE ${`%${ops.$strEndsWith}`}`);\n }\n if (isObject && ops.$strContains !== undefined) {\n conditions.push(sql`${sql.raw(this.objectLexicalSql('object'))} LIKE ${`%${ops.$strContains}%`}`);\n }\n if (isObject && ops.$strRegex !== undefined) {\n conditions.push(sql`${sql.raw(this.objectLexicalSql('object'))} GLOB ${ops.$strRegex.replace(/\\.\\*/g, '*').replace(/\\./g, '?')}`);\n }\n if (isObject && ops.$language !== undefined) {\n conditions.push(\n ops.$language === '*'\n ? sql`lower(${column}) LIKE ${`%\"@%`}`\n : sql`lower(${column}) LIKE ${`%\"@${ops.$language.toLowerCase()}`}`,\n );\n }\n if (ops.$isNull === true) {\n conditions.push(isNull(column));\n }\n if (ops.$isNull === false) {\n conditions.push(isNotNull(column));\n }\n }\n };\n\n addTermConditions(quints.graph, pattern.graph);\n addTermConditions(quints.subject, pattern.subject);\n addTermConditions(quints.predicate, pattern.predicate);\n addTermConditions(quints.object, pattern.object, true);\n\n return conditions;\n }\n\n private objectLexicalSql(column: string): string {\n return `CASE\n WHEN ${column} LIKE '\"%\"@%' THEN substr(${column}, 2, instr(substr(${column}, 2), '\"') - 1)\n WHEN ${column} LIKE '\"%\"^^%' THEN substr(${column}, 2, instr(substr(${column}, 2), '\"') - 1)\n WHEN ${column} LIKE '\"%\"' THEN substr(${column}, 2, length(${column}) - 2)\n WHEN ${column} LIKE 'N${SEP}%' THEN substr(${column}, length('N${SEP}') + instr(substr(${column}, length('N${SEP}') + 1), '${SEP}') + instr(substr(${column}, length('N${SEP}') + instr(substr(${column}, length('N${SEP}') + 1), '${SEP}') + 1), '${SEP}') + 1)\n WHEN ${column} LIKE 'D${SEP}%' THEN substr(${column}, length('D${SEP}') + instr(substr(${column}, length('D${SEP}') + 1), '${SEP}') + 1)\n ELSE ${column}\n END`;\n }\n\n private quintToRow(quint: Quint): NewQuintRow {\n return {\n graph: termToId(quint.graph as any),\n subject: termToId(quint.subject as any),\n predicate: termToId(quint.predicate as any),\n object: serializeObject(quint.object as any),\n vector: quint.vector ? JSON.stringify(quint.vector) : null,\n };\n }\n\n private rowToQuint(row: QuintRow): Quint {\n const quad = rowToQuad(row);\n const quint: Quint = quad as Quint;\n if (row.vector) {\n quint.vector = parseVector(row.vector);\n }\n return quint;\n }\n}\n"]}
|
|
@@ -185,6 +185,10 @@
|
|
|
185
185
|
"@id": "undefineds:dist/storage/quint/SqliteQuintStore.jsonld#SqliteQuintStore__member_buildConditions",
|
|
186
186
|
"memberFieldName": "buildConditions"
|
|
187
187
|
},
|
|
188
|
+
{
|
|
189
|
+
"@id": "undefineds:dist/storage/quint/SqliteQuintStore.jsonld#SqliteQuintStore__member_objectLexicalSql",
|
|
190
|
+
"memberFieldName": "objectLexicalSql"
|
|
191
|
+
},
|
|
188
192
|
{
|
|
189
193
|
"@id": "undefineds:dist/storage/quint/SqliteQuintStore.jsonld#SqliteQuintStore__member_quintToRow",
|
|
190
194
|
"memberFieldName": "quintToRow"
|
|
@@ -43,6 +43,12 @@ export interface TermOperators {
|
|
|
43
43
|
$endsWith?: string;
|
|
44
44
|
$contains?: string;
|
|
45
45
|
$regex?: string;
|
|
46
|
+
/** RDF term lexical string operators for STR(?object) pushdown. */
|
|
47
|
+
$strStartsWith?: string;
|
|
48
|
+
$strEndsWith?: string;
|
|
49
|
+
$strContains?: string;
|
|
50
|
+
$strRegex?: string;
|
|
51
|
+
$language?: string;
|
|
46
52
|
$isNull?: boolean;
|
|
47
53
|
}
|
|
48
54
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/storage/quint/types.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/storage/quint/types.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;AA0DH,wBAEC;AALD;;GAEG;AACH,SAAgB,MAAM,CAAC,KAAgB;IACrC,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,UAAU,IAAI,KAAK,CAAC;AAC5E,CAAC;AAqFD;;GAEG;AACH,MAAsB,UAAU;CA4C/B;AA5CD,gCA4CC","sourcesContent":["/**\n * QuintStore - 五元组存储类型定义\n * \n * Quint = (G)raph, (S)ubject, (P)redicate, (O)bject, (V)ector\n * \n * 核心能力:\n * - RDF 四元组存储与查询\n * - 通用操作符查询($startsWith, $contains 等)\n * - 向量嵌入存储(搜索后续再做)\n */\n\nimport type { Term, Quad } from '@rdfjs/types';\nimport type { AsyncIterator } from 'asynciterator';\nimport type { PredicateObjectDataTypes } from './value-types';\n\n/**\n * 五元组 - 扩展 RDF Quad,增加向量\n */\nexport interface Quint extends Quad {\n vector?: number[];\n}\n\n/**\n * Term 名称类型\n */\nexport type TermName = 'subject' | 'predicate' | 'object' | 'graph';\n\n/**\n * 操作符值类型 - 可以是 Term、string 或 number\n * 存储层会自动处理序列化\n */\nexport type OperatorValue = Term | string | number;\n\n/**\n * Term 操作符 - 用于灵活查询\n * 值可以是 Term、string 或 number,存储层自动处理序列化\n */\nexport interface TermOperators {\n $eq?: OperatorValue;\n $ne?: OperatorValue;\n $gt?: OperatorValue;\n $gte?: OperatorValue;\n $lt?: OperatorValue;\n $lte?: OperatorValue;\n $in?: OperatorValue[];\n $notIn?: OperatorValue[];\n $startsWith?: string;\n $endsWith?: string;\n $contains?: string;\n $regex?: string;\n /** RDF term lexical string operators for STR(?object) pushdown. */\n $strStartsWith?: string;\n $strEndsWith?: string;\n $strContains?: string;\n $strRegex?: string;\n $language?: string;\n $isNull?: boolean;\n}\n\n/**\n * Term 匹配 - Term 精确匹配或操作符匹配\n */\nexport type TermMatch = Term | TermOperators;\n\n/**\n * 判断是否为 Term(而非操作符)\n */\nexport function isTerm(value: TermMatch): value is Term {\n return value !== null && typeof value === 'object' && 'termType' in value;\n}\n\n/**\n * 查询模式\n */\nexport interface QuintPattern {\n subject?: TermMatch;\n predicate?: TermMatch;\n object?: TermMatch;\n graph?: TermMatch;\n}\n\n/**\n * 查询选项\n */\nexport interface QueryOptions {\n limit?: number;\n offset?: number;\n order?: TermName[];\n reverse?: boolean;\n}\n\n/**\n * 复合查询模式 - 多个 pattern 通过 subject 关联\n * 用于多 pattern + FILTER 查询,由数据库内部做 JOIN\n */\nexport interface CompoundPattern {\n /** 多个 pattern,每个 pattern 对应一个三元组匹配 */\n patterns: QuintPattern[];\n /** JOIN 的字段,通常是 subject */\n joinOn: TermName;\n /** 返回哪些字段的值 */\n select?: {\n pattern: number; // pattern 索引\n field: TermName; // 要返回的字段\n alias: string; // 别名\n }[];\n}\n\n/**\n * 存储统计信息\n */\nexport interface StoreStats {\n totalCount: number;\n vectorCount: number;\n graphCount: number;\n}\n\n/**\n * QuintStore 配置选项\n */\nexport interface QuintStoreOptions {\n debug?: boolean;\n /**\n * Predicate-level RDF object data declarations.\n *\n * This declares schema value types, not query modes. The store derives\n * whether exact/range/prefix/search can be pushed down from the data type.\n */\n predicateObjectDataTypes?: PredicateObjectDataTypes;\n /**\n * Maximum serialized byte length that can be indexed as text.\n * Longer undeclared text literals are stored as longText.\n */\n textMaxBytes?: number;\n}\n\n/**\n * 复合查询结果 - 包含多个 pattern 的绑定值\n */\nexport interface CompoundResult {\n /** JOIN 字段的值 */\n joinValue: string;\n /** 各 pattern 的匹配结果,key 是 alias */\n bindings: Record<string, string>;\n /** 原始 quad 数据(可选,用于获取完整信息) */\n quads?: Quint[];\n}\n\n/**\n * 批量属性查询结果\n * Map<subject, Map<predicate, object[]>>\n */\nexport type AttributeMap = Map<string, Map<string, Term[]>>;\n\n/**\n * QuintStore - 五元组存储抽象基类\n */\nexport abstract class QuintStore {\n // 查询\n abstract get(pattern: QuintPattern, options?: QueryOptions): Promise<Quint[]>;\n abstract match(subject?: Term | null, predicate?: Term | null, object?: Term | null, graph?: Term | null): AsyncIterator<Quint>;\n abstract getByGraphPrefix(prefix: string, options?: QueryOptions): Promise<Quint[]>;\n abstract count(pattern: QuintPattern): Promise<number>;\n \n // 复合查询 - 多 pattern JOIN,由数据库内部执行\n getCompound?(compound: CompoundPattern, options?: QueryOptions): Promise<CompoundResult[]>;\n \n /**\n * 批量获取多个 subject 的多个属性\n * \n * 用于优化 OPTIONAL 查询:先用 WHERE 条件获取 subjects,\n * 然后一次性获取所有属性,避免每个 OPTIONAL 变成一次 LEFT JOIN\n * \n * SQL: SELECT subject, predicate, object FROM quints \n * WHERE subject IN (...) AND predicate IN (...)\n * \n * @param subjects - 要查询的 subject IRIs\n * @param predicates - 要获取的属性 predicate IRIs\n * @param graph - 可选,限定图\n * @returns Map<subject, Map<predicate, object[]>>\n */\n getAttributes?(\n subjects: string[],\n predicates: string[],\n graph?: Term\n ): Promise<AttributeMap>;\n\n // 写入\n abstract put(quint: Quint): Promise<void>;\n abstract multiPut(quints: Quint[]): Promise<void>;\n abstract updateEmbedding(pattern: QuintPattern, embedding: number[]): Promise<number>;\n\n // 删除\n abstract del(pattern: QuintPattern): Promise<number>;\n abstract multiDel(quints: Quint[]): Promise<void>;\n\n // 生命周期\n abstract open(): Promise<void>;\n abstract close(): Promise<void>;\n abstract stats(): Promise<StoreStats>;\n abstract clear(): Promise<void>;\n}\n"]}
|
|
@@ -172,23 +172,25 @@ class FilterPushdownExtractor {
|
|
|
172
172
|
}
|
|
173
173
|
}
|
|
174
174
|
// STRSTARTS, STRENDS, CONTAINS
|
|
175
|
-
//
|
|
176
|
-
//
|
|
177
|
-
//
|
|
178
|
-
// - STRENDS('e') -> $endsWith: 'e"' (add trailing quote)
|
|
179
|
-
// - CONTAINS('x') -> $contains: 'x' (quotes don't affect middle content)
|
|
175
|
+
// Subject/predicate/graph columns store raw IRI strings. Object string
|
|
176
|
+
// operators are explicit lexical STR(?object) pushdowns so the store can
|
|
177
|
+
// route text literals to object_text and IRIs/blank nodes to object_key.
|
|
180
178
|
if (['strstarts', 'strends', 'contains'].includes(op) && expr.args.length === 2) {
|
|
181
179
|
const varName = (0, AlgebraUtils_1.extractStrVariable)(expr.args[0]);
|
|
182
180
|
const value = (0, AlgebraUtils_1.extractLiteralValue)(expr.args[1]);
|
|
183
181
|
if (varName && value && (0, AlgebraUtils_1.isVariableInPattern)(varName, pattern)) {
|
|
182
|
+
const position = (0, AlgebraUtils_1.getVariablePosition)(varName, pattern);
|
|
183
|
+
const startsWithOp = position === 'object' ? '$strStartsWith' : '$startsWith';
|
|
184
|
+
const endsWithOp = position === 'object' ? '$strEndsWith' : '$endsWith';
|
|
185
|
+
const containsOp = position === 'object' ? '$strContains' : '$contains';
|
|
184
186
|
if (op === 'strstarts') {
|
|
185
|
-
filters[varName] = {
|
|
187
|
+
filters[varName] = { [startsWithOp]: value };
|
|
186
188
|
}
|
|
187
189
|
else if (op === 'strends') {
|
|
188
|
-
filters[varName] = {
|
|
190
|
+
filters[varName] = { [endsWithOp]: value };
|
|
189
191
|
}
|
|
190
192
|
else {
|
|
191
|
-
filters[varName] = {
|
|
193
|
+
filters[varName] = { [containsOp]: value };
|
|
192
194
|
}
|
|
193
195
|
return filters;
|
|
194
196
|
}
|
|
@@ -198,7 +200,10 @@ class FilterPushdownExtractor {
|
|
|
198
200
|
const varName = (0, AlgebraUtils_1.extractStrVariable)(expr.args[0]);
|
|
199
201
|
const regexPattern = (0, AlgebraUtils_1.extractLiteralValue)(expr.args[1]);
|
|
200
202
|
if (varName && regexPattern && (0, AlgebraUtils_1.isVariableInPattern)(varName, pattern)) {
|
|
201
|
-
|
|
203
|
+
const position = (0, AlgebraUtils_1.getVariablePosition)(varName, pattern);
|
|
204
|
+
filters[varName] = position === 'object'
|
|
205
|
+
? { $strRegex: regexPattern }
|
|
206
|
+
: { $regex: regexPattern };
|
|
202
207
|
return filters;
|
|
203
208
|
}
|
|
204
209
|
}
|
|
@@ -293,7 +298,6 @@ class FilterPushdownExtractor {
|
|
|
293
298
|
}
|
|
294
299
|
}
|
|
295
300
|
// LANGMATCHES(LANG(?x), "en") - language tagged literals end with @lang"
|
|
296
|
-
// Serialization format: "value"@en
|
|
297
301
|
if (op === 'langmatches' && expr.args.length === 2) {
|
|
298
302
|
const langExpr = expr.args[0];
|
|
299
303
|
const langPattern = expr.args[1];
|
|
@@ -303,6 +307,14 @@ class FilterPushdownExtractor {
|
|
|
303
307
|
langExpr.args.length === 1) {
|
|
304
308
|
const varName = (0, AlgebraUtils_1.extractVariable)(langExpr.args[0]);
|
|
305
309
|
if (varName && (0, AlgebraUtils_1.isVariableInPattern)(varName, pattern)) {
|
|
310
|
+
const position = (0, AlgebraUtils_1.getVariablePosition)(varName, pattern);
|
|
311
|
+
if (position === 'object') {
|
|
312
|
+
if (langPattern.termType === 'Literal') {
|
|
313
|
+
const lang = langPattern.value.toLowerCase();
|
|
314
|
+
filters[varName] = { $language: lang };
|
|
315
|
+
return filters;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
306
318
|
// Get the language pattern
|
|
307
319
|
if (langPattern.termType === 'Literal') {
|
|
308
320
|
const lang = langPattern.value.toLowerCase();
|
|
@@ -349,7 +361,7 @@ class FilterPushdownExtractor {
|
|
|
349
361
|
const rightTerm = (0, AlgebraUtils_1.extractTerm)(right);
|
|
350
362
|
if (leftVarForTerm && rightTerm && (op === '=' || op === '!=')) {
|
|
351
363
|
const filterOp = op === '=' ? '$eq' : '$ne';
|
|
352
|
-
return { varName: leftVarForTerm, op: filterOp, value:
|
|
364
|
+
return { varName: leftVarForTerm, op: filterOp, value: rightTerm };
|
|
353
365
|
}
|
|
354
366
|
return null;
|
|
355
367
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterPushdownExtractor.js","sourceRoot":"","sources":["../../../src/storage/sparql/FilterPushdownExtractor.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * FilterPushdownExtractor - Extract pushdownable conditions from SPARQL FILTER\n * \n * Analyzes SPARQL FILTER expressions and extracts conditions that can be\n * pushed down to the database layer for efficient query execution.\n * \n * Supported pushdown operations:\n * - Comparison: =, !=, <, >, <=, >=\n * - String functions: STRSTARTS, STRENDS, CONTAINS, REGEX\n * - Type checking: isIRI, isBlank, isLiteral, isNumeric\n * - Language: LANGMATCHES\n * - Logical: AND, OR (with $in optimization)\n * - Set operations: IN, NOT IN\n * - Existence: BOUND, !BOUND\n */\n\nimport type { Algebra } from 'sparqlalgebrajs';\nimport { DataFactory } from 'rdf-data-factory';\n\nimport type { TermOperators } from '../quint/types';\nimport { fpEncode, NUMERIC_TYPES, DATETIME_TYPE, SEP, serializeObject } from '../quint/serialization';\nimport { \n extractVariable, \n extractStrVariable, \n extractLiteralValue, \n extractLiteral, \n extractTerm,\n isVariableInPattern \n} from './AlgebraUtils';\n\nconst dataFactory = new DataFactory();\n\n/**\n * Pushdown filters extracted from SPARQL FILTER clauses\n * Maps variable names to their filter conditions\n */\nexport interface PushdownFilters {\n [varName: string]: TermOperators;\n}\n\n/**\n * Result of extracting pushdown filters from an expression\n */\nexport interface PushdownResult {\n filters: PushdownFilters;\n remainder: Algebra.Expression | null;\n orBranches?: PushdownFilters[];\n orNonPushdownBranches?: Algebra.Expression[];\n}\n\n/**\n * FilterPushdownExtractor extracts pushdownable conditions from FILTER expressions\n */\nexport class FilterPushdownExtractor {\n /**\n * Extract pushdownable filters from an expression\n * Returns filters that can be pushed down and the remaining expression\n */\n extractPushdownFilters(\n expr: Algebra.Expression,\n pattern: Algebra.Pattern\n ): PushdownResult {\n if (expr.expressionType !== 'operator') {\n // Can't pushdown non-operator expressions\n return { filters: {}, remainder: expr };\n }\n\n const opExpr = expr as Algebra.OperatorExpression;\n const op = opExpr.operator.toLowerCase();\n\n // Handle AND: recursively extract from both sides\n if (op === '&&') {\n const filters: PushdownFilters = {};\n const remainders: Algebra.Expression[] = [];\n\n for (const arg of opExpr.args) {\n const result = this.extractPushdownFilters(arg, pattern);\n // Merge filters\n for (const [varName, ops] of Object.entries(result.filters)) {\n filters[varName] = { ...filters[varName], ...ops };\n }\n if (result.remainder) {\n remainders.push(result.remainder);\n }\n }\n\n // Combine remainders with AND\n let remainder: Algebra.Expression | null = null;\n if (remainders.length === 1) {\n remainder = remainders[0];\n } else if (remainders.length > 1) {\n remainder = {\n type: 'expression',\n expressionType: 'operator',\n operator: '&&',\n args: remainders,\n } as Algebra.OperatorExpression;\n }\n\n return { filters, remainder };\n }\n\n // Handle OR: try to convert to $in or OR branches\n if (op === '||') {\n return this.extractOrPushdown(opExpr, pattern);\n }\n\n // Try to extract single pushdown condition\n const result = this.tryExtractSinglePushdown(opExpr, pattern);\n if (result) {\n return { filters: result, remainder: null };\n }\n\n // Can't pushdown\n return { filters: {}, remainder: expr };\n }\n\n /**\n * Handle OR expression pushdown\n * - Same variable equality: convert to $in\n * - Different variables: create OR branches for separate queries\n * - Mixed (pushdownable + non-pushdownable): orBranches + orNonPushdownBranches\n */\n private extractOrPushdown(\n expr: Algebra.OperatorExpression,\n pattern: Algebra.Pattern\n ): PushdownResult {\n // Flatten OR tree and collect all branches\n const branches: Algebra.Expression[] = [];\n const collectBranches = (e: Algebra.Expression): void => {\n if (e.expressionType === 'operator') {\n const op = e as Algebra.OperatorExpression;\n if (op.operator.toLowerCase() === '||') {\n op.args.forEach(collectBranches);\n return;\n }\n }\n branches.push(e);\n };\n collectBranches(expr);\n\n // Try to extract pushdown from each branch\n const pushdownable: { filters: PushdownFilters; expr: Algebra.Expression }[] = [];\n const nonPushdownable: Algebra.Expression[] = [];\n\n for (const branch of branches) {\n if (branch.expressionType === 'operator') {\n const branchFilters = this.tryExtractSinglePushdown(branch as Algebra.OperatorExpression, pattern);\n if (branchFilters && Object.keys(branchFilters).length > 0) {\n pushdownable.push({ filters: branchFilters, expr: branch });\n continue;\n }\n }\n nonPushdownable.push(branch);\n }\n\n // If nothing pushdownable, return as remainder\n if (pushdownable.length === 0) {\n return { filters: {}, remainder: expr };\n }\n\n // Check if all are same-variable equality (can use $in)\n const inResult = this.tryConvertToIn(pushdownable);\n if (inResult && nonPushdownable.length === 0) {\n return { filters: inResult, remainder: null };\n }\n\n // Different variables or mixed: use OR branches\n const orBranches = pushdownable.map(p => p.filters);\n \n // Non-pushdownable branches need OR semantics (not AND), so use orNonPushdownBranches\n return { \n filters: {}, \n remainder: null, \n orBranches,\n orNonPushdownBranches: nonPushdownable.length > 0 ? nonPushdownable : undefined\n };\n }\n\n /**\n * Try to convert same-variable equalities to $in\n */\n private tryConvertToIn(\n branches: { filters: PushdownFilters; expr: Algebra.Expression }[]\n ): PushdownFilters | null {\n // Check if all branches are single-variable equality\n const varValues = new Map<string, string[]>();\n \n for (const { filters } of branches) {\n const keys = Object.keys(filters);\n if (keys.length !== 1) return null;\n \n const varName = keys[0];\n const ops = filters[varName];\n const opKeys = Object.keys(ops);\n \n if (opKeys.length !== 1 || !('$eq' in ops)) return null;\n \n if (!varValues.has(varName)) {\n varValues.set(varName, []);\n }\n varValues.get(varName)!.push(ops.$eq as string);\n }\n\n // Must be single variable\n if (varValues.size !== 1) return null;\n\n const [varName, values] = [...varValues.entries()][0];\n return { [varName]: { $in: values } };\n }\n\n /**\n * Try to extract pushdown filter from a single operator expression\n */\n tryExtractSinglePushdown(\n expr: Algebra.OperatorExpression,\n pattern: Algebra.Pattern\n ): PushdownFilters | null {\n const op = expr.operator.toLowerCase();\n const filters: PushdownFilters = {};\n\n // Comparison: =, !=, <, >, <=, >=\n if (['=', '!=', '<', '>', '<=', '>='].includes(op) && expr.args.length === 2) {\n const result = this.extractComparison(expr, op);\n if (result) {\n // Only pushdown if the variable is in the pattern\n if (isVariableInPattern(result.varName, pattern)) {\n filters[result.varName] = { [result.op]: result.value };\n return filters;\n }\n }\n }\n\n // STRSTARTS, STRENDS, CONTAINS\n // Database stores serialized literals like \"Alice\" (with quotes)\n // So we adjust the search pattern accordingly:\n // - STRSTARTS('A') -> $startsWith: '\"A' (add leading quote)\n // - STRENDS('e') -> $endsWith: 'e\"' (add trailing quote)\n // - CONTAINS('x') -> $contains: 'x' (quotes don't affect middle content)\n if (['strstarts', 'strends', 'contains'].includes(op) && expr.args.length === 2) {\n const varName = extractStrVariable(expr.args[0]);\n const value = extractLiteralValue(expr.args[1]);\n if (varName && value && isVariableInPattern(varName, pattern)) {\n if (op === 'strstarts') {\n filters[varName] = { $startsWith: '\"' + value };\n } else if (op === 'strends') {\n filters[varName] = { $endsWith: value + '\"' };\n } else {\n filters[varName] = { $contains: value };\n }\n return filters;\n }\n }\n\n // REGEX\n if (op === 'regex' && expr.args.length >= 2) {\n const varName = extractStrVariable(expr.args[0]);\n const regexPattern = extractLiteralValue(expr.args[1]);\n if (varName && regexPattern && isVariableInPattern(varName, pattern)) {\n filters[varName] = { $regex: regexPattern };\n return filters;\n }\n }\n\n // IN\n if (op === 'in' && expr.args.length >= 1) {\n const varName = extractVariable(expr.args[0]);\n if (varName && isVariableInPattern(varName, pattern)) {\n const values: string[] = [];\n for (let i = 1; i < expr.args.length; i++) {\n const lit = extractLiteral(expr.args[i]);\n if (lit) {\n values.push(this.serializeExactValue(lit.value, lit.datatype));\n }\n }\n if (values.length > 0) {\n filters[varName] = { $in: values };\n return filters;\n }\n }\n }\n\n // NOT IN\n if (op === 'notin' && expr.args.length >= 1) {\n const varName = extractVariable(expr.args[0]);\n if (varName && isVariableInPattern(varName, pattern)) {\n const values: string[] = [];\n for (let i = 1; i < expr.args.length; i++) {\n const lit = extractLiteral(expr.args[i]);\n if (lit) {\n values.push(this.serializeExactValue(lit.value, lit.datatype));\n }\n }\n if (values.length > 0) {\n filters[varName] = { $notIn: values };\n return filters;\n }\n }\n }\n\n // BOUND\n if (op === 'bound' && expr.args.length === 1) {\n const varName = extractVariable(expr.args[0]);\n if (varName && isVariableInPattern(varName, pattern)) {\n filters[varName] = { $isNull: false };\n return filters;\n }\n }\n\n // !BOUND\n if (op === '!' && expr.args.length === 1) {\n const inner = expr.args[0];\n if (inner.expressionType === 'operator') {\n const innerOp = inner as Algebra.OperatorExpression;\n if (innerOp.operator.toLowerCase() === 'bound' && innerOp.args.length === 1) {\n const varName = extractVariable(innerOp.args[0]);\n if (varName && isVariableInPattern(varName, pattern)) {\n filters[varName] = { $isNull: true };\n return filters;\n }\n }\n }\n }\n\n // Type checking functions\n // isiri/isuri: In Solid, IRIs are http:// or https://\n if ((op === 'isiri' || op === 'isuri') && expr.args.length === 1) {\n const varName = extractVariable(expr.args[0]);\n if (varName && isVariableInPattern(varName, pattern)) {\n filters[varName] = { $startsWith: 'http' };\n return filters;\n }\n }\n\n // isblank: Blank nodes start with _:\n if (op === 'isblank' && expr.args.length === 1) {\n const varName = extractVariable(expr.args[0]);\n if (varName && isVariableInPattern(varName, pattern)) {\n filters[varName] = { $startsWith: '_:' };\n return filters;\n }\n }\n\n // isliteral: Literals start with \" (or N\\0 for numeric, D\\0 for datetime)\n if (op === 'isliteral' && expr.args.length === 1) {\n const varName = extractVariable(expr.args[0]);\n if (varName && isVariableInPattern(varName, pattern)) {\n // Match strings starting with \", N (numeric), or D (datetime)\n filters[varName] = { $regex: '^[\"ND]' };\n return filters;\n }\n }\n\n // isnumeric: Our numeric literals start with N\\0\n if (op === 'isnumeric' && expr.args.length === 1) {\n const varName = extractVariable(expr.args[0]);\n if (varName && isVariableInPattern(varName, pattern)) {\n filters[varName] = { $startsWith: 'N\\0' };\n return filters;\n }\n }\n\n // LANGMATCHES(LANG(?x), \"en\") - language tagged literals end with @lang\"\n // Serialization format: \"value\"@en\n if (op === 'langmatches' && expr.args.length === 2) {\n const langExpr = expr.args[0] as Algebra.Expression;\n const langPattern = expr.args[1];\n \n // First arg should be LANG(?var)\n if (langExpr.expressionType === 'operator' && \n (langExpr as Algebra.OperatorExpression).operator === 'lang' &&\n (langExpr as Algebra.OperatorExpression).args.length === 1) {\n const varName = extractVariable((langExpr as Algebra.OperatorExpression).args[0]);\n \n if (varName && isVariableInPattern(varName, pattern)) {\n // Get the language pattern\n if (langPattern.termType === 'Literal') {\n const lang = langPattern.value.toLowerCase();\n if (lang === '*') {\n // Match any language tagged literal - ends with @something\"\n // Use regex to match @[a-z]+\" pattern at end\n filters[varName] = { $regex: '@[a-zA-Z]+\"$' };\n } else {\n // Match specific language - ends with @lang\"\n filters[varName] = { $endsWith: `@${lang}\"` };\n }\n return filters;\n }\n }\n }\n }\n\n return null;\n }\n\n /**\n * Extract comparison operator info\n */\n private extractComparison(\n expr: Algebra.OperatorExpression,\n op: string\n ): { varName: string; op: string; value: string } | null {\n const [left, right] = expr.args;\n\n // ?var op literal\n const leftVar = extractVariable(left);\n const rightLiteral = extractLiteral(right);\n if (leftVar && rightLiteral) {\n const filterOp = this.mapComparisonOp(op);\n const value = this.serializeForComparison(rightLiteral.value, rightLiteral.datatype, filterOp);\n return { varName: leftVar, op: filterOp, value };\n }\n\n // literal op ?var (reverse)\n const leftLiteral = extractLiteral(left);\n const rightVar = extractVariable(right);\n if (leftLiteral && rightVar) {\n const reversedOp = this.reverseComparisonOp(op);\n const filterOp = this.mapComparisonOp(reversedOp);\n const value = this.serializeForComparison(leftLiteral.value, leftLiteral.datatype, filterOp);\n return { varName: rightVar, op: filterOp, value };\n }\n\n // ?var = <namedNode>\n const leftVarForTerm = extractVariable(left);\n const rightTerm = extractTerm(right);\n if (leftVarForTerm && rightTerm && (op === '=' || op === '!=')) {\n const filterOp = op === '=' ? '$eq' : '$ne';\n return { varName: leftVarForTerm, op: filterOp, value: serializeObject(rightTerm) };\n }\n\n return null;\n }\n\n private mapComparisonOp(op: string): string {\n const map: Record<string, string> = {\n '=': '$eq', '!=': '$ne', '<': '$lt', '>': '$gt', '<=': '$lte', '>=': '$gte'\n };\n return map[op] || '$eq';\n }\n\n private reverseComparisonOp(op: string): string {\n const map: Record<string, string> = {\n '<': '>', '>': '<', '<=': '>=', '>=': '<=', '=': '=', '!=': '!='\n };\n return map[op] || op;\n }\n\n /**\n * Serialize value for comparison\n * \n * Range comparison handling:\n * - $gt, $lte: Use fpstring + max suffix to be >= all values with same fpstring\n * - $lt, $gte: Use fpstring only (prefix), stored values are always > prefix\n * - $eq, $ne: Use exact serialization\n */\n serializeForComparison(value: string, datatype: string | undefined, filterOp: string): string {\n // Exact match uses full serialization\n if (filterOp === '$eq' || filterOp === '$ne') {\n return this.serializeExactValue(value, datatype);\n }\n \n // Range comparison\n if (datatype && NUMERIC_TYPES.has(datatype)) {\n const fpValue = `N${SEP}${fpEncode(value)}`;\n // $gt and $lte need max suffix to compare correctly\n if (filterOp === '$gt' || filterOp === '$lte') {\n return fpValue + SEP + '\\uffff';\n }\n // $lt and $gte use prefix only\n return fpValue;\n }\n \n if (datatype === DATETIME_TYPE) {\n const fpValue = `D${SEP}${fpEncode(new Date(value).valueOf())}`;\n if (filterOp === '$gt' || filterOp === '$lte') {\n return fpValue + SEP + '\\uffff';\n }\n return fpValue;\n }\n \n // For non-numeric types, use exact value (string comparison)\n return this.serializeExactValue(value, datatype);\n }\n\n serializeExactValue(value: string, datatype?: string): string {\n const lit = datatype \n ? dataFactory.literal(value, dataFactory.namedNode(datatype))\n : dataFactory.literal(value);\n return serializeObject(lit);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"FilterPushdownExtractor.js","sourceRoot":"","sources":["../../../src/storage/sparql/FilterPushdownExtractor.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * FilterPushdownExtractor - Extract pushdownable conditions from SPARQL FILTER\n * \n * Analyzes SPARQL FILTER expressions and extracts conditions that can be\n * pushed down to the database layer for efficient query execution.\n * \n * Supported pushdown operations:\n * - Comparison: =, !=, <, >, <=, >=\n * - String functions: STRSTARTS, STRENDS, CONTAINS, REGEX\n * - Type checking: isIRI, isBlank, isLiteral, isNumeric\n * - Language: LANGMATCHES\n * - Logical: AND, OR (with $in optimization)\n * - Set operations: IN, NOT IN\n * - Existence: BOUND, !BOUND\n */\n\nimport type { Algebra } from 'sparqlalgebrajs';\nimport { DataFactory } from 'rdf-data-factory';\n\nimport type { OperatorValue, TermOperators } from '../quint/types';\nimport { fpEncode, NUMERIC_TYPES, DATETIME_TYPE, SEP, serializeObject } from '../quint/serialization';\nimport { \n extractVariable, \n extractStrVariable, \n extractLiteralValue, \n extractLiteral, \n extractTerm,\n isVariableInPattern,\n getVariablePosition,\n} from './AlgebraUtils';\n\nconst dataFactory = new DataFactory();\n\n/**\n * Pushdown filters extracted from SPARQL FILTER clauses\n * Maps variable names to their filter conditions\n */\nexport interface PushdownFilters {\n [varName: string]: TermOperators;\n}\n\n/**\n * Result of extracting pushdown filters from an expression\n */\nexport interface PushdownResult {\n filters: PushdownFilters;\n remainder: Algebra.Expression | null;\n orBranches?: PushdownFilters[];\n orNonPushdownBranches?: Algebra.Expression[];\n}\n\n/**\n * FilterPushdownExtractor extracts pushdownable conditions from FILTER expressions\n */\nexport class FilterPushdownExtractor {\n /**\n * Extract pushdownable filters from an expression\n * Returns filters that can be pushed down and the remaining expression\n */\n extractPushdownFilters(\n expr: Algebra.Expression,\n pattern: Algebra.Pattern\n ): PushdownResult {\n if (expr.expressionType !== 'operator') {\n // Can't pushdown non-operator expressions\n return { filters: {}, remainder: expr };\n }\n\n const opExpr = expr as Algebra.OperatorExpression;\n const op = opExpr.operator.toLowerCase();\n\n // Handle AND: recursively extract from both sides\n if (op === '&&') {\n const filters: PushdownFilters = {};\n const remainders: Algebra.Expression[] = [];\n\n for (const arg of opExpr.args) {\n const result = this.extractPushdownFilters(arg, pattern);\n // Merge filters\n for (const [varName, ops] of Object.entries(result.filters)) {\n filters[varName] = { ...filters[varName], ...ops };\n }\n if (result.remainder) {\n remainders.push(result.remainder);\n }\n }\n\n // Combine remainders with AND\n let remainder: Algebra.Expression | null = null;\n if (remainders.length === 1) {\n remainder = remainders[0];\n } else if (remainders.length > 1) {\n remainder = {\n type: 'expression',\n expressionType: 'operator',\n operator: '&&',\n args: remainders,\n } as Algebra.OperatorExpression;\n }\n\n return { filters, remainder };\n }\n\n // Handle OR: try to convert to $in or OR branches\n if (op === '||') {\n return this.extractOrPushdown(opExpr, pattern);\n }\n\n // Try to extract single pushdown condition\n const result = this.tryExtractSinglePushdown(opExpr, pattern);\n if (result) {\n return { filters: result, remainder: null };\n }\n\n // Can't pushdown\n return { filters: {}, remainder: expr };\n }\n\n /**\n * Handle OR expression pushdown\n * - Same variable equality: convert to $in\n * - Different variables: create OR branches for separate queries\n * - Mixed (pushdownable + non-pushdownable): orBranches + orNonPushdownBranches\n */\n private extractOrPushdown(\n expr: Algebra.OperatorExpression,\n pattern: Algebra.Pattern\n ): PushdownResult {\n // Flatten OR tree and collect all branches\n const branches: Algebra.Expression[] = [];\n const collectBranches = (e: Algebra.Expression): void => {\n if (e.expressionType === 'operator') {\n const op = e as Algebra.OperatorExpression;\n if (op.operator.toLowerCase() === '||') {\n op.args.forEach(collectBranches);\n return;\n }\n }\n branches.push(e);\n };\n collectBranches(expr);\n\n // Try to extract pushdown from each branch\n const pushdownable: { filters: PushdownFilters; expr: Algebra.Expression }[] = [];\n const nonPushdownable: Algebra.Expression[] = [];\n\n for (const branch of branches) {\n if (branch.expressionType === 'operator') {\n const branchFilters = this.tryExtractSinglePushdown(branch as Algebra.OperatorExpression, pattern);\n if (branchFilters && Object.keys(branchFilters).length > 0) {\n pushdownable.push({ filters: branchFilters, expr: branch });\n continue;\n }\n }\n nonPushdownable.push(branch);\n }\n\n // If nothing pushdownable, return as remainder\n if (pushdownable.length === 0) {\n return { filters: {}, remainder: expr };\n }\n\n // Check if all are same-variable equality (can use $in)\n const inResult = this.tryConvertToIn(pushdownable);\n if (inResult && nonPushdownable.length === 0) {\n return { filters: inResult, remainder: null };\n }\n\n // Different variables or mixed: use OR branches\n const orBranches = pushdownable.map(p => p.filters);\n \n // Non-pushdownable branches need OR semantics (not AND), so use orNonPushdownBranches\n return { \n filters: {}, \n remainder: null, \n orBranches,\n orNonPushdownBranches: nonPushdownable.length > 0 ? nonPushdownable : undefined\n };\n }\n\n /**\n * Try to convert same-variable equalities to $in\n */\n private tryConvertToIn(\n branches: { filters: PushdownFilters; expr: Algebra.Expression }[]\n ): PushdownFilters | null {\n // Check if all branches are single-variable equality\n const varValues = new Map<string, string[]>();\n \n for (const { filters } of branches) {\n const keys = Object.keys(filters);\n if (keys.length !== 1) return null;\n \n const varName = keys[0];\n const ops = filters[varName];\n const opKeys = Object.keys(ops);\n \n if (opKeys.length !== 1 || !('$eq' in ops)) return null;\n \n if (!varValues.has(varName)) {\n varValues.set(varName, []);\n }\n varValues.get(varName)!.push(ops.$eq as string);\n }\n\n // Must be single variable\n if (varValues.size !== 1) return null;\n\n const [varName, values] = [...varValues.entries()][0];\n return { [varName]: { $in: values } };\n }\n\n /**\n * Try to extract pushdown filter from a single operator expression\n */\n tryExtractSinglePushdown(\n expr: Algebra.OperatorExpression,\n pattern: Algebra.Pattern\n ): PushdownFilters | null {\n const op = expr.operator.toLowerCase();\n const filters: PushdownFilters = {};\n\n // Comparison: =, !=, <, >, <=, >=\n if (['=', '!=', '<', '>', '<=', '>='].includes(op) && expr.args.length === 2) {\n const result = this.extractComparison(expr, op);\n if (result) {\n // Only pushdown if the variable is in the pattern\n if (isVariableInPattern(result.varName, pattern)) {\n filters[result.varName] = { [result.op]: result.value };\n return filters;\n }\n }\n }\n\n // STRSTARTS, STRENDS, CONTAINS\n // Subject/predicate/graph columns store raw IRI strings. Object string\n // operators are explicit lexical STR(?object) pushdowns so the store can\n // route text literals to object_text and IRIs/blank nodes to object_key.\n if (['strstarts', 'strends', 'contains'].includes(op) && expr.args.length === 2) {\n const varName = extractStrVariable(expr.args[0]);\n const value = extractLiteralValue(expr.args[1]);\n if (varName && value && isVariableInPattern(varName, pattern)) {\n const position = getVariablePosition(varName, pattern);\n const startsWithOp = position === 'object' ? '$strStartsWith' : '$startsWith';\n const endsWithOp = position === 'object' ? '$strEndsWith' : '$endsWith';\n const containsOp = position === 'object' ? '$strContains' : '$contains';\n if (op === 'strstarts') {\n filters[varName] = { [startsWithOp]: value };\n } else if (op === 'strends') {\n filters[varName] = { [endsWithOp]: value };\n } else {\n filters[varName] = { [containsOp]: value };\n }\n return filters;\n }\n }\n\n // REGEX\n if (op === 'regex' && expr.args.length >= 2) {\n const varName = extractStrVariable(expr.args[0]);\n const regexPattern = extractLiteralValue(expr.args[1]);\n if (varName && regexPattern && isVariableInPattern(varName, pattern)) {\n const position = getVariablePosition(varName, pattern);\n filters[varName] = position === 'object'\n ? { $strRegex: regexPattern }\n : { $regex: regexPattern };\n return filters;\n }\n }\n\n // IN\n if (op === 'in' && expr.args.length >= 1) {\n const varName = extractVariable(expr.args[0]);\n if (varName && isVariableInPattern(varName, pattern)) {\n const values: string[] = [];\n for (let i = 1; i < expr.args.length; i++) {\n const lit = extractLiteral(expr.args[i]);\n if (lit) {\n values.push(this.serializeExactValue(lit.value, lit.datatype));\n }\n }\n if (values.length > 0) {\n filters[varName] = { $in: values };\n return filters;\n }\n }\n }\n\n // NOT IN\n if (op === 'notin' && expr.args.length >= 1) {\n const varName = extractVariable(expr.args[0]);\n if (varName && isVariableInPattern(varName, pattern)) {\n const values: string[] = [];\n for (let i = 1; i < expr.args.length; i++) {\n const lit = extractLiteral(expr.args[i]);\n if (lit) {\n values.push(this.serializeExactValue(lit.value, lit.datatype));\n }\n }\n if (values.length > 0) {\n filters[varName] = { $notIn: values };\n return filters;\n }\n }\n }\n\n // BOUND\n if (op === 'bound' && expr.args.length === 1) {\n const varName = extractVariable(expr.args[0]);\n if (varName && isVariableInPattern(varName, pattern)) {\n filters[varName] = { $isNull: false };\n return filters;\n }\n }\n\n // !BOUND\n if (op === '!' && expr.args.length === 1) {\n const inner = expr.args[0];\n if (inner.expressionType === 'operator') {\n const innerOp = inner as Algebra.OperatorExpression;\n if (innerOp.operator.toLowerCase() === 'bound' && innerOp.args.length === 1) {\n const varName = extractVariable(innerOp.args[0]);\n if (varName && isVariableInPattern(varName, pattern)) {\n filters[varName] = { $isNull: true };\n return filters;\n }\n }\n }\n }\n\n // Type checking functions\n // isiri/isuri: In Solid, IRIs are http:// or https://\n if ((op === 'isiri' || op === 'isuri') && expr.args.length === 1) {\n const varName = extractVariable(expr.args[0]);\n if (varName && isVariableInPattern(varName, pattern)) {\n filters[varName] = { $startsWith: 'http' };\n return filters;\n }\n }\n\n // isblank: Blank nodes start with _:\n if (op === 'isblank' && expr.args.length === 1) {\n const varName = extractVariable(expr.args[0]);\n if (varName && isVariableInPattern(varName, pattern)) {\n filters[varName] = { $startsWith: '_:' };\n return filters;\n }\n }\n\n // isliteral: Literals start with \" (or N\\0 for numeric, D\\0 for datetime)\n if (op === 'isliteral' && expr.args.length === 1) {\n const varName = extractVariable(expr.args[0]);\n if (varName && isVariableInPattern(varName, pattern)) {\n // Match strings starting with \", N (numeric), or D (datetime)\n filters[varName] = { $regex: '^[\"ND]' };\n return filters;\n }\n }\n\n // isnumeric: Our numeric literals start with N\\0\n if (op === 'isnumeric' && expr.args.length === 1) {\n const varName = extractVariable(expr.args[0]);\n if (varName && isVariableInPattern(varName, pattern)) {\n filters[varName] = { $startsWith: 'N\\0' };\n return filters;\n }\n }\n\n // LANGMATCHES(LANG(?x), \"en\") - language tagged literals end with @lang\"\n if (op === 'langmatches' && expr.args.length === 2) {\n const langExpr = expr.args[0] as Algebra.Expression;\n const langPattern = expr.args[1];\n \n // First arg should be LANG(?var)\n if (langExpr.expressionType === 'operator' && \n (langExpr as Algebra.OperatorExpression).operator === 'lang' &&\n (langExpr as Algebra.OperatorExpression).args.length === 1) {\n const varName = extractVariable((langExpr as Algebra.OperatorExpression).args[0]);\n \n if (varName && isVariableInPattern(varName, pattern)) {\n const position = getVariablePosition(varName, pattern);\n if (position === 'object') {\n if (langPattern.termType === 'Literal') {\n const lang = langPattern.value.toLowerCase();\n filters[varName] = { $language: lang };\n return filters;\n }\n }\n\n // Get the language pattern\n if (langPattern.termType === 'Literal') {\n const lang = langPattern.value.toLowerCase();\n if (lang === '*') {\n // Match any language tagged literal - ends with @something\"\n // Use regex to match @[a-z]+\" pattern at end\n filters[varName] = { $regex: '@[a-zA-Z]+\"$' };\n } else {\n // Match specific language - ends with @lang\"\n filters[varName] = { $endsWith: `@${lang}\"` };\n }\n return filters;\n }\n }\n }\n }\n\n return null;\n }\n\n /**\n * Extract comparison operator info\n */\n private extractComparison(\n expr: Algebra.OperatorExpression,\n op: string\n ): { varName: string; op: string; value: OperatorValue } | null {\n const [left, right] = expr.args;\n\n // ?var op literal\n const leftVar = extractVariable(left);\n const rightLiteral = extractLiteral(right);\n if (leftVar && rightLiteral) {\n const filterOp = this.mapComparisonOp(op);\n const value = this.serializeForComparison(rightLiteral.value, rightLiteral.datatype, filterOp);\n return { varName: leftVar, op: filterOp, value };\n }\n\n // literal op ?var (reverse)\n const leftLiteral = extractLiteral(left);\n const rightVar = extractVariable(right);\n if (leftLiteral && rightVar) {\n const reversedOp = this.reverseComparisonOp(op);\n const filterOp = this.mapComparisonOp(reversedOp);\n const value = this.serializeForComparison(leftLiteral.value, leftLiteral.datatype, filterOp);\n return { varName: rightVar, op: filterOp, value };\n }\n\n // ?var = <namedNode>\n const leftVarForTerm = extractVariable(left);\n const rightTerm = extractTerm(right);\n if (leftVarForTerm && rightTerm && (op === '=' || op === '!=')) {\n const filterOp = op === '=' ? '$eq' : '$ne';\n return { varName: leftVarForTerm, op: filterOp, value: rightTerm };\n }\n\n return null;\n }\n\n private mapComparisonOp(op: string): string {\n const map: Record<string, string> = {\n '=': '$eq', '!=': '$ne', '<': '$lt', '>': '$gt', '<=': '$lte', '>=': '$gte'\n };\n return map[op] || '$eq';\n }\n\n private reverseComparisonOp(op: string): string {\n const map: Record<string, string> = {\n '<': '>', '>': '<', '<=': '>=', '>=': '<=', '=': '=', '!=': '!='\n };\n return map[op] || op;\n }\n\n /**\n * Serialize value for comparison\n * \n * Range comparison handling:\n * - $gt, $lte: Use fpstring + max suffix to be >= all values with same fpstring\n * - $lt, $gte: Use fpstring only (prefix), stored values are always > prefix\n * - $eq, $ne: Use exact serialization\n */\n serializeForComparison(value: string, datatype: string | undefined, filterOp: string): string {\n // Exact match uses full serialization\n if (filterOp === '$eq' || filterOp === '$ne') {\n return this.serializeExactValue(value, datatype);\n }\n \n // Range comparison\n if (datatype && NUMERIC_TYPES.has(datatype)) {\n const fpValue = `N${SEP}${fpEncode(value)}`;\n // $gt and $lte need max suffix to compare correctly\n if (filterOp === '$gt' || filterOp === '$lte') {\n return fpValue + SEP + '\\uffff';\n }\n // $lt and $gte use prefix only\n return fpValue;\n }\n \n if (datatype === DATETIME_TYPE) {\n const fpValue = `D${SEP}${fpEncode(new Date(value).valueOf())}`;\n if (filterOp === '$gt' || filterOp === '$lte') {\n return fpValue + SEP + '\\uffff';\n }\n return fpValue;\n }\n \n // For non-numeric types, use exact value (string comparison)\n return this.serializeExactValue(value, datatype);\n }\n\n serializeExactValue(value: string, datatype?: string): string {\n const lit = datatype \n ? dataFactory.literal(value, dataFactory.namedNode(datatype))\n : dataFactory.literal(value);\n return serializeObject(lit);\n }\n}\n"]}
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
13
|
exports.VectorIndexingListener = void 0;
|
|
14
14
|
const global_logger_factory_1 = require("global-logger-factory");
|
|
15
|
+
const models_1 = require("@undefineds.co/models");
|
|
15
16
|
/**
|
|
16
17
|
* VectorIndexingListener - 自动向量索引
|
|
17
18
|
*/
|
|
@@ -204,23 +205,23 @@ class VectorIndexingListener {
|
|
|
204
205
|
*/
|
|
205
206
|
async getAiCredential(podBaseUrl) {
|
|
206
207
|
try {
|
|
207
|
-
// 使用 undefineds.co/ns# 命名空间,与 drizzle-solid schema 一致
|
|
208
208
|
// Credential -> Provider 关联,从 Provider 获取 baseUrl 和 proxyUrl
|
|
209
209
|
const query = `
|
|
210
|
-
PREFIX
|
|
210
|
+
PREFIX cred: <${models_1.XPOD_CREDENTIAL.NAMESPACE}>
|
|
211
|
+
PREFIX ai: <${models_1.XPOD_AI.NAMESPACE}>
|
|
211
212
|
SELECT ?apiKey ?baseUrl ?providerUri ?proxyUrl WHERE {
|
|
212
|
-
?cred a
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
OPTIONAL { ?cred
|
|
213
|
+
?cred a cred:Credential ;
|
|
214
|
+
cred:service "ai" ;
|
|
215
|
+
cred:status "active" ;
|
|
216
|
+
cred:apiKey ?apiKey .
|
|
217
|
+
OPTIONAL { ?cred cred:provider ?providerUri }
|
|
217
218
|
OPTIONAL {
|
|
218
|
-
?cred
|
|
219
|
-
?providerUri
|
|
219
|
+
?cred cred:provider ?providerUri .
|
|
220
|
+
?providerUri ai:baseUrl ?baseUrl .
|
|
220
221
|
}
|
|
221
222
|
OPTIONAL {
|
|
222
|
-
?cred
|
|
223
|
-
?providerUri
|
|
223
|
+
?cred cred:provider ?providerUri .
|
|
224
|
+
?providerUri ai:proxyUrl ?proxyUrl .
|
|
224
225
|
}
|
|
225
226
|
} LIMIT 1
|
|
226
227
|
`;
|
|
@@ -231,13 +232,7 @@ class VectorIndexingListener {
|
|
|
231
232
|
const providerUri = binding.get('providerUri');
|
|
232
233
|
const proxyUrl = binding.get('proxyUrl');
|
|
233
234
|
if (apiKey) {
|
|
234
|
-
|
|
235
|
-
let providerName = 'google';
|
|
236
|
-
if (providerUri?.value) {
|
|
237
|
-
const match = providerUri.value.match(/#([^#]+)$/);
|
|
238
|
-
if (match)
|
|
239
|
-
providerName = match[1];
|
|
240
|
-
}
|
|
235
|
+
const providerName = (0, models_1.normalizeAIConfigProviderId)(providerUri?.value || 'google') || 'google';
|
|
241
236
|
return {
|
|
242
237
|
apiKey: apiKey.value,
|
|
243
238
|
baseUrl: baseUrl?.value,
|