@undefineds.co/xpod 0.3.24 → 0.3.26

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.
Files changed (89) hide show
  1. package/config/cloud.json +6 -5
  2. package/config/main.json +0 -3
  3. package/config/xpod.base.json +0 -32
  4. package/dist/api/container/index.js +3 -0
  5. package/dist/api/container/index.js.map +1 -1
  6. package/dist/api/container/routes.js +2 -0
  7. package/dist/api/container/routes.js.map +1 -1
  8. package/dist/api/container/types.d.ts +5 -0
  9. package/dist/api/container/types.js.map +1 -1
  10. package/dist/authorization/AuthMode.d.ts +8 -0
  11. package/dist/authorization/AuthMode.js +51 -0
  12. package/dist/authorization/AuthMode.js.map +1 -0
  13. package/dist/authorization/PodAuthorizationResources.d.ts +18 -0
  14. package/dist/authorization/PodAuthorizationResources.js +108 -0
  15. package/dist/authorization/PodAuthorizationResources.js.map +1 -0
  16. package/dist/cli/commands/start.js +11 -2
  17. package/dist/cli/commands/start.js.map +1 -1
  18. package/dist/components/components.jsonld +3 -2
  19. package/dist/components/context.jsonld +115 -14
  20. package/dist/index.d.ts +5 -3
  21. package/dist/index.js +6 -5
  22. package/dist/index.js.map +1 -1
  23. package/dist/main.js +11 -2
  24. package/dist/main.js.map +1 -1
  25. package/dist/provision/LocalPodProvisioningService.d.ts +6 -2
  26. package/dist/provision/LocalPodProvisioningService.js +36 -33
  27. package/dist/provision/LocalPodProvisioningService.js.map +1 -1
  28. package/dist/provision/LocalPodProvisioningService.jsonld +65 -8
  29. package/dist/runtime/XpodRuntime.js +0 -1
  30. package/dist/runtime/XpodRuntime.js.map +1 -1
  31. package/dist/runtime/bootstrap.d.ts +4 -2
  32. package/dist/runtime/bootstrap.js +82 -12
  33. package/dist/runtime/bootstrap.js.map +1 -1
  34. package/dist/runtime/css-process.d.ts +6 -1
  35. package/dist/runtime/css-process.js +55 -7
  36. package/dist/runtime/css-process.js.map +1 -1
  37. package/dist/runtime/lifecycle.d.ts +2 -3
  38. package/dist/runtime/lifecycle.js +2 -2
  39. package/dist/runtime/lifecycle.js.map +1 -1
  40. package/dist/runtime/runtime-types.d.ts +2 -1
  41. package/dist/runtime/runtime-types.js.map +1 -1
  42. package/dist/storage/accessors/SolidRdfDataAccessor.d.ts +2 -3
  43. package/dist/storage/accessors/SolidRdfDataAccessor.js +48 -42
  44. package/dist/storage/accessors/SolidRdfDataAccessor.js.map +1 -1
  45. package/dist/storage/accessors/SolidRdfDataAccessor.jsonld +1 -1
  46. package/dist/storage/keyvalue/BaseKeyValueStorage.d.ts +33 -0
  47. package/dist/storage/keyvalue/BaseKeyValueStorage.js +106 -0
  48. package/dist/storage/keyvalue/BaseKeyValueStorage.js.map +1 -0
  49. package/dist/storage/keyvalue/BaseKeyValueStorage.jsonld +177 -0
  50. package/dist/storage/keyvalue/PostgresKeyValueStorage.d.ts +9 -18
  51. package/dist/storage/keyvalue/PostgresKeyValueStorage.js +24 -96
  52. package/dist/storage/keyvalue/PostgresKeyValueStorage.js.map +1 -1
  53. package/dist/storage/keyvalue/PostgresKeyValueStorage.jsonld +15 -58
  54. package/dist/storage/keyvalue/SqliteKeyValueStorage.d.ts +9 -15
  55. package/dist/storage/keyvalue/SqliteKeyValueStorage.js +36 -104
  56. package/dist/storage/keyvalue/SqliteKeyValueStorage.js.map +1 -1
  57. package/dist/storage/keyvalue/SqliteKeyValueStorage.jsonld +21 -52
  58. package/dist/storage/quint/BaseQuintStore.d.ts +4 -1
  59. package/dist/storage/quint/BaseQuintStore.js +59 -46
  60. package/dist/storage/quint/BaseQuintStore.js.map +1 -1
  61. package/dist/storage/quint/PgQuintStore.d.ts +4 -3
  62. package/dist/storage/quint/PgQuintStore.js.map +1 -1
  63. package/dist/storage/quint/SqliteQuintStore.d.ts +43 -54
  64. package/dist/storage/quint/SqliteQuintStore.js +197 -520
  65. package/dist/storage/quint/SqliteQuintStore.js.map +1 -1
  66. package/dist/storage/quint/SqliteQuintStore.jsonld +38 -86
  67. package/dist/storage/rdf/PostgresRdfEngine.d.ts +118 -0
  68. package/dist/storage/rdf/PostgresRdfEngine.js +2609 -0
  69. package/dist/storage/rdf/PostgresRdfEngine.js.map +1 -0
  70. package/dist/storage/rdf/PostgresRdfEngine.jsonld +657 -0
  71. package/dist/storage/rdf/SolidRdfEngine.d.ts +2 -2
  72. package/dist/storage/rdf/SolidRdfEngine.js.map +1 -1
  73. package/dist/storage/rdf/SolidRdfEngine.jsonld +3 -0
  74. package/dist/storage/rdf/SolidRdfSparqlEngine.d.ts +3 -3
  75. package/dist/storage/rdf/SolidRdfSparqlEngine.js +20 -20
  76. package/dist/storage/rdf/SolidRdfSparqlEngine.js.map +1 -1
  77. package/dist/storage/rdf/SolidRdfSparqlEngine.jsonld +1 -1
  78. package/dist/storage/rdf/index.d.ts +2 -1
  79. package/dist/storage/rdf/index.js +3 -1
  80. package/dist/storage/rdf/index.js.map +1 -1
  81. package/dist/storage/rdf/types.d.ts +19 -0
  82. package/dist/storage/rdf/types.js.map +1 -1
  83. package/dist/storage/rdf/types.jsonld +115 -0
  84. package/package.json +2 -2
  85. package/config/runtime-open.json +0 -22
  86. package/dist/authorization/AuthModeSelector.d.ts +0 -10
  87. package/dist/authorization/AuthModeSelector.js +0 -27
  88. package/dist/authorization/AuthModeSelector.js.map +0 -1
  89. package/dist/authorization/AuthModeSelector.jsonld +0 -81
@@ -94,14 +94,9 @@ class BaseQuintStore extends types_1.QuintStore {
94
94
  // Query Operations
95
95
  // ============================================
96
96
  async get(pattern, options) {
97
- const patternDesc = Object.entries(pattern).map(([k, v]) => `${k}=${v ? 'set' : 'any'}`).join(',');
98
- console.log(`[BaseQuintStore.get] Starting: ${patternDesc}`);
99
97
  this.ensureOpen();
100
98
  const { sql, params } = this.buildSelectQuery(pattern, options);
101
- console.log(`[BaseQuintStore.get] SQL: ${sql.slice(0, 80)}...`);
102
- const start = Date.now();
103
99
  const rows = await this.executor.query(sql, params);
104
- console.log(`[BaseQuintStore.get] Completed in ${Date.now() - start}ms, got ${rows.length} rows`);
105
100
  return rows.map(row => this.rowToQuint(row));
106
101
  }
107
102
  match(subject, predicate, object, graph) {
@@ -466,47 +461,6 @@ class BaseQuintStore extends types_1.QuintStore {
466
461
  }
467
462
  return { sql, params };
468
463
  }
469
- addAliasedConditions(conditions, params, alias, pattern) {
470
- const addCond = (col, match, isObject) => {
471
- if (!match)
472
- return;
473
- if ((0, types_1.isTerm)(match)) {
474
- conditions.push(`${alias}.${col} = ?`);
475
- params.push(isObject ? (0, serialization_1.serializeObject)(match) : (0, serialization_1.termToId)(match));
476
- return;
477
- }
478
- const ops = match;
479
- if (ops.$eq !== undefined) {
480
- conditions.push(`${alias}.${col} = ?`);
481
- params.push(this.serializeOpValue(ops.$eq, isObject, '$eq'));
482
- }
483
- if (ops.$gt !== undefined) {
484
- conditions.push(`${alias}.${col} > ?`);
485
- params.push(this.serializeOpValue(ops.$gt, isObject, '$gt'));
486
- }
487
- if (ops.$gte !== undefined) {
488
- conditions.push(`${alias}.${col} >= ?`);
489
- params.push(this.serializeOpValue(ops.$gte, isObject, '$gte'));
490
- }
491
- if (ops.$lt !== undefined) {
492
- conditions.push(`${alias}.${col} < ?`);
493
- params.push(this.serializeOpValue(ops.$lt, isObject, '$lt'));
494
- }
495
- if (ops.$lte !== undefined) {
496
- conditions.push(`${alias}.${col} <= ?`);
497
- params.push(this.serializeOpValue(ops.$lte, isObject, '$lte'));
498
- }
499
- if (ops.$in !== undefined && ops.$in.length > 0) {
500
- const placeholders = ops.$in.map(() => '?').join(', ');
501
- conditions.push(`${alias}.${col} IN (${placeholders})`);
502
- params.push(...ops.$in.map(v => this.serializeOpValue(v, isObject, '$in')));
503
- }
504
- };
505
- addCond('graph', pattern.graph, false);
506
- addCond('subject', pattern.subject, false);
507
- addCond('predicate', pattern.predicate, false);
508
- addCond('object', pattern.object, true);
509
- }
510
464
  // ============================================
511
465
  // Serialization Helpers
512
466
  // ============================================
@@ -554,6 +508,65 @@ class BaseQuintStore extends types_1.QuintStore {
554
508
  }
555
509
  return n3_1.DataFactory.namedNode(value);
556
510
  }
