sietch 0.10.0 → 0.10.1
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.
|
@@ -54,5 +54,15 @@ export declare class PostgreSQLDatabaseAdapter implements DatabaseAdapter {
|
|
|
54
54
|
close(): Promise<void>;
|
|
55
55
|
/** Escape a string for use inside AGE cypher literals. */
|
|
56
56
|
private escapeAg;
|
|
57
|
+
/** SQL-literal-quote a value for inline use (doubles single quotes). */
|
|
58
|
+
private quoteSqlLiteral;
|
|
59
|
+
/**
|
|
60
|
+
* Run a cypher block against AGE. Centralises the LOAD/SET ritual and
|
|
61
|
+
* inlines the graph name as a SQL literal — AGE's cypher() rejects the
|
|
62
|
+
* graph name when passed via a bind parameter ("a name constant is
|
|
63
|
+
* expected"). Constructor validation guarantees graphName is identifier-
|
|
64
|
+
* shaped; the literal quote is defence-in-depth.
|
|
65
|
+
*/
|
|
66
|
+
private runCypher;
|
|
57
67
|
}
|
|
58
68
|
export {};
|
|
@@ -21,6 +21,14 @@ export class PostgreSQLDatabaseAdapter {
|
|
|
21
21
|
graphName;
|
|
22
22
|
vectorDims;
|
|
23
23
|
constructor(config, graphName = 'sietch', vectorDims = 768) {
|
|
24
|
+
// AGE's cypher() and create_graph() require the graph name as a SQL string
|
|
25
|
+
// literal at parse time — bind parameters are rejected with "a name
|
|
26
|
+
// constant is expected". We inline the graph name into the SQL text
|
|
27
|
+
// instead, so it must be a safe identifier shape (defence-in-depth on top
|
|
28
|
+
// of the literal-quote helper used in runCypher).
|
|
29
|
+
if (!/^[A-Za-z0-9_]+$/.test(graphName)) {
|
|
30
|
+
throw new Error(`PostgreSQLDatabaseAdapter: graphName must match /^[A-Za-z0-9_]+$/, got ${JSON.stringify(graphName)}`);
|
|
31
|
+
}
|
|
24
32
|
this.pool = new Pool(typeof config === 'string' ? { connectionString: config } : config);
|
|
25
33
|
this.graphName = graphName;
|
|
26
34
|
this.vectorDims = vectorDims;
|
|
@@ -79,10 +87,14 @@ export class PostgreSQLDatabaseAdapter {
|
|
|
79
87
|
await client.query('CREATE EXTENSION IF NOT EXISTS age');
|
|
80
88
|
await client.query(`LOAD 'age'`);
|
|
81
89
|
await client.query(`SET search_path = ag_catalog, "$user", public`);
|
|
82
|
-
// Check if graph exists before creating
|
|
90
|
+
// Check if graph exists before creating. The catalog lookup uses a
|
|
91
|
+
// bind parameter (safe — `name` is a regular column), but
|
|
92
|
+
// create_graph() rejects bind parameters the same way cypher() does,
|
|
93
|
+
// so the graph name is inlined as a SQL literal. Constructor
|
|
94
|
+
// validation ensures graphName matches /^[A-Za-z0-9_]+$/.
|
|
83
95
|
const graphCheck = await client.query(`SELECT 1 FROM ag_catalog.ag_graph WHERE name = $1`, [this.graphName]);
|
|
84
96
|
if (graphCheck.rows.length === 0) {
|
|
85
|
-
await client.query(`SELECT create_graph($
|
|
97
|
+
await client.query(`SELECT create_graph(${this.quoteSqlLiteral(this.graphName)})`);
|
|
86
98
|
}
|
|
87
99
|
}
|
|
88
100
|
catch {
|
|
@@ -147,36 +159,19 @@ export class PostgreSQLDatabaseAdapter {
|
|
|
147
159
|
ON CONFLICT (subtree_id) DO UPDATE SET yjs_state = $2, updated_at = now()`, [subtreeId, Buffer.from(yjsState)]);
|
|
148
160
|
}
|
|
149
161
|
async addGraphEdge(source, label, target) {
|
|
150
|
-
const
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
await client.query(`SELECT * FROM cypher($1, $$
|
|
157
|
-
MERGE (s:Node {id: '${this.escapeAg(source)}'})
|
|
158
|
-
MERGE (t:Node {id: '${this.escapeAg(target)}'})
|
|
159
|
-
MERGE (s)-[:${safeLabel}]->(t)
|
|
160
|
-
$$) AS (v agtype)`, [this.graphName]);
|
|
161
|
-
}
|
|
162
|
-
finally {
|
|
163
|
-
client.release();
|
|
164
|
-
}
|
|
162
|
+
const safeLabel = label.replace(/[^a-zA-Z0-9_]/g, '_');
|
|
163
|
+
await this.runCypher(`
|
|
164
|
+
MERGE (s:Node {id: '${this.escapeAg(source)}'})
|
|
165
|
+
MERGE (t:Node {id: '${this.escapeAg(target)}'})
|
|
166
|
+
MERGE (s)-[:${safeLabel}]->(t)
|
|
167
|
+
`);
|
|
165
168
|
}
|
|
166
169
|
async removeGraphEdge(source, label, target) {
|
|
167
|
-
const
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
await client.query(`SELECT * FROM cypher($1, $$
|
|
173
|
-
MATCH (s:Node {id: '${this.escapeAg(source)}'})-[e:${safeLabel}]->(t:Node {id: '${this.escapeAg(target)}'})
|
|
174
|
-
DELETE e
|
|
175
|
-
$$) AS (v agtype)`, [this.graphName]);
|
|
176
|
-
}
|
|
177
|
-
finally {
|
|
178
|
-
client.release();
|
|
179
|
-
}
|
|
170
|
+
const safeLabel = label.replace(/[^a-zA-Z0-9_]/g, '_');
|
|
171
|
+
await this.runCypher(`
|
|
172
|
+
MATCH (s:Node {id: '${this.escapeAg(source)}'})-[e:${safeLabel}]->(t:Node {id: '${this.escapeAg(target)}'})
|
|
173
|
+
DELETE e
|
|
174
|
+
`);
|
|
180
175
|
}
|
|
181
176
|
async upsertVector(nodeId, subtree, embedding) {
|
|
182
177
|
const vecStr = `[${embedding.join(',')}]`;
|
|
@@ -185,25 +180,17 @@ export class PostgreSQLDatabaseAdapter {
|
|
|
185
180
|
ON CONFLICT (node_id) DO UPDATE SET embedding = $3::halfvec, subtree = $2, updated_at = now()`, [nodeId, subtree, vecStr]);
|
|
186
181
|
}
|
|
187
182
|
async cypherQuery(query, _params) {
|
|
188
|
-
const
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
const val = row.v;
|
|
195
|
-
if (typeof val === 'string') {
|
|
196
|
-
try {
|
|
197
|
-
return JSON.parse(val);
|
|
198
|
-
}
|
|
199
|
-
catch { /* fall through */ }
|
|
183
|
+
const result = await this.runCypher(query);
|
|
184
|
+
return result.rows.map((row) => {
|
|
185
|
+
const val = row.v;
|
|
186
|
+
if (typeof val === 'string') {
|
|
187
|
+
try {
|
|
188
|
+
return JSON.parse(val);
|
|
200
189
|
}
|
|
201
|
-
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
client.release();
|
|
206
|
-
}
|
|
190
|
+
catch { /* fall through */ }
|
|
191
|
+
}
|
|
192
|
+
return { v: val };
|
|
193
|
+
});
|
|
207
194
|
}
|
|
208
195
|
async vectorSearch(embedding, k) {
|
|
209
196
|
const vecStr = `[${embedding.join(',')}]`;
|
|
@@ -246,5 +233,28 @@ export class PostgreSQLDatabaseAdapter {
|
|
|
246
233
|
escapeAg(value) {
|
|
247
234
|
return value.replace(/\\/g, '\\\\').replace(/'/g, "\\'");
|
|
248
235
|
}
|
|
236
|
+
/** SQL-literal-quote a value for inline use (doubles single quotes). */
|
|
237
|
+
quoteSqlLiteral(value) {
|
|
238
|
+
return `'${value.replace(/'/g, "''")}'`;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Run a cypher block against AGE. Centralises the LOAD/SET ritual and
|
|
242
|
+
* inlines the graph name as a SQL literal — AGE's cypher() rejects the
|
|
243
|
+
* graph name when passed via a bind parameter ("a name constant is
|
|
244
|
+
* expected"). Constructor validation guarantees graphName is identifier-
|
|
245
|
+
* shaped; the literal quote is defence-in-depth.
|
|
246
|
+
*/
|
|
247
|
+
async runCypher(cypherText) {
|
|
248
|
+
const client = await this.pool.connect();
|
|
249
|
+
try {
|
|
250
|
+
await client.query(`LOAD 'age'`);
|
|
251
|
+
await client.query(`SET search_path = ag_catalog, "$user", public`);
|
|
252
|
+
const graph = this.quoteSqlLiteral(this.graphName);
|
|
253
|
+
return await client.query(`SELECT * FROM cypher(${graph}, $$ ${cypherText} $$) AS (v agtype)`);
|
|
254
|
+
}
|
|
255
|
+
finally {
|
|
256
|
+
client.release();
|
|
257
|
+
}
|
|
258
|
+
}
|
|
249
259
|
}
|
|
250
260
|
//# sourceMappingURL=pg-adapter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pg-adapter.js","sourceRoot":"","sources":["../../src/server/pg-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AAGpB,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;AAGpB,aAAa;AACb,aAAa;AACb,aAAa;AACb,aAAa;AACb,aAAa;AACb,aAAa;AACb,MAAM,OAAO,yBAAyB;IAC5B,IAAI,CAAU;IACd,WAAW,GAAG,KAAK,CAAC;IACpB,SAAS,CAAS;IAClB,UAAU,CAAS;IAE3B,YAAY,MAA2B,EAAE,SAAS,GAAG,QAAQ,EAAE,UAAU,GAAG,GAAG;QAC7E,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACzF,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,YAAY;QAChB,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO;QAE7B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACzC,IAAI,CAAC;YACH,aAAa;YACb,MAAM,MAAM,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;YACjE,MAAM,MAAM,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;YAE5D,cAAc;YACd,MAAM,MAAM,CAAC,KAAK,CAAC;;;;;;;OAOlB,CAAC,CAAC;YAEH,MAAM,MAAM,CAAC,KAAK,CAAC;;;;;;;;OAQlB,CAAC,CAAC;YAEH,MAAM,MAAM,CAAC,KAAK,CAAC;;;;;;OAMlB,CAAC,CAAC;YAEH,MAAM,MAAM,CAAC,KAAK,CAAC;;;;8BAIK,IAAI,CAAC,UAAU;;;OAGtC,CAAC,CAAC;YAEH,UAAU;YACV,MAAM,MAAM,CAAC,KAAK,CAAC,iEAAiE,CAAC,CAAC;YACtF,MAAM,MAAM,CAAC,KAAK,CAAC,8EAA8E,CAAC,CAAC;YACnG,MAAM,MAAM,CAAC,KAAK,CAAC,qEAAqE,CAAC,CAAC;YAE1F,yDAAyD;YACzD,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;gBACzD,MAAM,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;gBACjC,MAAM,MAAM,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;gBAEpE,
|
|
1
|
+
{"version":3,"file":"pg-adapter.js","sourceRoot":"","sources":["../../src/server/pg-adapter.ts"],"names":[],"mappings":"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"}
|