@undefineds.co/drizzle-solid 0.2.6 → 0.2.8

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 (172) hide show
  1. package/dist/core/ast-to-sparql.d.ts +1 -6
  2. package/dist/core/ast-to-sparql.d.ts.map +1 -1
  3. package/dist/core/ast-to-sparql.js +3 -22
  4. package/dist/core/ast-to-sparql.js.map +1 -1
  5. package/dist/core/execution/ldp-executor.d.ts +8 -7
  6. package/dist/core/execution/ldp-executor.d.ts.map +1 -1
  7. package/dist/core/execution/ldp-executor.js +165 -136
  8. package/dist/core/execution/ldp-executor.js.map +1 -1
  9. package/dist/core/execution/ldp-strategy.js +1 -1
  10. package/dist/core/execution/ldp-strategy.js.map +1 -1
  11. package/dist/core/execution/pod-executor.d.ts.map +1 -1
  12. package/dist/core/execution/pod-executor.js +9 -0
  13. package/dist/core/execution/pod-executor.js.map +1 -1
  14. package/dist/core/execution/sparql-strategy.d.ts +7 -26
  15. package/dist/core/execution/sparql-strategy.d.ts.map +1 -1
  16. package/dist/core/execution/sparql-strategy.js +65 -111
  17. package/dist/core/execution/sparql-strategy.js.map +1 -1
  18. package/dist/core/execution/types.d.ts +8 -8
  19. package/dist/core/execution/types.d.ts.map +1 -1
  20. package/dist/core/federated/executor.d.ts +3 -0
  21. package/dist/core/federated/executor.d.ts.map +1 -1
  22. package/dist/core/federated/executor.js +13 -8
  23. package/dist/core/federated/executor.js.map +1 -1
  24. package/dist/core/pod-database.d.ts +0 -4
  25. package/dist/core/pod-database.d.ts.map +1 -1
  26. package/dist/core/pod-database.js +10 -32
  27. package/dist/core/pod-database.js.map +1 -1
  28. package/dist/core/pod-dialect.d.ts +0 -24
  29. package/dist/core/pod-dialect.d.ts.map +1 -1
  30. package/dist/core/pod-dialect.js +0 -182
  31. package/dist/core/pod-dialect.js.map +1 -1
  32. package/dist/core/pod-session.d.ts +6 -2
  33. package/dist/core/pod-session.d.ts.map +1 -1
  34. package/dist/core/pod-session.js +8 -2
  35. package/dist/core/pod-session.js.map +1 -1
  36. package/dist/core/query-builders/select-query-builder.d.ts +7 -0
  37. package/dist/core/query-builders/select-query-builder.d.ts.map +1 -1
  38. package/dist/core/query-builders/select-query-builder.js +56 -14
  39. package/dist/core/query-builders/select-query-builder.js.map +1 -1
  40. package/dist/core/query-conditions.d.ts.map +1 -1
  41. package/dist/core/query-conditions.js.map +1 -1
  42. package/dist/core/resource-resolver/base-resolver.d.ts +74 -3
  43. package/dist/core/resource-resolver/base-resolver.d.ts.map +1 -1
  44. package/dist/core/resource-resolver/base-resolver.js +221 -0
  45. package/dist/core/resource-resolver/base-resolver.js.map +1 -1
  46. package/dist/core/resource-resolver/document-resolver.d.ts +19 -4
  47. package/dist/core/resource-resolver/document-resolver.d.ts.map +1 -1
  48. package/dist/core/resource-resolver/document-resolver.js +72 -34
  49. package/dist/core/resource-resolver/document-resolver.js.map +1 -1
  50. package/dist/core/resource-resolver/fragment-resolver.d.ts +17 -3
  51. package/dist/core/resource-resolver/fragment-resolver.d.ts.map +1 -1
  52. package/dist/core/resource-resolver/fragment-resolver.js +28 -16
  53. package/dist/core/resource-resolver/fragment-resolver.js.map +1 -1
  54. package/dist/core/resource-resolver/types.d.ts +1 -1
  55. package/dist/core/resource-resolver/types.d.ts.map +1 -1
  56. package/dist/core/schema/pod-table.d.ts +6 -0
  57. package/dist/core/schema/pod-table.d.ts.map +1 -1
  58. package/dist/core/schema/pod-table.js +18 -9
  59. package/dist/core/schema/pod-table.js.map +1 -1
  60. package/dist/core/sparql/builder/expression-builder.d.ts +1 -0
  61. package/dist/core/sparql/builder/expression-builder.d.ts.map +1 -1
  62. package/dist/core/sparql/builder/expression-builder.js +50 -7
  63. package/dist/core/sparql/builder/expression-builder.js.map +1 -1
  64. package/dist/core/subject/resolver.d.ts +19 -0
  65. package/dist/core/subject/resolver.d.ts.map +1 -1
  66. package/dist/core/subject/resolver.js +77 -21
  67. package/dist/core/subject/resolver.js.map +1 -1
  68. package/dist/core/subject/types.d.ts +8 -1
  69. package/dist/core/subject/types.d.ts.map +1 -1
  70. package/dist/core/triple/builder.d.ts.map +1 -1
  71. package/dist/core/triple/builder.js +38 -1
  72. package/dist/core/triple/builder.js.map +1 -1
  73. package/dist/core/triple/handlers/inverse.d.ts +6 -2
  74. package/dist/core/triple/handlers/inverse.d.ts.map +1 -1
  75. package/dist/core/triple/handlers/inverse.js +37 -16
  76. package/dist/core/triple/handlers/inverse.js.map +1 -1
  77. package/dist/core/uri/resolver.d.ts +66 -2
  78. package/dist/core/uri/resolver.d.ts.map +1 -1
  79. package/dist/core/uri/resolver.js +212 -80
  80. package/dist/core/uri/resolver.js.map +1 -1
  81. package/dist/core/uri/types.d.ts +8 -1
  82. package/dist/core/uri/types.d.ts.map +1 -1
  83. package/dist/esm/core/ast-to-sparql.d.ts +1 -6
  84. package/dist/esm/core/ast-to-sparql.d.ts.map +1 -1
  85. package/dist/esm/core/ast-to-sparql.js +3 -22
  86. package/dist/esm/core/ast-to-sparql.js.map +1 -1
  87. package/dist/esm/core/execution/ldp-executor.d.ts +8 -7
  88. package/dist/esm/core/execution/ldp-executor.d.ts.map +1 -1
  89. package/dist/esm/core/execution/ldp-executor.js +165 -136
  90. package/dist/esm/core/execution/ldp-executor.js.map +1 -1
  91. package/dist/esm/core/execution/ldp-strategy.js +1 -1
  92. package/dist/esm/core/execution/ldp-strategy.js.map +1 -1
  93. package/dist/esm/core/execution/pod-executor.d.ts.map +1 -1
  94. package/dist/esm/core/execution/pod-executor.js +9 -0
  95. package/dist/esm/core/execution/pod-executor.js.map +1 -1
  96. package/dist/esm/core/execution/sparql-strategy.d.ts +7 -26
  97. package/dist/esm/core/execution/sparql-strategy.d.ts.map +1 -1
  98. package/dist/esm/core/execution/sparql-strategy.js +65 -111
  99. package/dist/esm/core/execution/sparql-strategy.js.map +1 -1
  100. package/dist/esm/core/execution/types.d.ts +8 -8
  101. package/dist/esm/core/execution/types.d.ts.map +1 -1
  102. package/dist/esm/core/federated/executor.d.ts +3 -0
  103. package/dist/esm/core/federated/executor.d.ts.map +1 -1
  104. package/dist/esm/core/federated/executor.js +13 -8
  105. package/dist/esm/core/federated/executor.js.map +1 -1
  106. package/dist/esm/core/pod-database.d.ts +0 -4
  107. package/dist/esm/core/pod-database.d.ts.map +1 -1
  108. package/dist/esm/core/pod-database.js +10 -32
  109. package/dist/esm/core/pod-database.js.map +1 -1
  110. package/dist/esm/core/pod-dialect.d.ts +0 -24
  111. package/dist/esm/core/pod-dialect.d.ts.map +1 -1
  112. package/dist/esm/core/pod-dialect.js +0 -182
  113. package/dist/esm/core/pod-dialect.js.map +1 -1
  114. package/dist/esm/core/pod-session.d.ts +6 -2
  115. package/dist/esm/core/pod-session.d.ts.map +1 -1
  116. package/dist/esm/core/pod-session.js +8 -2
  117. package/dist/esm/core/pod-session.js.map +1 -1
  118. package/dist/esm/core/query-builders/select-query-builder.d.ts +7 -0
  119. package/dist/esm/core/query-builders/select-query-builder.d.ts.map +1 -1
  120. package/dist/esm/core/query-builders/select-query-builder.js +56 -14
  121. package/dist/esm/core/query-builders/select-query-builder.js.map +1 -1
  122. package/dist/esm/core/query-conditions.d.ts.map +1 -1
  123. package/dist/esm/core/query-conditions.js.map +1 -1
  124. package/dist/esm/core/resource-resolver/base-resolver.d.ts +74 -3
  125. package/dist/esm/core/resource-resolver/base-resolver.d.ts.map +1 -1
  126. package/dist/esm/core/resource-resolver/base-resolver.js +221 -0
  127. package/dist/esm/core/resource-resolver/base-resolver.js.map +1 -1
  128. package/dist/esm/core/resource-resolver/document-resolver.d.ts +19 -4
  129. package/dist/esm/core/resource-resolver/document-resolver.d.ts.map +1 -1
  130. package/dist/esm/core/resource-resolver/document-resolver.js +72 -34
  131. package/dist/esm/core/resource-resolver/document-resolver.js.map +1 -1
  132. package/dist/esm/core/resource-resolver/fragment-resolver.d.ts +17 -3
  133. package/dist/esm/core/resource-resolver/fragment-resolver.d.ts.map +1 -1
  134. package/dist/esm/core/resource-resolver/fragment-resolver.js +28 -16
  135. package/dist/esm/core/resource-resolver/fragment-resolver.js.map +1 -1
  136. package/dist/esm/core/resource-resolver/types.d.ts +1 -1
  137. package/dist/esm/core/resource-resolver/types.d.ts.map +1 -1
  138. package/dist/esm/core/schema/pod-table.d.ts +6 -0
  139. package/dist/esm/core/schema/pod-table.d.ts.map +1 -1
  140. package/dist/esm/core/schema/pod-table.js +18 -9
  141. package/dist/esm/core/schema/pod-table.js.map +1 -1
  142. package/dist/esm/core/sparql/builder/expression-builder.d.ts +1 -0
  143. package/dist/esm/core/sparql/builder/expression-builder.d.ts.map +1 -1
  144. package/dist/esm/core/sparql/builder/expression-builder.js +50 -7
  145. package/dist/esm/core/sparql/builder/expression-builder.js.map +1 -1
  146. package/dist/esm/core/subject/resolver.d.ts +19 -0
  147. package/dist/esm/core/subject/resolver.d.ts.map +1 -1
  148. package/dist/esm/core/subject/resolver.js +77 -21
  149. package/dist/esm/core/subject/resolver.js.map +1 -1
  150. package/dist/esm/core/subject/types.d.ts +8 -1
  151. package/dist/esm/core/subject/types.d.ts.map +1 -1
  152. package/dist/esm/core/triple/builder.d.ts.map +1 -1
  153. package/dist/esm/core/triple/builder.js +38 -1
  154. package/dist/esm/core/triple/builder.js.map +1 -1
  155. package/dist/esm/core/triple/handlers/inverse.d.ts +6 -2
  156. package/dist/esm/core/triple/handlers/inverse.d.ts.map +1 -1
  157. package/dist/esm/core/triple/handlers/inverse.js +37 -16
  158. package/dist/esm/core/triple/handlers/inverse.js.map +1 -1
  159. package/dist/esm/core/uri/resolver.d.ts +66 -2
  160. package/dist/esm/core/uri/resolver.d.ts.map +1 -1
  161. package/dist/esm/core/uri/resolver.js +212 -80
  162. package/dist/esm/core/uri/resolver.js.map +1 -1
  163. package/dist/esm/core/uri/types.d.ts +8 -1
  164. package/dist/esm/core/uri/types.d.ts.map +1 -1
  165. package/dist/esm/index.d.ts +1 -0
  166. package/dist/esm/index.d.ts.map +1 -1
  167. package/dist/esm/index.js.map +1 -1
  168. package/dist/index.d.ts +1 -0
  169. package/dist/index.d.ts.map +1 -1
  170. package/dist/index.js.map +1 -1
  171. package/package.json +5 -1
  172. package/CHANGELOG-DRAFT.md +0 -444