511
+ resolveObjectDataTypeForPattern(_pattern) {
512
+ return undefined;
513
+ }
514
+ extractExactPredicate(match) {
515
+ if (!match)
516
+ return undefined;
517
+ if (typeof match === 'object' && 'termType' in match) {
518
+ return (0, serialization_1.termToId)(match);
519
+ }
520
+ const ops = match;
521
+ if (ops.$eq !== undefined) {
522
+ return String(this.serializeOpValue(ops.$eq, false, '$eq'));
523
+ }
524
+ return undefined;
525
+ }
526
+ addTermConditions(conditions, params, column, match, isObject) {
527
+ this.addConditions(conditions, params, column, match, isObject);
528
+ }
529
+ addAliasedConditions(conditions, params, alias, pattern) {
530
+ const addCond = (col, match, isObject) => {
531
+ if (!match)
532
+ return;
533
+ if ((0, types_1.isTerm)(match)) {
534
+ conditions.push(`${alias}.${col} = ?`);
535
+ params.push(isObject ? (0, serialization_1.serializeObject)(match) : (0, serialization_1.termToId)(match));
536
+ return;
537
+ }
538
+ const ops = match;
539
+ if (ops.$eq !== undefined) {
540
+ conditions.push(`${alias}.${col} = ?`);
541
+ params.push(this.serializeOpValue(ops.$eq, isObject, '$eq'));
542
+ }
543
+ if (ops.$gt !== undefined) {
544
+ conditions.push(`${alias}.${col} > ?`);
545
+ params.push(this.serializeOpValue(ops.$gt, isObject, '$gt'));
546
+ }
547
+ if (ops.$gte !== undefined) {
548
+ conditions.push(`${alias}.${col} >= ?`);
549
+ params.push(this.serializeOpValue(ops.$gte, isObject, '$gte'));
550
+ }
551
+ if (ops.$lt !== undefined) {
552
+ conditions.push(`${alias}.${col} < ?`);
553
+ params.push(this.serializeOpValue(ops.$lt, isObject, '$lt'));
554
+ }
555
+ if (ops.$lte !== undefined) {
556
+ conditions.push(`${alias}.${col} <= ?`);
557
+ params.push(this.serializeOpValue(ops.$lte, isObject, '$lte'));
558
+ }
559
+ if (ops.$in !== undefined && ops.$in.length > 0) {
560
+ const placeholders = ops.$in.map(() => '?').join(', ');
561
+ conditions.push(`${alias}.${col} IN (${placeholders})`);
562
+ params.push(...ops.$in.map(v => this.serializeOpValue(v, isObject, '$in')));
563
+ }
564
+ };
565
+ addCond('graph', pattern.graph, false);
566
+ addCond('subject', pattern.subject, false);
567
+ addCond('predicate', pattern.predicate, false);
568
+ addCond('object', pattern.object, true);
569
+ }
557
570
  }
558
571
  exports.BaseQuintStore = BaseQuintStore;
