lokicms-plugin-sql 1.0.0
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/federation/cache-layer.d.ts +58 -0
- package/dist/federation/cache-layer.d.ts.map +1 -0
- package/dist/federation/cache-layer.js +210 -0
- package/dist/federation/cache-layer.js.map +1 -0
- package/dist/federation/index.d.ts +12 -0
- package/dist/federation/index.d.ts.map +1 -0
- package/dist/federation/index.js +9 -0
- package/dist/federation/index.js.map +1 -0
- package/dist/federation/source-manager.d.ts +57 -0
- package/dist/federation/source-manager.d.ts.map +1 -0
- package/dist/federation/source-manager.js +238 -0
- package/dist/federation/source-manager.js.map +1 -0
- package/dist/federation/sync-engine.d.ts +68 -0
- package/dist/federation/sync-engine.d.ts.map +1 -0
- package/dist/federation/sync-engine.js +288 -0
- package/dist/federation/sync-engine.js.map +1 -0
- package/dist/index.d.ts +80 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +79 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin.d.ts +28 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +798 -0
- package/dist/plugin.js.map +1 -0
- package/dist/providers/base.d.ts +142 -0
- package/dist/providers/base.d.ts.map +1 -0
- package/dist/providers/base.js +161 -0
- package/dist/providers/base.js.map +1 -0
- package/dist/providers/index.d.ts +22 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +74 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/mariadb.d.ts +83 -0
- package/dist/providers/mariadb.d.ts.map +1 -0
- package/dist/providers/mariadb.js +293 -0
- package/dist/providers/mariadb.js.map +1 -0
- package/dist/providers/mysql.d.ts +78 -0
- package/dist/providers/mysql.d.ts.map +1 -0
- package/dist/providers/mysql.js +284 -0
- package/dist/providers/mysql.js.map +1 -0
- package/dist/providers/postgresql.d.ts +77 -0
- package/dist/providers/postgresql.d.ts.map +1 -0
- package/dist/providers/postgresql.js +296 -0
- package/dist/providers/postgresql.js.map +1 -0
- package/dist/providers/sqlite.d.ts +80 -0
- package/dist/providers/sqlite.d.ts.map +1 -0
- package/dist/providers/sqlite.js +283 -0
- package/dist/providers/sqlite.js.map +1 -0
- package/dist/query/builder.d.ts +74 -0
- package/dist/query/builder.d.ts.map +1 -0
- package/dist/query/builder.js +279 -0
- package/dist/query/builder.js.map +1 -0
- package/dist/query/index.d.ts +10 -0
- package/dist/query/index.d.ts.map +1 -0
- package/dist/query/index.js +8 -0
- package/dist/query/index.js.map +1 -0
- package/dist/query/transformer.d.ts +74 -0
- package/dist/query/transformer.d.ts.map +1 -0
- package/dist/query/transformer.js +236 -0
- package/dist/query/transformer.js.map +1 -0
- package/dist/types.d.ts +350 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +38 -0
- package/dist/types.js.map +1 -0
- package/dist/vectors/adapter.d.ts +128 -0
- package/dist/vectors/adapter.d.ts.map +1 -0
- package/dist/vectors/adapter.js +79 -0
- package/dist/vectors/adapter.js.map +1 -0
- package/dist/vectors/index.d.ts +41 -0
- package/dist/vectors/index.d.ts.map +1 -0
- package/dist/vectors/index.js +87 -0
- package/dist/vectors/index.js.map +1 -0
- package/dist/vectors/lokijs-vector.d.ts +112 -0
- package/dist/vectors/lokijs-vector.d.ts.map +1 -0
- package/dist/vectors/lokijs-vector.js +217 -0
- package/dist/vectors/lokijs-vector.js.map +1 -0
- package/dist/vectors/mariadb-vector.d.ts +56 -0
- package/dist/vectors/mariadb-vector.d.ts.map +1 -0
- package/dist/vectors/mariadb-vector.js +263 -0
- package/dist/vectors/mariadb-vector.js.map +1 -0
- package/dist/vectors/mysql-vector.d.ts +56 -0
- package/dist/vectors/mysql-vector.d.ts.map +1 -0
- package/dist/vectors/mysql-vector.js +235 -0
- package/dist/vectors/mysql-vector.js.map +1 -0
- package/dist/vectors/pgvector.d.ts +52 -0
- package/dist/vectors/pgvector.d.ts.map +1 -0
- package/dist/vectors/pgvector.js +190 -0
- package/dist/vectors/pgvector.js.map +1 -0
- package/dist/vectors/sqlite-vec.d.ts +80 -0
- package/dist/vectors/sqlite-vec.d.ts.map +1 -0
- package/dist/vectors/sqlite-vec.js +362 -0
- package/dist/vectors/sqlite-vec.js.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MySQL Vector Adapter
|
|
3
|
+
*
|
|
4
|
+
* MySQL 9+ native VECTOR type adapter.
|
|
5
|
+
*/
|
|
6
|
+
import { BaseVectorAdapter } from './adapter.js';
|
|
7
|
+
/**
|
|
8
|
+
* MySQL vector adapter (MySQL 9+)
|
|
9
|
+
*/
|
|
10
|
+
export class MySQLVectorAdapter extends BaseVectorAdapter {
|
|
11
|
+
type = 'mysql';
|
|
12
|
+
hasVectorSupport = false;
|
|
13
|
+
constructor(options) {
|
|
14
|
+
super(options);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Check if vectors are supported
|
|
18
|
+
*/
|
|
19
|
+
isSupported() {
|
|
20
|
+
return this.hasVectorSupport;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Initialize vector storage
|
|
24
|
+
*/
|
|
25
|
+
async initialize(dimensions) {
|
|
26
|
+
this.dimensions = dimensions;
|
|
27
|
+
// Check MySQL version for VECTOR support (9.0+)
|
|
28
|
+
const versionResult = await this.provider.query('SELECT VERSION() as version');
|
|
29
|
+
if (versionResult.rows.length > 0) {
|
|
30
|
+
const version = versionResult.rows[0].version;
|
|
31
|
+
const versionMatch = version.match(/^(\d+)\.(\d+)/);
|
|
32
|
+
if (versionMatch) {
|
|
33
|
+
const major = parseInt(versionMatch[1], 10);
|
|
34
|
+
this.hasVectorSupport = major >= 9;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (!this.hasVectorSupport) {
|
|
38
|
+
this.logger.warn('MySQL 9+ required for VECTOR type. Using JSON fallback for vector storage.');
|
|
39
|
+
}
|
|
40
|
+
// Create vectors table
|
|
41
|
+
const tableName = this.provider.escapeIdentifier(this.tableName);
|
|
42
|
+
if (this.hasVectorSupport) {
|
|
43
|
+
await this.provider.execute(`
|
|
44
|
+
CREATE TABLE IF NOT EXISTS ${tableName} (
|
|
45
|
+
id VARCHAR(255) PRIMARY KEY,
|
|
46
|
+
entry_id VARCHAR(255) NOT NULL,
|
|
47
|
+
collection VARCHAR(255) NOT NULL,
|
|
48
|
+
vector VECTOR(${dimensions}),
|
|
49
|
+
text_hash VARCHAR(64) NOT NULL,
|
|
50
|
+
created_at BIGINT NOT NULL,
|
|
51
|
+
updated_at BIGINT NOT NULL,
|
|
52
|
+
INDEX idx_entry_id (entry_id),
|
|
53
|
+
INDEX idx_collection (collection)
|
|
54
|
+
)
|
|
55
|
+
`);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
// Fallback: store vectors as JSON
|
|
59
|
+
await this.provider.execute(`
|
|
60
|
+
CREATE TABLE IF NOT EXISTS ${tableName} (
|
|
61
|
+
id VARCHAR(255) PRIMARY KEY,
|
|
62
|
+
entry_id VARCHAR(255) NOT NULL,
|
|
63
|
+
collection VARCHAR(255) NOT NULL,
|
|
64
|
+
vector JSON NOT NULL,
|
|
65
|
+
text_hash VARCHAR(64) NOT NULL,
|
|
66
|
+
created_at BIGINT NOT NULL,
|
|
67
|
+
updated_at BIGINT NOT NULL,
|
|
68
|
+
INDEX idx_entry_id (entry_id),
|
|
69
|
+
INDEX idx_collection (collection)
|
|
70
|
+
)
|
|
71
|
+
`);
|
|
72
|
+
}
|
|
73
|
+
this.initialized = true;
|
|
74
|
+
this.logger.info(`MySQL vector adapter initialized with ${dimensions} dimensions ` +
|
|
75
|
+
`(${this.hasVectorSupport ? 'native VECTOR' : 'JSON fallback'})`);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Store a vector
|
|
79
|
+
*/
|
|
80
|
+
async store(entry) {
|
|
81
|
+
const now = Date.now();
|
|
82
|
+
const vectorValue = this.vectorToStorage(entry.vector);
|
|
83
|
+
const tableName = this.provider.escapeIdentifier(this.tableName);
|
|
84
|
+
await this.provider.execute(`INSERT INTO ${tableName} (id, entry_id, collection, vector, text_hash, created_at, updated_at)
|
|
85
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
86
|
+
ON DUPLICATE KEY UPDATE
|
|
87
|
+
vector = VALUES(vector),
|
|
88
|
+
text_hash = VALUES(text_hash),
|
|
89
|
+
updated_at = VALUES(updated_at)`, [entry.id, entry.entryId, entry.collection, vectorValue, entry.textHash, now, now]);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Search for similar vectors
|
|
93
|
+
*/
|
|
94
|
+
async search(vector, options = {}) {
|
|
95
|
+
const { limit = 10, collection, minSimilarity = 0 } = options;
|
|
96
|
+
const vectorValue = this.vectorToStorage(vector);
|
|
97
|
+
const tableName = this.provider.escapeIdentifier(this.tableName);
|
|
98
|
+
let sql;
|
|
99
|
+
const params = [];
|
|
100
|
+
if (this.hasVectorSupport) {
|
|
101
|
+
// MySQL 9+ native vector distance
|
|
102
|
+
// Using L2 distance and converting to similarity
|
|
103
|
+
sql = `
|
|
104
|
+
SELECT id, entry_id, collection,
|
|
105
|
+
1 / (1 + DISTANCE(vector, ?, 'L2')) as similarity
|
|
106
|
+
FROM ${tableName}
|
|
107
|
+
WHERE 1 / (1 + DISTANCE(vector, ?, 'L2')) >= ?
|
|
108
|
+
`;
|
|
109
|
+
params.push(vectorValue, vectorValue, minSimilarity);
|
|
110
|
+
if (collection) {
|
|
111
|
+
sql += ` AND collection = ?`;
|
|
112
|
+
params.push(collection);
|
|
113
|
+
}
|
|
114
|
+
sql += ` ORDER BY DISTANCE(vector, ?, 'L2') LIMIT ?`;
|
|
115
|
+
params.push(vectorValue, limit);
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
// JSON fallback - compute cosine similarity in application
|
|
119
|
+
sql = `SELECT id, entry_id, collection, vector FROM ${tableName}`;
|
|
120
|
+
if (collection) {
|
|
121
|
+
sql += ` WHERE collection = ?`;
|
|
122
|
+
params.push(collection);
|
|
123
|
+
}
|
|
124
|
+
const result = await this.provider.query(sql, params);
|
|
125
|
+
// Calculate cosine similarity for each row
|
|
126
|
+
const results = result.rows
|
|
127
|
+
.map((row) => {
|
|
128
|
+
const storedVector = this.storageToVector(row.vector);
|
|
129
|
+
const similarity = this.cosineSimilarity(vector, storedVector);
|
|
130
|
+
return {
|
|
131
|
+
id: row.id,
|
|
132
|
+
entryId: row.entry_id,
|
|
133
|
+
collection: row.collection,
|
|
134
|
+
similarity,
|
|
135
|
+
};
|
|
136
|
+
})
|
|
137
|
+
.filter((r) => r.similarity >= minSimilarity)
|
|
138
|
+
.sort((a, b) => b.similarity - a.similarity)
|
|
139
|
+
.slice(0, limit);
|
|
140
|
+
return results;
|
|
141
|
+
}
|
|
142
|
+
const result = await this.provider.query(sql, params);
|
|
143
|
+
return result.rows.map((row) => ({
|
|
144
|
+
id: row.id,
|
|
145
|
+
entryId: row.entry_id,
|
|
146
|
+
collection: row.collection,
|
|
147
|
+
similarity: row.similarity,
|
|
148
|
+
}));
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Create vector index (MySQL 9+ specific)
|
|
152
|
+
*/
|
|
153
|
+
async createIndex(_indexType) {
|
|
154
|
+
if (!this.hasVectorSupport) {
|
|
155
|
+
this.logger.warn('Vector indexing not available without native VECTOR type');
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
// MySQL 9 may support vector indexes in future versions
|
|
159
|
+
// For now, log a warning
|
|
160
|
+
this.logger.info('MySQL vector indexes: Currently using sequential scan');
|
|
161
|
+
return true;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Check if vector index exists
|
|
165
|
+
*/
|
|
166
|
+
async hasIndex() {
|
|
167
|
+
// MySQL 9.0 doesn't have vector-specific indexes yet
|
|
168
|
+
return false;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Convert row to VectorEntry
|
|
172
|
+
*/
|
|
173
|
+
rowToEntry(row) {
|
|
174
|
+
return {
|
|
175
|
+
id: row.id,
|
|
176
|
+
entryId: row.entry_id,
|
|
177
|
+
collection: row.collection,
|
|
178
|
+
vector: this.storageToVector(row.vector),
|
|
179
|
+
textHash: row.text_hash,
|
|
180
|
+
createdAt: row.created_at,
|
|
181
|
+
updatedAt: row.updated_at,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Convert vector to MySQL format
|
|
186
|
+
*/
|
|
187
|
+
vectorToStorage(vector) {
|
|
188
|
+
if (this.hasVectorSupport) {
|
|
189
|
+
// MySQL 9+ VECTOR format
|
|
190
|
+
return `[${vector.join(',')}]`;
|
|
191
|
+
}
|
|
192
|
+
// JSON fallback
|
|
193
|
+
return JSON.stringify(vector);
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Convert MySQL format to vector
|
|
197
|
+
*/
|
|
198
|
+
storageToVector(value) {
|
|
199
|
+
if (typeof value === 'string') {
|
|
200
|
+
try {
|
|
201
|
+
// Try JSON parse first
|
|
202
|
+
return JSON.parse(value);
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
// MySQL VECTOR format: [0.1,0.2,0.3]
|
|
206
|
+
return value
|
|
207
|
+
.slice(1, -1)
|
|
208
|
+
.split(',')
|
|
209
|
+
.map((n) => parseFloat(n));
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
if (Array.isArray(value)) {
|
|
213
|
+
return value.map((n) => Number(n));
|
|
214
|
+
}
|
|
215
|
+
return [];
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Compute cosine similarity between two vectors
|
|
219
|
+
*/
|
|
220
|
+
cosineSimilarity(a, b) {
|
|
221
|
+
if (a.length !== b.length)
|
|
222
|
+
return 0;
|
|
223
|
+
let dotProduct = 0;
|
|
224
|
+
let normA = 0;
|
|
225
|
+
let normB = 0;
|
|
226
|
+
for (let i = 0; i < a.length; i++) {
|
|
227
|
+
dotProduct += a[i] * b[i];
|
|
228
|
+
normA += a[i] * a[i];
|
|
229
|
+
normB += b[i] * b[i];
|
|
230
|
+
}
|
|
231
|
+
const magnitude = Math.sqrt(normA) * Math.sqrt(normB);
|
|
232
|
+
return magnitude === 0 ? 0 : dotProduct / magnitude;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=mysql-vector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mysql-vector.js","sourceRoot":"","sources":["../../src/vectors/mysql-vector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pgvector Adapter
|
|
3
|
+
*
|
|
4
|
+
* PostgreSQL vector adapter using pgvector extension.
|
|
5
|
+
*/
|
|
6
|
+
import type { VectorEntry, VectorSearchOptions, VectorSearchResult } from '../types.js';
|
|
7
|
+
import { BaseVectorAdapter, VectorAdapterOptions } from './adapter.js';
|
|
8
|
+
/**
|
|
9
|
+
* pgvector adapter for PostgreSQL
|
|
10
|
+
*/
|
|
11
|
+
export declare class PgVectorAdapter extends BaseVectorAdapter {
|
|
12
|
+
readonly type: "postgresql";
|
|
13
|
+
private hasVectorSupport;
|
|
14
|
+
constructor(options: VectorAdapterOptions);
|
|
15
|
+
/**
|
|
16
|
+
* Check if vectors are supported
|
|
17
|
+
*/
|
|
18
|
+
isSupported(): boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Initialize vector storage
|
|
21
|
+
*/
|
|
22
|
+
initialize(dimensions: number): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Store a vector
|
|
25
|
+
*/
|
|
26
|
+
store(entry: Omit<VectorEntry, 'createdAt' | 'updatedAt'>): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Search for similar vectors using cosine similarity
|
|
29
|
+
*/
|
|
30
|
+
search(vector: number[], options?: VectorSearchOptions): Promise<VectorSearchResult[]>;
|
|
31
|
+
/**
|
|
32
|
+
* Create HNSW index for faster search
|
|
33
|
+
*/
|
|
34
|
+
createIndex(indexType?: string): Promise<boolean>;
|
|
35
|
+
/**
|
|
36
|
+
* Check if vector index exists
|
|
37
|
+
*/
|
|
38
|
+
hasIndex(): Promise<boolean>;
|
|
39
|
+
/**
|
|
40
|
+
* Convert row to VectorEntry
|
|
41
|
+
*/
|
|
42
|
+
protected rowToEntry(row: Record<string, unknown>): VectorEntry;
|
|
43
|
+
/**
|
|
44
|
+
* Convert vector to PostgreSQL format
|
|
45
|
+
*/
|
|
46
|
+
protected vectorToStorage(vector: number[]): string;
|
|
47
|
+
/**
|
|
48
|
+
* Convert PostgreSQL format to vector
|
|
49
|
+
*/
|
|
50
|
+
protected storageToVector(value: unknown): number[];
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=pgvector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pgvector.d.ts","sourceRoot":"","sources":["../../src/vectors/pgvector.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEvE;;GAEG;AACH,qBAAa,eAAgB,SAAQ,iBAAiB;IACpD,QAAQ,CAAC,IAAI,EAAG,YAAY,CAAU;IACtC,OAAO,CAAC,gBAAgB,CAAkB;gBAE9B,OAAO,EAAE,oBAAoB;IAIzC;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACG,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA+CnD;;OAEG;IACG,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,WAAW,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAoB/E;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,MAAM,EAAE,EAChB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAyChC;;OAEG;IACG,WAAW,CAAC,SAAS,GAAE,MAAe,GAAG,OAAO,CAAC,OAAO,CAAC;IAoC/D;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC;IAUlC;;OAEG;IACH,SAAS,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW;IAY/D;;OAEG;IACH,SAAS,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM;IAInD;;OAEG;IACH,SAAS,CAAC,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE;CAapD"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pgvector Adapter
|
|
3
|
+
*
|
|
4
|
+
* PostgreSQL vector adapter using pgvector extension.
|
|
5
|
+
*/
|
|
6
|
+
import { BaseVectorAdapter } from './adapter.js';
|
|
7
|
+
/**
|
|
8
|
+
* pgvector adapter for PostgreSQL
|
|
9
|
+
*/
|
|
10
|
+
export class PgVectorAdapter extends BaseVectorAdapter {
|
|
11
|
+
type = 'postgresql';
|
|
12
|
+
hasVectorSupport = false;
|
|
13
|
+
constructor(options) {
|
|
14
|
+
super(options);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Check if vectors are supported
|
|
18
|
+
*/
|
|
19
|
+
isSupported() {
|
|
20
|
+
return this.hasVectorSupport;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Initialize vector storage
|
|
24
|
+
*/
|
|
25
|
+
async initialize(dimensions) {
|
|
26
|
+
this.dimensions = dimensions;
|
|
27
|
+
// Check for pgvector extension
|
|
28
|
+
const result = await this.provider.query("SELECT extname FROM pg_extension WHERE extname = 'vector'");
|
|
29
|
+
this.hasVectorSupport = result.rows.length > 0;
|
|
30
|
+
if (!this.hasVectorSupport) {
|
|
31
|
+
this.logger.warn('pgvector extension not installed. Vector operations will not be available.');
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
// Create vectors table
|
|
35
|
+
const tableName = this.provider.escapeIdentifier(this.tableName);
|
|
36
|
+
await this.provider.execute(`
|
|
37
|
+
CREATE TABLE IF NOT EXISTS ${tableName} (
|
|
38
|
+
id VARCHAR(255) PRIMARY KEY,
|
|
39
|
+
entry_id VARCHAR(255) NOT NULL,
|
|
40
|
+
collection VARCHAR(255) NOT NULL,
|
|
41
|
+
vector vector(${dimensions}),
|
|
42
|
+
text_hash VARCHAR(64) NOT NULL,
|
|
43
|
+
created_at BIGINT NOT NULL,
|
|
44
|
+
updated_at BIGINT NOT NULL
|
|
45
|
+
)
|
|
46
|
+
`);
|
|
47
|
+
// Create indexes
|
|
48
|
+
await this.provider.execute(`
|
|
49
|
+
CREATE INDEX IF NOT EXISTS idx_${this.tableName}_entry_id
|
|
50
|
+
ON ${tableName} (entry_id)
|
|
51
|
+
`);
|
|
52
|
+
await this.provider.execute(`
|
|
53
|
+
CREATE INDEX IF NOT EXISTS idx_${this.tableName}_collection
|
|
54
|
+
ON ${tableName} (collection)
|
|
55
|
+
`);
|
|
56
|
+
this.initialized = true;
|
|
57
|
+
this.logger.info(`pgvector adapter initialized with ${dimensions} dimensions`);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Store a vector
|
|
61
|
+
*/
|
|
62
|
+
async store(entry) {
|
|
63
|
+
if (!this.hasVectorSupport) {
|
|
64
|
+
throw new Error('pgvector not available');
|
|
65
|
+
}
|
|
66
|
+
const now = Date.now();
|
|
67
|
+
const vectorStr = this.vectorToStorage(entry.vector);
|
|
68
|
+
const tableName = this.provider.escapeIdentifier(this.tableName);
|
|
69
|
+
await this.provider.execute(`INSERT INTO ${tableName} (id, entry_id, collection, vector, text_hash, created_at, updated_at)
|
|
70
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7)
|
|
71
|
+
ON CONFLICT (id) DO UPDATE SET
|
|
72
|
+
vector = EXCLUDED.vector,
|
|
73
|
+
text_hash = EXCLUDED.text_hash,
|
|
74
|
+
updated_at = EXCLUDED.updated_at`, [entry.id, entry.entryId, entry.collection, vectorStr, entry.textHash, now, now]);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Search for similar vectors using cosine similarity
|
|
78
|
+
*/
|
|
79
|
+
async search(vector, options = {}) {
|
|
80
|
+
if (!this.hasVectorSupport) {
|
|
81
|
+
return [];
|
|
82
|
+
}
|
|
83
|
+
const { limit = 10, collection, minSimilarity = 0 } = options;
|
|
84
|
+
const vectorStr = this.vectorToStorage(vector);
|
|
85
|
+
const tableName = this.provider.escapeIdentifier(this.tableName);
|
|
86
|
+
let sql = `
|
|
87
|
+
SELECT id, entry_id, collection,
|
|
88
|
+
1 - (vector <=> $1::vector) as similarity
|
|
89
|
+
FROM ${tableName}
|
|
90
|
+
WHERE 1 - (vector <=> $1::vector) >= $2
|
|
91
|
+
`;
|
|
92
|
+
const params = [vectorStr, minSimilarity];
|
|
93
|
+
if (collection) {
|
|
94
|
+
sql += ` AND collection = $3`;
|
|
95
|
+
params.push(collection);
|
|
96
|
+
}
|
|
97
|
+
sql += ` ORDER BY vector <=> $1::vector LIMIT $${params.length + 1}`;
|
|
98
|
+
params.push(limit);
|
|
99
|
+
const result = await this.provider.query(sql, params);
|
|
100
|
+
return result.rows.map((row) => ({
|
|
101
|
+
id: row.id,
|
|
102
|
+
entryId: row.entry_id,
|
|
103
|
+
collection: row.collection,
|
|
104
|
+
similarity: row.similarity,
|
|
105
|
+
}));
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Create HNSW index for faster search
|
|
109
|
+
*/
|
|
110
|
+
async createIndex(indexType = 'hnsw') {
|
|
111
|
+
if (!this.hasVectorSupport) {
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
const tableName = this.provider.escapeIdentifier(this.tableName);
|
|
115
|
+
const indexName = `idx_${this.tableName}_vector_${indexType}`;
|
|
116
|
+
try {
|
|
117
|
+
if (indexType === 'hnsw') {
|
|
118
|
+
// HNSW index - good for most use cases
|
|
119
|
+
await this.provider.execute(`
|
|
120
|
+
CREATE INDEX IF NOT EXISTS ${indexName}
|
|
121
|
+
ON ${tableName} USING hnsw (vector vector_cosine_ops)
|
|
122
|
+
WITH (m = 16, ef_construction = 64)
|
|
123
|
+
`);
|
|
124
|
+
}
|
|
125
|
+
else if (indexType === 'ivfflat') {
|
|
126
|
+
// IVFFlat index - requires training data
|
|
127
|
+
await this.provider.execute(`
|
|
128
|
+
CREATE INDEX IF NOT EXISTS ${indexName}
|
|
129
|
+
ON ${tableName} USING ivfflat (vector vector_cosine_ops)
|
|
130
|
+
WITH (lists = 100)
|
|
131
|
+
`);
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
this.logger.warn(`Unknown index type: ${indexType}`);
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
this.logger.info(`Created ${indexType.toUpperCase()} index on vectors table`);
|
|
138
|
+
return true;
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
this.logger.error(`Failed to create index: ${error}`);
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Check if vector index exists
|
|
147
|
+
*/
|
|
148
|
+
async hasIndex() {
|
|
149
|
+
const result = await this.provider.query(`SELECT indexname FROM pg_indexes
|
|
150
|
+
WHERE tablename = $1 AND indexname LIKE 'idx_%_vector_%'`, [this.tableName]);
|
|
151
|
+
return result.rows.length > 0;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Convert row to VectorEntry
|
|
155
|
+
*/
|
|
156
|
+
rowToEntry(row) {
|
|
157
|
+
return {
|
|
158
|
+
id: row.id,
|
|
159
|
+
entryId: row.entry_id,
|
|
160
|
+
collection: row.collection,
|
|
161
|
+
vector: this.storageToVector(row.vector),
|
|
162
|
+
textHash: row.text_hash,
|
|
163
|
+
createdAt: row.created_at,
|
|
164
|
+
updatedAt: row.updated_at,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Convert vector to PostgreSQL format
|
|
169
|
+
*/
|
|
170
|
+
vectorToStorage(vector) {
|
|
171
|
+
return `[${vector.join(',')}]`;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Convert PostgreSQL format to vector
|
|
175
|
+
*/
|
|
176
|
+
storageToVector(value) {
|
|
177
|
+
if (typeof value === 'string') {
|
|
178
|
+
// Format: [0.1,0.2,0.3]
|
|
179
|
+
return value
|
|
180
|
+
.slice(1, -1)
|
|
181
|
+
.split(',')
|
|
182
|
+
.map((n) => parseFloat(n));
|
|
183
|
+
}
|
|
184
|
+
if (Array.isArray(value)) {
|
|
185
|
+
return value.map((n) => Number(n));
|
|
186
|
+
}
|
|
187
|
+
return [];
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=pgvector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pgvector.js","sourceRoot":"","sources":["../../src/vectors/pgvector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite-vec Adapter
|
|
3
|
+
*
|
|
4
|
+
* SQLite vector adapter using sqlite-vec extension.
|
|
5
|
+
*/
|
|
6
|
+
import type { VectorEntry, VectorSearchOptions, VectorSearchResult } from '../types.js';
|
|
7
|
+
import { BaseVectorAdapter, VectorAdapterOptions } from './adapter.js';
|
|
8
|
+
/**
|
|
9
|
+
* SQLite-vec adapter
|
|
10
|
+
*/
|
|
11
|
+
export declare class SQLiteVecAdapter extends BaseVectorAdapter {
|
|
12
|
+
readonly type: "sqlite";
|
|
13
|
+
private hasVectorSupport;
|
|
14
|
+
constructor(options: VectorAdapterOptions);
|
|
15
|
+
/**
|
|
16
|
+
* Check if vectors are supported
|
|
17
|
+
*/
|
|
18
|
+
isSupported(): boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Initialize vector storage
|
|
21
|
+
*/
|
|
22
|
+
initialize(dimensions: number): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Store a vector
|
|
25
|
+
*/
|
|
26
|
+
store(entry: Omit<VectorEntry, 'createdAt' | 'updatedAt'>): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Delete by ID
|
|
29
|
+
*/
|
|
30
|
+
delete(id: string): Promise<boolean>;
|
|
31
|
+
/**
|
|
32
|
+
* Delete by entry ID
|
|
33
|
+
*/
|
|
34
|
+
deleteByEntryId(entryId: string): Promise<number>;
|
|
35
|
+
/**
|
|
36
|
+
* Search for similar vectors
|
|
37
|
+
*/
|
|
38
|
+
search(vector: number[], options?: VectorSearchOptions): Promise<VectorSearchResult[]>;
|
|
39
|
+
/**
|
|
40
|
+
* Get vector by ID
|
|
41
|
+
*/
|
|
42
|
+
get(id: string): Promise<VectorEntry | null>;
|
|
43
|
+
/**
|
|
44
|
+
* Create index (sqlite-vec handles this automatically)
|
|
45
|
+
*/
|
|
46
|
+
createIndex(_indexType?: string): Promise<boolean>;
|
|
47
|
+
/**
|
|
48
|
+
* Check if index exists
|
|
49
|
+
*/
|
|
50
|
+
hasIndex(): Promise<boolean>;
|
|
51
|
+
/**
|
|
52
|
+
* Count vectors
|
|
53
|
+
*/
|
|
54
|
+
count(collection?: string): Promise<number>;
|
|
55
|
+
/**
|
|
56
|
+
* Convert row to VectorEntry
|
|
57
|
+
*/
|
|
58
|
+
protected rowToEntry(row: Record<string, unknown>): VectorEntry;
|
|
59
|
+
/**
|
|
60
|
+
* Convert vector to storage format
|
|
61
|
+
*/
|
|
62
|
+
protected vectorToStorage(vector: number[]): string;
|
|
63
|
+
/**
|
|
64
|
+
* Convert storage format to vector
|
|
65
|
+
*/
|
|
66
|
+
protected storageToVector(value: unknown): number[];
|
|
67
|
+
/**
|
|
68
|
+
* Convert vector to BLOB (float32 array)
|
|
69
|
+
*/
|
|
70
|
+
private vectorToBlob;
|
|
71
|
+
/**
|
|
72
|
+
* Convert BLOB to vector
|
|
73
|
+
*/
|
|
74
|
+
private blobToVector;
|
|
75
|
+
/**
|
|
76
|
+
* Compute cosine similarity between two vectors
|
|
77
|
+
*/
|
|
78
|
+
private cosineSimilarity;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=sqlite-vec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-vec.d.ts","sourceRoot":"","sources":["../../src/vectors/sqlite-vec.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEvE;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,iBAAiB;IACrD,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAClC,OAAO,CAAC,gBAAgB,CAAkB;gBAE9B,OAAO,EAAE,oBAAoB;IAIzC;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACG,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmEnD;;OAEG;IACG,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,WAAW,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IA+C/E;;OAEG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAiB1C;;OAEG;IACG,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA8BvD;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,MAAM,EAAE,EAChB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,kBAAkB,EAAE,CAAC;IA4FhC;;OAEG;IACG,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAclD;;OAEG;IACG,WAAW,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWxD;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC;IAKlC;;OAEG;IACG,KAAK,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAejD;;OAEG;IACH,SAAS,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW;IAoB/D;;OAEG;IACH,SAAS,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM;IAInD;;OAEG;IACH,SAAS,CAAC,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE;IAanD;;OAEG;IACH,OAAO,CAAC,YAAY;IAQpB;;OAEG;IACH,OAAO,CAAC,YAAY;IAQpB;;OAEG;IACH,OAAO,CAAC,gBAAgB;CAgBzB"}
|