@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.
- package/dist/core/ast-to-sparql.d.ts +1 -6
- package/dist/core/ast-to-sparql.d.ts.map +1 -1
- package/dist/core/ast-to-sparql.js +3 -22
- package/dist/core/ast-to-sparql.js.map +1 -1
- package/dist/core/execution/ldp-executor.d.ts +8 -7
- package/dist/core/execution/ldp-executor.d.ts.map +1 -1
- package/dist/core/execution/ldp-executor.js +165 -136
- package/dist/core/execution/ldp-executor.js.map +1 -1
- package/dist/core/execution/ldp-strategy.js +1 -1
- package/dist/core/execution/ldp-strategy.js.map +1 -1
- package/dist/core/execution/pod-executor.d.ts.map +1 -1
- package/dist/core/execution/pod-executor.js +9 -0
- package/dist/core/execution/pod-executor.js.map +1 -1
- package/dist/core/execution/sparql-strategy.d.ts +7 -26
- package/dist/core/execution/sparql-strategy.d.ts.map +1 -1
- package/dist/core/execution/sparql-strategy.js +65 -111
- package/dist/core/execution/sparql-strategy.js.map +1 -1
- package/dist/core/execution/types.d.ts +8 -8
- package/dist/core/execution/types.d.ts.map +1 -1
- package/dist/core/federated/executor.d.ts +3 -0
- package/dist/core/federated/executor.d.ts.map +1 -1
- package/dist/core/federated/executor.js +13 -8
- package/dist/core/federated/executor.js.map +1 -1
- package/dist/core/pod-database.d.ts +0 -4
- package/dist/core/pod-database.d.ts.map +1 -1
- package/dist/core/pod-database.js +10 -32
- package/dist/core/pod-database.js.map +1 -1
- package/dist/core/pod-dialect.d.ts +0 -24
- package/dist/core/pod-dialect.d.ts.map +1 -1
- package/dist/core/pod-dialect.js +0 -182
- package/dist/core/pod-dialect.js.map +1 -1
- package/dist/core/pod-session.d.ts +6 -2
- package/dist/core/pod-session.d.ts.map +1 -1
- package/dist/core/pod-session.js +8 -2
- package/dist/core/pod-session.js.map +1 -1
- package/dist/core/query-builders/select-query-builder.d.ts +7 -0
- package/dist/core/query-builders/select-query-builder.d.ts.map +1 -1
- package/dist/core/query-builders/select-query-builder.js +56 -14
- package/dist/core/query-builders/select-query-builder.js.map +1 -1
- package/dist/core/query-conditions.d.ts.map +1 -1
- package/dist/core/query-conditions.js.map +1 -1
- package/dist/core/resource-resolver/base-resolver.d.ts +74 -3
- package/dist/core/resource-resolver/base-resolver.d.ts.map +1 -1
- package/dist/core/resource-resolver/base-resolver.js +221 -0
- package/dist/core/resource-resolver/base-resolver.js.map +1 -1
- package/dist/core/resource-resolver/document-resolver.d.ts +19 -4
- package/dist/core/resource-resolver/document-resolver.d.ts.map +1 -1
- package/dist/core/resource-resolver/document-resolver.js +72 -34
- package/dist/core/resource-resolver/document-resolver.js.map +1 -1
- package/dist/core/resource-resolver/fragment-resolver.d.ts +17 -3
- package/dist/core/resource-resolver/fragment-resolver.d.ts.map +1 -1
- package/dist/core/resource-resolver/fragment-resolver.js +28 -16
- package/dist/core/resource-resolver/fragment-resolver.js.map +1 -1
- package/dist/core/resource-resolver/types.d.ts +1 -1
- package/dist/core/resource-resolver/types.d.ts.map +1 -1
- package/dist/core/schema/pod-table.d.ts +6 -0
- package/dist/core/schema/pod-table.d.ts.map +1 -1
- package/dist/core/schema/pod-table.js +18 -9
- package/dist/core/schema/pod-table.js.map +1 -1
- package/dist/core/sparql/builder/expression-builder.d.ts +1 -0
- package/dist/core/sparql/builder/expression-builder.d.ts.map +1 -1
- package/dist/core/sparql/builder/expression-builder.js +50 -7
- package/dist/core/sparql/builder/expression-builder.js.map +1 -1
- package/dist/core/subject/resolver.d.ts +19 -0
- package/dist/core/subject/resolver.d.ts.map +1 -1
- package/dist/core/subject/resolver.js +77 -21
- package/dist/core/subject/resolver.js.map +1 -1
- package/dist/core/subject/types.d.ts +8 -1
- package/dist/core/subject/types.d.ts.map +1 -1
- package/dist/core/triple/builder.d.ts.map +1 -1
- package/dist/core/triple/builder.js +38 -1
- package/dist/core/triple/builder.js.map +1 -1
- package/dist/core/triple/handlers/inverse.d.ts +6 -2
- package/dist/core/triple/handlers/inverse.d.ts.map +1 -1
- package/dist/core/triple/handlers/inverse.js +37 -16
- package/dist/core/triple/handlers/inverse.js.map +1 -1
- package/dist/core/uri/resolver.d.ts +66 -2
- package/dist/core/uri/resolver.d.ts.map +1 -1
- package/dist/core/uri/resolver.js +212 -80
- package/dist/core/uri/resolver.js.map +1 -1
- package/dist/core/uri/types.d.ts +8 -1
- package/dist/core/uri/types.d.ts.map +1 -1
- package/dist/esm/core/ast-to-sparql.d.ts +1 -6
- package/dist/esm/core/ast-to-sparql.d.ts.map +1 -1
- package/dist/esm/core/ast-to-sparql.js +3 -22
- package/dist/esm/core/ast-to-sparql.js.map +1 -1
- package/dist/esm/core/execution/ldp-executor.d.ts +8 -7
- package/dist/esm/core/execution/ldp-executor.d.ts.map +1 -1
- package/dist/esm/core/execution/ldp-executor.js +165 -136
- package/dist/esm/core/execution/ldp-executor.js.map +1 -1
- package/dist/esm/core/execution/ldp-strategy.js +1 -1
- package/dist/esm/core/execution/ldp-strategy.js.map +1 -1
- package/dist/esm/core/execution/pod-executor.d.ts.map +1 -1
- package/dist/esm/core/execution/pod-executor.js +9 -0
- package/dist/esm/core/execution/pod-executor.js.map +1 -1
- package/dist/esm/core/execution/sparql-strategy.d.ts +7 -26
- package/dist/esm/core/execution/sparql-strategy.d.ts.map +1 -1
- package/dist/esm/core/execution/sparql-strategy.js +65 -111
- package/dist/esm/core/execution/sparql-strategy.js.map +1 -1
- package/dist/esm/core/execution/types.d.ts +8 -8
- package/dist/esm/core/execution/types.d.ts.map +1 -1
- package/dist/esm/core/federated/executor.d.ts +3 -0
- package/dist/esm/core/federated/executor.d.ts.map +1 -1
- package/dist/esm/core/federated/executor.js +13 -8
- package/dist/esm/core/federated/executor.js.map +1 -1
- package/dist/esm/core/pod-database.d.ts +0 -4
- package/dist/esm/core/pod-database.d.ts.map +1 -1
- package/dist/esm/core/pod-database.js +10 -32
- package/dist/esm/core/pod-database.js.map +1 -1
- package/dist/esm/core/pod-dialect.d.ts +0 -24
- package/dist/esm/core/pod-dialect.d.ts.map +1 -1
- package/dist/esm/core/pod-dialect.js +0 -182
- package/dist/esm/core/pod-dialect.js.map +1 -1
- package/dist/esm/core/pod-session.d.ts +6 -2
- package/dist/esm/core/pod-session.d.ts.map +1 -1
- package/dist/esm/core/pod-session.js +8 -2
- package/dist/esm/core/pod-session.js.map +1 -1
- package/dist/esm/core/query-builders/select-query-builder.d.ts +7 -0
- package/dist/esm/core/query-builders/select-query-builder.d.ts.map +1 -1
- package/dist/esm/core/query-builders/select-query-builder.js +56 -14
- package/dist/esm/core/query-builders/select-query-builder.js.map +1 -1
- package/dist/esm/core/query-conditions.d.ts.map +1 -1
- package/dist/esm/core/query-conditions.js.map +1 -1
- package/dist/esm/core/resource-resolver/base-resolver.d.ts +74 -3
- package/dist/esm/core/resource-resolver/base-resolver.d.ts.map +1 -1
- package/dist/esm/core/resource-resolver/base-resolver.js +221 -0
- package/dist/esm/core/resource-resolver/base-resolver.js.map +1 -1
- package/dist/esm/core/resource-resolver/document-resolver.d.ts +19 -4
- package/dist/esm/core/resource-resolver/document-resolver.d.ts.map +1 -1
- package/dist/esm/core/resource-resolver/document-resolver.js +72 -34
- package/dist/esm/core/resource-resolver/document-resolver.js.map +1 -1
- package/dist/esm/core/resource-resolver/fragment-resolver.d.ts +17 -3
- package/dist/esm/core/resource-resolver/fragment-resolver.d.ts.map +1 -1
- package/dist/esm/core/resource-resolver/fragment-resolver.js +28 -16
- package/dist/esm/core/resource-resolver/fragment-resolver.js.map +1 -1
- package/dist/esm/core/resource-resolver/types.d.ts +1 -1
- package/dist/esm/core/resource-resolver/types.d.ts.map +1 -1
- package/dist/esm/core/schema/pod-table.d.ts +6 -0
- package/dist/esm/core/schema/pod-table.d.ts.map +1 -1
- package/dist/esm/core/schema/pod-table.js +18 -9
- package/dist/esm/core/schema/pod-table.js.map +1 -1
- package/dist/esm/core/sparql/builder/expression-builder.d.ts +1 -0
- package/dist/esm/core/sparql/builder/expression-builder.d.ts.map +1 -1
- package/dist/esm/core/sparql/builder/expression-builder.js +50 -7
- package/dist/esm/core/sparql/builder/expression-builder.js.map +1 -1
- package/dist/esm/core/subject/resolver.d.ts +19 -0
- package/dist/esm/core/subject/resolver.d.ts.map +1 -1
- package/dist/esm/core/subject/resolver.js +77 -21
- package/dist/esm/core/subject/resolver.js.map +1 -1
- package/dist/esm/core/subject/types.d.ts +8 -1
- package/dist/esm/core/subject/types.d.ts.map +1 -1
- package/dist/esm/core/triple/builder.d.ts.map +1 -1
- package/dist/esm/core/triple/builder.js +38 -1
- package/dist/esm/core/triple/builder.js.map +1 -1
- package/dist/esm/core/triple/handlers/inverse.d.ts +6 -2
- package/dist/esm/core/triple/handlers/inverse.d.ts.map +1 -1
- package/dist/esm/core/triple/handlers/inverse.js +37 -16
- package/dist/esm/core/triple/handlers/inverse.js.map +1 -1
- package/dist/esm/core/uri/resolver.d.ts +66 -2
- package/dist/esm/core/uri/resolver.d.ts.map +1 -1
- package/dist/esm/core/uri/resolver.js +212 -80
- package/dist/esm/core/uri/resolver.js.map +1 -1
- package/dist/esm/core/uri/types.d.ts +8 -1
- package/dist/esm/core/uri/types.d.ts.map +1 -1
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +5 -1
- package/CHANGELOG-DRAFT.md +0 -444
|
@@ -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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"}
|
|
@@ -60,10 +60,6 @@ class ASTToSPARQLConverter {
|
|
|
60
60
|
}
|
|
61
61
|
addPrefix(prefix, uri) {
|
|
62
62
|
this.prefixes[prefix] = uri;
|
|
63
|
-
// Re-instantiate builders to propagate prefixes if necessary,
|
|
64
|
-
// or make builders reference this.prefixes object (passed by reference).
|
|
65
|
-
// Since we passed object ref in constructor, it should update automatically
|
|
66
|
-
// if we mutate the object.
|
|
67
63
|
}
|
|
68
64
|
// Legacy / Helper methods exposed for other modules
|
|
69
65
|
getPredicateForColumnPublic(column, table) {
|
|
@@ -75,23 +71,8 @@ class ASTToSPARQLConverter {
|
|
|
75
71
|
generateSubjectUri(record, table) {
|
|
76
72
|
return (0, helpers_1.generateSubjectUri)(record, table, this.uriResolver);
|
|
77
73
|
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
* Direct SQL conversion without table context is limited and may not work correctly
|
|
81
|
-
*/
|
|
82
|
-
convert(sql) {
|
|
83
|
-
const sqlString = sql.queryChunks.join('');
|
|
84
|
-
if (sqlString.toLowerCase().includes('select')) {
|
|
85
|
-
return this.convertSelect({
|
|
86
|
-
select: undefined,
|
|
87
|
-
columns: '*',
|
|
88
|
-
where: this.parseWhereClause(sql)
|
|
89
|
-
}, {});
|
|
90
|
-
}
|
|
91
|
-
throw new Error(`Direct SQL conversion without table context is limited: ${sqlString}`);
|
|
92
|
-
}
|
|
93
|
-
parseDrizzleAST(sql, table) {
|
|
94
|
-
// Basic placeholder
|
|
74
|
+
parseDrizzleAST(sql, _table) {
|
|
75
|
+
void _table;
|
|
95
76
|
return {
|
|
96
77
|
type: 'select',
|
|
97
78
|
columns: '*',
|
|
@@ -99,7 +80,7 @@ class ASTToSPARQLConverter {
|
|
|
99
80
|
};
|
|
100
81
|
}
|
|
101
82
|
parseWhereClause(sql) {
|
|
102
|
-
|
|
83
|
+
void sql;
|
|
103
84
|
return {};
|
|
104
85
|
}
|
|
105
86
|
}
|
|
@@ -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
|
-
|
|
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;
|
|
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"}
|
|
@@ -9,8 +9,6 @@ exports.LdpExecutor = void 0;
|
|
|
9
9
|
const builder_1 = require("../triple/builder");
|
|
10
10
|
class LdpExecutor {
|
|
11
11
|
constructor(sparqlExecutor, fetchFn, uriResolver) {
|
|
12
|
-
// 用于跟踪 N3 Patch 请求数
|
|
13
|
-
this.n3PatchCounter = 0;
|
|
14
12
|
this.sparqlExecutor = sparqlExecutor;
|
|
15
13
|
this.fetchFn = fetchFn;
|
|
16
14
|
this.uriResolver = uriResolver;
|
|
@@ -34,11 +32,22 @@ class LdpExecutor {
|
|
|
34
32
|
* 执行 INSERT 操作
|
|
35
33
|
*/
|
|
36
34
|
async executeInsert(rows, table, resourceUrl) {
|
|
37
|
-
const deleteTriples = [];
|
|
38
35
|
const insertTriples = [];
|
|
36
|
+
// DEBUG: Log insert operation details
|
|
37
|
+
console.log('[DEBUG executeInsert]', {
|
|
38
|
+
tableName: table.config?.name,
|
|
39
|
+
resourceUrl,
|
|
40
|
+
rowCount: rows.length,
|
|
41
|
+
template: table.config?.subjectTemplate,
|
|
42
|
+
base: table.config?.base,
|
|
43
|
+
});
|
|
39
44
|
rows.forEach((row, idx) => {
|
|
45
|
+
// DEBUG: Log row data
|
|
46
|
+
console.log(`[DEBUG executeInsert] Row ${idx}:`, JSON.stringify(row));
|
|
40
47
|
// 使用 SubjectResolver 生成 URI
|
|
41
48
|
const subject = this.uriResolver.resolveSubject(table, row, idx);
|
|
49
|
+
// DEBUG: Log generated subject URI
|
|
50
|
+
console.log(`[DEBUG executeInsert] Generated subject URI: ${subject}`);
|
|
42
51
|
// 1. rdf:type
|
|
43
52
|
const typeTriple = this.tripleBuilder.buildTypeTriple(subject, table.config.type);
|
|
44
53
|
insertTriples.push(...this.tripleBuilder.toN3Strings([typeTriple]));
|
|
@@ -62,12 +71,17 @@ class LdpExecutor {
|
|
|
62
71
|
});
|
|
63
72
|
});
|
|
64
73
|
if (insertTriples.length === 0) {
|
|
74
|
+
console.log('[DEBUG executeInsert] No triples to insert, returning empty');
|
|
65
75
|
return [];
|
|
66
76
|
}
|
|
67
77
|
const mode = this.uriResolver.getResourceMode(table);
|
|
68
|
-
|
|
78
|
+
console.log(`[DEBUG executeInsert] Mode for table ${table.config?.name}: ${mode}`);
|
|
79
|
+
// Document Mode: 每条记录写入各自的文件
|
|
80
|
+
// 但如果多条记录共享同一个资源 URL(如同一天的 messages.ttl),则合并写入
|
|
69
81
|
if (mode === 'document') {
|
|
70
|
-
|
|
82
|
+
console.log('[DEBUG executeInsert] Entering Document mode branch');
|
|
83
|
+
// 按 resourceUrl 分组收集三元组
|
|
84
|
+
const resourceTriples = new Map();
|
|
71
85
|
for (let idx = 0; idx < rows.length; idx++) {
|
|
72
86
|
const row = rows[idx];
|
|
73
87
|
const subject = this.uriResolver.resolveSubject(table, row, idx);
|
|
@@ -94,15 +108,43 @@ class LdpExecutor {
|
|
|
94
108
|
});
|
|
95
109
|
if (recordTriples.length === 0)
|
|
96
110
|
continue;
|
|
97
|
-
|
|
98
|
-
const
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
111
|
+
// 按 resourceUrl 分组
|
|
112
|
+
const existing = resourceTriples.get(docResourceUrl) || [];
|
|
113
|
+
existing.push(...recordTriples);
|
|
114
|
+
resourceTriples.set(docResourceUrl, existing);
|
|
115
|
+
}
|
|
116
|
+
// 对每个唯一的 resourceUrl 执行一次写入
|
|
117
|
+
const results = [];
|
|
118
|
+
for (const [docResourceUrl, triples] of resourceTriples.entries()) {
|
|
119
|
+
// 检查资源是否已存在,如果存在则使用 PATCH 追加
|
|
120
|
+
const headRes = await this.fetchFn(docResourceUrl, { method: 'HEAD' });
|
|
121
|
+
const resourceExists = headRes.ok || headRes.status === 405;
|
|
122
|
+
let response;
|
|
123
|
+
if (resourceExists) {
|
|
124
|
+
// 资源已存在,使用 SPARQL UPDATE 追加三元组
|
|
125
|
+
const sparql = `INSERT DATA {\n${triples.join('\n')}\n}`;
|
|
126
|
+
console.log(`[DEBUG executeInsert] Document mode PATCH to: ${docResourceUrl}`);
|
|
127
|
+
console.log(`[DEBUG executeInsert] Triples being added:\n${triples.join('\n')}`);
|
|
128
|
+
response = await this.fetchFn(docResourceUrl, {
|
|
129
|
+
method: 'PATCH',
|
|
130
|
+
headers: { 'Content-Type': 'application/sparql-update' },
|
|
131
|
+
body: sparql
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
// 资源不存在,使用 PUT 创建
|
|
136
|
+
const body = triples.join('\n');
|
|
137
|
+
console.log(`[DEBUG executeInsert] Document mode PUT to: ${docResourceUrl}`);
|
|
138
|
+
console.log(`[DEBUG executeInsert] Triples being stored:\n${body}`);
|
|
139
|
+
response = await this.fetchFn(docResourceUrl, {
|
|
140
|
+
method: 'PUT',
|
|
141
|
+
headers: { 'Content-Type': 'text/turtle' },
|
|
142
|
+
body
|
|
143
|
+
});
|
|
144
|
+
}
|
|
103
145
|
if (![200, 201, 202, 204, 205].includes(response.status)) {
|
|
104
146
|
const text = await response.text().catch(() => '');
|
|
105
|
-
throw new Error(`
|
|
147
|
+
throw new Error(`Write failed for ${docResourceUrl}: ${response.status} ${response.statusText}${text ? ` - ${text}` : ''}`);
|
|
106
148
|
}
|
|
107
149
|
await this.sparqlExecutor.invalidateHttpCache(docResourceUrl);
|
|
108
150
|
const lastSlash = docResourceUrl.lastIndexOf('/');
|
|
@@ -110,7 +152,9 @@ class LdpExecutor {
|
|
|
110
152
|
const containerUrl = docResourceUrl.slice(0, lastSlash + 1);
|
|
111
153
|
await this.sparqlExecutor.invalidateHttpCache(containerUrl);
|
|
112
154
|
}
|
|
113
|
-
|
|
155
|
+
// Also invalidate global cache to ensure SPARQL endpoint queries see the new data
|
|
156
|
+
await this.sparqlExecutor.invalidateHttpCache(undefined).catch(() => undefined);
|
|
157
|
+
results.push({ success: true, source: docResourceUrl, status: response.status, via: resourceExists ? 'patch' : 'put' });
|
|
114
158
|
}
|
|
115
159
|
return results;
|
|
116
160
|
}
|
|
@@ -157,6 +201,8 @@ class LdpExecutor {
|
|
|
157
201
|
const containerUrl = resourceUrl.slice(0, lastSlash + 1);
|
|
158
202
|
await this.sparqlExecutor.invalidateHttpCache(containerUrl);
|
|
159
203
|
}
|
|
204
|
+
// Also invalidate global cache to ensure SPARQL endpoint queries see the new data
|
|
205
|
+
await this.sparqlExecutor.invalidateHttpCache(undefined).catch(() => undefined);
|
|
160
206
|
return [{ success: true, source: resourceUrl, status: response.status, via: 'sparql-update' }];
|
|
161
207
|
}
|
|
162
208
|
/**
|
|
@@ -183,7 +229,7 @@ class LdpExecutor {
|
|
|
183
229
|
// 这里需要特殊的逻辑来处理"更新"语义:先删旧的,再插新的
|
|
184
230
|
// 额外的内联对象清理逻辑
|
|
185
231
|
const entries = Object.entries(data).filter(([_, value]) => value !== undefined);
|
|
186
|
-
for (const [key
|
|
232
|
+
for (const [key] of entries) {
|
|
187
233
|
// 跳过系统字段
|
|
188
234
|
if (key === '@id' || key === 'subject')
|
|
189
235
|
continue;
|
|
@@ -263,18 +309,47 @@ class LdpExecutor {
|
|
|
263
309
|
return results;
|
|
264
310
|
}
|
|
265
311
|
// ================= Private Helpers =================
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
312
|
+
/**
|
|
313
|
+
* Execute a function with exponential backoff retry on server errors
|
|
314
|
+
*/
|
|
315
|
+
async retryWithBackoff(fn, maxRetries = 3) {
|
|
316
|
+
let response = null;
|
|
317
|
+
let lastError;
|
|
318
|
+
for (let i = 0; i < maxRetries; i++) {
|
|
319
|
+
try {
|
|
320
|
+
const outcome = await fn();
|
|
321
|
+
response = outcome.response;
|
|
322
|
+
if (outcome.result !== undefined) {
|
|
323
|
+
return { response, result: outcome.result };
|
|
324
|
+
}
|
|
325
|
+
if (outcome.fallback) {
|
|
326
|
+
const fallbackResult = await outcome.fallback();
|
|
327
|
+
return { response, result: fallbackResult };
|
|
328
|
+
}
|
|
329
|
+
if (!outcome.shouldRetry) {
|
|
330
|
+
break;
|
|
331
|
+
}
|
|
332
|
+
await new Promise(r => setTimeout(r, 1000 * (i + 1)));
|
|
333
|
+
}
|
|
334
|
+
catch (e) {
|
|
335
|
+
lastError = e;
|
|
336
|
+
if (i < maxRetries - 1) {
|
|
337
|
+
await new Promise(r => setTimeout(r, 1000 * (i + 1)));
|
|
338
|
+
}
|
|
339
|
+
}
|
|
277
340
|
}
|
|
341
|
+
return { response, lastError };
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Build error from failed response
|
|
345
|
+
*/
|
|
346
|
+
async buildPatchError(response, lastError, errorPrefix) {
|
|
347
|
+
const text = response ? await response.text().catch(() => '') : '';
|
|
348
|
+
const status = response ? response.status : 'Network Error';
|
|
349
|
+
const statusText = response ? response.statusText : (lastError instanceof Error ? lastError.message : String(lastError));
|
|
350
|
+
const error = new Error(`${errorPrefix} failed: ${status} ${statusText}${text ? ` - ${text}` : ''}`);
|
|
351
|
+
error.status = status;
|
|
352
|
+
return error;
|
|
278
353
|
}
|
|
279
354
|
async buildUpdatePatchPayload(subject, table, data, resourceUrl) {
|
|
280
355
|
const deleteTriples = [];
|
|
@@ -355,59 +430,43 @@ class LdpExecutor {
|
|
|
355
430
|
if (deleteTriples.length === 0 && insertTriples.length === 0 && deleteWherePatterns.length === 0) {
|
|
356
431
|
return [];
|
|
357
432
|
}
|
|
358
|
-
this.n3PatchCounter++;
|
|
359
|
-
// 构建 SPARQL UPDATE 查询
|
|
360
433
|
const sparqlUpdate = this.buildSparqlUpdate(deleteTriples, insertTriples, deleteWherePatterns);
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
await this.sparqlExecutor.invalidateHttpCache(resourceUrl);
|
|
375
|
-
return [{ success: true, source: resourceUrl, status: response.status, via: 'sparql-update' }];
|
|
376
|
-
}
|
|
377
|
-
// 如果 SPARQL UPDATE 不被支持 (415/405),尝试 N3 Patch
|
|
378
|
-
// 如果 SPARQL UPDATE 不被支持 (415/405),尝试 N3 Patch
|
|
379
|
-
if (response.status === 415 || response.status === 405) {
|
|
380
|
-
const fallbackDeletes = deleteWherePatterns.length > 0
|
|
381
|
-
? [...deleteTriples, ...deleteWherePatterns]
|
|
382
|
-
: deleteTriples;
|
|
383
|
-
const fallbackWhere = deleteWherePatterns.length > 0
|
|
384
|
-
? deleteWherePatterns
|
|
385
|
-
: wherePatterns;
|
|
386
|
-
return await this.executeN3PatchInternal(resourceUrl, fallbackDeletes, insertTriples, fallbackWhere);
|
|
387
|
-
}
|
|
388
|
-
// 服务器错误,重试
|
|
389
|
-
if (response.status >= 500 || response.status === 409) {
|
|
390
|
-
await new Promise(r => setTimeout(r, 1000 * (i + 1)));
|
|
391
|
-
continue;
|
|
392
|
-
}
|
|
393
|
-
break;
|
|
434
|
+
const { response, result, lastError } = await this.retryWithBackoff(async () => {
|
|
435
|
+
const res = await this.fetchFn(resourceUrl, {
|
|
436
|
+
method: 'PATCH',
|
|
437
|
+
headers: { 'Content-Type': 'application/sparql-update' },
|
|
438
|
+
body: sparqlUpdate
|
|
439
|
+
});
|
|
440
|
+
if (res.ok) {
|
|
441
|
+
await this.sparqlExecutor.invalidateHttpCache(resourceUrl);
|
|
442
|
+
return {
|
|
443
|
+
response: res,
|
|
444
|
+
result: [{ success: true, source: resourceUrl, status: res.status, via: 'sparql-update' }],
|
|
445
|
+
shouldRetry: false
|
|
446
|
+
};
|
|
394
447
|
}
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
448
|
+
// SPARQL UPDATE not supported, fallback to N3 Patch
|
|
449
|
+
if (res.status === 415 || res.status === 405) {
|
|
450
|
+
const fallbackDeletes = deleteWherePatterns.length > 0
|
|
451
|
+
? [...deleteTriples, ...deleteWherePatterns]
|
|
452
|
+
: deleteTriples;
|
|
453
|
+
const fallbackWhere = deleteWherePatterns.length > 0
|
|
454
|
+
? deleteWherePatterns
|
|
455
|
+
: wherePatterns;
|
|
456
|
+
return {
|
|
457
|
+
response: res,
|
|
458
|
+
shouldRetry: false,
|
|
459
|
+
fallback: () => this.executeN3PatchInternal(resourceUrl, fallbackDeletes, insertTriples, fallbackWhere)
|
|
460
|
+
};
|
|
399
461
|
}
|
|
462
|
+
// Server error, retry
|
|
463
|
+
const shouldRetry = res.status >= 500 || res.status === 409;
|
|
464
|
+
return { response: res, shouldRetry };
|
|
465
|
+
});
|
|
466
|
+
if (result) {
|
|
467
|
+
return result;
|
|
400
468
|
}
|
|
401
|
-
|
|
402
|
-
const text = response ? await response.text().catch(() => '') : '';
|
|
403
|
-
const status = response ? response.status : 'Network Error';
|
|
404
|
-
const statusText = response ? response.statusText : (lastError instanceof Error ? lastError.message : String(lastError));
|
|
405
|
-
const error = new Error(`SPARQL UPDATE failed: ${status} ${statusText}${text ? ` - ${text}` : ''}`);
|
|
406
|
-
error.status = status;
|
|
407
|
-
throw error;
|
|
408
|
-
}
|
|
409
|
-
await this.sparqlExecutor.invalidateHttpCache(resourceUrl);
|
|
410
|
-
return [{ success: true, source: resourceUrl, status: response.status, via: 'sparql-update' }];
|
|
469
|
+
throw await this.buildPatchError(response, lastError, 'SPARQL UPDATE');
|
|
411
470
|
}
|
|
412
471
|
/**
|
|
413
472
|
* 构建 SPARQL UPDATE 查询
|
|
@@ -433,73 +492,43 @@ class LdpExecutor {
|
|
|
433
492
|
*/
|
|
434
493
|
async executeN3PatchInternal(resourceUrl, deleteTriples, insertTriples, wherePatterns = []) {
|
|
435
494
|
const patch = this.tripleBuilder.buildN3Patch(deleteTriples, insertTriples, wherePatterns);
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
495
|
+
const { response, result, lastError } = await this.retryWithBackoff(async () => {
|
|
496
|
+
let res = await this.fetchFn(resourceUrl, {
|
|
497
|
+
method: 'PATCH',
|
|
498
|
+
headers: { 'Content-Type': 'text/n3' },
|
|
499
|
+
body: patch
|
|
500
|
+
});
|
|
501
|
+
// Resource not found, create it and retry
|
|
502
|
+
if (res.status === 404) {
|
|
503
|
+
const createRes = await this.fetchFn(resourceUrl, {
|
|
504
|
+
method: 'PUT',
|
|
505
|
+
headers: { 'Content-Type': 'text/turtle' },
|
|
506
|
+
body: ''
|
|
507
|
+
});
|
|
508
|
+
if (!createRes.ok && createRes.status !== 409) {
|
|
509
|
+
throw new Error(`Failed to create resource ${resourceUrl}: ${createRes.status} ${createRes.statusText}`);
|
|
510
|
+
}
|
|
511
|
+
res = await this.fetchFn(resourceUrl, {
|
|
441
512
|
method: 'PATCH',
|
|
442
|
-
headers: {
|
|
443
|
-
'Content-Type': 'text/n3'
|
|
444
|
-
},
|
|
513
|
+
headers: { 'Content-Type': 'text/n3' },
|
|
445
514
|
body: patch
|
|
446
515
|
});
|
|
447
|
-
if (response.status === 404) {
|
|
448
|
-
const createRes = await this.fetchFn(resourceUrl, {
|
|
449
|
-
method: 'PUT',
|
|
450
|
-
headers: { 'Content-Type': 'text/turtle' },
|
|
451
|
-
body: ''
|
|
452
|
-
});
|
|
453
|
-
if (!createRes.ok && createRes.status !== 409) {
|
|
454
|
-
throw new Error(`Failed to create resource ${resourceUrl}: ${createRes.status} ${createRes.statusText}`);
|
|
455
|
-
}
|
|
456
|
-
response = await this.fetchFn(resourceUrl, {
|
|
457
|
-
method: 'PATCH',
|
|
458
|
-
headers: { 'Content-Type': 'text/n3' },
|
|
459
|
-
body: patch
|
|
460
|
-
});
|
|
461
|
-
}
|
|
462
|
-
if (response.ok)
|
|
463
|
-
break;
|
|
464
|
-
if (response.status >= 500 || response.status === 409) {
|
|
465
|
-
await new Promise(r => setTimeout(r, 1000 * (i + 1)));
|
|
466
|
-
continue;
|
|
467
|
-
}
|
|
468
|
-
break;
|
|
469
516
|
}
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
517
|
+
if (res.ok) {
|
|
518
|
+
await this.sparqlExecutor.invalidateHttpCache(resourceUrl);
|
|
519
|
+
return {
|
|
520
|
+
response: res,
|
|
521
|
+
result: [{ success: true, source: resourceUrl, status: res.status, via: 'n3' }],
|
|
522
|
+
shouldRetry: false
|
|
523
|
+
};
|
|
474
524
|
}
|
|
525
|
+
const shouldRetry = res.status >= 500 || res.status === 409;
|
|
526
|
+
return { response: res, shouldRetry };
|
|
527
|
+
});
|
|
528
|
+
if (result) {
|
|
529
|
+
return result;
|
|
475
530
|
}
|
|
476
|
-
|
|
477
|
-
const text = response ? await response.text().catch(() => '') : '';
|
|
478
|
-
const status = response ? response.status : 'Network Error';
|
|
479
|
-
const statusText = response ? response.statusText : (lastError instanceof Error ? lastError.message : String(lastError));
|
|
480
|
-
const error = new Error(`N3 PATCH failed: ${status} ${statusText}${text ? ` - ${text}` : ''}`);
|
|
481
|
-
error.status = status;
|
|
482
|
-
throw error;
|
|
483
|
-
}
|
|
484
|
-
await this.sparqlExecutor.invalidateHttpCache(resourceUrl);
|
|
485
|
-
return [{ success: true, source: resourceUrl, status: response.status, via: 'n3' }];
|
|
486
|
-
}
|
|
487
|
-
/**
|
|
488
|
-
* 尝试使用 SPARQL UPDATE 进行 Patch
|
|
489
|
-
* 保留此方法供将来 SPARQL endpoint 增强使用
|
|
490
|
-
*/
|
|
491
|
-
async trySparqlPatch(resourceUrl, sparql) {
|
|
492
|
-
try {
|
|
493
|
-
const response = await this.fetchFn(resourceUrl, {
|
|
494
|
-
method: 'PATCH',
|
|
495
|
-
headers: { 'Content-Type': 'application/sparql-update' },
|
|
496
|
-
body: sparql
|
|
497
|
-
});
|
|
498
|
-
return response.ok;
|
|
499
|
-
}
|
|
500
|
-
catch (error) {
|
|
501
|
-
return false;
|
|
502
|
-
}
|
|
531
|
+
throw await this.buildPatchError(response, lastError, 'N3 PATCH');
|
|
503
532
|
}
|
|
504
533
|
formatTerm(term) {
|
|
505
534
|
if (!term)
|
|
@@ -547,7 +576,7 @@ class LdpExecutor {
|
|
|
547
576
|
if (o.termType === 'NamedNode') {
|
|
548
577
|
// Check against table schema to see if this is an inline column
|
|
549
578
|
const pVal = p.value;
|
|
550
|
-
for (const [
|
|
579
|
+
for (const [, col] of Object.entries(table.columns)) {
|
|
551
580
|
const predicate = this.tripleBuilder.getPredicateUri(col, table);
|
|
552
581
|
// Check if column is inline
|
|
553
582
|
const isInline = col.dataType === 'object' || col.dataType === 'json' ||
|