559
572
  //# sourceMappingURL=BaseQuintStore.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BaseQuintStore.js","sourceRoot":"","sources":["../../../src/storage/quint/BaseQuintStore.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;;AAEH,iDAAoD;AACpD,2BAAiC;AAGjC,mDAQyB;AAczB,mCAA6C;AAwB7C,MAAsB,cAAe,SAAQ,kBAAU;IAMrD,YAAY,OAA0B;QACpC,KAAK,EAAE,CAAC;QALA,aAAQ,GAAuB,IAAI,CAAC;QACpC,WAAM,GAAG,KAAK,CAAC;QACf,YAAO,GAAyB,IAAI,CAAC;QAI7C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IASD,+CAA+C;IAC/C,YAAY;IACZ,+CAA+C;IAE/C,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;YAC5C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACtB,CAAC,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,OAAO,CAAC;IACrB,CAAC;IAES,KAAK,CAAC,QAAQ;QACtB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC7C,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAEzB,IAAI,CAAC;YACH,SAAS;YACT,MAAM,QAAQ,CAAC,IAAI,CAAC;;;;;;;;;OASnB,CAAC,CAAC;YAEH,2BAA2B;YAC3B,MAAM,OAAO,GAAG;gBACd,mFAAmF;gBACnF,mFAAmF;gBACnF,mFAAmF;gBACnF,mFAAmF;gBACnF,mFAAmF;gBACnF,mFAAmF;aACpF,CAAC;YAEF,KAAK,MAAM,QAAQ,IAAI,OAAO,EAAE,CAAC;gBAC/B,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAChC,CAAC;YACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACrB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAC3C,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAC/B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YACvB,CAAC;YACD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;YACpB,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACrC,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;YAC3B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACvB,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACtB,CAAC;IAES,UAAU;QAClB,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAED,+CAA+C;IAC/C,mBAAmB;IACnB,+CAA+C;IAE/C,KAAK,CAAC,GAAG,CAAC,OAAqB,EAAE,OAAsB;QACrD,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnG,OAAO,CAAC,GAAG,CAAC,kCAAkC,WAAW,EAAE,CAAC,CAAC;QAC7D,IAAI,CAAC,UAAU,EAAE,CAAC;QAElB,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,6BAA6B,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;QAChE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAS,CAAC,KAAK,CAAW,GAAG,EAAE,MAAM,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,qCAAqC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,WAAW,IAAI,CAAC,MAAM,OAAO,CAAC,CAAC;QAElG,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CACH,OAAqB,EACrB,SAAuB,EACvB,MAAoB,EACpB,KAAmB;QAEnB,MAAM,OAAO,GAAiB,EAAE,CAAC;QACjC,IAAI,OAAO,IAAI,OAAO,CAAC,QAAQ,KAAK,UAAU;YAAE,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;QAC1E,IAAI,SAAS,IAAI,SAAS,CAAC,QAAQ,KAAK,UAAU;YAAE,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;QAClF,IAAI,MAAM,IAAI,MAAM,CAAC,QAAQ,KAAK,UAAU;YAAE,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;QACtE,IAAI,KAAK,IAAI,KAAK,CAAC,QAAQ,KAAK,UAAU,IAAI,KAAK,CAAC,QAAQ,KAAK,cAAc,EAAE,CAAC;YAChF,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;QACxB,CAAC;QAED,OAAO,IAAA,oBAAI,EAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,MAAc,EAAE,OAAsB;QAC3D,IAAI,CAAC,UAAU,EAAE,CAAC;QAElB,IAAI,GAAG,GAAG,qDAAqD,CAAC;QAChE,MAAM,MAAM,GAAU,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAC;QAElD,IAAI,OAAO,EAAE,KAAK,EAAE,CAAC;YACnB,GAAG,IAAI,UAAU,CAAC;YAClB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;QACD,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;YACpB,GAAG,IAAI,WAAW,CAAC;YACnB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAS,CAAC,KAAK,CAAW,GAAG,EAAE,MAAM,CAAC,CAAC;QAC/D,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,OAAqB;QAC/B,IAAI,CAAC,UAAU,EAAE,CAAC;QAElB,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAC/D,MAAM,GAAG,GAAG,uCAAuC,WAAW,EAAE,CAAC;QAEjE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAS,CAAC,KAAK,CAAoB,GAAG,EAAE,MAAM,CAAC,CAAC;QACxE,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED,+CAA+C;IAC/C,4BAA4B;IAC5B,+CAA+C;IAEtC,KAAK,CAAC,WAAW,CAAC,QAAyB,EAAE,OAAsB;QAC1E,IAAI,CAAC,UAAU,EAAE,CAAC;QAElB,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC;QAE9C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YACnD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACrB,SAAS,EAAE,IAAA,wBAAQ,EAAE,CAAS,CAAC,MAAM,CAAC,CAAC;gBACvC,QAAQ,EAAE,EAAE;gBACZ,KAAK,EAAE,CAAC,CAAC,CAAC;aACX,CAAC,CAAC,CAAC;QACN,CAAC;QAED,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAEnE,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,gCAAgC,EAAE,GAAG,CAAC,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,MAAM,CAAC,CAAC;QAClD,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAS,CAAC,KAAK,CAAyB,GAAG,EAAE,MAAM,CAAC,CAAC;QAE7E,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YACpB,MAAM,QAAQ,GAA2B,EAAE,CAAC;YAE5C,IAAI,MAAM,EAAE,CAAC;gBACX,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;oBACvB,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;gBACnC,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;oBACnC,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;wBACzB,QAAQ,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;oBAC3B,CAAC;gBACH,CAAC;YACH,CAAC;YAED,OAAO;gBACL,SAAS,EAAE,GAAG,CAAC,UAAU;gBACzB,QAAQ;aACT,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED,+CAA+C;IAC/C,qDAAqD;IACrD,+CAA+C;IAEtC,KAAK,CAAC,aAAa,CAC1B,QAAkB,EAClB,UAAoB,EACpB,KAAY;QAEZ,IAAI,CAAC,UAAU,EAAE,CAAC;QAElB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrD,OAAO,IAAI,GAAG,EAAE,CAAC;QACnB,CAAC;QAED,eAAe;QACf,MAAM,mBAAmB,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/D,MAAM,qBAAqB,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEnE,IAAI,GAAG,GAAG,mEAAmE,mBAAmB,uBAAuB,qBAAqB,GAAG,CAAC;QAChJ,MAAM,MAAM,GAAU,CAAC,GAAG,QAAQ,EAAE,GAAG,UAAU,CAAC,CAAC;QAEnD,IAAI,KAAK,IAAI,KAAK,CAAC,QAAQ,KAAK,cAAc,EAAE,CAAC;YAC/C,GAAG,IAAI,gBAAgB,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC,IAAA,wBAAQ,EAAC,KAAY,CAAC,CAAC,CAAC;QACtC,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,qCAAqC,EAAE,GAAG,CAAC,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,CAAC,MAAM,EAAE,aAAa,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QACzH,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAS,CAAC,KAAK,CAAyD,GAAG,EAAE,MAAM,CAAC,CAAC;QAE7G,WAAW;QACX,MAAM,MAAM,GAAiB,IAAI,GAAG,EAAE,CAAC;QAEvC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC7B,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;YACrC,CAAC;YACD,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC;YAE9C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBACrC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YACtC,CAAC;YAED,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACtD,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,yCAAyC,EAAE,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAClF,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,+CAA+C;IAC/C,mBAAmB;IACnB,+CAA+C;IAE/C,KAAK,CAAC,GAAG,CAAC,KAAY;QACpB,IAAI,CAAC,UAAU,EAAE,CAAC;QAElB,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAEnC,0EAA0E;QAC1E,iDAAiD;QACjD,MAAM,GAAG,GAAG,kGAAkG,CAAC;QAC/G,MAAM,IAAI,CAAC,QAAS,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IACrG,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,SAAkB;QAC/B,IAAI,CAAC,UAAU,EAAE,CAAC;QAElB,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAEnC,MAAM,UAAU,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;YACvC,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACnC,OAAO;gBACL,GAAG,EAAE,kGAAkG;gBACvG,MAAM,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC;aACxE,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,QAAS,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,OAAqB,EAAE,SAAmB;QAC9D,IAAI,CAAC,UAAU,EAAE,CAAC;QAElB,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAC/D,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAE7C,MAAM,GAAG,GAAG,+BAA+B,WAAW,EAAE,CAAC;QACzD,OAAO,MAAM,IAAI,CAAC,QAAS,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;IACpE,CAAC;IAED,+CAA+C;IAC/C,oBAAoB;IACpB,+CAA+C;IAE/C,KAAK,CAAC,GAAG,CAAC,OAAqB;QAC7B,IAAI,CAAC,UAAU,EAAE,CAAC;QAElB,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAC/D,MAAM,GAAG,GAAG,qBAAqB,WAAW,EAAE,CAAC;QAE/C,OAAO,MAAM,IAAI,CAAC,QAAS,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,SAAkB;QAC/B,IAAI,CAAC,UAAU,EAAE,CAAC;QAElB,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAEnC,MAAM,UAAU,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;YACvC,MAAM,CAAC,GAAG,IAAA,wBAAQ,EAAC,KAAK,CAAC,KAAY,CAAC,CAAC;YACvC,MAAM,CAAC,GAAG,IAAA,wBAAQ,EAAC,KAAK,CAAC,OAAc,CAAC,CAAC;YACzC,MAAM,CAAC,GAAG,IAAA,wBAAQ,EAAC,KAAK,CAAC,SAAgB,CAAC,CAAC;YAC3C,MAAM,CAAC,GAAG,IAAA,+BAAe,EAAC,KAAK,CAAC,MAAa,CAAC,CAAC;YAE/C,OAAO;gBACL,GAAG,EAAE,qFAAqF;gBAC1F,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;aACrB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,QAAS,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;IACxD,CAAC;IAED,+CAA+C;IAC/C,QAAQ;IACR,+CAA+C;IAE/C,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,UAAU,EAAE,CAAC;QAElB,MAAM,CAAC,WAAW,EAAE,YAAY,EAAE,WAAW,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACjE,IAAI,CAAC,QAAS,CAAC,KAAK,CAAoB,sCAAsC,CAAC;YAC/E,IAAI,CAAC,QAAS,CAAC,KAAK,CAAoB,+DAA+D,CAAC;YACxG,IAAI,CAAC,QAAS,CAAC,KAAK,CAAoB,mDAAmD,CAAC;SAC7F,CAAC,CAAC;QAEH,OAAO;YACL,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;YACtC,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;YACxC,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;SACvC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,MAAM,IAAI,CAAC,QAAS,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACrD,CAAC;IAED,+CAA+C;IAC/C,uBAAuB;IACvB,+CAA+C;IAErC,gBAAgB,CAAC,OAAqB,EAAE,OAAsB;QACtE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAE/D,IAAI,GAAG,GAAG,uBAAuB,WAAW,EAAE,CAAC;QAE/C,IAAI,OAAO,EAAE,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/C,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3C,GAAG,IAAI,aAAa,SAAS,EAAE,CAAC;YAChC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpB,GAAG,IAAI,OAAO,CAAC;YACjB,CAAC;QACH,CAAC;QAED,IAAI,OAAO,EAAE,KAAK,EAAE,CAAC;YACnB,GAAG,IAAI,UAAU,CAAC;YAClB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;QAED,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;YACpB,GAAG,IAAI,WAAW,CAAC;YACnB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;QAED,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;IACzB,CAAC;IAES,gBAAgB,CAAC,OAAqB;QAC9C,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,MAAM,MAAM,GAAU,EAAE,CAAC;QAEzB,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACtE,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC1E,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC9E,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAEvE,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtF,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;IACjC,CAAC;IAES,aAAa,CACrB,UAAoB,EACpB,MAAa,EACb,MAAc,EACd,KAA4B,EAC5B,QAAiB;QAEjB,IAAI,CAAC,KAAK;YAAE,OAAO;QAEnB,IAAI,IAAA,cAAM,EAAC,KAAK,CAAC,EAAE,CAAC;YAClB,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,MAAM,CAAC,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAA,+BAAe,EAAC,KAAY,CAAC,CAAC,CAAC,CAAC,IAAA,wBAAQ,EAAC,KAAY,CAAC,CAAC,CAAC;YAC/E,OAAO;QACT,CAAC;QAED,MAAM,GAAG,GAAG,KAAsB,CAAC;QAEnC,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YAC1B,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,MAAM,CAAC,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;QAC/D,CAAC;QACD,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YAC1B,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,OAAO,CAAC,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;QAC/D,CAAC;QACD,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YAC1B,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,MAAM,CAAC,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;QAC/D,CAAC;QACD,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC3B,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,OAAO,CAAC,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YAC1B,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,MAAM,CAAC,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;QAC/D,CAAC;QACD,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC3B,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,OAAO,CAAC,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChD,MAAM,YAAY,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvD,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,QAAQ,YAAY,GAAG,CAAC,CAAC;YAClD,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QAC9E,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtD,MAAM,YAAY,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1D,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,YAAY,YAAY,GAAG,CAAC,CAAC;YACtD,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;QACpF,CAAC;QACD,IAAI,GAAG,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YAClC,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,aAAa,MAAM,MAAM,CAAC,CAAC;YACpD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,WAAW,GAAG,QAAQ,CAAC,CAAC;QAC3D,CAAC;QACD,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YAChC,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,SAAS,CAAC,CAAC;YACpC,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;QACnC,CAAC;QACD,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YAChC,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,SAAS,CAAC,CAAC;YACpC,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC;QACpC,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC7B,oCAAoC;YACpC,kBAAkB;YAClB,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YACrE,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,SAAS,CAAC,CAAC;YACpC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;QACD,IAAI,GAAG,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YACzB,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,UAAU,CAAC,CAAC;QACvC,CAAC;QACD,IAAI,GAAG,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YAC1B,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,cAAc,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAES,gBAAgB,CAAC,KAAoB,EAAE,QAAiB,EAAE,QAAgB;QAClF,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,UAAU,IAAI,KAAK,EAAE,CAAC;YACrD,OAAO,QAAQ,CAAC,CAAC,CAAC,IAAA,+BAAe,EAAC,KAAY,CAAC,CAAC,CAAC,CAAC,IAAA,wBAAQ,EAAC,KAAY,CAAC,CAAC;QAC3E,CAAC;QAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,QAAQ,KAAK,KAAK,IAAI,QAAQ,KAAK,KAAK,IAAI,QAAQ,KAAK,KAAK,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;oBAC5F,MAAM,GAAG,GAAG,gBAAW,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,gBAAW,CAAC,SAAS,CAAC,0CAA0C,CAAC,CAAC,CAAC;oBAClH,OAAO,IAAA,+BAAe,EAAC,GAAG,CAAC,CAAC;gBAC9B,CAAC;gBACD,MAAM,OAAO,GAAG,IAAI,mBAAG,GAAG,IAAA,wBAAQ,EAAC,KAAK,CAAC,EAAE,CAAC;gBAC5C,IAAI,QAAQ,KAAK,KAAK,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;oBAC9C,OAAO,OAAO,GAAG,mBAAG,GAAG,QAAQ,CAAC;gBAClC,CAAC;gBACD,OAAO,OAAO,CAAC;YACjB,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,QAAQ,IAAI,CAAC,IAAA,uCAAuB,EAAC,KAAK,CAAC,EAAE,CAAC;YAChD,OAAO,IAAI,KAAK,GAAG,CAAC;QACtB,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAES,kBAAkB,CAAC,QAAyB,EAAE,OAAsB;QAC5E,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC;QAC9C,MAAM,MAAM,GAAU,EAAE,CAAC;QAEzB,YAAY;QACZ,IAAI,YAAY,GAAG,MAAM,MAAM,gBAAgB,CAAC;QAEhD,IAAI,MAAM,EAAE,CAAC;YACX,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;gBACvB,YAAY,IAAI,MAAM,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC;YAC7D,CAAC;QACH,CAAC;aAAM,CAAC;YACN,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACzC,YAAY,IAAI,MAAM,CAAC,eAAe,CAAC,SAAS,CAAC;gBACjD,YAAY,IAAI,MAAM,CAAC,kBAAkB,CAAC,YAAY,CAAC;YACzD,CAAC;QACH,CAAC;QAED,gBAAgB;QAChB,IAAI,UAAU,GAAG,WAAW,CAAC;QAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,UAAU,IAAI,iBAAiB,CAAC,UAAU,MAAM,OAAO,CAAC,IAAI,MAAM,EAAE,CAAC;YACrE,UAAU,IAAI,oBAAoB,CAAC,QAAQ,CAAC;QAC9C,CAAC;QAED,WAAW;QACX,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC;YAEtB,IAAI,CAAC,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QAChE,CAAC;QAED,IAAI,GAAG,GAAG,UAAU,YAAY,SAAS,UAAU,EAAE,CAAC;QAEtD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,GAAG,IAAI,UAAU,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9C,CAAC;QAED,IAAI,OAAO,EAAE,KAAK,EAAE,CAAC;YACnB,GAAG,IAAI,UAAU,CAAC;YAClB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;QACD,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;YACpB,GAAG,IAAI,WAAW,CAAC;YACnB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;QAED,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;IACzB,CAAC;IAES,oBAAoB,CAC5B,UAAoB,EACpB,MAAa,EACb,KAAa,EACb,OAAqB;QAErB,MAAM,OAAO,GAAG,CAAC,GAAW,EAAE,KAA4B,EAAE,QAAiB,EAAE,EAAE;YAC/E,IAAI,CAAC,KAAK;gBAAE,OAAO;YAEnB,IAAI,IAAA,cAAM,EAAC,KAAK,CAAC,EAAE,CAAC;gBAClB,UAAU,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,GAAG,MAAM,CAAC,CAAC;gBACvC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAA,+BAAe,EAAC,KAAY,CAAC,CAAC,CAAC,CAAC,IAAA,wBAAQ,EAAC,KAAY,CAAC,CAAC,CAAC;gBAC/E,OAAO;YACT,CAAC;YAED,MAAM,GAAG,GAAG,KAAsB,CAAC;YAEnC,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;gBAC1B,UAAU,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,GAAG,MAAM,CAAC,CAAC;gBACvC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;YAC/D,CAAC;YACD,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;gBAC1B,UAAU,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,GAAG,MAAM,CAAC,CAAC;gBACvC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;YAC/D,CAAC;YACD,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC3B,UAAU,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,GAAG,OAAO,CAAC,CAAC;gBACxC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;YACjE,CAAC;YACD,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;gBAC1B,UAAU,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,GAAG,MAAM,CAAC,CAAC;gBACvC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;YAC/D,CAAC;YACD,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC3B,UAAU,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,GAAG,OAAO,CAAC,CAAC;gBACxC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;YACjE,CAAC;YACD,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChD,MAAM,YAAY,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACvD,UAAU,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,GAAG,QAAQ,YAAY,GAAG,CAAC,CAAC;gBACxD,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;YAC9E,CAAC;QACH,CAAC,CAAC;QAEF,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACvC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC3C,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC/C,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC1C,CAAC;IAED,+CAA+C;IAC/C,wBAAwB;IACxB,+CAA+C;IAErC,UAAU,CAAC,KAAY;QAC/B,OAAO;YACL,KAAK,EAAE,IAAA,wBAAQ,EAAC,KAAK,CAAC,KAAY,CAAC;YACnC,OAAO,EAAE,IAAA,wBAAQ,EAAC,KAAK,CAAC,OAAc,CAAC;YACvC,SAAS,EAAE,IAAA,wBAAQ,EAAC,KAAK,CAAC,SAAgB,CAAC;YAC3C,MAAM,EAAE,IAAA,+BAAe,EAAC,KAAK,CAAC,MAAa,CAAC;YAC5C,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI;SAC3D,CAAC;IACJ,CAAC;IAES,UAAU,CAAC,GAAa;QAChC,MAAM,IAAI,GAAG,IAAA,yBAAS,EAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,KAAK,GAAU,IAAa,CAAC;QACnC,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,KAAK,CAAC,MAAM,GAAG,IAAA,2BAAW,EAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACzC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAES,iBAAiB,CAAC,KAAa;QACvC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;YACzE,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC;gBAC1C,IAAI,IAAI,EAAE,CAAC;oBACT,OAAO,gBAAW,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBAC5C,CAAC;gBACD,IAAI,QAAQ,EAAE,CAAC;oBACb,OAAO,gBAAW,CAAC,OAAO,CAAC,OAAO,EAAE,gBAAW,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACvE,CAAC;gBACD,OAAO,gBAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;QAED,IAAI,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAChC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACpC,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC1B,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC/B,OAAO,gBAAW,CAAC,OAAO,CAAC,aAAa,EAAE,gBAAW,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC7E,CAAC;QAED,IAAI,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAChC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACpC,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC/B,OAAO,gBAAW,CAAC,OAAO,CAAC,aAAa,EAAE,gBAAW,CAAC,SAAS,CAAC,2CAA2C,CAAC,CAAC,CAAC;QAChH,CAAC;QAED,OAAO,gBAAW,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;CACF;AA7pBD,wCA6pBC","sourcesContent":["/**\n * BaseQuintStore - 统一的 QuintStore 抽象基类\n * \n * 支持:\n * - SQLite (via pluggable SQLite runtime + drizzle-orm)\n * - PGLite (via @electric-sql/pglite + drizzle-orm)\n * - PostgreSQL (via pg + drizzle-orm) - 未来\n * \n * 设计:\n * - 所有 SQL 逻辑在基类中实现\n * - 子类只负责创建数据库连接和执行原生 SQL\n */\n\nimport { wrap, AsyncIterator } from 'asynciterator';\nimport { DataFactory } from 'n3';\nimport type { Term, Quad } from '@rdfjs/types';\n\nimport { \n rowToQuad, \n parseVector,\n termToId,\n serializeObject,\n fpEncode,\n SEP,\n isSerializedObjectValue,\n} from './serialization';\nimport type {\n Quint,\n QuintPattern,\n QuintStoreOptions,\n QueryOptions,\n StoreStats,\n TermMatch,\n TermOperators,\n CompoundPattern,\n CompoundResult,\n OperatorValue,\n AttributeMap,\n} from './types';\nimport { isTerm, QuintStore } from './types';\n\nexport interface QuintRow {\n graph: string;\n subject: string;\n predicate: string;\n object: string;\n vector: string | null;\n}\n\n/**\n * SQL 执行器接口 - 子类实现\n */\nexport interface SqlExecutor {\n /** 执行查询,返回行数组 */\n query<T = any>(sql: string, params?: any[]): Promise<T[]>;\n /** 执行更新,返回影响行数 */\n execute(sql: string, params?: any[]): Promise<number>;\n /** 执行多条语句(事务内) */\n executeInTransaction(statements: { sql: string; params?: any[] }[]): Promise<void>;\n /** 执行原生 SQL(建表等) */\n exec(sql: string): Promise<void>;\n}\n\nexport abstract class BaseQuintStore extends QuintStore {\n protected options: QuintStoreOptions;\n protected executor: SqlExecutor | null = null;\n protected opened = false;\n protected opening: Promise<void> | null = null;\n\n constructor(options: QuintStoreOptions) {\n super();\n this.options = options;\n }\n\n // ============================================\n // 抽象方法 - 子类实现\n // ============================================\n\n protected abstract createExecutor(): Promise<SqlExecutor>;\n protected abstract closeExecutor(): Promise<void>;\n\n // ============================================\n // Lifecycle\n // ============================================\n\n async open(): Promise<void> {\n if (this.opened) {\n return;\n }\n\n this.opening ??= this.openOnce().finally(() => {\n this.opening = null;\n });\n\n await this.opening;\n }\n\n protected async openOnce(): Promise<void> {\n const executor = await this.createExecutor();\n this.executor = executor;\n\n try {\n // 创建表和索引\n await executor.exec(`\n CREATE TABLE IF NOT EXISTS quints (\n graph TEXT NOT NULL,\n subject TEXT NOT NULL,\n predicate TEXT NOT NULL,\n object TEXT NOT NULL,\n vector TEXT,\n PRIMARY KEY (graph, subject, predicate, object)\n )\n `);\n\n // 创建索引(分开执行,避免某些数据库不支持多语句)\n const indexes = [\n 'CREATE INDEX IF NOT EXISTS idx_spog ON quints (subject, predicate, object, graph)',\n 'CREATE INDEX IF NOT EXISTS idx_ogsp ON quints (object, graph, subject, predicate)',\n 'CREATE INDEX IF NOT EXISTS idx_gspo ON quints (graph, subject, predicate, object)',\n 'CREATE INDEX IF NOT EXISTS idx_sopg ON quints (subject, object, predicate, graph)',\n 'CREATE INDEX IF NOT EXISTS idx_pogs ON quints (predicate, object, graph, subject)',\n 'CREATE INDEX IF NOT EXISTS idx_gpos ON quints (graph, predicate, object, subject)',\n ];\n\n for (const indexSql of indexes) {\n await executor.exec(indexSql);\n }\n this.opened = true;\n } catch (error) {\n await this.closeExecutor().catch(() => {});\n if (this.executor === executor) {\n this.executor = null;\n }\n this.opened = false;\n throw error;\n }\n }\n\n async close(): Promise<void> {\n if (this.opening) {\n await this.opening.catch(() => {});\n }\n if (this.executor) {\n await this.closeExecutor();\n this.executor = null;\n }\n this.opened = false;\n }\n\n protected ensureOpen(): void {\n if (!this.opened || !this.executor) {\n throw new Error('Store not open. Call open() first.');\n }\n }\n\n // ============================================\n // Query Operations\n // ============================================\n\n async get(pattern: QuintPattern, options?: QueryOptions): Promise<Quint[]> {\n const patternDesc = Object.entries(pattern).map(([k, v]) => `${k}=${v ? 'set' : 'any'}`).join(',');\n console.log(`[BaseQuintStore.get] Starting: ${patternDesc}`);\n this.ensureOpen();\n\n const { sql, params } = this.buildSelectQuery(pattern, options);\n console.log(`[BaseQuintStore.get] SQL: ${sql.slice(0, 80)}...`);\n const start = Date.now();\n const rows = await this.executor!.query<QuintRow>(sql, params);\n console.log(`[BaseQuintStore.get] Completed in ${Date.now() - start}ms, got ${rows.length} rows`);\n \n return rows.map(row => this.rowToQuint(row));\n }\n\n match(\n subject?: Term | null,\n predicate?: Term | null,\n object?: Term | null,\n graph?: Term | null\n ): AsyncIterator<Quint> {\n const pattern: QuintPattern = {};\n if (subject && subject.termType !== 'Variable') pattern.subject = subject;\n if (predicate && predicate.termType !== 'Variable') pattern.predicate = predicate;\n if (object && object.termType !== 'Variable') pattern.object = object;\n if (graph && graph.termType !== 'Variable' && graph.termType !== 'DefaultGraph') {\n pattern.graph = graph;\n }\n\n return wrap(this.get(pattern));\n }\n\n async getByGraphPrefix(prefix: string, options?: QueryOptions): Promise<Quint[]> {\n this.ensureOpen();\n\n let sql = `SELECT * FROM quints WHERE graph >= ? AND graph < ?`;\n const params: any[] = [prefix, prefix + '\\uffff'];\n\n if (options?.limit) {\n sql += ` LIMIT ?`;\n params.push(options.limit);\n }\n if (options?.offset) {\n sql += ` OFFSET ?`;\n params.push(options.offset);\n }\n\n const rows = await this.executor!.query<QuintRow>(sql, params);\n return rows.map(row => this.rowToQuint(row));\n }\n\n async count(pattern: QuintPattern): Promise<number> {\n this.ensureOpen();\n\n const { whereClause, params } = this.buildWhereClause(pattern);\n const sql = `SELECT COUNT(*) as count FROM quints${whereClause}`;\n \n const rows = await this.executor!.query<{ count: number }>(sql, params);\n return rows[0]?.count ?? 0;\n }\n\n // ============================================\n // Compound Query (SQL JOIN)\n // ============================================\n\n override async getCompound(compound: CompoundPattern, options?: QueryOptions): Promise<CompoundResult[]> {\n this.ensureOpen();\n\n const { patterns, joinOn, select } = compound;\n \n if (patterns.length === 0) {\n return [];\n }\n\n if (patterns.length === 1) {\n const quads = await this.get(patterns[0], options);\n return quads.map(q => ({\n joinValue: termToId((q as any)[joinOn]),\n bindings: {},\n quads: [q],\n }));\n }\n\n const { sql, params } = this.buildCompoundQuery(compound, options);\n \n if (this.options.debug) {\n console.log('[BaseQuintStore] Compound SQL:', sql);\n console.log('[BaseQuintStore] Params:', params);\n }\n\n const rows = await this.executor!.query<Record<string, string>>(sql, params);\n\n return rows.map(row => {\n const bindings: Record<string, string> = {};\n \n if (select) {\n for (const s of select) {\n bindings[s.alias] = row[s.alias];\n }\n } else {\n for (const key of Object.keys(row)) {\n if (key !== 'join_value') {\n bindings[key] = row[key];\n }\n }\n }\n\n return {\n joinValue: row.join_value,\n bindings,\n };\n });\n }\n\n // ============================================\n // Batch Attributes Query (for OPTIONAL optimization)\n // ============================================\n\n override async getAttributes(\n subjects: string[],\n predicates: string[],\n graph?: Term\n ): Promise<AttributeMap> {\n this.ensureOpen();\n\n if (subjects.length === 0 || predicates.length === 0) {\n return new Map();\n }\n\n // 构建 IN 子句的占位符\n const subjectPlaceholders = subjects.map(() => '?').join(', ');\n const predicatePlaceholders = predicates.map(() => '?').join(', ');\n \n let sql = `SELECT subject, predicate, object FROM quints WHERE subject IN (${subjectPlaceholders}) AND predicate IN (${predicatePlaceholders})`;\n const params: any[] = [...subjects, ...predicates];\n\n if (graph && graph.termType !== 'DefaultGraph') {\n sql += ` AND graph = ?`;\n params.push(termToId(graph as any));\n }\n\n if (this.options.debug) {\n console.log('[BaseQuintStore] getAttributes SQL:', sql);\n console.log('[BaseQuintStore] Params:', params.length, 'subjects:', subjects.length, 'predicates:', predicates.length);\n }\n\n const rows = await this.executor!.query<{ subject: string; predicate: string; object: string }>(sql, params);\n\n // 构建结果 Map\n const result: AttributeMap = new Map();\n\n for (const row of rows) {\n if (!result.has(row.subject)) {\n result.set(row.subject, new Map());\n }\n const predicateMap = result.get(row.subject)!;\n \n if (!predicateMap.has(row.predicate)) {\n predicateMap.set(row.predicate, []);\n }\n \n const objectTerm = this.deserializeObject(row.object);\n predicateMap.get(row.predicate)!.push(objectTerm);\n }\n\n if (this.options.debug) {\n console.log('[BaseQuintStore] getAttributes returned', result.size, 'subjects');\n }\n\n return result;\n }\n\n // ============================================\n // Write Operations\n // ============================================\n\n async put(quint: Quint): Promise<void> {\n this.ensureOpen();\n\n const row = this.quintToRow(quint);\n \n // UPSERT: INSERT OR REPLACE (SQLite) / ON CONFLICT DO UPDATE (PostgreSQL)\n // 使用通用的 INSERT OR REPLACE 语法,PGLite 和 SQLite 都支持\n const sql = `INSERT OR REPLACE INTO quints (graph, subject, predicate, object, vector) VALUES (?, ?, ?, ?, ?)`;\n await this.executor!.execute(sql, [row.graph, row.subject, row.predicate, row.object, row.vector]);\n }\n\n async multiPut(quintList: Quint[]): Promise<void> {\n this.ensureOpen();\n\n if (quintList.length === 0) return;\n\n const statements = quintList.map(quint => {\n const row = this.quintToRow(quint);\n return {\n sql: `INSERT OR REPLACE INTO quints (graph, subject, predicate, object, vector) VALUES (?, ?, ?, ?, ?)`,\n params: [row.graph, row.subject, row.predicate, row.object, row.vector],\n };\n });\n\n await this.executor!.executeInTransaction(statements);\n }\n\n async updateEmbedding(pattern: QuintPattern, embedding: number[]): Promise<number> {\n this.ensureOpen();\n\n const { whereClause, params } = this.buildWhereClause(pattern);\n const vectorJson = JSON.stringify(embedding);\n \n const sql = `UPDATE quints SET vector = ?${whereClause}`;\n return await this.executor!.execute(sql, [vectorJson, ...params]);\n }\n\n // ============================================\n // Delete Operations\n // ============================================\n\n async del(pattern: QuintPattern): Promise<number> {\n this.ensureOpen();\n\n const { whereClause, params } = this.buildWhereClause(pattern);\n const sql = `DELETE FROM quints${whereClause}`;\n \n return await this.executor!.execute(sql, params);\n }\n\n async multiDel(quintList: Quint[]): Promise<void> {\n this.ensureOpen();\n\n if (quintList.length === 0) return;\n\n const statements = quintList.map(quint => {\n const g = termToId(quint.graph as any);\n const s = termToId(quint.subject as any);\n const p = termToId(quint.predicate as any);\n const o = serializeObject(quint.object as any);\n \n return {\n sql: `DELETE FROM quints WHERE graph = ? AND subject = ? AND predicate = ? AND object = ?`,\n params: [g, s, p, o],\n };\n });\n\n await this.executor!.executeInTransaction(statements);\n }\n\n // ============================================\n // Stats\n // ============================================\n\n async stats(): Promise<StoreStats> {\n this.ensureOpen();\n\n const [totalResult, vectorResult, graphResult] = await Promise.all([\n this.executor!.query<{ count: number }>('SELECT COUNT(*) as count FROM quints'),\n this.executor!.query<{ count: number }>('SELECT COUNT(*) as count FROM quints WHERE vector IS NOT NULL'),\n this.executor!.query<{ count: number }>('SELECT COUNT(DISTINCT graph) as count FROM quints'),\n ]);\n\n return {\n totalCount: totalResult[0]?.count ?? 0,\n vectorCount: vectorResult[0]?.count ?? 0,\n graphCount: graphResult[0]?.count ?? 0,\n };\n }\n\n async clear(): Promise<void> {\n this.ensureOpen();\n await this.executor!.execute('DELETE FROM quints');\n }\n\n // ============================================\n // SQL Building Helpers\n // ============================================\n\n protected buildSelectQuery(pattern: QuintPattern, options?: QueryOptions): { sql: string; params: any[] } {\n const { whereClause, params } = this.buildWhereClause(pattern);\n \n let sql = `SELECT * FROM quints${whereClause}`;\n\n if (options?.order && options.order.length > 0) {\n const orderCols = options.order.join(', ');\n sql += ` ORDER BY ${orderCols}`;\n if (options.reverse) {\n sql += ' DESC';\n }\n }\n\n if (options?.limit) {\n sql += ` LIMIT ?`;\n params.push(options.limit);\n }\n\n if (options?.offset) {\n sql += ` OFFSET ?`;\n params.push(options.offset);\n }\n\n return { sql, params };\n }\n\n protected buildWhereClause(pattern: QuintPattern): { whereClause: string; params: any[] } {\n const conditions: string[] = [];\n const params: any[] = [];\n\n this.addConditions(conditions, params, 'graph', pattern.graph, false);\n this.addConditions(conditions, params, 'subject', pattern.subject, false);\n this.addConditions(conditions, params, 'predicate', pattern.predicate, false);\n this.addConditions(conditions, params, 'object', pattern.object, true);\n\n const whereClause = conditions.length > 0 ? ` WHERE ${conditions.join(' AND ')}` : '';\n return { whereClause, params };\n }\n\n protected addConditions(\n conditions: string[],\n params: any[],\n column: string,\n match: TermMatch | undefined,\n isObject: boolean\n ): void {\n if (!match) return;\n\n if (isTerm(match)) {\n conditions.push(`${column} = ?`);\n params.push(isObject ? serializeObject(match as any) : termToId(match as any));\n return;\n }\n\n const ops = match as TermOperators;\n\n if (ops.$eq !== undefined) {\n conditions.push(`${column} = ?`);\n params.push(this.serializeOpValue(ops.$eq, isObject, '$eq'));\n }\n if (ops.$ne !== undefined) {\n conditions.push(`${column} != ?`);\n params.push(this.serializeOpValue(ops.$ne, isObject, '$ne'));\n }\n if (ops.$gt !== undefined) {\n conditions.push(`${column} > ?`);\n params.push(this.serializeOpValue(ops.$gt, isObject, '$gt'));\n }\n if (ops.$gte !== undefined) {\n conditions.push(`${column} >= ?`);\n params.push(this.serializeOpValue(ops.$gte, isObject, '$gte'));\n }\n if (ops.$lt !== undefined) {\n conditions.push(`${column} < ?`);\n params.push(this.serializeOpValue(ops.$lt, isObject, '$lt'));\n }\n if (ops.$lte !== undefined) {\n conditions.push(`${column} <= ?`);\n params.push(this.serializeOpValue(ops.$lte, isObject, '$lte'));\n }\n if (ops.$in !== undefined && ops.$in.length > 0) {\n const placeholders = ops.$in.map(() => '?').join(', ');\n conditions.push(`${column} IN (${placeholders})`);\n params.push(...ops.$in.map(v => this.serializeOpValue(v, isObject, '$in')));\n }\n if (ops.$notIn !== undefined && ops.$notIn.length > 0) {\n const placeholders = ops.$notIn.map(() => '?').join(', ');\n conditions.push(`${column} NOT IN (${placeholders})`);\n params.push(...ops.$notIn.map(v => this.serializeOpValue(v, isObject, '$notIn')));\n }\n if (ops.$startsWith !== undefined) {\n conditions.push(`${column} >= ? AND ${column} < ?`);\n params.push(ops.$startsWith, ops.$startsWith + '\\uffff');\n }\n if (ops.$endsWith !== undefined) {\n conditions.push(`${column} LIKE ?`);\n params.push(`%${ops.$endsWith}`);\n }\n if (ops.$contains !== undefined) {\n conditions.push(`${column} LIKE ?`);\n params.push(`%${ops.$contains}%`);\n }\n if (ops.$regex !== undefined) {\n // 使用 GLOB (SQLite) 或 ~ (PostgreSQL)\n // 这里用 LIKE 作为简单实现\n const pattern = ops.$regex.replace(/\\.\\*/g, '%').replace(/\\./g, '_');\n conditions.push(`${column} LIKE ?`);\n params.push(pattern);\n }\n if (ops.$isNull === true) {\n conditions.push(`${column} IS NULL`);\n }\n if (ops.$isNull === false) {\n conditions.push(`${column} IS NOT NULL`);\n }\n }\n\n protected serializeOpValue(value: OperatorValue, isObject: boolean, filterOp: string): any {\n if (typeof value === 'object' && 'termType' in value) {\n return isObject ? serializeObject(value as any) : termToId(value as any);\n }\n \n if (typeof value === 'number') {\n if (isObject) {\n if (filterOp === '$eq' || filterOp === '$ne' || filterOp === '$in' || filterOp === '$notIn') {\n const lit = DataFactory.literal(String(value), DataFactory.namedNode('http://www.w3.org/2001/XMLSchema#integer'));\n return serializeObject(lit);\n }\n const fpValue = `N${SEP}${fpEncode(value)}`;\n if (filterOp === '$gt' || filterOp === '$lte') {\n return fpValue + SEP + '\\uffff';\n }\n return fpValue;\n }\n return value;\n }\n \n if (isObject && !isSerializedObjectValue(value)) {\n return `\"${value}\"`;\n }\n return value;\n }\n\n protected buildCompoundQuery(compound: CompoundPattern, options?: QueryOptions): { sql: string; params: any[] } {\n const { patterns, joinOn, select } = compound;\n const params: any[] = [];\n \n // SELECT 子句\n let selectClause = `q0.${joinOn} as join_value`;\n \n if (select) {\n for (const s of select) {\n selectClause += `, q${s.pattern}.${s.field} as ${s.alias}`;\n }\n } else {\n for (let i = 0; i < patterns.length; i++) {\n selectClause += `, q${i}.object as p${i}_object`;\n selectClause += `, q${i}.predicate as p${i}_predicate`;\n }\n }\n\n // FROM 子句(JOIN)\n let fromClause = 'quints q0';\n for (let i = 1; i < patterns.length; i++) {\n fromClause += ` JOIN quints q${i} ON q0.${joinOn} = q${i}.${joinOn}`;\n fromClause += ` AND q0.graph = q${i}.graph`;\n }\n\n // WHERE 子句\n const whereParts: string[] = [];\n \n for (let i = 0; i < patterns.length; i++) {\n const pattern = patterns[i];\n const alias = `q${i}`;\n \n this.addAliasedConditions(whereParts, params, alias, pattern);\n }\n\n let sql = `SELECT ${selectClause} FROM ${fromClause}`;\n \n if (whereParts.length > 0) {\n sql += ` WHERE ${whereParts.join(' AND ')}`;\n }\n\n if (options?.limit) {\n sql += ` LIMIT ?`;\n params.push(options.limit);\n }\n if (options?.offset) {\n sql += ` OFFSET ?`;\n params.push(options.offset);\n }\n\n return { sql, params };\n }\n\n protected addAliasedConditions(\n conditions: string[],\n params: any[],\n alias: string,\n pattern: QuintPattern\n ): void {\n const addCond = (col: string, match: TermMatch | undefined, isObject: boolean) => {\n if (!match) return;\n\n if (isTerm(match)) {\n conditions.push(`${alias}.${col} = ?`);\n params.push(isObject ? serializeObject(match as any) : termToId(match as any));\n return;\n }\n\n const ops = match as TermOperators;\n \n if (ops.$eq !== undefined) {\n conditions.push(`${alias}.${col} = ?`);\n params.push(this.serializeOpValue(ops.$eq, isObject, '$eq'));\n }\n if (ops.$gt !== undefined) {\n conditions.push(`${alias}.${col} > ?`);\n params.push(this.serializeOpValue(ops.$gt, isObject, '$gt'));\n }\n if (ops.$gte !== undefined) {\n conditions.push(`${alias}.${col} >= ?`);\n params.push(this.serializeOpValue(ops.$gte, isObject, '$gte'));\n }\n if (ops.$lt !== undefined) {\n conditions.push(`${alias}.${col} < ?`);\n params.push(this.serializeOpValue(ops.$lt, isObject, '$lt'));\n }\n if (ops.$lte !== undefined) {\n conditions.push(`${alias}.${col} <= ?`);\n params.push(this.serializeOpValue(ops.$lte, isObject, '$lte'));\n }\n if (ops.$in !== undefined && ops.$in.length > 0) {\n const placeholders = ops.$in.map(() => '?').join(', ');\n conditions.push(`${alias}.${col} IN (${placeholders})`);\n params.push(...ops.$in.map(v => this.serializeOpValue(v, isObject, '$in')));\n }\n };\n\n addCond('graph', pattern.graph, false);\n addCond('subject', pattern.subject, false);\n addCond('predicate', pattern.predicate, false);\n addCond('object', pattern.object, true);\n }\n\n // ============================================\n // Serialization Helpers\n // ============================================\n\n protected quintToRow(quint: Quint): QuintRow {\n return {\n graph: termToId(quint.graph as any),\n subject: termToId(quint.subject as any),\n predicate: termToId(quint.predicate as any),\n object: serializeObject(quint.object as any),\n vector: quint.vector ? JSON.stringify(quint.vector) : null,\n };\n }\n\n protected rowToQuint(row: QuintRow): Quint {\n const quad = rowToQuad(row);\n const quint: Quint = quad as Quint;\n if (row.vector) {\n quint.vector = parseVector(row.vector);\n }\n return quint;\n }\n\n protected deserializeObject(value: string): Term {\n if (value.startsWith('\"')) {\n const match = value.match(/^\"([^\"]*)\"(?:@([a-zA-Z-]+)|\\^\\^<([^>]+)>)?$/);\n if (match) {\n const [, lexical, lang, datatype] = match;\n if (lang) {\n return DataFactory.literal(lexical, lang);\n }\n if (datatype) {\n return DataFactory.literal(lexical, DataFactory.namedNode(datatype));\n }\n return DataFactory.literal(lexical);\n }\n }\n \n if (value.startsWith('N\\u0000')) {\n const parts = value.split('\\u0000');\n const datatype = parts[2];\n const originalValue = parts[3];\n return DataFactory.literal(originalValue, DataFactory.namedNode(datatype));\n }\n \n if (value.startsWith('D\\u0000')) {\n const parts = value.split('\\u0000');\n const originalValue = parts[2];\n return DataFactory.literal(originalValue, DataFactory.namedNode('http://www.w3.org/2001/XMLSchema#dateTime'));\n }\n \n return DataFactory.namedNode(value);\n }\n}\n"]}