@@ -28,6 +28,13 @@ export interface ParsedSubject {
28
28
  }
29
29
  /**
30
30
  * 时间变量上下文
31
+ *
32
+ * 变量命名遵循 Java/ISO 风格 (SimpleDateFormat):
33
+ * - yyyy: 年份 (4位)
34
+ * - MM: 月份 (2位,大写以区分分钟)
35
+ * - dd: 日期 (2位)
36
+ *
37
+ * 示例: {yyyy}/{MM}/{dd} → 2026/01/20
31
38
  */
32
39
  export interface TimeContext {
33
40
  /** 日期对象 */
@@ -35,7 +42,7 @@ export interface TimeContext {
35
42
  /** 年份 (4位) */
36
43
  yyyy: string;
37
44
  /** 月份 (2位) */
38
- mm: string;
45
+ MM: string;
39
46
  /** 日期 (2位) */
40
47
  dd: string;
41
48
  /** Unix 时间戳 */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/uri/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/uri/types.ts"],"names":[],"mappings":"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"}
@@ -51,12 +51,7 @@ export declare class ASTToSPARQLConverter {
51
51
  getPredicateForColumnPublic(column: any, table: PodTable): string;
52
52
  formatLiteralValue(value: any, column?: any): string | string[];
53
53
  generateSubjectUri(record: any, table: PodTable): string;
54
- /**
55
- * @deprecated Use parseDrizzleAST() + convertSelect() with table context instead
56
- * Direct SQL conversion without table context is limited and may not work correctly
57
- */
58
- convert(sql: SQL): SPARQLQuery;
59
- parseDrizzleAST(sql: SQL, table: PodTable): any;
54
+ parseDrizzleAST(sql: SQL, _table?: PodTable): any;
60
55
  private parseWhereClause;
61
56
  }
62
57
  //# sourceMappingURL=ast-to-sparql.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ast-to-sparql.d.ts","sourceRoot":"","sources":["../../../src/core/ast-to-sparql.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ast-to-sparql.d.ts","sourceRoot":"","sources":["../../../src/core/ast-to-sparql.ts"],"names":[],"mappings":"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"}
@@ -57,10 +57,6 @@ export class ASTToSPARQLConverter {
57
57
  }
58
58
  addPrefix(prefix, uri) {
59
59
  this.prefixes[prefix] = uri;
60
- // Re-instantiate builders to propagate prefixes if necessary,
61
- // or make builders reference this.prefixes object (passed by reference).
62
- // Since we passed object ref in constructor, it should update automatically
63
- // if we mutate the object.
64
60
  }
65
61
  // Legacy / Helper methods exposed for other modules
66
62
  getPredicateForColumnPublic(column, table) {
@@ -72,23 +68,8 @@ export class ASTToSPARQLConverter {
72
68
  generateSubjectUri(record, table) {
73
69
  return generateSubjectUri(record, table, this.uriResolver);
74
70
  }
75
- /**
76
- * @deprecated Use parseDrizzleAST() + convertSelect() with table context instead
77
- * Direct SQL conversion without table context is limited and may not work correctly
78
- */
79
- convert(sql) {
80
- const sqlString = sql.queryChunks.join('');
81
- if (sqlString.toLowerCase().includes('select')) {
82
- return this.convertSelect({
83
- select: undefined,
84
- columns: '*',
85
- where: this.parseWhereClause(sql)
86
- }, {});
87
- }
88
- throw new Error(`Direct SQL conversion without table context is limited: ${sqlString}`);
89
- }
90
- parseDrizzleAST(sql, table) {
91
- // Basic placeholder
71
+ parseDrizzleAST(sql, _table) {
72
+ void _table;
92
73
  return {
93
74
  type: 'select',
94
75
  columns: '*',
@@ -96,7 +77,7 @@ export class ASTToSPARQLConverter {
96
77
  };
97
78
  }
98
79
  parseWhereClause(sql) {
99
- // Placeholder for AST parsing
80
+ void sql;
100
81
  return {};
101
82
  }
102
83
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ast-to-sparql.js","sourceRoot":"","sources":["../../../src/core/ast-to-sparql.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ast-to-sparql.js","sourceRoot":"","sources":["../../../src/core/ast-to-sparql.ts"],"names":[],"mappings":"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"}
@@ -11,7 +11,6 @@ export declare class LdpExecutor {
11
11
  private fetchFn;
12
12
  private tripleBuilder;
13
13
  private uriResolver;
14
- private n3PatchCounter;
15
14
  constructor(sparqlExecutor: ComunicaSPARQLExecutor, fetchFn: typeof fetch, uriResolver: UriResolver);
16
15
  /**
17
16
  * 设置表注册表(用于 URI 引用自动补全)
@@ -35,7 +34,14 @@ export declare class LdpExecutor {
35
34
  * 执行 DELETE 操作
36
35
  */
37
36
  executeDelete(subjects: string[], table: PodTable, resourceUrl: string): Promise<any[]>;
38
- private resourceExists;
37
+ /**
38
+ * Execute a function with exponential backoff retry on server errors
39
+ */
40
+ private retryWithBackoff;
41
+ /**
42
+ * Build error from failed response
43
+ */
44
+ private buildPatchError;
39
45
  private buildUpdatePatchPayload;
40
46
  /**
41
47
  * 执行更新操作
@@ -53,11 +59,6 @@ export declare class LdpExecutor {
53
59
  * 内部 N3 Patch 实现(作为 SPARQL UPDATE 的回退)
54
60
  */
55
61
  private executeN3PatchInternal;
56
- /**
57
- * 尝试使用 SPARQL UPDATE 进行 Patch
58
- * 保留此方法供将来 SPARQL endpoint 增强使用
59
- */
60
- private trySparqlPatch;
61
62
  private formatTerm;
62
63
  private fetchRecursiveTriplesToDelete;
63
64
  private fetchExistingObjects;
@@ -1 +1 @@
1
- {"version":3,"file":"ldp-executor.d.ts","sourceRoot":"","sources":["../../../../src/core/execution/ldp-executor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAGjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAE1C,qBAAa,WAAW;IACtB,OAAO,CAAC,cAAc,CAAyB;IAC/C,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,aAAa,CAAoB;IACzC,OAAO,CAAC,WAAW,CAAc;IAGjC,OAAO,CAAC,cAAc,CAAK;gBAEf,cAAc,EAAE,sBAAsB,EAAE,OAAO,EAAE,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW;IAOnG;;;;OAIG;IACH,gBAAgB,CACd,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,EACtC,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,GAClC,IAAI;IAIP;;OAEG;IACH,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI7B;;OAEG;IACG,aAAa,CACjB,IAAI,EAAE,GAAG,EAAE,EACX,KAAK,EAAE,QAAQ,EACf,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,GAAG,EAAE,CAAC;IA8IjB;;OAEG;IACG,aAAa,CACjB,KAAK,EAAE,QAAQ,EACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,QAAQ,EAAE,MAAM,EAAE,EAClB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,GAAG,EAAE,CAAC;IA2FjB;;OAEG;IACG,aAAa,CACjB,QAAQ,EAAE,MAAM,EAAE,EAClB,KAAK,EAAE,QAAQ,EACf,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,GAAG,EAAE,CAAC;YAmCH,cAAc;YAWd,uBAAuB;IAqFrC;;;;;;OAMG;YACW,cAAc;IAwE5B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAyBzB;;OAEG;YACW,sBAAsB;IA8DpC;;;OAGG;YACW,cAAc;IAa5B,OAAO,CAAC,UAAU;YA2BJ,6BAA6B;YA+C7B,oBAAoB;YAgBpB,oBAAoB;CAUnC"}
1
+ {"version":3,"file":"ldp-executor.d.ts","sourceRoot":"","sources":["../../../../src/core/execution/ldp-executor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAEjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAE1C,qBAAa,WAAW;IACtB,OAAO,CAAC,cAAc,CAAyB;IAC/C,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,aAAa,CAAoB;IACzC,OAAO,CAAC,WAAW,CAAc;gBAErB,cAAc,EAAE,sBAAsB,EAAE,OAAO,EAAE,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW;IAOnG;;;;OAIG;IACH,gBAAgB,CACd,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,EACtC,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,GAClC,IAAI;IAIP;;OAEG;IACH,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI7B;;OAEG;IACG,aAAa,CACjB,IAAI,EAAE,GAAG,EAAE,EACX,KAAK,EAAE,QAAQ,EACf,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,GAAG,EAAE,CAAC;IAsMjB;;OAEG;IACG,aAAa,CACjB,KAAK,EAAE,QAAQ,EACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,QAAQ,EAAE,MAAM,EAAE,EAClB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,GAAG,EAAE,CAAC;IA2FjB;;OAEG;IACG,aAAa,CACjB,QAAQ,EAAE,MAAM,EAAE,EAClB,KAAK,EAAE,QAAQ,EACf,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,GAAG,EAAE,CAAC;IAmCjB;;OAEG;YACW,gBAAgB;IAqC9B;;OAEG;YACW,eAAe;YAaf,uBAAuB;IAqFrC;;;;;;OAMG;YACW,cAAc;IAwD5B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAyBzB;;OAEG;YACW,sBAAsB;IAoDpC,OAAO,CAAC,UAAU;YA2BJ,6BAA6B;YA+C7B,oBAAoB;YAgBpB,oBAAoB;CAUnC"}
@@ -6,8 +6,6 @@
6
6
  import { TripleBuilderImpl } from '../triple/builder';
7
7
  export class LdpExecutor {
8
8
  constructor(sparqlExecutor, fetchFn, uriResolver) {
9
- // 用于跟踪 N3 Patch 请求数
10
- this.n3PatchCounter = 0;
11
9
  this.sparqlExecutor = sparqlExecutor;
12
10
  this.fetchFn = fetchFn;
13
11
  this.uriResolver = uriResolver;
@@ -31,11 +29,22 @@ export class LdpExecutor {
31
29
  * 执行 INSERT 操作
32
30
  */
33
31
  async executeInsert(rows, table, resourceUrl) {
34
- const deleteTriples = [];
35
32
  const insertTriples = [];
33
+ // DEBUG: Log insert operation details
34
+ console.log('[DEBUG executeInsert]', {
35
+ tableName: table.config?.name,
36
+ resourceUrl,
37
+ rowCount: rows.length,
38
+ template: table.config?.subjectTemplate,
39
+ base: table.config?.base,
40
+ });
36
41
  rows.forEach((row, idx) => {
42
+ // DEBUG: Log row data
43
+ console.log(`[DEBUG executeInsert] Row ${idx}:`, JSON.stringify(row));
37
44
  // 使用 SubjectResolver 生成 URI
38
45
  const subject = this.uriResolver.resolveSubject(table, row, idx);
46
+ // DEBUG: Log generated subject URI
47
+ console.log(`[DEBUG executeInsert] Generated subject URI: ${subject}`);
39
48
  // 1. rdf:type
40
49
  const typeTriple = this.tripleBuilder.buildTypeTriple(subject, table.config.type);
41
50
  insertTriples.push(...this.tripleBuilder.toN3Strings([typeTriple]));
@@ -59,12 +68,17 @@ export class LdpExecutor {
59
68
  });
60
69
  });
61
70
  if (insertTriples.length === 0) {
71
+ console.log('[DEBUG executeInsert] No triples to insert, returning empty');
62
72
  return [];
63
73
  }
64
74
  const mode = this.uriResolver.getResourceMode(table);
65
- // Document Mode: 每条记录单独写入各自的文件
75
+ console.log(`[DEBUG executeInsert] Mode for table ${table.config?.name}: ${mode}`);
76
+ // Document Mode: 每条记录写入各自的文件
77
+ // 但如果多条记录共享同一个资源 URL(如同一天的 messages.ttl),则合并写入
66
78
  if (mode === 'document') {
67
- const results = [];
79
+ console.log('[DEBUG executeInsert] Entering Document mode branch');
80
+ // 按 resourceUrl 分组收集三元组
81
+ const resourceTriples = new Map();
68
82
  for (let idx = 0; idx < rows.length; idx++) {
69
83
  const row = rows[idx];
70
84
  const subject = this.uriResolver.resolveSubject(table, row, idx);
@@ -91,15 +105,43 @@ export class LdpExecutor {
91
105
  });
92
106
  if (recordTriples.length === 0)
93
107
  continue;
94
- const body = recordTriples.join('\n');
95
- const response = await this.fetchFn(docResourceUrl, {
96
- method: 'PUT',
97
- headers: { 'Content-Type': 'text/turtle' },
98
- body
99
- });
108
+ // resourceUrl 分组
109
+ const existing = resourceTriples.get(docResourceUrl) || [];
110
+ existing.push(...recordTriples);
111
+ resourceTriples.set(docResourceUrl, existing);
112
+ }
113
+ // 对每个唯一的 resourceUrl 执行一次写入
114
+ const results = [];
115
+ for (const [docResourceUrl, triples] of resourceTriples.entries()) {
116
+ // 检查资源是否已存在,如果存在则使用 PATCH 追加
117
+ const headRes = await this.fetchFn(docResourceUrl, { method: 'HEAD' });
118
+ const resourceExists = headRes.ok || headRes.status === 405;
119
+ let response;
120
+ if (resourceExists) {
121
+ // 资源已存在,使用 SPARQL UPDATE 追加三元组
122
+ const sparql = `INSERT DATA {\n${triples.join('\n')}\n}`;
123
+ console.log(`[DEBUG executeInsert] Document mode PATCH to: ${docResourceUrl}`);
124
+ console.log(`[DEBUG executeInsert] Triples being added:\n${triples.join('\n')}`);
125
+ response = await this.fetchFn(docResourceUrl, {
126
+ method: 'PATCH',
127
+ headers: { 'Content-Type': 'application/sparql-update' },
128
+ body: sparql
129
+ });
130
+ }
131
+ else {
132
+ // 资源不存在,使用 PUT 创建
133
+ const body = triples.join('\n');
134
+ console.log(`[DEBUG executeInsert] Document mode PUT to: ${docResourceUrl}`);
135
+ console.log(`[DEBUG executeInsert] Triples being stored:\n${body}`);
136
+ response = await this.fetchFn(docResourceUrl, {
137
+ method: 'PUT',
138
+ headers: { 'Content-Type': 'text/turtle' },
139
+ body
140
+ });
141
+ }
100
142
  if (![200, 201, 202, 204, 205].includes(response.status)) {
101
143
  const text = await response.text().catch(() => '');
102
- throw new Error(`PUT failed for ${docResourceUrl}: ${response.status} ${response.statusText}${text ? ` - ${text}` : ''}`);
144
+ throw new Error(`Write failed for ${docResourceUrl}: ${response.status} ${response.statusText}${text ? ` - ${text}` : ''}`);
103
145
  }
104
146
  await this.sparqlExecutor.invalidateHttpCache(docResourceUrl);
105
147
  const lastSlash = docResourceUrl.lastIndexOf('/');
@@ -107,7 +149,9 @@ export class LdpExecutor {
107
149
  const containerUrl = docResourceUrl.slice(0, lastSlash + 1);
108
150
  await this.sparqlExecutor.invalidateHttpCache(containerUrl);
109
151
  }
110
- results.push({ success: true, source: docResourceUrl, status: response.status, via: 'put' });
152
+ // Also invalidate global cache to ensure SPARQL endpoint queries see the new data
153
+ await this.sparqlExecutor.invalidateHttpCache(undefined).catch(() => undefined);
154
+ results.push({ success: true, source: docResourceUrl, status: response.status, via: resourceExists ? 'patch' : 'put' });
111
155
  }
112
156
  return results;
113
157
  }
@@ -154,6 +198,8 @@ export class LdpExecutor {
154
198
  const containerUrl = resourceUrl.slice(0, lastSlash + 1);
155
199
  await this.sparqlExecutor.invalidateHttpCache(containerUrl);
156
200
  }
201
+ // Also invalidate global cache to ensure SPARQL endpoint queries see the new data
202
+ await this.sparqlExecutor.invalidateHttpCache(undefined).catch(() => undefined);
157
203
  return [{ success: true, source: resourceUrl, status: response.status, via: 'sparql-update' }];
158
204
  }
159
205
  /**
@@ -180,7 +226,7 @@ export class LdpExecutor {
180
226
  // 这里需要特殊的逻辑来处理"更新"语义:先删旧的,再插新的
181
227
  // 额外的内联对象清理逻辑
182
228
  const entries = Object.entries(data).filter(([_, value]) => value !== undefined);
183
- for (const [key, rawValue] of entries) {
229
+ for (const [key] of entries) {
184
230
  // 跳过系统字段
185
231
  if (key === '@id' || key === 'subject')
186
232
  continue;
@@ -260,18 +306,47 @@ export class LdpExecutor {
260
306
  return results;
261
307
  }
262
308
  // ================= Private Helpers =================
263
- async resourceExists(resourceUrl) {
264
- try {
265
- const response = await this.fetchFn(resourceUrl, { method: 'HEAD' });
266
- if (response.ok || response.status === 405)
267
- return true;
268
- if (response.status === 404)
269
- return false;
270
- return response.ok;
271
- }
272
- catch {
273
- return false;
309
+ /**
310
+ * Execute a function with exponential backoff retry on server errors
311
+ */
312
+ async retryWithBackoff(fn, maxRetries = 3) {
313
+ let response = null;
314
+ let lastError;
315
+ for (let i = 0; i < maxRetries; i++) {
316
+ try {
317
+ const outcome = await fn();
318
+ response = outcome.response;
319
+ if (outcome.result !== undefined) {
320
+ return { response, result: outcome.result };
321
+ }
322
+ if (outcome.fallback) {
323
+ const fallbackResult = await outcome.fallback();
324
+ return { response, result: fallbackResult };
325
+ }
326
+ if (!outcome.shouldRetry) {
327
+ break;
328
+ }
329
+ await new Promise(r => setTimeout(r, 1000 * (i + 1)));
330
+ }
331
+ catch (e) {
332
+ lastError = e;
333
+ if (i < maxRetries - 1) {
334
+ await new Promise(r => setTimeout(r, 1000 * (i + 1)));
335
+ }
336
+ }
274
337
  }
338
+ return { response, lastError };
339
+ }
340
+ /**
341
+ * Build error from failed response
342
+ */
343
+ async buildPatchError(response, lastError, errorPrefix) {
344
+ const text = response ? await response.text().catch(() => '') : '';
345
+ const status = response ? response.status : 'Network Error';
346
+ const statusText = response ? response.statusText : (lastError instanceof Error ? lastError.message : String(lastError));
347
+ const error = new Error(`${errorPrefix} failed: ${status} ${statusText}${text ? ` - ${text}` : ''}`);
348
+ error.status = status;
349
+ return error;
275
350
  }
276
351
  async buildUpdatePatchPayload(subject, table, data, resourceUrl) {
277
352
  const deleteTriples = [];
@@ -352,59 +427,43 @@ export class LdpExecutor {
352
427
  if (deleteTriples.length === 0 && insertTriples.length === 0 && deleteWherePatterns.length === 0) {
353
428
  return [];
354
429
  }
355
- this.n3PatchCounter++;
356
- // 构建 SPARQL UPDATE 查询
357
430
  const sparqlUpdate = this.buildSparqlUpdate(deleteTriples, insertTriples, deleteWherePatterns);
358
- let response;
359
- let lastError;
360
- // 首先尝试 SPARQL UPDATE
361
- for (let i = 0; i < 3; i++) {
362
- try {
363
- response = await this.fetchFn(resourceUrl, {
364
- method: 'PATCH',
365
- headers: {
366
- 'Content-Type': 'application/sparql-update'
367
- },
368
- body: sparqlUpdate
369
- });
370
- if (response.ok) {
371
- await this.sparqlExecutor.invalidateHttpCache(resourceUrl);
372
- return [{ success: true, source: resourceUrl, status: response.status, via: 'sparql-update' }];
373
- }
374
- // 如果 SPARQL UPDATE 不被支持 (415/405),尝试 N3 Patch
375
- // 如果 SPARQL UPDATE 不被支持 (415/405),尝试 N3 Patch
376
- if (response.status === 415 || response.status === 405) {
377
- const fallbackDeletes = deleteWherePatterns.length > 0
378
- ? [...deleteTriples, ...deleteWherePatterns]
379
- : deleteTriples;
380
- const fallbackWhere = deleteWherePatterns.length > 0
381
- ? deleteWherePatterns
382
- : wherePatterns;
383
- return await this.executeN3PatchInternal(resourceUrl, fallbackDeletes, insertTriples, fallbackWhere);
384
- }
385
- // 服务器错误,重试
386
- if (response.status >= 500 || response.status === 409) {
387
- await new Promise(r => setTimeout(r, 1000 * (i + 1)));
388
- continue;
389
- }
390
- break;
431
+ const { response, result, lastError } = await this.retryWithBackoff(async () => {
432
+ const res = await this.fetchFn(resourceUrl, {
433
+ method: 'PATCH',
434
+ headers: { 'Content-Type': 'application/sparql-update' },
435
+ body: sparqlUpdate
436
+ });
437
+ if (res.ok) {
438
+ await this.sparqlExecutor.invalidateHttpCache(resourceUrl);
439
+ return {
440
+ response: res,
441
+ result: [{ success: true, source: resourceUrl, status: res.status, via: 'sparql-update' }],
442
+ shouldRetry: false
443
+ };
391
444
  }
392
- catch (e) {
393
- lastError = e;
394
- if (i < 2)
395
- await new Promise(r => setTimeout(r, 1000 * (i + 1)));
445
+ // SPARQL UPDATE not supported, fallback to N3 Patch
446
+ if (res.status === 415 || res.status === 405) {
447
+ const fallbackDeletes = deleteWherePatterns.length > 0
448
+ ? [...deleteTriples, ...deleteWherePatterns]
449
+ : deleteTriples;
450
+ const fallbackWhere = deleteWherePatterns.length > 0
451
+ ? deleteWherePatterns
452
+ : wherePatterns;
453
+ return {
454
+ response: res,
455
+ shouldRetry: false,
456
+ fallback: () => this.executeN3PatchInternal(resourceUrl, fallbackDeletes, insertTriples, fallbackWhere)
457
+ };
396
458
  }
459
+ // Server error, retry
460
+ const shouldRetry = res.status >= 500 || res.status === 409;
461
+ return { response: res, shouldRetry };
462
+ });
463
+ if (result) {
464
+ return result;
397
465
  }
398
- if (!response || !response.ok) {
399
- const text = response ? await response.text().catch(() => '') : '';
400
- const status = response ? response.status : 'Network Error';
401
- const statusText = response ? response.statusText : (lastError instanceof Error ? lastError.message : String(lastError));
402
- const error = new Error(`SPARQL UPDATE failed: ${status} ${statusText}${text ? ` - ${text}` : ''}`);
403
- error.status = status;
404
- throw error;
405
- }
406
- await this.sparqlExecutor.invalidateHttpCache(resourceUrl);
407
- return [{ success: true, source: resourceUrl, status: response.status, via: 'sparql-update' }];
466
+ throw await this.buildPatchError(response, lastError, 'SPARQL UPDATE');
408
467
  }
409
468
  /**
410
469
  * 构建 SPARQL UPDATE 查询
@@ -430,73 +489,43 @@ export class LdpExecutor {
430
489
  */
431
490
  async executeN3PatchInternal(resourceUrl, deleteTriples, insertTriples, wherePatterns = []) {
432
491
  const patch = this.tripleBuilder.buildN3Patch(deleteTriples, insertTriples, wherePatterns);
433
- let response;
434
- let lastError;
435
- for (let i = 0; i < 3; i++) {
436
- try {
437
- response = await this.fetchFn(resourceUrl, {
492
+ const { response, result, lastError } = await this.retryWithBackoff(async () => {
493
+ let res = await this.fetchFn(resourceUrl, {
494
+ method: 'PATCH',
495
+ headers: { 'Content-Type': 'text/n3' },
496
+ body: patch
497
+ });
498
+ // Resource not found, create it and retry
499
+ if (res.status === 404) {
500
+ const createRes = await this.fetchFn(resourceUrl, {
501
+ method: 'PUT',
502
+ headers: { 'Content-Type': 'text/turtle' },
503
+ body: ''
504
+ });
505
+ if (!createRes.ok && createRes.status !== 409) {
506
+ throw new Error(`Failed to create resource ${resourceUrl}: ${createRes.status} ${createRes.statusText}`);
507
+ }
508
+ res = await this.fetchFn(resourceUrl, {
438
509
  method: 'PATCH',
439
- headers: {
440
- 'Content-Type': 'text/n3'
441
- },
510
+ headers: { 'Content-Type': 'text/n3' },
442
511
  body: patch
443
512
  });
444
- if (response.status === 404) {
445
- const createRes = await this.fetchFn(resourceUrl, {
446
- method: 'PUT',
447
- headers: { 'Content-Type': 'text/turtle' },
448
- body: ''
449
- });
450
- if (!createRes.ok && createRes.status !== 409) {
451
- throw new Error(`Failed to create resource ${resourceUrl}: ${createRes.status} ${createRes.statusText}`);
452
- }
453
- response = await this.fetchFn(resourceUrl, {
454
- method: 'PATCH',
455
- headers: { 'Content-Type': 'text/n3' },
456
- body: patch
457
- });
458
- }
459
- if (response.ok)
460
- break;
461
- if (response.status >= 500 || response.status === 409) {
462
- await new Promise(r => setTimeout(r, 1000 * (i + 1)));
463
- continue;
464
- }
465
- break;
466
513
  }
467
- catch (e) {
468
- lastError = e;
469
- if (i < 2)
470
- await new Promise(r => setTimeout(r, 1000 * (i + 1)));
514
+ if (res.ok) {
515
+ await this.sparqlExecutor.invalidateHttpCache(resourceUrl);
516
+ return {
517
+ response: res,
518
+ result: [{ success: true, source: resourceUrl, status: res.status, via: 'n3' }],
519
+ shouldRetry: false
520
+ };
471
521
  }
522
+ const shouldRetry = res.status >= 500 || res.status === 409;
523
+ return { response: res, shouldRetry };
524
+ });
525
+ if (result) {
526
+ return result;
472
527
  }
473
- if (!response || !response.ok) {
474
- const text = response ? await response.text().catch(() => '') : '';
475
- const status = response ? response.status : 'Network Error';
476
- const statusText = response ? response.statusText : (lastError instanceof Error ? lastError.message : String(lastError));
477
- const error = new Error(`N3 PATCH failed: ${status} ${statusText}${text ? ` - ${text}` : ''}`);
478
- error.status = status;
479
- throw error;
480
- }
481
- await this.sparqlExecutor.invalidateHttpCache(resourceUrl);
482
- return [{ success: true, source: resourceUrl, status: response.status, via: 'n3' }];
483
- }
484
- /**
485
- * 尝试使用 SPARQL UPDATE 进行 Patch
486
- * 保留此方法供将来 SPARQL endpoint 增强使用
487
- */
488
- async trySparqlPatch(resourceUrl, sparql) {
489
- try {
490
- const response = await this.fetchFn(resourceUrl, {
491
- method: 'PATCH',
492
- headers: { 'Content-Type': 'application/sparql-update' },
493
- body: sparql
494
- });
495
- return response.ok;
496
- }
497
- catch (error) {
498
- return false;
499
- }
528
+ throw await this.buildPatchError(response, lastError, 'N3 PATCH');
500
529
  }
501
530
  formatTerm(term) {
502
531
  if (!term)
@@ -544,7 +573,7 @@ export class LdpExecutor {
544
573
  if (o.termType === 'NamedNode') {
545
574
  // Check against table schema to see if this is an inline column
546
575
  const pVal = p.value;
547
- for (const [colName, col] of Object.entries(table.columns)) {
576
+ for (const [, col] of Object.entries(table.columns)) {
548
577
  const predicate = this.tripleBuilder.getPredicateUri(col, table);
549
578
  // Check if column is inline
550
579
  const isInline = col.dataType === 'object' || col.dataType === 'json' ||