@undefineds.co/xpod 0.3.14 → 0.3.16
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/config/local.json +5 -5
- package/config/xpod.json +24 -10
- package/dist/cli/commands/auth.d.ts +1 -0
- package/dist/cli/commands/auth.js +117 -37
- package/dist/cli/commands/auth.js.map +1 -1
- package/dist/cli/commands/login.js +16 -23
- package/dist/cli/commands/login.js.map +1 -1
- package/dist/cli/commands/logs.d.ts +2 -0
- package/dist/cli/commands/logs.js +20 -5
- package/dist/cli/commands/logs.js.map +1 -1
- package/dist/cli/commands/obj.d.ts +44 -0
- package/dist/cli/commands/obj.js +1059 -0
- package/dist/cli/commands/obj.js.map +1 -0
- package/dist/cli/commands/rdf.d.ts +14 -0
- package/dist/cli/commands/rdf.js +235 -0
- package/dist/cli/commands/rdf.js.map +1 -0
- package/dist/cli/commands/resource.d.ts +31 -0
- package/dist/cli/commands/resource.js +191 -0
- package/dist/cli/commands/resource.js.map +1 -0
- package/dist/cli/commands/secret.d.ts +36 -0
- package/dist/cli/commands/secret.js +285 -0
- package/dist/cli/commands/secret.js.map +1 -0
- package/dist/cli/commands/server.d.ts +11 -0
- package/dist/cli/commands/server.js +168 -0
- package/dist/cli/commands/server.js.map +1 -0
- package/dist/cli/commands/start.d.ts +1 -0
- package/dist/cli/commands/start.js +5 -0
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/commands/status.d.ts +1 -0
- package/dist/cli/commands/status.js +21 -6
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/stop.d.ts +3 -0
- package/dist/cli/commands/stop.js +40 -6
- package/dist/cli/commands/stop.js.map +1 -1
- package/dist/cli/index.js +23 -8
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/lib/auth-context.d.ts +24 -0
- package/dist/cli/lib/auth-context.js +70 -0
- package/dist/cli/lib/auth-context.js.map +1 -0
- package/dist/cli/lib/output.d.ts +23 -0
- package/dist/cli/lib/output.js +63 -0
- package/dist/cli/lib/output.js.map +1 -0
- package/dist/cli/lib/resource.d.ts +29 -0
- package/dist/cli/lib/resource.js +114 -0
- package/dist/cli/lib/resource.js.map +1 -0
- package/dist/components/context.jsonld +6 -0
- package/dist/identity/oidc/AutoDetectIdentityProviderHandler.d.ts +11 -10
- package/dist/identity/oidc/AutoDetectIdentityProviderHandler.js +13 -24
- package/dist/identity/oidc/AutoDetectIdentityProviderHandler.js.map +1 -1
- package/dist/identity/oidc/AutoDetectIdentityProviderHandler.jsonld +4 -4
- package/dist/identity/oidc/AutoDetectOidcHandler.d.ts +8 -4
- package/dist/identity/oidc/AutoDetectOidcHandler.js +10 -6
- package/dist/identity/oidc/AutoDetectOidcHandler.js.map +1 -1
- package/dist/identity/oidc/AutoDetectOidcHandler.jsonld +3 -3
- package/dist/storage/accessors/MixDataAccessor.js +3 -0
- package/dist/storage/accessors/MixDataAccessor.js.map +1 -1
- package/dist/storage/quint/SqliteQuintStore.d.ts +26 -1
- package/dist/storage/quint/SqliteQuintStore.js +551 -318
- package/dist/storage/quint/SqliteQuintStore.js.map +1 -1
- package/dist/storage/quint/SqliteQuintStore.jsonld +102 -2
- package/dist/storage/quint/schema.d.ts +76 -0
- package/dist/storage/quint/schema.js +13 -7
- package/dist/storage/quint/schema.js.map +1 -1
- package/dist/storage/rdf/RdfLocalQueryEngine.d.ts +4 -1
- package/dist/storage/rdf/RdfLocalQueryEngine.js +77 -8
- package/dist/storage/rdf/RdfLocalQueryEngine.js.map +1 -1
- package/dist/storage/rdf/SolidRdfEngine.d.ts +5 -0
- package/dist/storage/rdf/SolidRdfEngine.js +31 -3
- package/dist/storage/rdf/SolidRdfEngine.js.map +1 -1
- package/dist/storage/rdf/SolidRdfEngine.jsonld +34 -0
- package/dist/storage/sparql/ComunicaQuintEngine.js +16 -3
- package/dist/storage/sparql/ComunicaQuintEngine.js.map +1 -1
- package/package.json +1 -1
- package/dist/cli/commands/config.d.ts +0 -42
- package/dist/cli/commands/config.js +0 -289
- package/dist/cli/commands/config.js.map +0 -1
|
@@ -11,6 +11,7 @@ export interface SolidRdfEngineOptions {
|
|
|
11
11
|
textIndex?: RdfTextIndex | RdfTextIndexOptions;
|
|
12
12
|
vectorIndex?: RdfVectorIndex | RdfVectorIndexOptions;
|
|
13
13
|
rdf3xIndex?: Rdf3xTripleIndex | Rdf3xTripleIndexOptions;
|
|
14
|
+
rdf3xPrimary?: boolean;
|
|
14
15
|
compatibilityStore?: QuintStore;
|
|
15
16
|
autoOpen?: boolean;
|
|
16
17
|
}
|
|
@@ -23,9 +24,11 @@ export declare class SolidRdfEngine {
|
|
|
23
24
|
private readonly ownsTextIndex;
|
|
24
25
|
private readonly ownsVectorIndex;
|
|
25
26
|
private readonly ownsRdf3xIndex;
|
|
27
|
+
private readonly rdf3xPrimary;
|
|
26
28
|
private readonly compatibilityStore?;
|
|
27
29
|
private shadowComparator?;
|
|
28
30
|
private readonly queryEngine;
|
|
31
|
+
private rdf3xDirty;
|
|
29
32
|
constructor(options: SolidRdfEngineOptions);
|
|
30
33
|
open(): void;
|
|
31
34
|
close(): Promise<void>;
|
|
@@ -48,4 +51,6 @@ export declare class SolidRdfEngine {
|
|
|
48
51
|
private requireTextIndex;
|
|
49
52
|
private requireVectorIndex;
|
|
50
53
|
private requireRdf3xIndex;
|
|
54
|
+
private markRdf3xDirty;
|
|
55
|
+
private refreshRdf3xPrimary;
|
|
51
56
|
}
|
|
@@ -11,6 +11,7 @@ const RdfShadowComparator_1 = require("./RdfShadowComparator");
|
|
|
11
11
|
const RdfLocalQueryEngine_1 = require("./RdfLocalQueryEngine");
|
|
12
12
|
class SolidRdfEngine {
|
|
13
13
|
constructor(options) {
|
|
14
|
+
this.rdf3xDirty = true;
|
|
14
15
|
if (options.index instanceof RdfQuadIndex_1.RdfQuadIndex) {
|
|
15
16
|
this.index = options.index;
|
|
16
17
|
this.ownsIndex = false;
|
|
@@ -52,8 +53,12 @@ class SolidRdfEngine {
|
|
|
52
53
|
else {
|
|
53
54
|
this.ownsRdf3xIndex = false;
|
|
54
55
|
}
|
|
56
|
+
if (options.rdf3xPrimary && !this.rdf3xIndex) {
|
|
57
|
+
throw new Error('SolidRdfEngine rdf3xPrimary requires an rdf3xIndex');
|
|
58
|
+
}
|
|
59
|
+
this.rdf3xPrimary = Boolean(options.rdf3xPrimary);
|
|
55
60
|
this.compatibilityStore = options.compatibilityStore;
|
|
56
|
-
this.queryEngine = new RdfLocalQueryEngine_1.RdfLocalQueryEngine(this.index, this.textIndex, this.vectorIndex);
|
|
61
|
+
this.queryEngine = new RdfLocalQueryEngine_1.RdfLocalQueryEngine(this.index, this.textIndex, this.vectorIndex, this.rdf3xPrimary ? this.rdf3xIndex : undefined);
|
|
57
62
|
if (this.compatibilityStore) {
|
|
58
63
|
this.shadowComparator = new RdfShadowComparator_1.RdfShadowComparator(this.index, this.compatibilityStore);
|
|
59
64
|
}
|
|
@@ -86,20 +91,31 @@ class SolidRdfEngine {
|
|
|
86
91
|
}
|
|
87
92
|
put(quads, options) {
|
|
88
93
|
this.index.multiPut(Array.isArray(quads) ? quads : [quads], options);
|
|
94
|
+
this.markRdf3xDirty();
|
|
89
95
|
}
|
|
90
96
|
replaceSource(quads, source) {
|
|
91
97
|
this.index.replaceSource(quads, source);
|
|
98
|
+
this.markRdf3xDirty();
|
|
92
99
|
}
|
|
93
100
|
deleteSource(source) {
|
|
94
|
-
|
|
101
|
+
const changes = this.index.deleteSource(source);
|
|
102
|
+
if (changes > 0) {
|
|
103
|
+
this.markRdf3xDirty();
|
|
104
|
+
}
|
|
105
|
+
return changes;
|
|
95
106
|
}
|
|
96
107
|
delete(pattern) {
|
|
97
|
-
|
|
108
|
+
const changes = this.index.delete(pattern);
|
|
109
|
+
if (changes > 0) {
|
|
110
|
+
this.markRdf3xDirty();
|
|
111
|
+
}
|
|
112
|
+
return changes;
|
|
98
113
|
}
|
|
99
114
|
scan(query) {
|
|
100
115
|
return this.index.scan(query.pattern, query.options);
|
|
101
116
|
}
|
|
102
117
|
query(query) {
|
|
118
|
+
this.refreshRdf3xPrimary();
|
|
103
119
|
return this.queryEngine.query(query);
|
|
104
120
|
}
|
|
105
121
|
indexTextSource(source, text, chunks) {
|
|
@@ -194,6 +210,18 @@ class SolidRdfEngine {
|
|
|
194
210
|
}
|
|
195
211
|
return this.rdf3xIndex;
|
|
196
212
|
}
|
|
213
|
+
markRdf3xDirty() {
|
|
214
|
+
if (this.rdf3xIndex) {
|
|
215
|
+
this.rdf3xDirty = true;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
refreshRdf3xPrimary() {
|
|
219
|
+
if (!this.rdf3xPrimary || !this.rdf3xDirty) {
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
this.requireRdf3xIndex().rebuildFromCurrentQuads();
|
|
223
|
+
this.rdf3xDirty = false;
|
|
224
|
+
}
|
|
197
225
|
}
|
|
198
226
|
exports.SolidRdfEngine = SolidRdfEngine;
|
|
199
227
|
function isRdfTextIndexOptions(input) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SolidRdfEngine.js","sourceRoot":"","sources":["../../../src/storage/rdf/SolidRdfEngine.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Quad } from '@rdfjs/types';\nimport { termToId } from 'n3';\nimport type { QuintPattern, QuintStore } from '../quint/types';\nimport { isTerm } from '../quint/types';\nimport type {\n Rdf3xNumericObjectRangePattern,\n Rdf3xShadowJoinResult,\n Rdf3xShadowScanResult,\n Rdf3xTripleIndexOptions,\n Rdf3xTriplePattern,\n RdfIndexPutOptions,\n RdfPatternQuery,\n RdfQuadJoinOptions,\n RdfQuadJoinPattern,\n RdfQuadIndexOptions,\n RdfQuadIndexScanResult,\n RdfSourceInput,\n RdfShadowScanResult,\n RdfTextChunkInput,\n RdfTextIndexOptions,\n RdfTextSearchOptions,\n RdfTextSearchResult,\n RdfTextSourceInput,\n RdfVectorChunkInput,\n RdfVectorIndexOptions,\n RdfVectorSearchOptions,\n RdfVectorSearchResult,\n RdfVectorSourceInput,\n} from './types';\nimport { RdfQuadIndex } from './RdfQuadIndex';\nimport { Rdf3xTripleIndex } from './Rdf3xTripleIndex';\nimport { RdfTextIndex } from './RdfTextIndex';\nimport { RdfVectorIndex } from './RdfVectorIndex';\nimport { RdfShadowComparator, diffQuads } from './RdfShadowComparator';\nimport { RdfLocalQueryEngine } from './RdfLocalQueryEngine';\nimport type { RdfLocalQuery, RdfLocalQueryResult } from './types';\n\nexport interface SolidRdfEngineOptions {\n index: RdfQuadIndex | RdfQuadIndexOptions;\n textIndex?: RdfTextIndex | RdfTextIndexOptions;\n vectorIndex?: RdfVectorIndex | RdfVectorIndexOptions;\n rdf3xIndex?: Rdf3xTripleIndex | Rdf3xTripleIndexOptions;\n compatibilityStore?: QuintStore;\n autoOpen?: boolean;\n}\n\nexport class SolidRdfEngine {\n public readonly index: RdfQuadIndex;\n public readonly textIndex?: RdfTextIndex;\n public readonly vectorIndex?: RdfVectorIndex;\n public readonly rdf3xIndex?: Rdf3xTripleIndex;\n private readonly ownsIndex: boolean;\n private readonly ownsTextIndex: boolean;\n private readonly ownsVectorIndex: boolean;\n private readonly ownsRdf3xIndex: boolean;\n private readonly compatibilityStore?: QuintStore;\n private shadowComparator?: RdfShadowComparator;\n private readonly queryEngine: RdfLocalQueryEngine;\n\n public constructor(options: SolidRdfEngineOptions) {\n if (options.index instanceof RdfQuadIndex) {\n this.index = options.index;\n this.ownsIndex = false;\n } else {\n this.index = new RdfQuadIndex(options.index);\n this.ownsIndex = true;\n }\n if (options.textIndex instanceof RdfTextIndex) {\n this.textIndex = options.textIndex;\n this.ownsTextIndex = false;\n } else if (isRdfTextIndexOptions(options.textIndex)) {\n this.textIndex = new RdfTextIndex(options.textIndex);\n this.ownsTextIndex = true;\n } else {\n this.ownsTextIndex = false;\n }\n if (options.vectorIndex instanceof RdfVectorIndex) {\n this.vectorIndex = options.vectorIndex;\n this.ownsVectorIndex = false;\n } else if (isRdfVectorIndexOptions(options.vectorIndex)) {\n this.vectorIndex = new RdfVectorIndex(options.vectorIndex);\n this.ownsVectorIndex = true;\n } else {\n this.ownsVectorIndex = false;\n }\n if (options.rdf3xIndex instanceof Rdf3xTripleIndex) {\n this.rdf3xIndex = options.rdf3xIndex;\n this.ownsRdf3xIndex = false;\n } else if (isRdf3xTripleIndexOptions(options.rdf3xIndex)) {\n this.rdf3xIndex = new Rdf3xTripleIndex(options.rdf3xIndex);\n this.ownsRdf3xIndex = true;\n } else {\n this.ownsRdf3xIndex = false;\n }\n this.compatibilityStore = options.compatibilityStore;\n this.queryEngine = new RdfLocalQueryEngine(this.index, this.textIndex, this.vectorIndex);\n if (this.compatibilityStore) {\n this.shadowComparator = new RdfShadowComparator(this.index, this.compatibilityStore);\n }\n if (options.autoOpen) {\n this.open();\n }\n }\n\n public open(): void {\n this.index.open();\n this.textIndex?.open();\n this.vectorIndex?.open();\n this.rdf3xIndex?.open();\n }\n\n public async close(): Promise<void> {\n if (this.ownsRdf3xIndex) {\n this.rdf3xIndex?.close();\n }\n if (this.ownsVectorIndex) {\n this.vectorIndex?.close();\n }\n if (this.ownsTextIndex) {\n this.textIndex?.close();\n }\n if (this.ownsIndex) {\n this.index.close();\n }\n if (this.compatibilityStore) {\n await this.compatibilityStore.close();\n }\n }\n\n public put(quads: Quad | Quad[], options?: RdfIndexPutOptions): void {\n this.index.multiPut(Array.isArray(quads) ? quads : [quads], options);\n }\n\n public replaceSource(quads: Quad[], source: RdfSourceInput): void {\n this.index.replaceSource(quads, source);\n }\n\n public deleteSource(source: string): number {\n return this.index.deleteSource(source);\n }\n\n public delete(pattern: QuintPattern): number {\n return this.index.delete(pattern);\n }\n\n public scan(query: RdfPatternQuery): RdfQuadIndexScanResult {\n return this.index.scan(query.pattern, query.options);\n }\n\n public query(query: RdfLocalQuery): RdfLocalQueryResult {\n return this.queryEngine.query(query);\n }\n\n public indexTextSource(source: RdfTextSourceInput, text: string, chunks?: RdfTextChunkInput[]): void {\n this.requireTextIndex().indexText(source, text, chunks);\n }\n\n public deleteTextSource(source: string): number {\n return this.requireTextIndex().deleteSource(source);\n }\n\n public searchText(options: RdfTextSearchOptions | string): RdfTextSearchResult[] {\n return this.requireTextIndex().search(typeof options === 'string' ? { query: options } : options);\n }\n\n public indexVectorSource(source: RdfVectorSourceInput, chunks: RdfVectorChunkInput[]): void {\n this.requireVectorIndex().indexVector(source, chunks);\n }\n\n public deleteVectorSource(source: string): number {\n return this.requireVectorIndex().deleteSource(source);\n }\n\n public searchVector(options: RdfVectorSearchOptions): RdfVectorSearchResult[] {\n return this.requireVectorIndex().search(options);\n }\n\n public async shadowScan(query: RdfPatternQuery): Promise<RdfShadowScanResult> {\n if (!this.shadowComparator) {\n throw new Error('SolidRdfEngine shadowScan requires a compatibility QuintStore');\n }\n return this.shadowComparator.compareScan(query);\n }\n\n public shadowRdf3xScan(query: RdfPatternQuery): Rdf3xShadowScanResult {\n const rdf3xIndex = this.requireRdf3xIndex();\n const rdf3xPattern = toRdf3xTriplePattern(query.pattern);\n const rebuild = rdf3xIndex.rebuildFromCurrentQuads();\n const primary = this.index.scan(query.pattern, query.options);\n const rdf3x = rdf3xIndex.scan(rdf3xPattern, query.options);\n const diff = diffQuads(rdf3x.quads, primary.quads);\n const orderedMatch = canonicalQuadKeys(primary.quads).join('\\n') === canonicalQuadKeys(rdf3x.quads).join('\\n');\n return {\n matched: diff.missingFromPrimary.length === 0 && diff.extraInPrimary.length === 0,\n orderedMatch,\n primary: primary.quads,\n rdf3x: rdf3x.quads,\n diff: {\n missingFromRdf3x: diff.extraInPrimary,\n extraInRdf3x: diff.missingFromPrimary,\n },\n primaryMetrics: primary.metrics,\n rdf3xMetrics: rdf3x.metrics,\n rebuild,\n };\n }\n\n public shadowRdf3xJoin(\n patterns: RdfQuadJoinPattern[],\n options?: RdfQuadJoinOptions,\n ): Rdf3xShadowJoinResult {\n const rdf3xIndex = this.requireRdf3xIndex();\n const rebuild = rdf3xIndex.rebuildFromCurrentQuads();\n const primary = this.index.joinPatterns(patterns, options);\n const rdf3x = rdf3xIndex.joinPatterns(patterns, options);\n const primaryKeys = primary.bindings.map(canonicalBindingKey);\n const rdf3xKeys = rdf3x.bindings.map(canonicalBindingKey);\n const diff = diffBindingKeys(rdf3xKeys, primaryKeys);\n return {\n matched: diff.missingFromRdf3x.length === 0 && diff.extraInRdf3x.length === 0,\n orderedMatch: primaryKeys.join('\\n') === rdf3xKeys.join('\\n'),\n primary: primary.bindings,\n rdf3x: rdf3x.bindings,\n diff,\n primaryMetrics: primary.metrics,\n rdf3xMetrics: rdf3x.metrics,\n rebuild,\n };\n }\n\n public supportsPrimary(query: RdfPatternQuery): boolean {\n try {\n this.index.scan(query.pattern, { ...query.options, limit: 0 });\n return true;\n } catch {\n return false;\n }\n }\n\n private requireTextIndex(): RdfTextIndex {\n if (!this.textIndex) {\n throw new Error('SolidRdfEngine text index is not configured');\n }\n return this.textIndex;\n }\n\n private requireVectorIndex(): RdfVectorIndex {\n if (!this.vectorIndex) {\n throw new Error('SolidRdfEngine vector index is not configured');\n }\n return this.vectorIndex;\n }\n\n private requireRdf3xIndex(): Rdf3xTripleIndex {\n if (!this.rdf3xIndex) {\n throw new Error('SolidRdfEngine RDF-3X shadow index is not configured');\n }\n return this.rdf3xIndex;\n }\n}\n\nfunction isRdfTextIndexOptions(input: RdfTextIndex | RdfTextIndexOptions | undefined): input is RdfTextIndexOptions {\n return input !== undefined && !(input instanceof RdfTextIndex) && typeof input.path === 'string';\n}\n\nfunction isRdfVectorIndexOptions(input: RdfVectorIndex | RdfVectorIndexOptions | undefined): input is RdfVectorIndexOptions {\n return input !== undefined && !(input instanceof RdfVectorIndex) && typeof input.path === 'string';\n}\n\nfunction isRdf3xTripleIndexOptions(input: Rdf3xTripleIndex | Rdf3xTripleIndexOptions | undefined): input is Rdf3xTripleIndexOptions {\n return input !== undefined && !(input instanceof Rdf3xTripleIndex) && typeof input.path === 'string';\n}\n\nfunction canonicalQuadKeys(quads: Quad[]): string[] {\n return quads.map((quad) => [\n termToId(quad.graph as any),\n termToId(quad.subject as any),\n termToId(quad.predicate as any),\n termToId(quad.object as any),\n ].join('\\u001f'));\n}\n\nfunction canonicalBindingKey(binding: Record<string, unknown>): string {\n return Object.keys(binding)\n .sort()\n .map((key) => `${key}=${termToId(binding[key] as any)}`)\n .join('\\u001f');\n}\n\nfunction diffBindingKeys(\n rdf3xKeys: string[],\n primaryKeys: string[],\n): Rdf3xShadowJoinResult['diff'] {\n const rdf3xSet = new Set(rdf3xKeys);\n const primarySet = new Set(primaryKeys);\n return {\n missingFromRdf3x: Array.from(primarySet).filter((key) => !rdf3xSet.has(key)).sort(),\n extraInRdf3x: Array.from(rdf3xSet).filter((key) => !primarySet.has(key)).sort(),\n };\n}\n\nfunction toRdf3xTriplePattern(pattern: QuintPattern): Rdf3xTriplePattern {\n const result: Rdf3xTriplePattern = {};\n for (const key of ['graph', 'subject', 'predicate', 'object'] as const) {\n const value = pattern[key];\n if (!value) {\n continue;\n }\n if (!isTerm(value)) {\n if (key === 'graph' && isStartsWithOperator(value)) {\n result.graph = { $startsWith: value.$startsWith };\n continue;\n }\n if (key === 'object' && isNumericObjectRangeOperator(value)) {\n result.object = value;\n continue;\n }\n throw new Error(`SolidRdfEngine RDF-3X shadow scan only supports exact ${key} terms${key === 'graph' ? ' or graph $startsWith' : ''}`);\n }\n result[key] = value;\n }\n return result;\n}\n\nfunction isStartsWithOperator(value: unknown): value is { $startsWith: string } {\n return value !== null\n && typeof value === 'object'\n && '$startsWith' in value\n && typeof (value as { $startsWith?: unknown }).$startsWith === 'string';\n}\n\nfunction isNumericObjectRangeOperator(value: unknown): value is Rdf3xNumericObjectRangePattern {\n return value !== null\n && typeof value === 'object'\n && !('termType' in value)\n && ['$gt', '$gte', '$lt', '$lte'].some((operator) => operator in value);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"SolidRdfEngine.js","sourceRoot":"","sources":["../../../src/storage/rdf/SolidRdfEngine.ts"],"names":[],"mappings":";;;AACA,2BAA8B;AAE9B,0CAAwC;AA0BxC,iDAA8C;AAC9C,yDAAsD;AACtD,iDAA8C;AAC9C,qDAAkD;AAClD,+DAAuE;AACvE,+DAA4D;AAa5D,MAAa,cAAc;IAezB,YAAmB,OAA8B;QAFzC,eAAU,GAAG,IAAI,CAAC;QAGxB,IAAI,OAAO,CAAC,KAAK,YAAY,2BAAY,EAAE,CAAC;YAC1C,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;YAC3B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,KAAK,GAAG,IAAI,2BAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC7C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACxB,CAAC;QACD,IAAI,OAAO,CAAC,SAAS,YAAY,2BAAY,EAAE,CAAC;YAC9C,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;YACnC,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC7B,CAAC;aAAM,IAAI,qBAAqB,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YACpD,IAAI,CAAC,SAAS,GAAG,IAAI,2BAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YACrD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC7B,CAAC;QACD,IAAI,OAAO,CAAC,WAAW,YAAY,+BAAc,EAAE,CAAC;YAClD,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;YACvC,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC/B,CAAC;aAAM,IAAI,uBAAuB,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;YACxD,IAAI,CAAC,WAAW,GAAG,IAAI,+BAAc,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YAC3D,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC9B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC/B,CAAC;QACD,IAAI,OAAO,CAAC,UAAU,YAAY,mCAAgB,EAAE,CAAC;YACnD,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;YACrC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC9B,CAAC;aAAM,IAAI,yBAAyB,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YACzD,IAAI,CAAC,UAAU,GAAG,IAAI,mCAAgB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAC3D,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC9B,CAAC;QACD,IAAI,OAAO,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YAC7C,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACxE,CAAC;QACD,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAClD,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC;QACrD,IAAI,CAAC,WAAW,GAAG,IAAI,yCAAmB,CACxC,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAChD,CAAC;QACF,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC5B,IAAI,CAAC,gBAAgB,GAAG,IAAI,yCAAmB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACvF,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,CAAC;IACH,CAAC;IAEM,IAAI;QACT,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAClB,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC;QACzB,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC;IAC1B,CAAC;IAEM,KAAK,CAAC,KAAK;QAChB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC;QAC3B,CAAC;QACD,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC;QAC5B,CAAC;QACD,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC;QAC1B,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC;QACD,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC5B,MAAM,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC;QACxC,CAAC;IACH,CAAC;IAEM,GAAG,CAAC,KAAoB,EAAE,OAA4B;QAC3D,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;QACrE,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAEM,aAAa,CAAC,KAAa,EAAE,MAAsB;QACxD,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAEM,YAAY,CAAC,MAAc;QAChC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAChD,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;YAChB,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAEM,MAAM,CAAC,OAAqB;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;YAChB,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAEM,IAAI,CAAC,KAAsB;QAChC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACvD,CAAC;IAEM,KAAK,CAAC,KAAoB;QAC/B,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IAEM,eAAe,CAAC,MAA0B,EAAE,IAAY,EAAE,MAA4B;QAC3F,IAAI,CAAC,gBAAgB,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC1D,CAAC;IAEM,gBAAgB,CAAC,MAAc;QACpC,OAAO,IAAI,CAAC,gBAAgB,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IACtD,CAAC;IAEM,UAAU,CAAC,OAAsC;QACtD,OAAO,IAAI,CAAC,gBAAgB,EAAE,CAAC,MAAM,CAAC,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACpG,CAAC;IAEM,iBAAiB,CAAC,MAA4B,EAAE,MAA6B;QAClF,IAAI,CAAC,kBAAkB,EAAE,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxD,CAAC;IAEM,kBAAkB,CAAC,MAAc;QACtC,OAAO,IAAI,CAAC,kBAAkB,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IACxD,CAAC;IAEM,YAAY,CAAC,OAA+B;QACjD,OAAO,IAAI,CAAC,kBAAkB,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACnD,CAAC;IAEM,KAAK,CAAC,UAAU,CAAC,KAAsB;QAC5C,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;QACnF,CAAC;QACD,OAAO,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAClD,CAAC;IAEM,eAAe,CAAC,KAAsB;QAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC5C,MAAM,YAAY,GAAG,oBAAoB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACzD,MAAM,OAAO,GAAG,UAAU,CAAC,uBAAuB,EAAE,CAAC;QACrD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAC9D,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAC3D,MAAM,IAAI,GAAG,IAAA,+BAAS,EAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QACnD,MAAM,YAAY,GAAG,iBAAiB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,iBAAiB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/G,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,kBAAkB,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC;YACjF,YAAY;YACZ,OAAO,EAAE,OAAO,CAAC,KAAK;YACtB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,IAAI,EAAE;gBACJ,gBAAgB,EAAE,IAAI,CAAC,cAAc;gBACrC,YAAY,EAAE,IAAI,CAAC,kBAAkB;aACtC;YACD,cAAc,EAAE,OAAO,CAAC,OAAO;YAC/B,YAAY,EAAE,KAAK,CAAC,OAAO;YAC3B,OAAO;SACR,CAAC;IACJ,CAAC;IAEM,eAAe,CACpB,QAA8B,EAC9B,OAA4B;QAE5B,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC5C,MAAM,OAAO,GAAG,UAAU,CAAC,uBAAuB,EAAE,CAAC;QACrD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC3D,MAAM,KAAK,GAAG,UAAU,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACzD,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QAC9D,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QAC1D,MAAM,IAAI,GAAG,eAAe,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QACrD,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC;YAC7E,YAAY,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;YAC7D,OAAO,EAAE,OAAO,CAAC,QAAQ;YACzB,KAAK,EAAE,KAAK,CAAC,QAAQ;YACrB,IAAI;YACJ,cAAc,EAAE,OAAO,CAAC,OAAO;YAC/B,YAAY,EAAE,KAAK,CAAC,OAAO;YAC3B,OAAO;SACR,CAAC;IACJ,CAAC;IAEM,eAAe,CAAC,KAAsB;QAC3C,IAAI,CAAC;YACH,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YAC/D,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAEO,gBAAgB;QACtB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAEO,kBAAkB;QACxB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAEO,iBAAiB;QACvB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;QAC1E,CAAC;QACD,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAEO,cAAc;QACpB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC;IACH,CAAC;IAEO,mBAAmB;QACzB,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YAC3C,OAAO;QACT,CAAC;QACD,IAAI,CAAC,iBAAiB,EAAE,CAAC,uBAAuB,EAAE,CAAC;QACnD,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC;CACF;AAzPD,wCAyPC;AAED,SAAS,qBAAqB,CAAC,KAAqD;IAClF,OAAO,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,YAAY,2BAAY,CAAC,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC;AACnG,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAyD;IACxF,OAAO,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,YAAY,+BAAc,CAAC,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC;AACrG,CAAC;AAED,SAAS,yBAAyB,CAAC,KAA6D;IAC9F,OAAO,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,YAAY,mCAAgB,CAAC,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC;AACvG,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAa;IACtC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QACzB,IAAA,aAAQ,EAAC,IAAI,CAAC,KAAY,CAAC;QAC3B,IAAA,aAAQ,EAAC,IAAI,CAAC,OAAc,CAAC;QAC7B,IAAA,aAAQ,EAAC,IAAI,CAAC,SAAgB,CAAC;QAC/B,IAAA,aAAQ,EAAC,IAAI,CAAC,MAAa,CAAC;KAC7B,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;AACpB,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAgC;IAC3D,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;SACxB,IAAI,EAAE;SACN,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,IAAA,aAAQ,EAAC,OAAO,CAAC,GAAG,CAAQ,CAAC,EAAE,CAAC;SACvD,IAAI,CAAC,QAAQ,CAAC,CAAC;AACpB,CAAC;AAED,SAAS,eAAe,CACtB,SAAmB,EACnB,WAAqB;IAErB,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;IACpC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;IACxC,OAAO;QACL,gBAAgB,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE;QACnF,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE;KAChF,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,OAAqB;IACjD,MAAM,MAAM,GAAuB,EAAE,CAAC;IACtC,KAAK,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,CAAU,EAAE,CAAC;QACvE,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,SAAS;QACX,CAAC;QACD,IAAI,CAAC,IAAA,cAAM,EAAC,KAAK,CAAC,EAAE,CAAC;YACnB,IAAI,GAAG,KAAK,OAAO,IAAI,oBAAoB,CAAC,KAAK,CAAC,EAAE,CAAC;gBACnD,MAAM,CAAC,KAAK,GAAG,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC;gBAClD,SAAS;YACX,CAAC;YACD,IAAI,GAAG,KAAK,QAAQ,IAAI,4BAA4B,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5D,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC;gBACtB,SAAS;YACX,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,yDAAyD,GAAG,SAAS,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACzI,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACtB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc;IAC1C,OAAO,KAAK,KAAK,IAAI;WAChB,OAAO,KAAK,KAAK,QAAQ;WACzB,aAAa,IAAI,KAAK;WACtB,OAAQ,KAAmC,CAAC,WAAW,KAAK,QAAQ,CAAC;AAC5E,CAAC;AAED,SAAS,4BAA4B,CAAC,KAAc;IAClD,OAAO,KAAK,KAAK,IAAI;WAChB,OAAO,KAAK,KAAK,QAAQ;WACzB,CAAC,CAAC,UAAU,IAAI,KAAK,CAAC;WACtB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,CAAC;AAC5E,CAAC","sourcesContent":["import type { Quad } from '@rdfjs/types';\nimport { termToId } from 'n3';\nimport type { QuintPattern, QuintStore } from '../quint/types';\nimport { isTerm } from '../quint/types';\nimport type {\n Rdf3xNumericObjectRangePattern,\n Rdf3xShadowJoinResult,\n Rdf3xShadowScanResult,\n Rdf3xTripleIndexOptions,\n Rdf3xTriplePattern,\n RdfIndexPutOptions,\n RdfPatternQuery,\n RdfQuadJoinOptions,\n RdfQuadJoinPattern,\n RdfQuadIndexOptions,\n RdfQuadIndexScanResult,\n RdfSourceInput,\n RdfShadowScanResult,\n RdfTextChunkInput,\n RdfTextIndexOptions,\n RdfTextSearchOptions,\n RdfTextSearchResult,\n RdfTextSourceInput,\n RdfVectorChunkInput,\n RdfVectorIndexOptions,\n RdfVectorSearchOptions,\n RdfVectorSearchResult,\n RdfVectorSourceInput,\n} from './types';\nimport { RdfQuadIndex } from './RdfQuadIndex';\nimport { Rdf3xTripleIndex } from './Rdf3xTripleIndex';\nimport { RdfTextIndex } from './RdfTextIndex';\nimport { RdfVectorIndex } from './RdfVectorIndex';\nimport { RdfShadowComparator, diffQuads } from './RdfShadowComparator';\nimport { RdfLocalQueryEngine } from './RdfLocalQueryEngine';\nimport type { RdfLocalQuery, RdfLocalQueryResult } from './types';\n\nexport interface SolidRdfEngineOptions {\n index: RdfQuadIndex | RdfQuadIndexOptions;\n textIndex?: RdfTextIndex | RdfTextIndexOptions;\n vectorIndex?: RdfVectorIndex | RdfVectorIndexOptions;\n rdf3xIndex?: Rdf3xTripleIndex | Rdf3xTripleIndexOptions;\n rdf3xPrimary?: boolean;\n compatibilityStore?: QuintStore;\n autoOpen?: boolean;\n}\n\nexport class SolidRdfEngine {\n public readonly index: RdfQuadIndex;\n public readonly textIndex?: RdfTextIndex;\n public readonly vectorIndex?: RdfVectorIndex;\n public readonly rdf3xIndex?: Rdf3xTripleIndex;\n private readonly ownsIndex: boolean;\n private readonly ownsTextIndex: boolean;\n private readonly ownsVectorIndex: boolean;\n private readonly ownsRdf3xIndex: boolean;\n private readonly rdf3xPrimary: boolean;\n private readonly compatibilityStore?: QuintStore;\n private shadowComparator?: RdfShadowComparator;\n private readonly queryEngine: RdfLocalQueryEngine;\n private rdf3xDirty = true;\n\n public constructor(options: SolidRdfEngineOptions) {\n if (options.index instanceof RdfQuadIndex) {\n this.index = options.index;\n this.ownsIndex = false;\n } else {\n this.index = new RdfQuadIndex(options.index);\n this.ownsIndex = true;\n }\n if (options.textIndex instanceof RdfTextIndex) {\n this.textIndex = options.textIndex;\n this.ownsTextIndex = false;\n } else if (isRdfTextIndexOptions(options.textIndex)) {\n this.textIndex = new RdfTextIndex(options.textIndex);\n this.ownsTextIndex = true;\n } else {\n this.ownsTextIndex = false;\n }\n if (options.vectorIndex instanceof RdfVectorIndex) {\n this.vectorIndex = options.vectorIndex;\n this.ownsVectorIndex = false;\n } else if (isRdfVectorIndexOptions(options.vectorIndex)) {\n this.vectorIndex = new RdfVectorIndex(options.vectorIndex);\n this.ownsVectorIndex = true;\n } else {\n this.ownsVectorIndex = false;\n }\n if (options.rdf3xIndex instanceof Rdf3xTripleIndex) {\n this.rdf3xIndex = options.rdf3xIndex;\n this.ownsRdf3xIndex = false;\n } else if (isRdf3xTripleIndexOptions(options.rdf3xIndex)) {\n this.rdf3xIndex = new Rdf3xTripleIndex(options.rdf3xIndex);\n this.ownsRdf3xIndex = true;\n } else {\n this.ownsRdf3xIndex = false;\n }\n if (options.rdf3xPrimary && !this.rdf3xIndex) {\n throw new Error('SolidRdfEngine rdf3xPrimary requires an rdf3xIndex');\n }\n this.rdf3xPrimary = Boolean(options.rdf3xPrimary);\n this.compatibilityStore = options.compatibilityStore;\n this.queryEngine = new RdfLocalQueryEngine(\n this.index,\n this.textIndex,\n this.vectorIndex,\n this.rdf3xPrimary ? this.rdf3xIndex : undefined,\n );\n if (this.compatibilityStore) {\n this.shadowComparator = new RdfShadowComparator(this.index, this.compatibilityStore);\n }\n if (options.autoOpen) {\n this.open();\n }\n }\n\n public open(): void {\n this.index.open();\n this.textIndex?.open();\n this.vectorIndex?.open();\n this.rdf3xIndex?.open();\n }\n\n public async close(): Promise<void> {\n if (this.ownsRdf3xIndex) {\n this.rdf3xIndex?.close();\n }\n if (this.ownsVectorIndex) {\n this.vectorIndex?.close();\n }\n if (this.ownsTextIndex) {\n this.textIndex?.close();\n }\n if (this.ownsIndex) {\n this.index.close();\n }\n if (this.compatibilityStore) {\n await this.compatibilityStore.close();\n }\n }\n\n public put(quads: Quad | Quad[], options?: RdfIndexPutOptions): void {\n this.index.multiPut(Array.isArray(quads) ? quads : [quads], options);\n this.markRdf3xDirty();\n }\n\n public replaceSource(quads: Quad[], source: RdfSourceInput): void {\n this.index.replaceSource(quads, source);\n this.markRdf3xDirty();\n }\n\n public deleteSource(source: string): number {\n const changes = this.index.deleteSource(source);\n if (changes > 0) {\n this.markRdf3xDirty();\n }\n return changes;\n }\n\n public delete(pattern: QuintPattern): number {\n const changes = this.index.delete(pattern);\n if (changes > 0) {\n this.markRdf3xDirty();\n }\n return changes;\n }\n\n public scan(query: RdfPatternQuery): RdfQuadIndexScanResult {\n return this.index.scan(query.pattern, query.options);\n }\n\n public query(query: RdfLocalQuery): RdfLocalQueryResult {\n this.refreshRdf3xPrimary();\n return this.queryEngine.query(query);\n }\n\n public indexTextSource(source: RdfTextSourceInput, text: string, chunks?: RdfTextChunkInput[]): void {\n this.requireTextIndex().indexText(source, text, chunks);\n }\n\n public deleteTextSource(source: string): number {\n return this.requireTextIndex().deleteSource(source);\n }\n\n public searchText(options: RdfTextSearchOptions | string): RdfTextSearchResult[] {\n return this.requireTextIndex().search(typeof options === 'string' ? { query: options } : options);\n }\n\n public indexVectorSource(source: RdfVectorSourceInput, chunks: RdfVectorChunkInput[]): void {\n this.requireVectorIndex().indexVector(source, chunks);\n }\n\n public deleteVectorSource(source: string): number {\n return this.requireVectorIndex().deleteSource(source);\n }\n\n public searchVector(options: RdfVectorSearchOptions): RdfVectorSearchResult[] {\n return this.requireVectorIndex().search(options);\n }\n\n public async shadowScan(query: RdfPatternQuery): Promise<RdfShadowScanResult> {\n if (!this.shadowComparator) {\n throw new Error('SolidRdfEngine shadowScan requires a compatibility QuintStore');\n }\n return this.shadowComparator.compareScan(query);\n }\n\n public shadowRdf3xScan(query: RdfPatternQuery): Rdf3xShadowScanResult {\n const rdf3xIndex = this.requireRdf3xIndex();\n const rdf3xPattern = toRdf3xTriplePattern(query.pattern);\n const rebuild = rdf3xIndex.rebuildFromCurrentQuads();\n const primary = this.index.scan(query.pattern, query.options);\n const rdf3x = rdf3xIndex.scan(rdf3xPattern, query.options);\n const diff = diffQuads(rdf3x.quads, primary.quads);\n const orderedMatch = canonicalQuadKeys(primary.quads).join('\\n') === canonicalQuadKeys(rdf3x.quads).join('\\n');\n return {\n matched: diff.missingFromPrimary.length === 0 && diff.extraInPrimary.length === 0,\n orderedMatch,\n primary: primary.quads,\n rdf3x: rdf3x.quads,\n diff: {\n missingFromRdf3x: diff.extraInPrimary,\n extraInRdf3x: diff.missingFromPrimary,\n },\n primaryMetrics: primary.metrics,\n rdf3xMetrics: rdf3x.metrics,\n rebuild,\n };\n }\n\n public shadowRdf3xJoin(\n patterns: RdfQuadJoinPattern[],\n options?: RdfQuadJoinOptions,\n ): Rdf3xShadowJoinResult {\n const rdf3xIndex = this.requireRdf3xIndex();\n const rebuild = rdf3xIndex.rebuildFromCurrentQuads();\n const primary = this.index.joinPatterns(patterns, options);\n const rdf3x = rdf3xIndex.joinPatterns(patterns, options);\n const primaryKeys = primary.bindings.map(canonicalBindingKey);\n const rdf3xKeys = rdf3x.bindings.map(canonicalBindingKey);\n const diff = diffBindingKeys(rdf3xKeys, primaryKeys);\n return {\n matched: diff.missingFromRdf3x.length === 0 && diff.extraInRdf3x.length === 0,\n orderedMatch: primaryKeys.join('\\n') === rdf3xKeys.join('\\n'),\n primary: primary.bindings,\n rdf3x: rdf3x.bindings,\n diff,\n primaryMetrics: primary.metrics,\n rdf3xMetrics: rdf3x.metrics,\n rebuild,\n };\n }\n\n public supportsPrimary(query: RdfPatternQuery): boolean {\n try {\n this.index.scan(query.pattern, { ...query.options, limit: 0 });\n return true;\n } catch {\n return false;\n }\n }\n\n private requireTextIndex(): RdfTextIndex {\n if (!this.textIndex) {\n throw new Error('SolidRdfEngine text index is not configured');\n }\n return this.textIndex;\n }\n\n private requireVectorIndex(): RdfVectorIndex {\n if (!this.vectorIndex) {\n throw new Error('SolidRdfEngine vector index is not configured');\n }\n return this.vectorIndex;\n }\n\n private requireRdf3xIndex(): Rdf3xTripleIndex {\n if (!this.rdf3xIndex) {\n throw new Error('SolidRdfEngine RDF-3X shadow index is not configured');\n }\n return this.rdf3xIndex;\n }\n\n private markRdf3xDirty(): void {\n if (this.rdf3xIndex) {\n this.rdf3xDirty = true;\n }\n }\n\n private refreshRdf3xPrimary(): void {\n if (!this.rdf3xPrimary || !this.rdf3xDirty) {\n return;\n }\n this.requireRdf3xIndex().rebuildFromCurrentQuads();\n this.rdf3xDirty = false;\n }\n}\n\nfunction isRdfTextIndexOptions(input: RdfTextIndex | RdfTextIndexOptions | undefined): input is RdfTextIndexOptions {\n return input !== undefined && !(input instanceof RdfTextIndex) && typeof input.path === 'string';\n}\n\nfunction isRdfVectorIndexOptions(input: RdfVectorIndex | RdfVectorIndexOptions | undefined): input is RdfVectorIndexOptions {\n return input !== undefined && !(input instanceof RdfVectorIndex) && typeof input.path === 'string';\n}\n\nfunction isRdf3xTripleIndexOptions(input: Rdf3xTripleIndex | Rdf3xTripleIndexOptions | undefined): input is Rdf3xTripleIndexOptions {\n return input !== undefined && !(input instanceof Rdf3xTripleIndex) && typeof input.path === 'string';\n}\n\nfunction canonicalQuadKeys(quads: Quad[]): string[] {\n return quads.map((quad) => [\n termToId(quad.graph as any),\n termToId(quad.subject as any),\n termToId(quad.predicate as any),\n termToId(quad.object as any),\n ].join('\\u001f'));\n}\n\nfunction canonicalBindingKey(binding: Record<string, unknown>): string {\n return Object.keys(binding)\n .sort()\n .map((key) => `${key}=${termToId(binding[key] as any)}`)\n .join('\\u001f');\n}\n\nfunction diffBindingKeys(\n rdf3xKeys: string[],\n primaryKeys: string[],\n): Rdf3xShadowJoinResult['diff'] {\n const rdf3xSet = new Set(rdf3xKeys);\n const primarySet = new Set(primaryKeys);\n return {\n missingFromRdf3x: Array.from(primarySet).filter((key) => !rdf3xSet.has(key)).sort(),\n extraInRdf3x: Array.from(rdf3xSet).filter((key) => !primarySet.has(key)).sort(),\n };\n}\n\nfunction toRdf3xTriplePattern(pattern: QuintPattern): Rdf3xTriplePattern {\n const result: Rdf3xTriplePattern = {};\n for (const key of ['graph', 'subject', 'predicate', 'object'] as const) {\n const value = pattern[key];\n if (!value) {\n continue;\n }\n if (!isTerm(value)) {\n if (key === 'graph' && isStartsWithOperator(value)) {\n result.graph = { $startsWith: value.$startsWith };\n continue;\n }\n if (key === 'object' && isNumericObjectRangeOperator(value)) {\n result.object = value;\n continue;\n }\n throw new Error(`SolidRdfEngine RDF-3X shadow scan only supports exact ${key} terms${key === 'graph' ? ' or graph $startsWith' : ''}`);\n }\n result[key] = value;\n }\n return result;\n}\n\nfunction isStartsWithOperator(value: unknown): value is { $startsWith: string } {\n return value !== null\n && typeof value === 'object'\n && '$startsWith' in value\n && typeof (value as { $startsWith?: unknown }).$startsWith === 'string';\n}\n\nfunction isNumericObjectRangeOperator(value: unknown): value is Rdf3xNumericObjectRangePattern {\n return value !== null\n && typeof value === 'object'\n && !('termType' in value)\n && ['$gt', '$gte', '$lt', '$lte'].some((operator) => operator in value);\n}\n"]}
|
|
@@ -77,6 +77,18 @@
|
|
|
77
77
|
]
|
|
78
78
|
}
|
|
79
79
|
},
|
|
80
|
+
{
|
|
81
|
+
"@id": "undefineds:dist/storage/rdf/SolidRdfEngine.jsonld#SolidRdfEngine_options_rdf3xPrimary",
|
|
82
|
+
"range": {
|
|
83
|
+
"@type": "ParameterRangeUnion",
|
|
84
|
+
"parameterRangeElements": [
|
|
85
|
+
"xsd:boolean",
|
|
86
|
+
{
|
|
87
|
+
"@type": "ParameterRangeUndefined"
|
|
88
|
+
}
|
|
89
|
+
]
|
|
90
|
+
}
|
|
91
|
+
},
|
|
80
92
|
{
|
|
81
93
|
"@id": "undefineds:dist/storage/rdf/SolidRdfEngine.jsonld#SolidRdfEngine_options_compatibilityStore",
|
|
82
94
|
"range": {
|
|
@@ -139,6 +151,10 @@
|
|
|
139
151
|
"@id": "undefineds:dist/storage/rdf/SolidRdfEngine.jsonld#SolidRdfEngine__member_ownsRdf3xIndex",
|
|
140
152
|
"memberFieldName": "ownsRdf3xIndex"
|
|
141
153
|
},
|
|
154
|
+
{
|
|
155
|
+
"@id": "undefineds:dist/storage/rdf/SolidRdfEngine.jsonld#SolidRdfEngine__member_rdf3xPrimary",
|
|
156
|
+
"memberFieldName": "rdf3xPrimary"
|
|
157
|
+
},
|
|
142
158
|
{
|
|
143
159
|
"@id": "undefineds:dist/storage/rdf/SolidRdfEngine.jsonld#SolidRdfEngine__member_compatibilityStore",
|
|
144
160
|
"memberFieldName": "compatibilityStore"
|
|
@@ -151,6 +167,10 @@
|
|
|
151
167
|
"@id": "undefineds:dist/storage/rdf/SolidRdfEngine.jsonld#SolidRdfEngine__member_queryEngine",
|
|
152
168
|
"memberFieldName": "queryEngine"
|
|
153
169
|
},
|
|
170
|
+
{
|
|
171
|
+
"@id": "undefineds:dist/storage/rdf/SolidRdfEngine.jsonld#SolidRdfEngine__member_rdf3xDirty",
|
|
172
|
+
"memberFieldName": "rdf3xDirty"
|
|
173
|
+
},
|
|
154
174
|
{
|
|
155
175
|
"@id": "undefineds:dist/storage/rdf/SolidRdfEngine.jsonld#SolidRdfEngine__member_constructor",
|
|
156
176
|
"memberFieldName": "constructor"
|
|
@@ -238,6 +258,14 @@
|
|
|
238
258
|
{
|
|
239
259
|
"@id": "undefineds:dist/storage/rdf/SolidRdfEngine.jsonld#SolidRdfEngine__member_requireRdf3xIndex",
|
|
240
260
|
"memberFieldName": "requireRdf3xIndex"
|
|
261
|
+
},
|
|
262
|
+
{
|
|
263
|
+
"@id": "undefineds:dist/storage/rdf/SolidRdfEngine.jsonld#SolidRdfEngine__member_markRdf3xDirty",
|
|
264
|
+
"memberFieldName": "markRdf3xDirty"
|
|
265
|
+
},
|
|
266
|
+
{
|
|
267
|
+
"@id": "undefineds:dist/storage/rdf/SolidRdfEngine.jsonld#SolidRdfEngine__member_refreshRdf3xPrimary",
|
|
268
|
+
"memberFieldName": "refreshRdf3xPrimary"
|
|
241
269
|
}
|
|
242
270
|
],
|
|
243
271
|
"constructorArguments": [
|
|
@@ -318,6 +346,12 @@
|
|
|
318
346
|
]
|
|
319
347
|
}
|
|
320
348
|
},
|
|
349
|
+
{
|
|
350
|
+
"keyRaw": "rdf3xPrimary",
|
|
351
|
+
"value": {
|
|
352
|
+
"@id": "undefineds:dist/storage/rdf/SolidRdfEngine.jsonld#SolidRdfEngine_options_rdf3xPrimary"
|
|
353
|
+
}
|
|
354
|
+
},
|
|
321
355
|
{
|
|
322
356
|
"keyRaw": "compatibilityStore",
|
|
323
357
|
"value": {
|
|
@@ -398,14 +398,27 @@ class ComunicaQuintEngine {
|
|
|
398
398
|
*/
|
|
399
399
|
async executeCoreQuery(coreOperation, _context) {
|
|
400
400
|
const bindings = [];
|
|
401
|
+
const savedOptimizeParams = this.currentOptimizeParams;
|
|
401
402
|
const mockContext = {
|
|
402
403
|
get: () => undefined,
|
|
403
404
|
getSafe: () => { throw new Error('Not implemented'); },
|
|
404
405
|
has: () => false,
|
|
405
406
|
};
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
407
|
+
try {
|
|
408
|
+
if (savedOptimizeParams) {
|
|
409
|
+
this.currentOptimizeParams = {
|
|
410
|
+
...savedOptimizeParams,
|
|
411
|
+
limit: undefined,
|
|
412
|
+
offset: undefined,
|
|
413
|
+
};
|
|
414
|
+
}
|
|
415
|
+
const stream = this.querySource.queryBindings(coreOperation, mockContext, undefined);
|
|
416
|
+
for await (const binding of stream) {
|
|
417
|
+
bindings.push(binding);
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
finally {
|
|
421
|
+
this.currentOptimizeParams = savedOptimizeParams;
|
|
409
422
|
}
|
|
410
423
|
return bindings;
|
|
411
424
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ComunicaQuintEngine.js","sourceRoot":"","sources":["../../../src/storage/sparql/ComunicaQuintEngine.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * ComunicaQuintEngine - Comunica SPARQL engine backed by QuintStore\n * \n * Features:\n * 1. Query pushdown optimization (LIMIT/ORDER BY)\n * 2. FILTER pushdown via IQuerySource interface\n * 3. External filters for security boundaries (ACL)\n * 4. OPTIONAL optimization via QueryOptimizer\n * \n * Architecture:\n * - Uses QuintQuerySource (IQuerySource) for proper FILTER pushdown\n * - Uses QueryOptimizer for OPTIONAL and Compound Query optimization\n * - Comunica pushes FILTER operations down to sources that declare support\n * - QuintQuerySource extracts filters from algebra and applies them to QuintStore\n */\n\nimport { EventEmitter } from 'events';\nimport type { Quad, Term, Bindings, ResultStream } from '@rdfjs/types';\nimport type * as RDF from '@rdfjs/types';\nimport { QueryEngine } from '@comunica/query-sparql-rdfjs';\nimport { BindingsFactory } from '@comunica/utils-bindings-factory';\nimport { translate, type Algebra } from 'sparqlalgebrajs';\nimport { wrap } from 'asynciterator';\nimport { DataFactory } from 'rdf-data-factory';\n\nimport type { QuintStore, QuintPattern, QueryOptions, TermName, TermOperators } from '../quint/types';\nimport { QuintQuerySource } from './QuintQuerySource';\nimport { QueryOptimizer } from './QueryOptimizer';\nimport { SimpleSparqlExecutor } from './SimpleSparqlExecutor';\n\nexport interface ComunicaQuintEngineOptions {\n debug?: boolean;\n}\n\n/**\n * Security/ACL filters passed from upstream\n * These are applied unconditionally to restrict query scope\n */\nexport interface SecurityFilters {\n subject?: TermOperators;\n predicate?: TermOperators;\n object?: TermOperators;\n graph?: TermOperators;\n}\n\nexport interface QueryContext {\n sources?: unknown[];\n baseIRI?: string;\n /** Security filters for access control */\n filters?: SecurityFilters;\n [key: string]: unknown;\n}\n\n/**\n * Query analysis result (stateless)\n */\nexport interface QueryAnalysis {\n hasFilter: boolean;\n filterTypes: string[];\n pushdownable: string[];\n nonPushdownable: string[];\n estimatedPushdownRate: number;\n}\n\ninterface OptimizeParams {\n limit?: number;\n offset?: number;\n order?: TermName[];\n /** 原始 ORDER BY 变量名,用于在 QuintQuerySource 中分析绑定位置 */\n orderVarName?: string;\n reverse?: boolean;\n}\n\n// Context key names - must match Comunica's internal keys\nconst CONTEXT_KEY_QUERY_SOURCES = '@comunica/bus-query-operation:querySources';\n\nconst dataFactory = new DataFactory();\n\n/**\n * Custom RDF/JS Store backed by QuintStore\n * Used for UPDATE operations (INSERT/DELETE) which don't need FILTER pushdown\n */\nclass QuintRdfStore implements RDF.Store {\n constructor(\n private readonly store: QuintStore,\n private readonly getSecurityFilters: () => SecurityFilters | undefined,\n private readonly debug: boolean\n ) {}\n\n match(\n subject?: Term | null,\n predicate?: Term | null,\n object?: Term | null,\n graph?: Term | null\n ): RDF.Stream {\n // Build QuintPattern\n const pattern: QuintPattern = {};\n \n if (subject && subject.termType !== 'Variable') {\n pattern.subject = subject;\n }\n if (predicate && predicate.termType !== 'Variable') {\n pattern.predicate = predicate;\n }\n if (object && object.termType !== 'Variable') {\n pattern.object = object;\n }\n if (graph && graph.termType !== 'Variable' && graph.termType !== 'DefaultGraph') {\n pattern.graph = graph;\n }\n\n // Apply security filters (from upstream, e.g., ACL)\n const securityFilters = this.getSecurityFilters();\n if (securityFilters) {\n if (securityFilters.subject && !pattern.subject) {\n pattern.subject = securityFilters.subject;\n }\n if (securityFilters.predicate && !pattern.predicate) {\n pattern.predicate = securityFilters.predicate;\n }\n if (securityFilters.object && !pattern.object) {\n pattern.object = securityFilters.object;\n }\n if (securityFilters.graph && !pattern.graph) {\n pattern.graph = securityFilters.graph;\n }\n }\n\n if (this.debug) {\n console.log(`[QuintRdfStore] match() called`);\n console.log(` pattern:`, pattern);\n }\n\n // Use wrap to convert Promise<Array> to AsyncIterator\n const promiseIterator = wrap(this.store.get(pattern));\n return promiseIterator as any;\n }\n\n /**\n * Import quads from a stream (Sink interface)\n */\n import(stream: RDF.Stream<Quad>): EventEmitter {\n const emitter = new EventEmitter();\n \n const quads: Quad[] = [];\n let ended = false;\n \n // Handle data events\n stream.on('data', (quad: Quad) => {\n quads.push(quad);\n });\n \n const handleEnd = () => {\n if (ended) return;\n ended = true;\n if (quads.length > 0) {\n this.store.multiPut(quads as any[])\n .then(() => emitter.emit('end'))\n .catch((err) => emitter.emit('error', err));\n } else {\n emitter.emit('end');\n }\n };\n \n stream.on('end', handleEnd);\n stream.on('error', (err) => {\n emitter.emit('error', err);\n });\n \n // Handle already-ended streams (synchronous streams)\n // Use setImmediate to ensure we check after all synchronous data events\n setImmediate(() => {\n if ((stream as any).readableEnded || (stream as any).closed) {\n handleEnd();\n }\n });\n \n return emitter;\n }\n\n /**\n * Remove quads from a stream (Store interface)\n */\n remove(stream: RDF.Stream<Quad>): EventEmitter {\n const emitter = new EventEmitter();\n \n const deletePromises: Promise<number>[] = [];\n let ended = false;\n \n stream.on('data', (quad: Quad) => {\n const pattern: QuintPattern = {\n subject: quad.subject,\n predicate: quad.predicate,\n object: quad.object,\n };\n if (quad.graph && quad.graph.termType !== 'DefaultGraph') {\n pattern.graph = quad.graph;\n }\n deletePromises.push(this.store.del(pattern));\n });\n \n const handleEnd = () => {\n if (ended) return;\n ended = true;\n Promise.all(deletePromises)\n .then(() => emitter.emit('end'))\n .catch((err) => emitter.emit('error', err));\n };\n \n stream.on('end', handleEnd);\n stream.on('error', (err) => {\n emitter.emit('error', err);\n });\n \n // Handle already-ended streams (synchronous streams)\n setImmediate(() => {\n if ((stream as any).readableEnded || (stream as any).closed) {\n handleEnd();\n }\n });\n \n return emitter;\n }\n\n /**\n * Remove all matching quads (Store interface)\n */\n removeMatches(\n subject?: Term | null,\n predicate?: Term | null,\n object?: Term | null,\n graph?: Term | null\n ): EventEmitter {\n const emitter = new EventEmitter();\n \n if (this.debug) {\n console.log(`[QuintRdfStore] removeMatches()`, { subject, predicate, object, graph });\n }\n \n const pattern: QuintPattern = {};\n if (subject && subject.termType !== 'Variable') {\n pattern.subject = subject;\n }\n if (predicate && predicate.termType !== 'Variable') {\n pattern.predicate = predicate;\n }\n if (object && object.termType !== 'Variable') {\n pattern.object = object;\n }\n if (graph && graph.termType !== 'Variable' && graph.termType !== 'DefaultGraph') {\n pattern.graph = graph;\n }\n \n this.store.del(pattern)\n .then(() => emitter.emit('end'))\n .catch((err) => emitter.emit('error', err));\n \n return emitter;\n }\n\n /**\n * Delete a named graph (Store interface)\n */\n deleteGraph(graph: Term | string): EventEmitter {\n const emitter = new EventEmitter();\n \n const graphTerm = typeof graph === 'string' \n ? { termType: 'NamedNode' as const, value: graph }\n : graph;\n \n const pattern: QuintPattern = { graph: graphTerm as Term };\n \n this.store.del(pattern)\n .then(() => emitter.emit('end'))\n .catch((err) => emitter.emit('error', err));\n \n return emitter;\n }\n}\n\nexport class ComunicaQuintEngine {\n private readonly store: QuintStore;\n private readonly rdfStore: QuintRdfStore;\n private readonly querySource: QuintQuerySource;\n private readonly queryOptimizer: QueryOptimizer;\n private readonly simpleExecutor: SimpleSparqlExecutor;\n private readonly engine: QueryEngine;\n private readonly debug: boolean;\n private bindingsFactory: any;\n \n // Current query optimization params\n private currentOptimizeParams: OptimizeParams | null = null;\n // Current security filters (from upstream)\n private currentSecurityFilters: SecurityFilters | undefined;\n // Current query's FILTER expressions for pushdown\n private currentFilterExpressions: Map<string, Algebra.Expression> = new Map();\n\n constructor(store: QuintStore, options?: ComunicaQuintEngineOptions) {\n this.store = store;\n this.debug = options?.debug ?? false;\n \n // Create RdfStore for UPDATE operations\n this.rdfStore = new QuintRdfStore(\n store,\n () => this.currentSecurityFilters,\n this.debug\n );\n \n // Create BindingsFactory\n this.bindingsFactory = new (BindingsFactory as any)(dataFactory);\n \n // Create QuintQuerySource with IQuerySource interface for proper FILTER pushdown\n this.querySource = new QuintQuerySource(store, {\n debug: this.debug,\n bindingsFactory: this.bindingsFactory,\n getSecurityFilters: () => this.currentSecurityFilters,\n getOptimizeParams: () => this.currentOptimizeParams,\n getFilterExpression: (varName: string) => this.currentFilterExpressions.get(varName),\n });\n \n // Create QueryOptimizer for OPTIONAL and Compound Query optimization\n this.queryOptimizer = new QueryOptimizer(store, {\n debug: this.debug,\n bindingsFactory: this.bindingsFactory,\n });\n \n this.engine = new QueryEngine();\n }\n\n /**\n * Analyze a query's pushdown potential (stateless)\n * Returns analysis of what can/cannot be pushed down without executing the query\n */\n analyzeQuery(query: string): QueryAnalysis {\n const algebra = translate(query);\n return this.analyzeAlgebra(algebra);\n }\n\n /**\n * Analyze algebra tree for pushdown potential\n */\n private analyzeAlgebra(op: Algebra.Operation): QueryAnalysis {\n const result: QueryAnalysis = {\n hasFilter: false,\n filterTypes: [],\n pushdownable: [],\n nonPushdownable: [],\n estimatedPushdownRate: 1.0,\n };\n\n this.walkAlgebra(op, result);\n\n // Calculate pushdown rate\n const total = result.pushdownable.length + result.nonPushdownable.length;\n if (total > 0) {\n result.estimatedPushdownRate = result.pushdownable.length / total;\n }\n\n return result;\n }\n\n /**\n * Walk algebra tree and collect filter info\n */\n private walkAlgebra(op: Algebra.Operation, result: QueryAnalysis): void {\n if (op.type === 'filter') {\n result.hasFilter = true;\n const filterOp = op as Algebra.Filter;\n this.analyzeExpression(filterOp.expression, result);\n this.walkAlgebra(filterOp.input, result);\n } else if ('input' in op && op.input) {\n this.walkAlgebra(op.input as Algebra.Operation, result);\n }\n if ('left' in op && op.left) {\n this.walkAlgebra(op.left as Algebra.Operation, result);\n }\n if ('right' in op && op.right) {\n this.walkAlgebra(op.right as Algebra.Operation, result);\n }\n }\n\n /**\n * Analyze a filter expression\n */\n private analyzeExpression(expr: Algebra.Expression, result: QueryAnalysis): void {\n if (expr.expressionType === 'operator') {\n const opExpr = expr as Algebra.OperatorExpression;\n const op = opExpr.operator.toLowerCase();\n\n // Classify the operator\n if (['=', '!='].includes(op)) {\n result.filterTypes.push('equality');\n result.pushdownable.push(op);\n } else if (['<', '>', '<=', '>='].includes(op)) {\n result.filterTypes.push('range');\n result.pushdownable.push(op);\n } else if (['in', 'notin'].includes(op)) {\n result.filterTypes.push('equality');\n result.pushdownable.push(op);\n } else if (['strstarts', 'strends', 'contains', 'regex'].includes(op)) {\n result.filterTypes.push('string');\n result.pushdownable.push(op);\n } else if (op === 'bound') {\n result.filterTypes.push('bound');\n result.pushdownable.push(op);\n } else if (['isiri', 'isuri', 'isblank', 'isliteral', 'isnumeric'].includes(op)) {\n // Type checking functions - can be pushed down\n result.filterTypes.push('typecheck');\n result.pushdownable.push(op);\n } else if (op === 'langmatches') {\n // LANGMATCHES can be pushed down using $endsWith on serialized format\n result.filterTypes.push('language');\n result.pushdownable.push(op);\n } else if (['&&', '||', '!'].includes(op)) {\n result.filterTypes.push('logical');\n // Recurse into logical operators\n for (const arg of opExpr.args) {\n this.analyzeExpression(arg, result);\n }\n } else {\n // Non-pushdownable functions\n result.filterTypes.push('function');\n result.nonPushdownable.push(op);\n }\n } else if (expr.expressionType === 'existence') {\n result.filterTypes.push('exists');\n result.pushdownable.push('exists');\n }\n }\n\n /**\n * Execute SELECT query\n * Uses IQuerySource for proper FILTER pushdown\n * \n * OPTIONAL 优化:\n * 如果查询包含多个 OPTIONAL 且只是获取属性(不参与过滤),\n * 则先执行核心条件获取 subjects,再批量获取属性\n */\n async queryBindings(query: string, context?: QueryContext): Promise<ResultStream<Bindings>> {\n const params = this.extractOptimizeParams(query);\n this.currentOptimizeParams = params;\n this.currentSecurityFilters = context?.filters;\n \n // Extract FILTER expressions from the query for pushdown\n // Note: We don't clear these in finally because the stream is lazy-evaluated\n // and sub-queries may need access to filters after this function returns\n this.extractAndStoreFilters(query);\n \n if (this.debug) {\n console.log(`[ComunicaQuintEngine] Query optimization:`, this.currentOptimizeParams);\n console.log(`[ComunicaQuintEngine] Security filters:`, this.currentSecurityFilters);\n console.log(`[ComunicaQuintEngine] Filter expressions for pushdown:`, this.currentFilterExpressions.size);\n }\n\n // 尝试 OPTIONAL 优化(使用 QueryOptimizer)\n try {\n const algebra = translate(query, { quads: true });\n const optResult = this.queryOptimizer.analyzeQuery(algebra);\n \n if (optResult.type === 'optional' && optResult.analysis) {\n const optionalAnalysis = optResult.analysis as import('./QueryOptimizer').OptionalAnalysis;\n \n if (this.debug) {\n console.log(`[ComunicaQuintEngine] OPTIONAL optimization available:`, {\n subjectVar: optionalAnalysis.subjectVar,\n predicates: optionalAnalysis.optionalPredicates?.length,\n });\n }\n \n // 执行核心查询获取 subjects\n const coreBindings = await this.executeCoreQuery(optionalAnalysis.coreOperation!, context);\n \n // 使用 QueryOptimizer 执行优化查询(排序也在 QueryOptimizer 中处理)\n const orderOptions = params?.orderVarName \n ? { varName: params.orderVarName, reverse: params.reverse }\n : undefined;\n let results = await this.queryOptimizer.executeOptionalOptimized(\n optionalAnalysis, \n coreBindings,\n orderOptions\n );\n \n // 应用 LIMIT 和 OFFSET\n if (params?.offset || params?.limit) {\n const start = params.offset ?? 0;\n const end = params.limit ? start + params.limit : undefined;\n results = results.slice(start, end);\n }\n \n if (this.debug) {\n console.log(`[ComunicaQuintEngine] OPTIONAL optimized: ${results.length} results`);\n }\n \n const resultStream = wrap(Promise.resolve(results));\n return resultStream as ResultStream<Bindings>;\n }\n } catch (error) {\n if (this.debug) {\n console.log(`[ComunicaQuintEngine] OPTIONAL optimization failed, falling back:`, error);\n }\n }\n\n // Create context with pre-identified source to bypass source identification\n // This allows us to use our IQuerySource directly\n // IMPORTANT: Use plain object instead of ActionContext to avoid version mismatch\n // between the root @comunica/core and the one bundled with @comunica/query-sparql-rdfjs\n // The engine will convert it to ActionContext using its internal @comunica/core\n const { sources: _ignored, filters: _filters, ...restContext } = context || {};\n const queryContext = {\n ...restContext,\n // Set the identified sources directly - this skips ActorContextPreprocessQuerySourceIdentify\n [CONTEXT_KEY_QUERY_SOURCES]: [{ source: this.querySource }],\n };\n\n return await this.engine.queryBindings(query, queryContext as any);\n }\n\n /**\n * 执行核心查询(不含 OPTIONAL)\n */\n private async executeCoreQuery(\n coreOperation: Algebra.Operation,\n _context?: QueryContext\n ): Promise<Bindings[]> {\n const bindings: Bindings[] = [];\n\n const mockContext = {\n get: <V>() => undefined as V | undefined,\n getSafe: <V>() => { throw new Error('Not implemented'); },\n has: () => false,\n };\n\n const stream = this.querySource.queryBindings(coreOperation, mockContext as any, undefined);\n \n for await (const binding of stream) {\n bindings.push(binding);\n }\n\n return bindings;\n }\n\n /**\n * Extract FILTER expressions from query and store them for later pushdown\n * Maps variable names to their filter expressions\n */\n private extractAndStoreFilters(query: string): void {\n this.currentFilterExpressions.clear();\n \n try {\n const algebra = translate(query, { quads: true });\n this.collectFilterExpressions(algebra);\n } catch (error) {\n if (this.debug) {\n console.log(`[ComunicaQuintEngine] Failed to extract filters:`, error);\n }\n }\n }\n \n /**\n * Recursively collect FILTER expressions and their variable bindings\n */\n private collectFilterExpressions(op: Algebra.Operation): void {\n if (op.type === 'filter') {\n const filterOp = op as Algebra.Filter;\n const expression = filterOp.expression;\n \n // Extract variables from the expression\n const variables = this.getExpressionVariables(expression);\n \n // Store the expression for each variable\n for (const varName of variables) {\n // Merge with existing expressions for this variable\n const existing = this.currentFilterExpressions.get(varName);\n if (existing) {\n // Combine with AND\n this.currentFilterExpressions.set(varName, {\n type: 'expression',\n expressionType: 'operator',\n operator: '&&',\n args: [existing, expression],\n } as Algebra.OperatorExpression);\n } else {\n this.currentFilterExpressions.set(varName, expression);\n }\n }\n \n // Continue to nested operations\n this.collectFilterExpressions(filterOp.input);\n } else if ('input' in op && op.input) {\n if (Array.isArray(op.input)) {\n for (const child of op.input) {\n this.collectFilterExpressions(child as Algebra.Operation);\n }\n } else {\n this.collectFilterExpressions(op.input as Algebra.Operation);\n }\n }\n if ('left' in op && op.left) {\n this.collectFilterExpressions(op.left as Algebra.Operation);\n }\n if ('right' in op && op.right) {\n this.collectFilterExpressions(op.right as Algebra.Operation);\n }\n }\n \n /**\n * Get variable names from an expression\n */\n private getExpressionVariables(expr: Algebra.Expression): string[] {\n const variables: string[] = [];\n \n const collectVars = (e: Algebra.Expression): void => {\n if (e.expressionType === 'term') {\n const term = (e as Algebra.TermExpression).term;\n if (term.termType === 'Variable') {\n variables.push(term.value);\n }\n } else if (e.expressionType === 'operator') {\n const opExpr = e as Algebra.OperatorExpression;\n for (const arg of opExpr.args) {\n collectVars(arg);\n }\n }\n };\n \n collectVars(expr);\n return variables;\n }\n \n /**\n * Get the current filter expression for a variable (used by QuintQuerySource)\n */\n getFilterExpressionForVariable(varName: string): Algebra.Expression | undefined {\n return this.currentFilterExpressions.get(varName);\n }\n\n /**\n * Execute ASK query\n */\n async queryBoolean(query: string, context?: QueryContext): Promise<boolean> {\n const params = this.extractOptimizeParams(query);\n this.currentOptimizeParams = params;\n this.currentSecurityFilters = context?.filters;\n \n // Optimize ASK with limit=1\n if (!this.currentOptimizeParams) {\n this.currentOptimizeParams = { limit: 1 };\n } else if (this.currentOptimizeParams.limit === undefined) {\n this.currentOptimizeParams.limit = 1;\n }\n \n try {\n const { sources: _ignored, filters: _filters, ...restContext } = context || {};\n const queryContext = {\n ...restContext,\n [CONTEXT_KEY_QUERY_SOURCES]: [{ source: this.querySource }],\n };\n\n return await this.engine.queryBoolean(query, queryContext as any);\n } finally {\n this.currentOptimizeParams = null;\n this.currentSecurityFilters = undefined;\n }\n }\n\n /**\n * Execute CONSTRUCT/DESCRIBE query\n */\n async queryQuads(query: string, context?: QueryContext): Promise<ResultStream<Quad>> {\n console.log(`[ComunicaQuintEngine.queryQuads] Starting: ${query.slice(0, 100)}...`);\n const params = this.extractOptimizeParams(query);\n this.currentOptimizeParams = params;\n this.currentSecurityFilters = context?.filters;\n \n try {\n const start = Date.now();\n const { sources: _ignored, filters: _filters, ...restContext } = context || {};\n const queryContext = {\n ...restContext,\n [CONTEXT_KEY_QUERY_SOURCES]: [{ source: this.querySource }],\n };\n\n const result = await this.engine.queryQuads(query, queryContext as any);\n console.log(`[ComunicaQuintEngine.queryQuads] Completed in ${Date.now() - start}ms`);\n return result;\n } catch (err) {\n console.error(`[ComunicaQuintEngine.queryQuads] Failed:`, err);\n throw err;\n } finally {\n this.currentOptimizeParams = null;\n this.currentSecurityFilters = undefined;\n }\n }\n\n /**\n * Execute UPDATE query (INSERT/DELETE)\n * Uses RDF.Store interface since UPDATE doesn't need FILTER pushdown\n */\n async queryVoid(query: string, context?: QueryContext): Promise<void> {\n this.currentSecurityFilters = context?.filters;\n\n try {\n // Comunica does not properly await the RDF.Store remove() EventEmitter\n // before proceeding to the next operation. This causes DELETE WHERE to\n // complete after INSERT DATA, deleting newly inserted triples.\n // Fix: split compound updates and handle DELETE WHERE directly via QuintStore.\n const statements = this.splitUpdateStatements(query);\n for (const stmt of statements) {\n const deleteGraphUri = this.parseDeleteWhereGraph(stmt);\n if (deleteGraphUri) {\n // Execute DELETE WHERE directly via QuintStore.del()\n await this.store.del({ graph: { termType: 'NamedNode', value: deleteGraphUri } as any });\n } else {\n await this.engine.queryVoid(stmt, {\n sources: [this.rdfStore],\n ...context,\n } as any);\n }\n }\n } catch (err) {\n throw err;\n } finally {\n this.currentSecurityFilters = undefined;\n }\n }\n\n /**\n * Parse \"DELETE WHERE { GRAPH <uri> { ?s ?p ?o. } }\" and return the graph URI.\n * Returns null if the statement doesn't match this pattern.\n */\n private parseDeleteWhereGraph(stmt: string): string | null {\n const m = stmt.match(\n /^\\s*DELETE\\s+WHERE\\s*\\{\\s*GRAPH\\s*<([^>]+)>\\s*\\{\\s*\\?(\\w+)\\s+\\?(\\w+)\\s+\\?(\\w+)\\s*\\.?\\s*\\}\\s*\\}\\s*$/i\n );\n return m ? m[1] : null;\n }\n\n /**\n * Split a compound SPARQL UPDATE into individual statements.\n */\n private splitUpdateStatements(query: string): string[] {\n const statements: string[] = [];\n let depth = 0;\n let start = 0;\n\n for (let i = 0; i < query.length; i++) {\n if (query[i] === '{') depth++;\n else if (query[i] === '}') depth--;\n else if (query[i] === ';' && depth === 0) {\n const stmt = query.slice(start, i).trim();\n if (stmt) statements.push(stmt);\n start = i + 1;\n }\n }\n const last = query.slice(start).trim();\n if (last) statements.push(last);\n\n return statements;\n }\n\n /**\n * Extract optimization params from SPARQL query\n */\n private extractOptimizeParams(query: string): OptimizeParams | null {\n try {\n const algebra = translate(query, { quads: true });\n return this.extractOptimizeParamsFromAlgebra(algebra);\n } catch (error) {\n if (this.debug) {\n console.log(`[ComunicaQuintEngine] Failed to analyze query:`, error);\n }\n return null;\n }\n }\n\n /**\n * Extract optimization params from SPARQL algebra\n */\n private extractOptimizeParamsFromAlgebra(algebra: Algebra.Operation): OptimizeParams | null {\n let limit: number | undefined;\n let offset: number | undefined;\n let order: TermName[] | undefined;\n let orderVarName: string | undefined;\n let reverse: boolean | undefined;\n let currentOp = algebra;\n let canPushLimit = true;\n\n while (currentOp) {\n switch (currentOp.type) {\n case 'slice': {\n const slice = currentOp as Algebra.Slice;\n if (slice.length !== undefined) {\n limit = slice.length;\n }\n if (slice.start !== undefined) {\n offset = slice.start;\n }\n currentOp = slice.input;\n break;\n }\n \n case 'orderby': {\n const orderBy = currentOp as Algebra.OrderBy;\n if (orderBy.expressions.length === 1) {\n const expr = orderBy.expressions[0] as Algebra.Expression;\n \n // 提取变量名和排序方向\n // ORDER BY ?name: { expressionType: \"term\", term: { value: \"name\" } }\n // ORDER BY DESC(?name): { expressionType: \"operator\", operator: \"desc\", args: [{ expressionType: \"term\", term: {...} }] }\n let varName: string | undefined;\n reverse = false;\n \n if (expr.expressionType === 'term') {\n const termExpr = expr as Algebra.TermExpression;\n if (termExpr.term?.termType === 'Variable') {\n varName = termExpr.term.value;\n }\n } else if (expr.expressionType === 'operator') {\n const opExpr = expr as Algebra.OperatorExpression;\n if (opExpr.operator === 'desc' && opExpr.args.length === 1) {\n reverse = true;\n const innerExpr = opExpr.args[0] as Algebra.Expression;\n if (innerExpr.expressionType === 'term') {\n const termExpr = innerExpr as Algebra.TermExpression;\n if (termExpr.term?.termType === 'Variable') {\n varName = termExpr.term.value;\n }\n }\n } else if (opExpr.operator === 'asc' && opExpr.args.length === 1) {\n const innerExpr = opExpr.args[0] as Algebra.Expression;\n if (innerExpr.expressionType === 'term') {\n const termExpr = innerExpr as Algebra.TermExpression;\n if (termExpr.term?.termType === 'Variable') {\n varName = termExpr.term.value;\n }\n }\n }\n }\n \n if (varName) {\n orderVarName = varName; // 保存原始变量名\n \n // 尝试直接映射(s/p/o/g)\n const termName = this.variableToTermName(varName);\n if (termName) {\n order = [termName];\n }\n // 如果直接映射失败,QuintQuerySource 会通过 pattern 分析来确定\n }\n }\n currentOp = orderBy.input;\n break;\n }\n\n case 'project':\n case 'distinct':\n case 'reduced': {\n currentOp = (currentOp as any).input;\n break;\n }\n\n case 'bgp': {\n const bgp = currentOp as Algebra.Bgp;\n if (bgp.patterns.length === 1) {\n return { limit, offset, order, orderVarName, reverse };\n }\n canPushLimit = false;\n return canPushLimit ? { limit, offset, order, orderVarName, reverse } : null;\n }\n\n case 'join':\n case 'leftjoin':\n case 'union':\n case 'minus':\n // 虽然不能下推 LIMIT,但仍然返回 ORDER BY 参数\n // 因为 OPTIONAL 优化路径会自己处理排序\n canPushLimit = false;\n if (orderVarName) {\n return { limit, offset, order, orderVarName, reverse };\n }\n return null;\n\n case 'filter':\n case 'extend':\n case 'group':\n // 同样,返回 ORDER BY 参数供 OPTIONAL 优化路径使用\n if (orderVarName) {\n return { limit, offset, order, orderVarName, reverse };\n }\n return null;\n\n default:\n return null;\n }\n }\n\n return null;\n }\n\n /**\n * Map SPARQL variable name to TermName\n */\n private variableToTermName(varName: string): TermName | null {\n const mapping: Record<string, TermName> = {\n 's': 'subject',\n 'subject': 'subject',\n 'p': 'predicate',\n 'predicate': 'predicate',\n 'o': 'object',\n 'object': 'object',\n 'g': 'graph',\n 'graph': 'graph',\n };\n return mapping[varName.toLowerCase()] ?? null;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ComunicaQuintEngine.js","sourceRoot":"","sources":["../../../src/storage/sparql/ComunicaQuintEngine.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * ComunicaQuintEngine - Comunica SPARQL engine backed by QuintStore\n * \n * Features:\n * 1. Query pushdown optimization (LIMIT/ORDER BY)\n * 2. FILTER pushdown via IQuerySource interface\n * 3. External filters for security boundaries (ACL)\n * 4. OPTIONAL optimization via QueryOptimizer\n * \n * Architecture:\n * - Uses QuintQuerySource (IQuerySource) for proper FILTER pushdown\n * - Uses QueryOptimizer for OPTIONAL and Compound Query optimization\n * - Comunica pushes FILTER operations down to sources that declare support\n * - QuintQuerySource extracts filters from algebra and applies them to QuintStore\n */\n\nimport { EventEmitter } from 'events';\nimport type { Quad, Term, Bindings, ResultStream } from '@rdfjs/types';\nimport type * as RDF from '@rdfjs/types';\nimport { QueryEngine } from '@comunica/query-sparql-rdfjs';\nimport { BindingsFactory } from '@comunica/utils-bindings-factory';\nimport { translate, type Algebra } from 'sparqlalgebrajs';\nimport { wrap } from 'asynciterator';\nimport { DataFactory } from 'rdf-data-factory';\n\nimport type { QuintStore, QuintPattern, QueryOptions, TermName, TermOperators } from '../quint/types';\nimport { QuintQuerySource } from './QuintQuerySource';\nimport { QueryOptimizer } from './QueryOptimizer';\nimport { SimpleSparqlExecutor } from './SimpleSparqlExecutor';\n\nexport interface ComunicaQuintEngineOptions {\n debug?: boolean;\n}\n\n/**\n * Security/ACL filters passed from upstream\n * These are applied unconditionally to restrict query scope\n */\nexport interface SecurityFilters {\n subject?: TermOperators;\n predicate?: TermOperators;\n object?: TermOperators;\n graph?: TermOperators;\n}\n\nexport interface QueryContext {\n sources?: unknown[];\n baseIRI?: string;\n /** Security filters for access control */\n filters?: SecurityFilters;\n [key: string]: unknown;\n}\n\n/**\n * Query analysis result (stateless)\n */\nexport interface QueryAnalysis {\n hasFilter: boolean;\n filterTypes: string[];\n pushdownable: string[];\n nonPushdownable: string[];\n estimatedPushdownRate: number;\n}\n\ninterface OptimizeParams {\n limit?: number;\n offset?: number;\n order?: TermName[];\n /** 原始 ORDER BY 变量名,用于在 QuintQuerySource 中分析绑定位置 */\n orderVarName?: string;\n reverse?: boolean;\n}\n\n// Context key names - must match Comunica's internal keys\nconst CONTEXT_KEY_QUERY_SOURCES = '@comunica/bus-query-operation:querySources';\n\nconst dataFactory = new DataFactory();\n\n/**\n * Custom RDF/JS Store backed by QuintStore\n * Used for UPDATE operations (INSERT/DELETE) which don't need FILTER pushdown\n */\nclass QuintRdfStore implements RDF.Store {\n constructor(\n private readonly store: QuintStore,\n private readonly getSecurityFilters: () => SecurityFilters | undefined,\n private readonly debug: boolean\n ) {}\n\n match(\n subject?: Term | null,\n predicate?: Term | null,\n object?: Term | null,\n graph?: Term | null\n ): RDF.Stream {\n // Build QuintPattern\n const pattern: QuintPattern = {};\n \n if (subject && subject.termType !== 'Variable') {\n pattern.subject = subject;\n }\n if (predicate && predicate.termType !== 'Variable') {\n pattern.predicate = predicate;\n }\n if (object && object.termType !== 'Variable') {\n pattern.object = object;\n }\n if (graph && graph.termType !== 'Variable' && graph.termType !== 'DefaultGraph') {\n pattern.graph = graph;\n }\n\n // Apply security filters (from upstream, e.g., ACL)\n const securityFilters = this.getSecurityFilters();\n if (securityFilters) {\n if (securityFilters.subject && !pattern.subject) {\n pattern.subject = securityFilters.subject;\n }\n if (securityFilters.predicate && !pattern.predicate) {\n pattern.predicate = securityFilters.predicate;\n }\n if (securityFilters.object && !pattern.object) {\n pattern.object = securityFilters.object;\n }\n if (securityFilters.graph && !pattern.graph) {\n pattern.graph = securityFilters.graph;\n }\n }\n\n if (this.debug) {\n console.log(`[QuintRdfStore] match() called`);\n console.log(` pattern:`, pattern);\n }\n\n // Use wrap to convert Promise<Array> to AsyncIterator\n const promiseIterator = wrap(this.store.get(pattern));\n return promiseIterator as any;\n }\n\n /**\n * Import quads from a stream (Sink interface)\n */\n import(stream: RDF.Stream<Quad>): EventEmitter {\n const emitter = new EventEmitter();\n \n const quads: Quad[] = [];\n let ended = false;\n \n // Handle data events\n stream.on('data', (quad: Quad) => {\n quads.push(quad);\n });\n \n const handleEnd = () => {\n if (ended) return;\n ended = true;\n if (quads.length > 0) {\n this.store.multiPut(quads as any[])\n .then(() => emitter.emit('end'))\n .catch((err) => emitter.emit('error', err));\n } else {\n emitter.emit('end');\n }\n };\n \n stream.on('end', handleEnd);\n stream.on('error', (err) => {\n emitter.emit('error', err);\n });\n \n // Handle already-ended streams (synchronous streams)\n // Use setImmediate to ensure we check after all synchronous data events\n setImmediate(() => {\n if ((stream as any).readableEnded || (stream as any).closed) {\n handleEnd();\n }\n });\n \n return emitter;\n }\n\n /**\n * Remove quads from a stream (Store interface)\n */\n remove(stream: RDF.Stream<Quad>): EventEmitter {\n const emitter = new EventEmitter();\n \n const deletePromises: Promise<number>[] = [];\n let ended = false;\n \n stream.on('data', (quad: Quad) => {\n const pattern: QuintPattern = {\n subject: quad.subject,\n predicate: quad.predicate,\n object: quad.object,\n };\n if (quad.graph && quad.graph.termType !== 'DefaultGraph') {\n pattern.graph = quad.graph;\n }\n deletePromises.push(this.store.del(pattern));\n });\n \n const handleEnd = () => {\n if (ended) return;\n ended = true;\n Promise.all(deletePromises)\n .then(() => emitter.emit('end'))\n .catch((err) => emitter.emit('error', err));\n };\n \n stream.on('end', handleEnd);\n stream.on('error', (err) => {\n emitter.emit('error', err);\n });\n \n // Handle already-ended streams (synchronous streams)\n setImmediate(() => {\n if ((stream as any).readableEnded || (stream as any).closed) {\n handleEnd();\n }\n });\n \n return emitter;\n }\n\n /**\n * Remove all matching quads (Store interface)\n */\n removeMatches(\n subject?: Term | null,\n predicate?: Term | null,\n object?: Term | null,\n graph?: Term | null\n ): EventEmitter {\n const emitter = new EventEmitter();\n \n if (this.debug) {\n console.log(`[QuintRdfStore] removeMatches()`, { subject, predicate, object, graph });\n }\n \n const pattern: QuintPattern = {};\n if (subject && subject.termType !== 'Variable') {\n pattern.subject = subject;\n }\n if (predicate && predicate.termType !== 'Variable') {\n pattern.predicate = predicate;\n }\n if (object && object.termType !== 'Variable') {\n pattern.object = object;\n }\n if (graph && graph.termType !== 'Variable' && graph.termType !== 'DefaultGraph') {\n pattern.graph = graph;\n }\n \n this.store.del(pattern)\n .then(() => emitter.emit('end'))\n .catch((err) => emitter.emit('error', err));\n \n return emitter;\n }\n\n /**\n * Delete a named graph (Store interface)\n */\n deleteGraph(graph: Term | string): EventEmitter {\n const emitter = new EventEmitter();\n \n const graphTerm = typeof graph === 'string' \n ? { termType: 'NamedNode' as const, value: graph }\n : graph;\n \n const pattern: QuintPattern = { graph: graphTerm as Term };\n \n this.store.del(pattern)\n .then(() => emitter.emit('end'))\n .catch((err) => emitter.emit('error', err));\n \n return emitter;\n }\n}\n\nexport class ComunicaQuintEngine {\n private readonly store: QuintStore;\n private readonly rdfStore: QuintRdfStore;\n private readonly querySource: QuintQuerySource;\n private readonly queryOptimizer: QueryOptimizer;\n private readonly simpleExecutor: SimpleSparqlExecutor;\n private readonly engine: QueryEngine;\n private readonly debug: boolean;\n private bindingsFactory: any;\n \n // Current query optimization params\n private currentOptimizeParams: OptimizeParams | null = null;\n // Current security filters (from upstream)\n private currentSecurityFilters: SecurityFilters | undefined;\n // Current query's FILTER expressions for pushdown\n private currentFilterExpressions: Map<string, Algebra.Expression> = new Map();\n\n constructor(store: QuintStore, options?: ComunicaQuintEngineOptions) {\n this.store = store;\n this.debug = options?.debug ?? false;\n \n // Create RdfStore for UPDATE operations\n this.rdfStore = new QuintRdfStore(\n store,\n () => this.currentSecurityFilters,\n this.debug\n );\n \n // Create BindingsFactory\n this.bindingsFactory = new (BindingsFactory as any)(dataFactory);\n \n // Create QuintQuerySource with IQuerySource interface for proper FILTER pushdown\n this.querySource = new QuintQuerySource(store, {\n debug: this.debug,\n bindingsFactory: this.bindingsFactory,\n getSecurityFilters: () => this.currentSecurityFilters,\n getOptimizeParams: () => this.currentOptimizeParams,\n getFilterExpression: (varName: string) => this.currentFilterExpressions.get(varName),\n });\n \n // Create QueryOptimizer for OPTIONAL and Compound Query optimization\n this.queryOptimizer = new QueryOptimizer(store, {\n debug: this.debug,\n bindingsFactory: this.bindingsFactory,\n });\n \n this.engine = new QueryEngine();\n }\n\n /**\n * Analyze a query's pushdown potential (stateless)\n * Returns analysis of what can/cannot be pushed down without executing the query\n */\n analyzeQuery(query: string): QueryAnalysis {\n const algebra = translate(query);\n return this.analyzeAlgebra(algebra);\n }\n\n /**\n * Analyze algebra tree for pushdown potential\n */\n private analyzeAlgebra(op: Algebra.Operation): QueryAnalysis {\n const result: QueryAnalysis = {\n hasFilter: false,\n filterTypes: [],\n pushdownable: [],\n nonPushdownable: [],\n estimatedPushdownRate: 1.0,\n };\n\n this.walkAlgebra(op, result);\n\n // Calculate pushdown rate\n const total = result.pushdownable.length + result.nonPushdownable.length;\n if (total > 0) {\n result.estimatedPushdownRate = result.pushdownable.length / total;\n }\n\n return result;\n }\n\n /**\n * Walk algebra tree and collect filter info\n */\n private walkAlgebra(op: Algebra.Operation, result: QueryAnalysis): void {\n if (op.type === 'filter') {\n result.hasFilter = true;\n const filterOp = op as Algebra.Filter;\n this.analyzeExpression(filterOp.expression, result);\n this.walkAlgebra(filterOp.input, result);\n } else if ('input' in op && op.input) {\n this.walkAlgebra(op.input as Algebra.Operation, result);\n }\n if ('left' in op && op.left) {\n this.walkAlgebra(op.left as Algebra.Operation, result);\n }\n if ('right' in op && op.right) {\n this.walkAlgebra(op.right as Algebra.Operation, result);\n }\n }\n\n /**\n * Analyze a filter expression\n */\n private analyzeExpression(expr: Algebra.Expression, result: QueryAnalysis): void {\n if (expr.expressionType === 'operator') {\n const opExpr = expr as Algebra.OperatorExpression;\n const op = opExpr.operator.toLowerCase();\n\n // Classify the operator\n if (['=', '!='].includes(op)) {\n result.filterTypes.push('equality');\n result.pushdownable.push(op);\n } else if (['<', '>', '<=', '>='].includes(op)) {\n result.filterTypes.push('range');\n result.pushdownable.push(op);\n } else if (['in', 'notin'].includes(op)) {\n result.filterTypes.push('equality');\n result.pushdownable.push(op);\n } else if (['strstarts', 'strends', 'contains', 'regex'].includes(op)) {\n result.filterTypes.push('string');\n result.pushdownable.push(op);\n } else if (op === 'bound') {\n result.filterTypes.push('bound');\n result.pushdownable.push(op);\n } else if (['isiri', 'isuri', 'isblank', 'isliteral', 'isnumeric'].includes(op)) {\n // Type checking functions - can be pushed down\n result.filterTypes.push('typecheck');\n result.pushdownable.push(op);\n } else if (op === 'langmatches') {\n // LANGMATCHES can be pushed down using $endsWith on serialized format\n result.filterTypes.push('language');\n result.pushdownable.push(op);\n } else if (['&&', '||', '!'].includes(op)) {\n result.filterTypes.push('logical');\n // Recurse into logical operators\n for (const arg of opExpr.args) {\n this.analyzeExpression(arg, result);\n }\n } else {\n // Non-pushdownable functions\n result.filterTypes.push('function');\n result.nonPushdownable.push(op);\n }\n } else if (expr.expressionType === 'existence') {\n result.filterTypes.push('exists');\n result.pushdownable.push('exists');\n }\n }\n\n /**\n * Execute SELECT query\n * Uses IQuerySource for proper FILTER pushdown\n * \n * OPTIONAL 优化:\n * 如果查询包含多个 OPTIONAL 且只是获取属性(不参与过滤),\n * 则先执行核心条件获取 subjects,再批量获取属性\n */\n async queryBindings(query: string, context?: QueryContext): Promise<ResultStream<Bindings>> {\n const params = this.extractOptimizeParams(query);\n this.currentOptimizeParams = params;\n this.currentSecurityFilters = context?.filters;\n \n // Extract FILTER expressions from the query for pushdown\n // Note: We don't clear these in finally because the stream is lazy-evaluated\n // and sub-queries may need access to filters after this function returns\n this.extractAndStoreFilters(query);\n \n if (this.debug) {\n console.log(`[ComunicaQuintEngine] Query optimization:`, this.currentOptimizeParams);\n console.log(`[ComunicaQuintEngine] Security filters:`, this.currentSecurityFilters);\n console.log(`[ComunicaQuintEngine] Filter expressions for pushdown:`, this.currentFilterExpressions.size);\n }\n\n // 尝试 OPTIONAL 优化(使用 QueryOptimizer)\n try {\n const algebra = translate(query, { quads: true });\n const optResult = this.queryOptimizer.analyzeQuery(algebra);\n \n if (optResult.type === 'optional' && optResult.analysis) {\n const optionalAnalysis = optResult.analysis as import('./QueryOptimizer').OptionalAnalysis;\n \n if (this.debug) {\n console.log(`[ComunicaQuintEngine] OPTIONAL optimization available:`, {\n subjectVar: optionalAnalysis.subjectVar,\n predicates: optionalAnalysis.optionalPredicates?.length,\n });\n }\n \n // 执行核心查询获取 subjects\n const coreBindings = await this.executeCoreQuery(optionalAnalysis.coreOperation!, context);\n \n // 使用 QueryOptimizer 执行优化查询(排序也在 QueryOptimizer 中处理)\n const orderOptions = params?.orderVarName \n ? { varName: params.orderVarName, reverse: params.reverse }\n : undefined;\n let results = await this.queryOptimizer.executeOptionalOptimized(\n optionalAnalysis, \n coreBindings,\n orderOptions\n );\n \n // 应用 LIMIT 和 OFFSET\n if (params?.offset || params?.limit) {\n const start = params.offset ?? 0;\n const end = params.limit ? start + params.limit : undefined;\n results = results.slice(start, end);\n }\n \n if (this.debug) {\n console.log(`[ComunicaQuintEngine] OPTIONAL optimized: ${results.length} results`);\n }\n \n const resultStream = wrap(Promise.resolve(results));\n return resultStream as ResultStream<Bindings>;\n }\n } catch (error) {\n if (this.debug) {\n console.log(`[ComunicaQuintEngine] OPTIONAL optimization failed, falling back:`, error);\n }\n }\n\n // Create context with pre-identified source to bypass source identification\n // This allows us to use our IQuerySource directly\n // IMPORTANT: Use plain object instead of ActionContext to avoid version mismatch\n // between the root @comunica/core and the one bundled with @comunica/query-sparql-rdfjs\n // The engine will convert it to ActionContext using its internal @comunica/core\n const { sources: _ignored, filters: _filters, ...restContext } = context || {};\n const queryContext = {\n ...restContext,\n // Set the identified sources directly - this skips ActorContextPreprocessQuerySourceIdentify\n [CONTEXT_KEY_QUERY_SOURCES]: [{ source: this.querySource }],\n };\n\n return await this.engine.queryBindings(query, queryContext as any);\n }\n\n /**\n * 执行核心查询(不含 OPTIONAL)\n */\n private async executeCoreQuery(\n coreOperation: Algebra.Operation,\n _context?: QueryContext\n ): Promise<Bindings[]> {\n const bindings: Bindings[] = [];\n const savedOptimizeParams = this.currentOptimizeParams;\n\n const mockContext = {\n get: <V>() => undefined as V | undefined,\n getSafe: <V>() => { throw new Error('Not implemented'); },\n has: () => false,\n };\n\n try {\n if (savedOptimizeParams) {\n this.currentOptimizeParams = {\n ...savedOptimizeParams,\n limit: undefined,\n offset: undefined,\n };\n }\n\n const stream = this.querySource.queryBindings(coreOperation, mockContext as any, undefined);\n\n for await (const binding of stream) {\n bindings.push(binding);\n }\n } finally {\n this.currentOptimizeParams = savedOptimizeParams;\n }\n\n return bindings;\n }\n\n /**\n * Extract FILTER expressions from query and store them for later pushdown\n * Maps variable names to their filter expressions\n */\n private extractAndStoreFilters(query: string): void {\n this.currentFilterExpressions.clear();\n \n try {\n const algebra = translate(query, { quads: true });\n this.collectFilterExpressions(algebra);\n } catch (error) {\n if (this.debug) {\n console.log(`[ComunicaQuintEngine] Failed to extract filters:`, error);\n }\n }\n }\n \n /**\n * Recursively collect FILTER expressions and their variable bindings\n */\n private collectFilterExpressions(op: Algebra.Operation): void {\n if (op.type === 'filter') {\n const filterOp = op as Algebra.Filter;\n const expression = filterOp.expression;\n \n // Extract variables from the expression\n const variables = this.getExpressionVariables(expression);\n \n // Store the expression for each variable\n for (const varName of variables) {\n // Merge with existing expressions for this variable\n const existing = this.currentFilterExpressions.get(varName);\n if (existing) {\n // Combine with AND\n this.currentFilterExpressions.set(varName, {\n type: 'expression',\n expressionType: 'operator',\n operator: '&&',\n args: [existing, expression],\n } as Algebra.OperatorExpression);\n } else {\n this.currentFilterExpressions.set(varName, expression);\n }\n }\n \n // Continue to nested operations\n this.collectFilterExpressions(filterOp.input);\n } else if ('input' in op && op.input) {\n if (Array.isArray(op.input)) {\n for (const child of op.input) {\n this.collectFilterExpressions(child as Algebra.Operation);\n }\n } else {\n this.collectFilterExpressions(op.input as Algebra.Operation);\n }\n }\n if ('left' in op && op.left) {\n this.collectFilterExpressions(op.left as Algebra.Operation);\n }\n if ('right' in op && op.right) {\n this.collectFilterExpressions(op.right as Algebra.Operation);\n }\n }\n \n /**\n * Get variable names from an expression\n */\n private getExpressionVariables(expr: Algebra.Expression): string[] {\n const variables: string[] = [];\n \n const collectVars = (e: Algebra.Expression): void => {\n if (e.expressionType === 'term') {\n const term = (e as Algebra.TermExpression).term;\n if (term.termType === 'Variable') {\n variables.push(term.value);\n }\n } else if (e.expressionType === 'operator') {\n const opExpr = e as Algebra.OperatorExpression;\n for (const arg of opExpr.args) {\n collectVars(arg);\n }\n }\n };\n \n collectVars(expr);\n return variables;\n }\n \n /**\n * Get the current filter expression for a variable (used by QuintQuerySource)\n */\n getFilterExpressionForVariable(varName: string): Algebra.Expression | undefined {\n return this.currentFilterExpressions.get(varName);\n }\n\n /**\n * Execute ASK query\n */\n async queryBoolean(query: string, context?: QueryContext): Promise<boolean> {\n const params = this.extractOptimizeParams(query);\n this.currentOptimizeParams = params;\n this.currentSecurityFilters = context?.filters;\n \n // Optimize ASK with limit=1\n if (!this.currentOptimizeParams) {\n this.currentOptimizeParams = { limit: 1 };\n } else if (this.currentOptimizeParams.limit === undefined) {\n this.currentOptimizeParams.limit = 1;\n }\n \n try {\n const { sources: _ignored, filters: _filters, ...restContext } = context || {};\n const queryContext = {\n ...restContext,\n [CONTEXT_KEY_QUERY_SOURCES]: [{ source: this.querySource }],\n };\n\n return await this.engine.queryBoolean(query, queryContext as any);\n } finally {\n this.currentOptimizeParams = null;\n this.currentSecurityFilters = undefined;\n }\n }\n\n /**\n * Execute CONSTRUCT/DESCRIBE query\n */\n async queryQuads(query: string, context?: QueryContext): Promise<ResultStream<Quad>> {\n console.log(`[ComunicaQuintEngine.queryQuads] Starting: ${query.slice(0, 100)}...`);\n const params = this.extractOptimizeParams(query);\n this.currentOptimizeParams = params;\n this.currentSecurityFilters = context?.filters;\n \n try {\n const start = Date.now();\n const { sources: _ignored, filters: _filters, ...restContext } = context || {};\n const queryContext = {\n ...restContext,\n [CONTEXT_KEY_QUERY_SOURCES]: [{ source: this.querySource }],\n };\n\n const result = await this.engine.queryQuads(query, queryContext as any);\n console.log(`[ComunicaQuintEngine.queryQuads] Completed in ${Date.now() - start}ms`);\n return result;\n } catch (err) {\n console.error(`[ComunicaQuintEngine.queryQuads] Failed:`, err);\n throw err;\n } finally {\n this.currentOptimizeParams = null;\n this.currentSecurityFilters = undefined;\n }\n }\n\n /**\n * Execute UPDATE query (INSERT/DELETE)\n * Uses RDF.Store interface since UPDATE doesn't need FILTER pushdown\n */\n async queryVoid(query: string, context?: QueryContext): Promise<void> {\n this.currentSecurityFilters = context?.filters;\n\n try {\n // Comunica does not properly await the RDF.Store remove() EventEmitter\n // before proceeding to the next operation. This causes DELETE WHERE to\n // complete after INSERT DATA, deleting newly inserted triples.\n // Fix: split compound updates and handle DELETE WHERE directly via QuintStore.\n const statements = this.splitUpdateStatements(query);\n for (const stmt of statements) {\n const deleteGraphUri = this.parseDeleteWhereGraph(stmt);\n if (deleteGraphUri) {\n // Execute DELETE WHERE directly via QuintStore.del()\n await this.store.del({ graph: { termType: 'NamedNode', value: deleteGraphUri } as any });\n } else {\n await this.engine.queryVoid(stmt, {\n sources: [this.rdfStore],\n ...context,\n } as any);\n }\n }\n } catch (err) {\n throw err;\n } finally {\n this.currentSecurityFilters = undefined;\n }\n }\n\n /**\n * Parse \"DELETE WHERE { GRAPH <uri> { ?s ?p ?o. } }\" and return the graph URI.\n * Returns null if the statement doesn't match this pattern.\n */\n private parseDeleteWhereGraph(stmt: string): string | null {\n const m = stmt.match(\n /^\\s*DELETE\\s+WHERE\\s*\\{\\s*GRAPH\\s*<([^>]+)>\\s*\\{\\s*\\?(\\w+)\\s+\\?(\\w+)\\s+\\?(\\w+)\\s*\\.?\\s*\\}\\s*\\}\\s*$/i\n );\n return m ? m[1] : null;\n }\n\n /**\n * Split a compound SPARQL UPDATE into individual statements.\n */\n private splitUpdateStatements(query: string): string[] {\n const statements: string[] = [];\n let depth = 0;\n let start = 0;\n\n for (let i = 0; i < query.length; i++) {\n if (query[i] === '{') depth++;\n else if (query[i] === '}') depth--;\n else if (query[i] === ';' && depth === 0) {\n const stmt = query.slice(start, i).trim();\n if (stmt) statements.push(stmt);\n start = i + 1;\n }\n }\n const last = query.slice(start).trim();\n if (last) statements.push(last);\n\n return statements;\n }\n\n /**\n * Extract optimization params from SPARQL query\n */\n private extractOptimizeParams(query: string): OptimizeParams | null {\n try {\n const algebra = translate(query, { quads: true });\n return this.extractOptimizeParamsFromAlgebra(algebra);\n } catch (error) {\n if (this.debug) {\n console.log(`[ComunicaQuintEngine] Failed to analyze query:`, error);\n }\n return null;\n }\n }\n\n /**\n * Extract optimization params from SPARQL algebra\n */\n private extractOptimizeParamsFromAlgebra(algebra: Algebra.Operation): OptimizeParams | null {\n let limit: number | undefined;\n let offset: number | undefined;\n let order: TermName[] | undefined;\n let orderVarName: string | undefined;\n let reverse: boolean | undefined;\n let currentOp = algebra;\n let canPushLimit = true;\n\n while (currentOp) {\n switch (currentOp.type) {\n case 'slice': {\n const slice = currentOp as Algebra.Slice;\n if (slice.length !== undefined) {\n limit = slice.length;\n }\n if (slice.start !== undefined) {\n offset = slice.start;\n }\n currentOp = slice.input;\n break;\n }\n \n case 'orderby': {\n const orderBy = currentOp as Algebra.OrderBy;\n if (orderBy.expressions.length === 1) {\n const expr = orderBy.expressions[0] as Algebra.Expression;\n \n // 提取变量名和排序方向\n // ORDER BY ?name: { expressionType: \"term\", term: { value: \"name\" } }\n // ORDER BY DESC(?name): { expressionType: \"operator\", operator: \"desc\", args: [{ expressionType: \"term\", term: {...} }] }\n let varName: string | undefined;\n reverse = false;\n \n if (expr.expressionType === 'term') {\n const termExpr = expr as Algebra.TermExpression;\n if (termExpr.term?.termType === 'Variable') {\n varName = termExpr.term.value;\n }\n } else if (expr.expressionType === 'operator') {\n const opExpr = expr as Algebra.OperatorExpression;\n if (opExpr.operator === 'desc' && opExpr.args.length === 1) {\n reverse = true;\n const innerExpr = opExpr.args[0] as Algebra.Expression;\n if (innerExpr.expressionType === 'term') {\n const termExpr = innerExpr as Algebra.TermExpression;\n if (termExpr.term?.termType === 'Variable') {\n varName = termExpr.term.value;\n }\n }\n } else if (opExpr.operator === 'asc' && opExpr.args.length === 1) {\n const innerExpr = opExpr.args[0] as Algebra.Expression;\n if (innerExpr.expressionType === 'term') {\n const termExpr = innerExpr as Algebra.TermExpression;\n if (termExpr.term?.termType === 'Variable') {\n varName = termExpr.term.value;\n }\n }\n }\n }\n \n if (varName) {\n orderVarName = varName; // 保存原始变量名\n \n // 尝试直接映射(s/p/o/g)\n const termName = this.variableToTermName(varName);\n if (termName) {\n order = [termName];\n }\n // 如果直接映射失败,QuintQuerySource 会通过 pattern 分析来确定\n }\n }\n currentOp = orderBy.input;\n break;\n }\n\n case 'project':\n case 'distinct':\n case 'reduced': {\n currentOp = (currentOp as any).input;\n break;\n }\n\n case 'bgp': {\n const bgp = currentOp as Algebra.Bgp;\n if (bgp.patterns.length === 1) {\n return { limit, offset, order, orderVarName, reverse };\n }\n canPushLimit = false;\n return canPushLimit ? { limit, offset, order, orderVarName, reverse } : null;\n }\n\n case 'join':\n case 'leftjoin':\n case 'union':\n case 'minus':\n // 虽然不能下推 LIMIT,但仍然返回 ORDER BY 参数\n // 因为 OPTIONAL 优化路径会自己处理排序\n canPushLimit = false;\n if (orderVarName) {\n return { limit, offset, order, orderVarName, reverse };\n }\n return null;\n\n case 'filter':\n case 'extend':\n case 'group':\n // 同样,返回 ORDER BY 参数供 OPTIONAL 优化路径使用\n if (orderVarName) {\n return { limit, offset, order, orderVarName, reverse };\n }\n return null;\n\n default:\n return null;\n }\n }\n\n return null;\n }\n\n /**\n * Map SPARQL variable name to TermName\n */\n private variableToTermName(varName: string): TermName | null {\n const mapping: Record<string, TermName> = {\n 's': 'subject',\n 'subject': 'subject',\n 'p': 'predicate',\n 'predicate': 'predicate',\n 'o': 'object',\n 'object': 'object',\n 'g': 'graph',\n 'graph': 'graph',\n };\n return mapping[varName.toLowerCase()] ?? null;\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@undefineds.co/xpod",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.16",
|
|
4
4
|
"description": "Xpod is an extended Community Solid Server, offering rich-feature, production-level Solid Pod and identity management.",
|
|
5
5
|
"repository": "https://github.com/undefinedsco/xpod",
|
|
6
6
|
"author": "developer@undefineds.co",
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import type { CommandModule } from 'yargs';
|
|
2
|
-
interface ConfigArgs {
|
|
3
|
-
url?: string;
|
|
4
|
-
}
|
|
5
|
-
/**
|
|
6
|
-
* Config 子命令:配置 Pod 中的 AI provider。
|
|
7
|
-
*
|
|
8
|
-
* 写入 Pod 的两个资源,与服务端 PodChatKitStore.getAiConfig() 对齐:
|
|
9
|
-
* /settings/providers/{provider}.ttl — Provider + optional Model
|
|
10
|
-
* /settings/credentials.ttl#cred-{provider} — Credential (apiKey, service=ai, status=active, provider link)
|
|
11
|
-
*
|
|
12
|
-
* 用法:
|
|
13
|
-
* xpod config set --provider openai --model gpt-4o --api-key sk-xxx
|
|
14
|
-
* xpod config set --api-key sk-new-key # 更新已有 provider 的 key
|
|
15
|
-
* xpod config show
|
|
16
|
-
* xpod config reset
|
|
17
|
-
*/
|
|
18
|
-
export declare const AI_NS: string;
|
|
19
|
-
export declare const CREDENTIAL_NS: string;
|
|
20
|
-
/** provider name → default baseUrl */
|
|
21
|
-
export declare const PROVIDER_BASE_URLS: Record<string, string>;
|
|
22
|
-
export declare function maskSecret(value: string): string;
|
|
23
|
-
export declare function credentialId(provider: string): string;
|
|
24
|
-
/**
|
|
25
|
-
* Build SPARQL UPDATE to upsert a Provider at /settings/providers/{id}.ttl
|
|
26
|
-
*/
|
|
27
|
-
export declare function buildProviderSparql(resourceUrl: string, providerId: string, fields?: {
|
|
28
|
-
model?: string;
|
|
29
|
-
}): string;
|
|
30
|
-
/**
|
|
31
|
-
* Build SPARQL UPDATE to upsert a Credential at /settings/credentials.ttl#cred-{provider}
|
|
32
|
-
*/
|
|
33
|
-
export declare function buildCredentialSparql(resourceUrl: string, podUrl: string, provider: string, fields: {
|
|
34
|
-
apiKey?: string;
|
|
35
|
-
model?: string;
|
|
36
|
-
}): string;
|
|
37
|
-
/**
|
|
38
|
-
* Build SPARQL UPDATE to delete a Credential
|
|
39
|
-
*/
|
|
40
|
-
export declare function buildResetSparql(resourceUrl: string, provider: string): string;
|
|
41
|
-
export declare const configCommand: CommandModule<object, ConfigArgs>;
|
|
42
|
-
export {};
|