1
+ {"version":3,"file":"BaseQuintStore.js","sourceRoot":"","sources":["../../../src/storage/quint/BaseQuintStore.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * BaseQuintStore - 统一的 QuintStore 抽象基类\n * \n * 支持:\n * - SQLite (via pluggable SQLite runtime + drizzle-orm)\n * - PGLite (via @electric-sql/pglite + drizzle-orm)\n * - PostgreSQL (via pg + drizzle-orm) - 未来\n * \n * 设计:\n * - 所有 SQL 逻辑在基类中实现\n * - 子类只负责创建数据库连接和执行原生 SQL\n */\n\nimport { wrap, AsyncIterator } from 'asynciterator';\nimport { DataFactory } from 'n3';\nimport type { Term, Quad } from '@rdfjs/types';\n\nimport { \n rowToQuad, \n parseVector,\n termToId,\n serializeObject,\n fpEncode,\n SEP,\n isSerializedObjectValue,\n} from './serialization';\nimport type {\n Quint,\n QuintPattern,\n QuintStoreOptions,\n QueryOptions,\n StoreStats,\n TermMatch,\n TermOperators,\n CompoundPattern,\n CompoundResult,\n OperatorValue,\n AttributeMap,\n} from './types';\nimport { isTerm, QuintStore } from './types';\n\nexport interface QuintRow {\n graph: string;\n subject: string;\n predicate: string;\n object: string;\n vector: string | null;\n}\n\n/**\n * SQL 执行器接口 - 子类实现\n */\nexport interface SqlExecutor {\n /** 执行查询,返回行数组 */\n query<T = any>(sql: string, params?: any[]): Promise<T[]>;\n /** 执行更新,返回影响行数 */\n execute(sql: string, params?: any[]): Promise<number>;\n /** 执行多条语句(事务内) */\n executeInTransaction(statements: { sql: string; params?: any[] }[]): Promise<void>;\n /** 执行原生 SQL(建表等) */\n exec(sql: string): Promise<void>;\n}\n\nexport abstract class BaseQuintStore extends QuintStore {\n protected options: QuintStoreOptions;\n protected executor: SqlExecutor | null = null;\n protected opened = false;\n protected opening: Promise<void> | null = null;\n\n constructor(options: QuintStoreOptions) {\n super();\n this.options = options;\n }\n\n // ============================================\n // 抽象方法 - 子类实现\n // ============================================\n\n protected abstract createExecutor(): Promise<SqlExecutor>;\n protected abstract closeExecutor(): Promise<void>;\n\n // ============================================\n // Lifecycle\n // ============================================\n\n async open(): Promise<void> {\n if (this.opened) {\n return;\n }\n\n this.opening ??= this.openOnce().finally(() => {\n this.opening = null;\n });\n\n await this.opening;\n }\n\n protected async openOnce(): Promise<void> {\n const executor = await this.createExecutor();\n this.executor = executor;\n\n try {\n // 创建表和索引\n await executor.exec(`\n CREATE TABLE IF NOT EXISTS quints (\n graph TEXT NOT NULL,\n subject TEXT NOT NULL,\n predicate TEXT NOT NULL,\n object TEXT NOT NULL,\n vector TEXT,\n PRIMARY KEY (graph, subject, predicate, object)\n )\n `);\n\n // 创建索引(分开执行,避免某些数据库不支持多语句)\n const indexes = [\n 'CREATE INDEX IF NOT EXISTS idx_spog ON quints (subject, predicate, object, graph)',\n 'CREATE INDEX IF NOT EXISTS idx_ogsp ON quints (object, graph, subject, predicate)',\n 'CREATE INDEX IF NOT EXISTS idx_gspo ON quints (graph, subject, predicate, object)',\n 'CREATE INDEX IF NOT EXISTS idx_sopg ON quints (subject, object, predicate, graph)',\n 'CREATE INDEX IF NOT EXISTS idx_pogs ON quints (predicate, object, graph, subject)',\n 'CREATE INDEX IF NOT EXISTS idx_gpos ON quints (graph, predicate, object, subject)',\n ];\n\n for (const indexSql of indexes) {\n await executor.exec(indexSql);\n }\n this.opened = true;\n } catch (error) {\n await this.closeExecutor().catch(() => {});\n if (this.executor === executor) {\n this.executor = null;\n }\n this.opened = false;\n throw error;\n }\n }\n\n async close(): Promise<void> {\n if (this.opening) {\n await this.opening.catch(() => {});\n }\n if (this.executor) {\n await this.closeExecutor();\n this.executor = null;\n }\n this.opened = false;\n }\n\n protected ensureOpen(): void {\n if (!this.opened || !this.executor) {\n throw new Error('Store not open. Call open() first.');\n }\n }\n\n // ============================================\n // Query Operations\n // ============================================\n\n async get(pattern: QuintPattern, options?: QueryOptions): Promise<Quint[]> {\n this.ensureOpen();\n\n const { sql, params } = this.buildSelectQuery(pattern, options);\n const rows = await this.executor!.query<QuintRow>(sql, params);\n \n return rows.map(row => this.rowToQuint(row));\n }\n\n match(\n subject?: Term | null,\n predicate?: Term | null,\n object?: Term | null,\n graph?: Term | null\n ): AsyncIterator<Quint> {\n const pattern: QuintPattern = {};\n if (subject && subject.termType !== 'Variable') pattern.subject = subject;\n if (predicate && predicate.termType !== 'Variable') pattern.predicate = predicate;\n if (object && object.termType !== 'Variable') pattern.object = object;\n if (graph && graph.termType !== 'Variable' && graph.termType !== 'DefaultGraph') {\n pattern.graph = graph;\n }\n\n return wrap(this.get(pattern));\n }\n\n async getByGraphPrefix(prefix: string, options?: QueryOptions): Promise<Quint[]> {\n this.ensureOpen();\n\n let sql = `SELECT * FROM quints WHERE graph >= ? AND graph < ?`;\n const params: any[] = [prefix, prefix + '\\uffff'];\n\n if (options?.limit) {\n sql += ` LIMIT ?`;\n params.push(options.limit);\n }\n if (options?.offset) {\n sql += ` OFFSET ?`;\n params.push(options.offset);\n }\n\n const rows = await this.executor!.query<QuintRow>(sql, params);\n return rows.map(row => this.rowToQuint(row));\n }\n\n async count(pattern: QuintPattern): Promise<number> {\n this.ensureOpen();\n\n const { whereClause, params } = this.buildWhereClause(pattern);\n const sql = `SELECT COUNT(*) as count FROM quints${whereClause}`;\n \n const rows = await this.executor!.query<{ count: number }>(sql, params);\n return rows[0]?.count ?? 0;\n }\n\n // ============================================\n // Compound Query (SQL JOIN)\n // ============================================\n\n override async getCompound(compound: CompoundPattern, options?: QueryOptions): Promise<CompoundResult[]> {\n this.ensureOpen();\n\n const { patterns, joinOn, select } = compound;\n \n if (patterns.length === 0) {\n return [];\n }\n\n if (patterns.length === 1) {\n const quads = await this.get(patterns[0], options);\n return quads.map(q => ({\n joinValue: termToId((q as any)[joinOn]),\n bindings: {},\n quads: [q],\n }));\n }\n\n const { sql, params } = this.buildCompoundQuery(compound, options);\n \n if (this.options.debug) {\n console.log('[BaseQuintStore] Compound SQL:', sql);\n console.log('[BaseQuintStore] Params:', params);\n }\n\n const rows = await this.executor!.query<Record<string, string>>(sql, params);\n\n return rows.map(row => {\n const bindings: Record<string, string> = {};\n \n if (select) {\n for (const s of select) {\n bindings[s.alias] = row[s.alias];\n }\n } else {\n for (const key of Object.keys(row)) {\n if (key !== 'join_value') {\n bindings[key] = row[key];\n }\n }\n }\n\n return {\n joinValue: row.join_value,\n bindings,\n };\n });\n }\n\n // ============================================\n // Batch Attributes Query (for OPTIONAL optimization)\n // ============================================\n\n override async getAttributes(\n subjects: string[],\n predicates: string[],\n graph?: Term\n ): Promise<AttributeMap> {\n this.ensureOpen();\n\n if (subjects.length === 0 || predicates.length === 0) {\n return new Map();\n }\n\n // 构建 IN 子句的占位符\n const subjectPlaceholders = subjects.map(() => '?').join(', ');\n const predicatePlaceholders = predicates.map(() => '?').join(', ');\n \n let sql = `SELECT subject, predicate, object FROM quints WHERE subject IN (${subjectPlaceholders}) AND predicate IN (${predicatePlaceholders})`;\n const params: any[] = [...subjects, ...predicates];\n\n if (graph && graph.termType !== 'DefaultGraph') {\n sql += ` AND graph = ?`;\n params.push(termToId(graph as any));\n }\n\n if (this.options.debug) {\n console.log('[BaseQuintStore] getAttributes SQL:', sql);\n console.log('[BaseQuintStore] Params:', params.length, 'subjects:', subjects.length, 'predicates:', predicates.length);\n }\n\n const rows = await this.executor!.query<{ subject: string; predicate: string; object: string }>(sql, params);\n\n // 构建结果 Map\n const result: AttributeMap = new Map();\n\n for (const row of rows) {\n if (!result.has(row.subject)) {\n result.set(row.subject, new Map());\n }\n const predicateMap = result.get(row.subject)!;\n \n if (!predicateMap.has(row.predicate)) {\n predicateMap.set(row.predicate, []);\n }\n \n const objectTerm = this.deserializeObject(row.object);\n predicateMap.get(row.predicate)!.push(objectTerm);\n }\n\n if (this.options.debug) {\n console.log('[BaseQuintStore] getAttributes returned', result.size, 'subjects');\n }\n\n return result;\n }\n\n // ============================================\n // Write Operations\n // ============================================\n\n async put(quint: Quint): Promise<void> {\n this.ensureOpen();\n\n const row = this.quintToRow(quint);\n \n // UPSERT: INSERT OR REPLACE (SQLite) / ON CONFLICT DO UPDATE (PostgreSQL)\n // 使用通用的 INSERT OR REPLACE 语法,PGLite 和 SQLite 都支持\n const sql = `INSERT OR REPLACE INTO quints (graph, subject, predicate, object, vector) VALUES (?, ?, ?, ?, ?)`;\n await this.executor!.execute(sql, [row.graph, row.subject, row.predicate, row.object, row.vector]);\n }\n\n async multiPut(quintList: Quint[]): Promise<void> {\n this.ensureOpen();\n\n if (quintList.length === 0) return;\n\n const statements = quintList.map(quint => {\n const row = this.quintToRow(quint);\n return {\n sql: `INSERT OR REPLACE INTO quints (graph, subject, predicate, object, vector) VALUES (?, ?, ?, ?, ?)`,\n params: [row.graph, row.subject, row.predicate, row.object, row.vector],\n };\n });\n\n await this.executor!.executeInTransaction(statements);\n }\n\n async updateEmbedding(pattern: QuintPattern, embedding: number[]): Promise<number> {\n this.ensureOpen();\n\n const { whereClause, params } = this.buildWhereClause(pattern);\n const vectorJson = JSON.stringify(embedding);\n \n const sql = `UPDATE quints SET vector = ?${whereClause}`;\n return await this.executor!.execute(sql, [vectorJson, ...params]);\n }\n\n // ============================================\n // Delete Operations\n // ============================================\n\n async del(pattern: QuintPattern): Promise<number> {\n this.ensureOpen();\n\n const { whereClause, params } = this.buildWhereClause(pattern);\n const sql = `DELETE FROM quints${whereClause}`;\n \n return await this.executor!.execute(sql, params);\n }\n\n async multiDel(quintList: Quint[]): Promise<void> {\n this.ensureOpen();\n\n if (quintList.length === 0) return;\n\n const statements = quintList.map(quint => {\n const g = termToId(quint.graph as any);\n const s = termToId(quint.subject as any);\n const p = termToId(quint.predicate as any);\n const o = serializeObject(quint.object as any);\n \n return {\n sql: `DELETE FROM quints WHERE graph = ? AND subject = ? AND predicate = ? AND object = ?`,\n params: [g, s, p, o],\n };\n });\n\n await this.executor!.executeInTransaction(statements);\n }\n\n // ============================================\n // Stats\n // ============================================\n\n async stats(): Promise<StoreStats> {\n this.ensureOpen();\n\n const [totalResult, vectorResult, graphResult] = await Promise.all([\n this.executor!.query<{ count: number }>('SELECT COUNT(*) as count FROM quints'),\n this.executor!.query<{ count: number }>('SELECT COUNT(*) as count FROM quints WHERE vector IS NOT NULL'),\n this.executor!.query<{ count: number }>('SELECT COUNT(DISTINCT graph) as count FROM quints'),\n ]);\n\n return {\n totalCount: totalResult[0]?.count ?? 0,\n vectorCount: vectorResult[0]?.count ?? 0,\n graphCount: graphResult[0]?.count ?? 0,\n };\n }\n\n async clear(): Promise<void> {\n this.ensureOpen();\n await this.executor!.execute('DELETE FROM quints');\n }\n\n // ============================================\n // SQL Building Helpers\n // ============================================\n\n protected buildSelectQuery(pattern: QuintPattern, options?: QueryOptions): { sql: string; params: any[] } {\n const { whereClause, params } = this.buildWhereClause(pattern);\n \n let sql = `SELECT * FROM quints${whereClause}`;\n\n if (options?.order && options.order.length > 0) {\n const orderCols = options.order.join(', ');\n sql += ` ORDER BY ${orderCols}`;\n if (options.reverse) {\n sql += ' DESC';\n }\n }\n\n if (options?.limit) {\n sql += ` LIMIT ?`;\n params.push(options.limit);\n }\n\n if (options?.offset) {\n sql += ` OFFSET ?`;\n params.push(options.offset);\n }\n\n return { sql, params };\n }\n\n protected buildWhereClause(pattern: QuintPattern): { whereClause: string; params: any[] } {\n const conditions: string[] = [];\n const params: any[] = [];\n\n this.addConditions(conditions, params, 'graph', pattern.graph, false);\n this.addConditions(conditions, params, 'subject', pattern.subject, false);\n this.addConditions(conditions, params, 'predicate', pattern.predicate, false);\n this.addConditions(conditions, params, 'object', pattern.object, true);\n\n const whereClause = conditions.length > 0 ? ` WHERE ${conditions.join(' AND ')}` : '';\n return { whereClause, params };\n }\n\n protected addConditions(\n conditions: string[],\n params: any[],\n column: string,\n match: TermMatch | undefined,\n isObject: boolean\n ): void {\n if (!match) return;\n\n if (isTerm(match)) {\n conditions.push(`${column} = ?`);\n params.push(isObject ? serializeObject(match as any) : termToId(match as any));\n return;\n }\n\n const ops = match as TermOperators;\n\n if (ops.$eq !== undefined) {\n conditions.push(`${column} = ?`);\n params.push(this.serializeOpValue(ops.$eq, isObject, '$eq'));\n }\n if (ops.$ne !== undefined) {\n conditions.push(`${column} != ?`);\n params.push(this.serializeOpValue(ops.$ne, isObject, '$ne'));\n }\n if (ops.$gt !== undefined) {\n conditions.push(`${column} > ?`);\n params.push(this.serializeOpValue(ops.$gt, isObject, '$gt'));\n }\n if (ops.$gte !== undefined) {\n conditions.push(`${column} >= ?`);\n params.push(this.serializeOpValue(ops.$gte, isObject, '$gte'));\n }\n if (ops.$lt !== undefined) {\n conditions.push(`${column} < ?`);\n params.push(this.serializeOpValue(ops.$lt, isObject, '$lt'));\n }\n if (ops.$lte !== undefined) {\n conditions.push(`${column} <= ?`);\n params.push(this.serializeOpValue(ops.$lte, isObject, '$lte'));\n }\n if (ops.$in !== undefined && ops.$in.length > 0) {\n const placeholders = ops.$in.map(() => '?').join(', ');\n conditions.push(`${column} IN (${placeholders})`);\n params.push(...ops.$in.map(v => this.serializeOpValue(v, isObject, '$in')));\n }\n if (ops.$notIn !== undefined && ops.$notIn.length > 0) {\n const placeholders = ops.$notIn.map(() => '?').join(', ');\n conditions.push(`${column} NOT IN (${placeholders})`);\n params.push(...ops.$notIn.map(v => this.serializeOpValue(v, isObject, '$notIn')));\n }\n if (ops.$startsWith !== undefined) {\n conditions.push(`${column} >= ? AND ${column} < ?`);\n params.push(ops.$startsWith, ops.$startsWith + '\\uffff');\n }\n if (ops.$endsWith !== undefined) {\n conditions.push(`${column} LIKE ?`);\n params.push(`%${ops.$endsWith}`);\n }\n if (ops.$contains !== undefined) {\n conditions.push(`${column} LIKE ?`);\n params.push(`%${ops.$contains}%`);\n }\n if (ops.$regex !== undefined) {\n // 使用 GLOB (SQLite) 或 ~ (PostgreSQL)\n // 这里用 LIKE 作为简单实现\n const pattern = ops.$regex.replace(/\\.\\*/g, '%').replace(/\\./g, '_');\n conditions.push(`${column} LIKE ?`);\n params.push(pattern);\n }\n if (ops.$isNull === true) {\n conditions.push(`${column} IS NULL`);\n }\n if (ops.$isNull === false) {\n conditions.push(`${column} IS NOT NULL`);\n }\n }\n\n protected serializeOpValue(value: OperatorValue, isObject: boolean, filterOp: string): any {\n if (typeof value === 'object' && 'termType' in value) {\n return isObject ? serializeObject(value as any) : termToId(value as any);\n }\n \n if (typeof value === 'number') {\n if (isObject) {\n if (filterOp === '$eq' || filterOp === '$ne' || filterOp === '$in' || filterOp === '$notIn') {\n const lit = DataFactory.literal(String(value), DataFactory.namedNode('http://www.w3.org/2001/XMLSchema#integer'));\n return serializeObject(lit);\n }\n const fpValue = `N${SEP}${fpEncode(value)}`;\n if (filterOp === '$gt' || filterOp === '$lte') {\n return fpValue + SEP + '\\uffff';\n }\n return fpValue;\n }\n return value;\n }\n \n if (isObject && !isSerializedObjectValue(value)) {\n return `\"${value}\"`;\n }\n return value;\n }\n\n protected buildCompoundQuery(compound: CompoundPattern, options?: QueryOptions): { sql: string; params: any[] } {\n const { patterns, joinOn, select } = compound;\n const params: any[] = [];\n \n // SELECT 子句\n let selectClause = `q0.${joinOn} as join_value`;\n \n if (select) {\n for (const s of select) {\n selectClause += `, q${s.pattern}.${s.field} as ${s.alias}`;\n }\n } else {\n for (let i = 0; i < patterns.length; i++) {\n selectClause += `, q${i}.object as p${i}_object`;\n selectClause += `, q${i}.predicate as p${i}_predicate`;\n }\n }\n\n // FROM 子句(JOIN)\n let fromClause = 'quints q0';\n for (let i = 1; i < patterns.length; i++) {\n fromClause += ` JOIN quints q${i} ON q0.${joinOn} = q${i}.${joinOn}`;\n fromClause += ` AND q0.graph = q${i}.graph`;\n }\n\n // WHERE 子句\n const whereParts: string[] = [];\n \n for (let i = 0; i < patterns.length; i++) {\n const pattern = patterns[i];\n const alias = `q${i}`;\n \n this.addAliasedConditions(whereParts, params, alias, pattern);\n }\n\n let sql = `SELECT ${selectClause} FROM ${fromClause}`;\n \n if (whereParts.length > 0) {\n sql += ` WHERE ${whereParts.join(' AND ')}`;\n }\n\n if (options?.limit) {\n sql += ` LIMIT ?`;\n params.push(options.limit);\n }\n if (options?.offset) {\n sql += ` OFFSET ?`;\n params.push(options.offset);\n }\n\n return { sql, params };\n }\n\n // ============================================\n // Serialization Helpers\n // ============================================\n\n protected quintToRow(quint: Quint): QuintRow {\n return {\n graph: termToId(quint.graph as any),\n subject: termToId(quint.subject as any),\n predicate: termToId(quint.predicate as any),\n object: serializeObject(quint.object as any),\n vector: quint.vector ? JSON.stringify(quint.vector) : null,\n };\n }\n\n protected rowToQuint(row: QuintRow): Quint {\n const quad = rowToQuad(row);\n const quint: Quint = quad as Quint;\n if (row.vector) {\n quint.vector = parseVector(row.vector);\n }\n return quint;\n }\n\n protected deserializeObject(value: string): Term {\n if (value.startsWith('\"')) {\n const match = value.match(/^\"([^\"]*)\"(?:@([a-zA-Z-]+)|\\^\\^<([^>]+)>)?$/);\n if (match) {\n const [, lexical, lang, datatype] = match;\n if (lang) {\n return DataFactory.literal(lexical, lang);\n }\n if (datatype) {\n return DataFactory.literal(lexical, DataFactory.namedNode(datatype));\n }\n return DataFactory.literal(lexical);\n }\n }\n \n if (value.startsWith('N\\u0000')) {\n const parts = value.split('\\u0000');\n const datatype = parts[2];\n const originalValue = parts[3];\n return DataFactory.literal(originalValue, DataFactory.namedNode(datatype));\n }\n \n if (value.startsWith('D\\u0000')) {\n const parts = value.split('\\u0000');\n const originalValue = parts[2];\n return DataFactory.literal(originalValue, DataFactory.namedNode('http://www.w3.org/2001/XMLSchema#dateTime'));\n }\n \n return DataFactory.namedNode(value);\n }\n\n protected resolveObjectDataTypeForPattern(_pattern: QuintPattern): string | undefined {\n return undefined;\n }\n\n protected extractExactPredicate(match: TermMatch | undefined): string | undefined {\n if (!match) return undefined;\n if (typeof match === 'object' && 'termType' in match) {\n return termToId(match as Term);\n }\n const ops = match as TermOperators;\n if (ops.$eq !== undefined) {\n return String(this.serializeOpValue(ops.$eq, false, '$eq'));\n }\n return undefined;\n }\n\n protected addTermConditions(\n conditions: string[],\n params: any[],\n column: string,\n match: TermMatch | undefined,\n isObject: boolean,\n ): void {\n this.addConditions(conditions, params, column, match, isObject);\n }\n\n protected addAliasedConditions(\n conditions: string[],\n params: any[],\n alias: string,\n pattern: QuintPattern,\n ): void {\n const addCond = (col: string, match: TermMatch | undefined, isObject: boolean) => {\n if (!match) return;\n\n if (isTerm(match)) {\n conditions.push(`${alias}.${col} = ?`);\n params.push(isObject ? serializeObject(match as any) : termToId(match as any));\n return;\n }\n\n const ops = match as TermOperators;\n if (ops.$eq !== undefined) {\n conditions.push(`${alias}.${col} = ?`);\n params.push(this.serializeOpValue(ops.$eq, isObject, '$eq'));\n }\n if (ops.$gt !== undefined) {\n conditions.push(`${alias}.${col} > ?`);\n params.push(this.serializeOpValue(ops.$gt, isObject, '$gt'));\n }\n if (ops.$gte !== undefined) {\n conditions.push(`${alias}.${col} >= ?`);\n params.push(this.serializeOpValue(ops.$gte, isObject, '$gte'));\n }\n if (ops.$lt !== undefined) {\n conditions.push(`${alias}.${col} < ?`);\n params.push(this.serializeOpValue(ops.$lt, isObject, '$lt'));\n }\n if (ops.$lte !== undefined) {\n conditions.push(`${alias}.${col} <= ?`);\n params.push(this.serializeOpValue(ops.$lte, isObject, '$lte'));\n }\n if (ops.$in !== undefined && ops.$in.length > 0) {\n const placeholders = ops.$in.map(() => '?').join(', ');\n conditions.push(`${alias}.${col} IN (${placeholders})`);\n params.push(...ops.$in.map(v => this.serializeOpValue(v, isObject, '$in')));\n }\n };\n\n addCond('graph', pattern.graph, false);\n addCond('subject', pattern.subject, false);\n addCond('predicate', pattern.predicate, false);\n addCond('object', pattern.object, true);\n }\n}\n"]}
@@ -10,7 +10,8 @@
10
10
  */
11
11
  import type { Term } from '@rdfjs/types';
12
12
  import { BaseQuintStore, type SqlExecutor } from './BaseQuintStore';
13
- import type { AttributeMap, CompoundPattern, QuintStoreOptions, Quint, QuintPattern, QueryOptions } from './types';
13
+ import type { AttributeMap, CompoundPattern, QuintStoreOptions, Quint, QuintPattern, QueryOptions, TermMatch } from './types';
14
+ import { type PredicateObjectDataType } from './value-types';
14
15
  /**
15
16
  * PostgreSQL 连接配置
16
17
  */
@@ -101,8 +102,8 @@ export declare class PgQuintStore extends BaseQuintStore {
101
102
  private objectFieldsForPrefix;
102
103
  private assertComparableObject;
103
104
  private addAliasedObjectConditions;
104
- private extractExactPredicate;
105
- private resolveObjectDataTypeForPattern;
105
+ protected extractExactPredicate(match: TermMatch | undefined): string | undefined;
106
+ protected resolveObjectDataTypeForPattern(pattern: QuintPattern): PredicateObjectDataType | undefined;
106
107
  private addAliasedPgCondition;
107
108
  private addFallbackAliasedCondition;
108
109
  }