datafolder 1.0.18 → 1.0.19
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/README.md +2 -0
- package/package.json +1 -1
- package/sample.js +9 -0
- package/scripts/fastify.js +1 -0
- package/scripts/hnsw.js +39 -0
- package/src/QyAcl.js +1 -1
- package/src/QyBatch.d.ts +2 -1
- package/src/QyBatch.js +142 -101
- package/src/QyBinWriter.d.ts +5 -9
- package/src/QyBinWriter.js +36 -45
- package/src/QyCD.d.ts +1 -1
- package/src/QyCD.js +66 -64
- package/src/QyCache.d.ts +11 -9
- package/src/QyCache.js +125 -121
- package/src/QyDB.js +1 -4
- package/src/QyDefaultOptions.js +8 -0
- package/src/QyEmbeddingWriter.d.ts +12 -0
- package/src/QyEmbeddingWriter.js +55 -0
- package/src/QyEmbeddings.d.ts +15 -0
- package/src/QyEmbeddings.js +128 -0
- package/src/QyFileContentUtils.js +123 -111
- package/src/QyHNSW.d.ts +5 -8
- package/src/QyHNSW.js +36 -44
- package/src/QySnapshots.js +177 -184
- package/src/QyUtils.d.ts +5 -3
- package/src/QyUtils.js +130 -114
- package/static/codemirror.bundle/editor.bundle.js +16 -9
package/src/QyCache.js
CHANGED
|
@@ -1,78 +1,83 @@
|
|
|
1
1
|
import {
|
|
2
|
-
join as
|
|
2
|
+
join as v
|
|
3
3
|
} from "node:path";
|
|
4
4
|
|
|
5
5
|
import r from "node:events";
|
|
6
6
|
|
|
7
7
|
import {
|
|
8
|
-
QyDir as
|
|
8
|
+
QyDir as l
|
|
9
9
|
} from "./QyDir.js";
|
|
10
10
|
|
|
11
11
|
import {
|
|
12
|
-
QyFileLogger as
|
|
12
|
+
QyFileLogger as g
|
|
13
13
|
} from "./QyFileLogger.js";
|
|
14
14
|
|
|
15
15
|
import {
|
|
16
|
-
QyKVData as
|
|
16
|
+
QyKVData as h
|
|
17
17
|
} from "./QyKVData.js";
|
|
18
18
|
|
|
19
19
|
import {
|
|
20
|
-
QyTriggerNode as
|
|
20
|
+
QyTriggerNode as R,
|
|
21
21
|
updateTriggerNodes as s
|
|
22
22
|
} from "./QyTrigger.js";
|
|
23
23
|
|
|
24
24
|
import {
|
|
25
25
|
isString as C,
|
|
26
|
-
lockExclusiveFilePath as
|
|
27
|
-
unlockExclusiveFilePath as
|
|
26
|
+
lockExclusiveFilePath as x,
|
|
27
|
+
unlockExclusiveFilePath as o,
|
|
28
|
+
ensureDir as q,
|
|
29
|
+
SpecialFilePaths as e,
|
|
30
|
+
SpecialOperators as t
|
|
28
31
|
} from "./QyUtils.js";
|
|
29
32
|
|
|
30
33
|
import {
|
|
31
|
-
dumpStructure as
|
|
34
|
+
dumpStructure as O
|
|
32
35
|
} from "./QyStructure.js";
|
|
33
36
|
|
|
34
37
|
import {
|
|
35
38
|
getIndexPropPaths as n,
|
|
36
|
-
parseNamePathAndQuery as
|
|
39
|
+
parseNamePathAndQuery as d
|
|
37
40
|
} from "./QyIndex.js";
|
|
38
41
|
|
|
39
42
|
import {
|
|
40
|
-
getDefaultOptions as
|
|
43
|
+
getDefaultOptions as u
|
|
41
44
|
} from "./QyDefaultOptions.js";
|
|
42
45
|
|
|
43
46
|
import {
|
|
44
|
-
|
|
45
|
-
SpecialFilePaths as e
|
|
46
|
-
} from "./QyUtils.js";
|
|
47
|
-
|
|
48
|
-
import {
|
|
49
|
-
QueryCounter as l
|
|
47
|
+
QueryCounter as p
|
|
50
48
|
} from "./QyUnionNode.js";
|
|
51
49
|
|
|
52
50
|
import {
|
|
53
|
-
QyKVDataLoader as
|
|
51
|
+
QyKVDataLoader as P
|
|
54
52
|
} from "./QyKVDataLoader.js";
|
|
55
53
|
|
|
56
54
|
import {
|
|
57
|
-
requireFromModCode as
|
|
55
|
+
requireFromModCode as c
|
|
58
56
|
} from "./QyMod.js";
|
|
59
57
|
|
|
60
58
|
import {
|
|
61
|
-
logger as
|
|
59
|
+
logger as b
|
|
62
60
|
} from "./QyLogger.js";
|
|
63
61
|
|
|
62
|
+
import {
|
|
63
|
+
QyEmbeddings as D
|
|
64
|
+
} from "./QyEmbeddings.js";
|
|
65
|
+
|
|
66
|
+
var {} = t;
|
|
67
|
+
|
|
64
68
|
let {
|
|
65
69
|
HiddenFolderName: y,
|
|
66
|
-
IndexDirPath:
|
|
67
|
-
TriggerDirPath:
|
|
68
|
-
RpcDirPath:
|
|
69
|
-
ExpireDirPath:
|
|
70
|
-
MetaFilePath:
|
|
71
|
-
|
|
72
|
-
|
|
70
|
+
IndexDirPath: F,
|
|
71
|
+
TriggerDirPath: w,
|
|
72
|
+
RpcDirPath: E,
|
|
73
|
+
ExpireDirPath: m,
|
|
74
|
+
MetaFilePath: i,
|
|
75
|
+
HNSWDirPath: f,
|
|
76
|
+
InfoDirPath: Q,
|
|
77
|
+
RecycleDirPath: S
|
|
73
78
|
} = e;
|
|
74
79
|
|
|
75
|
-
class
|
|
80
|
+
class a extends r {
|
|
76
81
|
rootFolder;
|
|
77
82
|
options;
|
|
78
83
|
qyDB;
|
|
@@ -83,42 +88,35 @@ class o extends r {
|
|
|
83
88
|
rpcRootDir;
|
|
84
89
|
indexRootDir;
|
|
85
90
|
expireRootDir;
|
|
86
|
-
|
|
87
|
-
|
|
91
|
+
hnswRootDir;
|
|
92
|
+
infoRootDir;
|
|
93
|
+
recycleRootDir;
|
|
88
94
|
exclusiveFilePath;
|
|
89
95
|
qyKVData;
|
|
90
96
|
qyFileLogger;
|
|
97
|
+
qyEmbeddings;
|
|
91
98
|
rpcFunMap = {};
|
|
92
99
|
constructor(r, e, t) {
|
|
93
|
-
super(), e = {
|
|
94
|
-
...
|
|
100
|
+
super(), this.rootFolder = r, e = this.options = {
|
|
101
|
+
...u("QyCache"),
|
|
95
102
|
...e
|
|
96
|
-
},
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
[y]:
|
|
100
|
-
},
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
[n]
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
rootDir: o,
|
|
107
|
-
expireRootDir: l,
|
|
108
|
-
indexRootDir: d,
|
|
109
|
-
embeddingRootDir: h,
|
|
110
|
-
h2FRootDir: u
|
|
111
|
-
});
|
|
112
|
-
var i, o, a, s, n, g, l, d, h, u, p = f(r, "qykv");
|
|
103
|
+
}, this.qyDB = t;
|
|
104
|
+
var i, o = this, t = o.rootDir = new l("", !0, void 0, o), a = new l(y, !0, t);
|
|
105
|
+
t._subdirMap = {
|
|
106
|
+
[y]: a
|
|
107
|
+
}, a._subdirMap = {};
|
|
108
|
+
for ([ s, i ] of [ [ F, "indexRootDir" ], [ m, "expireRootDir" ], [ f, "hnswRootDir" ], [ Q, "infoRootDir" ], [ S, "recycleRootDir" ] ]) {
|
|
109
|
+
var s = s.at(-1), n = new l(s, !0, a);
|
|
110
|
+
a._subdirMap[s] = n, o[i] = n;
|
|
111
|
+
}
|
|
112
|
+
t = v(r, "qykv");
|
|
113
113
|
Object.assign(this, {
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
qyKVData: new F(p, e, this),
|
|
121
|
-
qyFileLogger: new c(f(r, "qylog"), e)
|
|
114
|
+
kvFolder: t,
|
|
115
|
+
rpcFolder: v(r, "rpc"),
|
|
116
|
+
exclusiveFilePath: v(r, ".opened"),
|
|
117
|
+
qyKVData: new h(t, e, this),
|
|
118
|
+
qyFileLogger: new g(v(r, "qylog"), e),
|
|
119
|
+
qyEmbeddings: new D(this, e)
|
|
122
120
|
});
|
|
123
121
|
}
|
|
124
122
|
async start() {
|
|
@@ -129,20 +127,21 @@ class o extends r {
|
|
|
129
127
|
qyKVData: i,
|
|
130
128
|
qyFileLogger: o,
|
|
131
129
|
exclusiveFilePath: a,
|
|
132
|
-
rootDir: s
|
|
130
|
+
rootDir: s,
|
|
131
|
+
qyEmbeddings: n
|
|
133
132
|
} = this;
|
|
134
|
-
|
|
133
|
+
b.log(`Starting at ${r}...`);
|
|
135
134
|
try {
|
|
136
135
|
await q(e), o.start();
|
|
137
136
|
var [ {
|
|
138
|
-
maxChangeId:
|
|
137
|
+
maxChangeId: l,
|
|
139
138
|
loadedMaxAclNum: g,
|
|
140
|
-
qySnapshots:
|
|
139
|
+
qySnapshots: h,
|
|
141
140
|
aclKeyValueMap: d
|
|
142
|
-
} ] = await Promise.all([ ((r, e) => (r = new
|
|
143
|
-
i.start(
|
|
141
|
+
} ] = await Promise.all([ ((r, e) => (r = new P(r, e)).load())(e, t), x(a) ]);
|
|
142
|
+
i.start(l, g, h, d), await n.start();
|
|
144
143
|
} catch (r) {
|
|
145
|
-
throw o.stop(), r;
|
|
144
|
+
throw o.stop(), n.stop(), r;
|
|
146
145
|
}
|
|
147
146
|
t.preloadFoldersAtStart && !function r(e) {
|
|
148
147
|
let {
|
|
@@ -151,48 +150,50 @@ class o extends r {
|
|
|
151
150
|
} = e;
|
|
152
151
|
for (var o of t) r(o);
|
|
153
152
|
}(s);
|
|
154
|
-
var
|
|
155
|
-
e.triggerNodes = [ new
|
|
156
|
-
for (
|
|
153
|
+
var u = this, e = u.rootDir;
|
|
154
|
+
e.triggerNodes = [ new R() ];
|
|
155
|
+
for (p of (e = u.triggerRootDir = e.searchOrCreateSubdir(w)).fileList) {
|
|
157
156
|
var {
|
|
158
|
-
name:
|
|
159
|
-
fileContent:
|
|
160
|
-
} =
|
|
161
|
-
|
|
157
|
+
name: p,
|
|
158
|
+
fileContent: c
|
|
159
|
+
} = p, [ c, D, y ] = c;
|
|
160
|
+
u.insertTriggerToTree(p, c, D, y);
|
|
162
161
|
}
|
|
163
162
|
var F = this;
|
|
164
|
-
F.rpcRootDir = F.rootDir.searchOrCreateSubdir(
|
|
163
|
+
F.rpcRootDir = F.rootDir.searchOrCreateSubdir(E);
|
|
165
164
|
for (m of F.rpcRootDir.fileList) {
|
|
166
165
|
var {
|
|
167
166
|
name: m,
|
|
168
|
-
fileContent:
|
|
167
|
+
fileContent: f
|
|
169
168
|
} = m;
|
|
170
|
-
C(
|
|
169
|
+
C(f) && F.insertRpc(m, f);
|
|
171
170
|
}
|
|
172
|
-
return t.dumpStructureAtStart && await
|
|
171
|
+
return t.dumpStructureAtStart && await O(v(r, "qystruct"), s), b.log("Started."),
|
|
173
172
|
this;
|
|
174
173
|
}
|
|
175
174
|
async stop() {
|
|
176
|
-
|
|
175
|
+
b.log("Stopping...");
|
|
177
176
|
var {
|
|
178
177
|
qyKVData: r,
|
|
179
|
-
|
|
180
|
-
|
|
178
|
+
qyEmbeddings: e,
|
|
179
|
+
qyFileLogger: t,
|
|
180
|
+
exclusiveFilePath: i
|
|
181
181
|
} = this;
|
|
182
|
-
return await r.stop(),
|
|
183
|
-
Object.assign(this, {
|
|
182
|
+
return await r.stop(), await e.stop(), b.log("QyFileLogger stopped."), await t.stop(),
|
|
183
|
+
o(i), Object.assign(this, {
|
|
184
184
|
rootDir: void 0,
|
|
185
185
|
indexRootDir: void 0,
|
|
186
186
|
expireRootDir: void 0,
|
|
187
187
|
triggerRootDir: void 0,
|
|
188
188
|
rpcRootDir: void 0,
|
|
189
|
-
|
|
190
|
-
|
|
189
|
+
hnswRootDir: void 0,
|
|
190
|
+
infoRootDir: void 0,
|
|
191
|
+
recycleRootDir: void 0,
|
|
191
192
|
qyKVData: void 0,
|
|
192
193
|
rpcFunMap: void 0,
|
|
193
194
|
qyDB: void 0,
|
|
194
195
|
qyFileLogger: void 0
|
|
195
|
-
}),
|
|
196
|
+
}), b.log("Stopped."), this;
|
|
196
197
|
}
|
|
197
198
|
increaseChangeId() {
|
|
198
199
|
return this.qyKVData.increaseChangeId();
|
|
@@ -210,20 +211,20 @@ class o extends r {
|
|
|
210
211
|
getFile(r, e = this.rootDir) {
|
|
211
212
|
return r.isFile ? r : C(r) ? e.getFile(r) : e.searchFile(r);
|
|
212
213
|
}
|
|
213
|
-
getDir(r, e = this.rootDir) {
|
|
214
|
-
return r.isDir ? r : C(r) ? e.getSubdir(r) : e.searchSubdir(r);
|
|
215
|
-
}
|
|
216
214
|
getOrCreateFile(r, e = this.rootDir) {
|
|
217
215
|
return r.isFile ? r : C(r) ? e.getOrCreateFile(r) : e.searchOrCreateFile(r);
|
|
218
216
|
}
|
|
217
|
+
getDir(r, e = this.rootDir) {
|
|
218
|
+
return r.isDir ? r : C(r) ? e.getSubdir(r) : e.searchSubdir(r);
|
|
219
|
+
}
|
|
219
220
|
getOrCreateDir(r, e = this.rootDir) {
|
|
220
221
|
return r.isDir ? r : C(r) ? e.getOrCreateSubdir(r) : e.searchOrCreateSubdir(r);
|
|
221
222
|
}
|
|
222
223
|
getIndexDir(r) {
|
|
223
|
-
return this.indexRootDir.searchSubdir(
|
|
224
|
+
return this.indexRootDir.searchSubdir(K(r.fullPathHash));
|
|
224
225
|
}
|
|
225
226
|
getOrCreateIndexDir(r) {
|
|
226
|
-
return this.indexRootDir.searchOrCreateSubdir(
|
|
227
|
+
return this.indexRootDir.searchOrCreateSubdir(K(r.fullPathHash));
|
|
227
228
|
}
|
|
228
229
|
getTriggerFile(r) {
|
|
229
230
|
return this.triggerRootDir.getFile(r);
|
|
@@ -232,29 +233,36 @@ class o extends r {
|
|
|
232
233
|
return this.triggerRootDir.getOrCreateFile(r);
|
|
233
234
|
}
|
|
234
235
|
getExpireInfoFile(r, e = "c") {
|
|
235
|
-
return this.expireRootDir.searchFile(
|
|
236
|
+
return this.expireRootDir.searchFile(L(r, e));
|
|
236
237
|
}
|
|
237
238
|
getOrCreateExpireInfoFile(r, e = "c") {
|
|
238
|
-
return this.expireRootDir.searchOrCreateFile(
|
|
239
|
+
return this.expireRootDir.searchOrCreateFile(L(r, e));
|
|
239
240
|
}
|
|
240
|
-
|
|
241
|
-
return this.
|
|
241
|
+
getInfoFile(r) {
|
|
242
|
+
return this.infoRootDir.searchFile(I(r.fullPathHash));
|
|
242
243
|
}
|
|
243
|
-
|
|
244
|
-
return this.
|
|
244
|
+
getOrCreateInfoFile(r) {
|
|
245
|
+
return this.infoRootDir.searchOrCreateFile(I(r.fullPathHash));
|
|
245
246
|
}
|
|
246
|
-
|
|
247
|
-
r = this.
|
|
248
|
-
if (r
|
|
247
|
+
hToSrcFile(r) {
|
|
248
|
+
r = this.infoRootDir.searchFile(I(r));
|
|
249
|
+
if (r && r.fileContent) {
|
|
250
|
+
r = r.fileContent.namePath;
|
|
251
|
+
if (r) return this.getOrCreateFile(r);
|
|
252
|
+
}
|
|
249
253
|
}
|
|
250
|
-
|
|
251
|
-
|
|
254
|
+
getEmbedding(r) {
|
|
255
|
+
var e, t = this.getInfoFile(r);
|
|
256
|
+
if (t && t.fileContent) return {
|
|
257
|
+
length: t,
|
|
258
|
+
idx: e
|
|
259
|
+
} = t.fileContent, this.qyEmbeddings.getEmbedding(r.fullPathHash, t, e);
|
|
252
260
|
}
|
|
253
|
-
|
|
254
|
-
return this.
|
|
261
|
+
getOrCreateRecycleFile(r) {
|
|
262
|
+
return this.recycleRootDir.getOrCreateFile(r);
|
|
255
263
|
}
|
|
256
|
-
|
|
257
|
-
return this.
|
|
264
|
+
getRecycleFile(r) {
|
|
265
|
+
return this.recycleRootDir.getFile(r);
|
|
258
266
|
}
|
|
259
267
|
get triggerFileList() {
|
|
260
268
|
return this.triggerRootDir.fileList;
|
|
@@ -269,13 +277,13 @@ class o extends r {
|
|
|
269
277
|
return this.rpcRootDir.fileList;
|
|
270
278
|
}
|
|
271
279
|
get metaFile() {
|
|
272
|
-
return this.rootDir.searchOrCreateFile(
|
|
280
|
+
return this.rootDir.searchOrCreateFile(i);
|
|
273
281
|
}
|
|
274
282
|
insertTriggerToTree(r, e, t, i) {
|
|
275
283
|
var {
|
|
276
284
|
rootDir: o,
|
|
277
285
|
qyDB: a
|
|
278
|
-
} = this, i =
|
|
286
|
+
} = this, i = c("trigger", r, i, a);
|
|
279
287
|
o.triggerNodes[0].insertTrigger(r, e, t, i), s(o, e);
|
|
280
288
|
}
|
|
281
289
|
removeTriggerFromTree(r, e) {
|
|
@@ -286,28 +294,28 @@ class o extends r {
|
|
|
286
294
|
var {
|
|
287
295
|
rpcFunMap: t,
|
|
288
296
|
qyDB: i
|
|
289
|
-
} = this, e =
|
|
297
|
+
} = this, e = c("rpc", r, e, i);
|
|
290
298
|
e && (t[r] = e);
|
|
291
299
|
}
|
|
292
300
|
removeRpc(r) {
|
|
293
301
|
delete this.rpcFunMap[r];
|
|
294
302
|
}
|
|
295
303
|
queryFiles(r, e, t, i, o = this.rootDir) {
|
|
296
|
-
var a = [], t = (C(e) && !t && (t = 1), new
|
|
297
|
-
return
|
|
304
|
+
var a = [], t = (C(e) && !t && (t = 1), new p(t, i)), i = this.options.queryAutoCreateIndex;
|
|
305
|
+
return T(r, e, a, t, o, i), a;
|
|
298
306
|
}
|
|
299
307
|
queryFilesMulti(r, e, t, i = this.rootDir) {
|
|
300
|
-
var o, a, s = [], n = new
|
|
301
|
-
for ([ o, a ] of r)
|
|
308
|
+
var o, a, s = [], n = new p(e, t), l = this.options.queryAutoCreateIndex;
|
|
309
|
+
for ([ o, a ] of r) T(o, a, s, n, i, l);
|
|
302
310
|
return s;
|
|
303
311
|
}
|
|
304
312
|
async callRpc(e, r, t) {
|
|
305
313
|
var i, o = this.rpcFunMap[e];
|
|
306
|
-
if (!o) return
|
|
314
|
+
if (!o) return b.warn(i = `RPC ${e} not implemented.`), new Error(i);
|
|
307
315
|
try {
|
|
308
316
|
return await o(r, t);
|
|
309
317
|
} catch (r) {
|
|
310
|
-
return
|
|
318
|
+
return b.error(`Calling RPC ${e} failed:`, r), r;
|
|
311
319
|
}
|
|
312
320
|
}
|
|
313
321
|
monitorItemExpire(r, e) {
|
|
@@ -324,26 +332,22 @@ class o extends r {
|
|
|
324
332
|
}
|
|
325
333
|
}
|
|
326
334
|
|
|
327
|
-
function
|
|
328
|
-
return [ r.substring(0, 2), r ];
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
function h(r) {
|
|
335
|
+
function I(r) {
|
|
332
336
|
return [ r.substring(0, 2), r ];
|
|
333
337
|
}
|
|
334
338
|
|
|
335
|
-
function
|
|
339
|
+
function L(r, e) {
|
|
336
340
|
return [ e, r.substring(0, 2), r ];
|
|
337
341
|
}
|
|
338
342
|
|
|
339
|
-
function
|
|
343
|
+
function K(r) {
|
|
340
344
|
return [ r[0], r ];
|
|
341
345
|
}
|
|
342
346
|
|
|
343
|
-
function
|
|
344
|
-
e && (a = a ? n(e) : void 0,
|
|
347
|
+
function T(r, e, t, i, o, a) {
|
|
348
|
+
e && (a = a ? n(e) : void 0, d(r, o, a, e, t, i));
|
|
345
349
|
}
|
|
346
350
|
|
|
347
351
|
export {
|
|
348
|
-
|
|
352
|
+
a as QyCache
|
|
349
353
|
};
|
package/src/QyDB.js
CHANGED
|
@@ -47,10 +47,7 @@ class l extends t {
|
|
|
47
47
|
...o("QyDB"),
|
|
48
48
|
...t
|
|
49
49
|
}, this.rootFolder = e;
|
|
50
|
-
for (let
|
|
51
|
-
var t = this.currentBatch;
|
|
52
|
-
return t[i].apply(t, e).run();
|
|
53
|
-
};
|
|
50
|
+
for (let t of [ "createIndex", "delIndex", "insert", "put", "remove", "delDir", "delFile", "delContent", "insertTrigger", "removeTrigger", "insertRpc", "removeRpc", "insertEmbedding", "delEmbedding", "insertWithEmbedding", "expireFile", "expireDir", "expireContent", "expireFileM", "expireDirM", "expireContentM", "removeFileExpire", "removeDirExpire", "removeContentExpire" ]) this[t] = (...e) => this.currentBatch[t](...e).run();
|
|
54
51
|
}
|
|
55
52
|
async start(e) {
|
|
56
53
|
var t;
|
package/src/QyDefaultOptions.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
var e = {
|
|
2
2
|
append: !1,
|
|
3
|
+
read: !1,
|
|
3
4
|
retryIntervalFactor: 2,
|
|
4
5
|
maxRetryInterval: 60,
|
|
5
6
|
emitSaveEvent: !1,
|
|
@@ -57,6 +58,13 @@ let t = {
|
|
|
57
58
|
},
|
|
58
59
|
QyAclWriter: {
|
|
59
60
|
minBatchSize: 2
|
|
61
|
+
},
|
|
62
|
+
QyEmbeddingWriter: {
|
|
63
|
+
append: !0,
|
|
64
|
+
read: !0
|
|
65
|
+
},
|
|
66
|
+
QyEmbeddings: {
|
|
67
|
+
appendOnly: !1
|
|
60
68
|
}
|
|
61
69
|
};
|
|
62
70
|
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { QyBinWriter } from "./QyBinWriter.ts";
|
|
2
|
+
export declare class QyEmbeddingWriter extends QyBinWriter {
|
|
3
|
+
length: any;
|
|
4
|
+
byteLength: any;
|
|
5
|
+
totalCount: number;
|
|
6
|
+
constructor(filePath: any | undefined, length: any);
|
|
7
|
+
start(): Promise<void>;
|
|
8
|
+
append(embedding: Float32Array, needPromise?: any): any;
|
|
9
|
+
pWrite(embedding: Float32Array, idx: any, needPromise?: any): any;
|
|
10
|
+
_op_pWrite(buffer: any, idx: any): any;
|
|
11
|
+
readSync(idx: any): Float32Array<ArrayBuffer> | undefined;
|
|
12
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import {
|
|
2
|
+
readBufferFromFD as s
|
|
3
|
+
} from "./QyUtils.js";
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
getDefaultOptions as r
|
|
7
|
+
} from "./QyDefaultOptions.js";
|
|
8
|
+
|
|
9
|
+
import {
|
|
10
|
+
QyBinWriter as t
|
|
11
|
+
} from "./QyBinWriter.js";
|
|
12
|
+
|
|
13
|
+
class e extends t {
|
|
14
|
+
length;
|
|
15
|
+
byteLength;
|
|
16
|
+
totalCount = 0;
|
|
17
|
+
constructor(t = void 0, e) {
|
|
18
|
+
super(r("QyEmbeddingWriter"), t), this.length = e, this.byteLength = e * Float32Array.BYTES_PER_ELEMENT;
|
|
19
|
+
}
|
|
20
|
+
async start() {
|
|
21
|
+
await this.pushAndRunWithPromise({
|
|
22
|
+
opFunName: "_op_start"
|
|
23
|
+
}), 0 == this.totalCount && (this.totalCount = this.totalSavedSize / this.byteLength);
|
|
24
|
+
}
|
|
25
|
+
append(t, e = !1) {
|
|
26
|
+
return ++this.totalCount, this.save(0, i(t), e);
|
|
27
|
+
}
|
|
28
|
+
pWrite(t, e, r = !1) {
|
|
29
|
+
t = {
|
|
30
|
+
opFunName: "_op_pWrite",
|
|
31
|
+
args: [ i(t), e ]
|
|
32
|
+
};
|
|
33
|
+
return r ? this.pushAndRunWithPromise(t) : this.pushAndRun(t);
|
|
34
|
+
}
|
|
35
|
+
_op_pWrite(t, e) {
|
|
36
|
+
return this.fileHandle.write(t, 0, t.byteLength, e * this.byteLength);
|
|
37
|
+
}
|
|
38
|
+
readSync(t) {
|
|
39
|
+
var {
|
|
40
|
+
filePath: e,
|
|
41
|
+
fileHandle: r,
|
|
42
|
+
length: i,
|
|
43
|
+
byteLength: n
|
|
44
|
+
} = this;
|
|
45
|
+
return (r = r && s(r.fd, e, t * n, n)) ? new Float32Array(r.buffer, r.byteOffset, i) : void 0;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function i(t) {
|
|
50
|
+
return Buffer.from(t.buffer, t.byteOffset, t.byteLength);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export {
|
|
54
|
+
e as QyEmbeddingWriter
|
|
55
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare class QyEmbeddings {
|
|
2
|
+
qyCache: any;
|
|
3
|
+
embeddingFolder: any;
|
|
4
|
+
options: any;
|
|
5
|
+
qyDB: any;
|
|
6
|
+
qyEmbeddingWriters: any;
|
|
7
|
+
hashToEmbeddingMap: {};
|
|
8
|
+
constructor(qyCache: any, options?: any);
|
|
9
|
+
start(): Promise<void>;
|
|
10
|
+
stop(): Promise<void>;
|
|
11
|
+
addEmbedding(fullPathHash: any, embedding: any): any;
|
|
12
|
+
getEmbedding(fullPathHash: any, length: any, idx: any): any;
|
|
13
|
+
updateEmbedding(fullPathHash: any, embedding: any, idx: any): any;
|
|
14
|
+
delEmbedding(fullPathHash: any, length: any, idx: any): void;
|
|
15
|
+
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import {
|
|
2
|
+
readdir as t
|
|
3
|
+
} from "node:fs/promises";
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
folderOrFileExists as i,
|
|
7
|
+
SpecialOperators as e
|
|
8
|
+
} from "./QyUtils.js";
|
|
9
|
+
|
|
10
|
+
import {
|
|
11
|
+
getDefaultOptions as r
|
|
12
|
+
} from "./QyDefaultOptions.js";
|
|
13
|
+
|
|
14
|
+
import {
|
|
15
|
+
logger as a
|
|
16
|
+
} from "./QyLogger.js";
|
|
17
|
+
|
|
18
|
+
import {
|
|
19
|
+
basename as n,
|
|
20
|
+
join as s
|
|
21
|
+
} from "node:path";
|
|
22
|
+
|
|
23
|
+
import {
|
|
24
|
+
QyEmbeddingWriter as d
|
|
25
|
+
} from "./QyEmbeddingWriter.js";
|
|
26
|
+
|
|
27
|
+
let o = e.$del;
|
|
28
|
+
|
|
29
|
+
class l {
|
|
30
|
+
qyCache;
|
|
31
|
+
embeddingFolder;
|
|
32
|
+
options;
|
|
33
|
+
qyDB;
|
|
34
|
+
qyEmbeddingWriters = {};
|
|
35
|
+
hashToEmbeddingMap = {};
|
|
36
|
+
constructor(e, t = void 0) {
|
|
37
|
+
var i = s(e.rootFolder, "qyembedding");
|
|
38
|
+
t = {
|
|
39
|
+
...r("QyEmbeddings"),
|
|
40
|
+
...t
|
|
41
|
+
}, Object.assign(this, {
|
|
42
|
+
qyCache: e,
|
|
43
|
+
embeddingFolder: i,
|
|
44
|
+
options: t,
|
|
45
|
+
qyDB: e.qyDB
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
async start() {
|
|
49
|
+
var e = this.embeddingFolder;
|
|
50
|
+
await i(e) && await Promise.all((await t(e)).filter(e => /[0-9]+\.bin$/.test(e)).map(async e => {
|
|
51
|
+
await h(this, n(e, ".bin")).start();
|
|
52
|
+
}));
|
|
53
|
+
}
|
|
54
|
+
async stop() {
|
|
55
|
+
var e = this.qyEmbeddingWriters;
|
|
56
|
+
e && (await Promise.all(Object.values(e).map(e => e.stop())), this.qyEmbeddingWriters = void 0);
|
|
57
|
+
}
|
|
58
|
+
addEmbedding(e, t) {
|
|
59
|
+
var {
|
|
60
|
+
hashToEmbeddingMap: i,
|
|
61
|
+
options: r
|
|
62
|
+
} = this;
|
|
63
|
+
if (i[e] = t, !r.appendOnly) {
|
|
64
|
+
i = ((e, t) => {
|
|
65
|
+
var {
|
|
66
|
+
qyCache: e,
|
|
67
|
+
qyDB: i
|
|
68
|
+
} = e, r = e.getRecycleFile(t);
|
|
69
|
+
if (r) {
|
|
70
|
+
var n, e = r.fileContent;
|
|
71
|
+
for (n in e) return i.insert(r, {
|
|
72
|
+
[n]: o
|
|
73
|
+
}), n;
|
|
74
|
+
}
|
|
75
|
+
})(this, t.length);
|
|
76
|
+
if (null != i) return p(this, e, t, i);
|
|
77
|
+
}
|
|
78
|
+
return m(this, e, t);
|
|
79
|
+
}
|
|
80
|
+
getEmbedding(e, t, i) {
|
|
81
|
+
var r = this.hashToEmbeddingMap, r = r[e];
|
|
82
|
+
return r || (null != t && null != i ? this.hashToEmbeddingMap[e] = g(this, t).readSync(i) : void 0);
|
|
83
|
+
}
|
|
84
|
+
updateEmbedding(e, t, i) {
|
|
85
|
+
var {
|
|
86
|
+
options: r,
|
|
87
|
+
hashToEmbeddingMap: n
|
|
88
|
+
} = this;
|
|
89
|
+
return n[e] = t, r.appendOnly ? m(this, e, t) : p(this, e, t, i);
|
|
90
|
+
}
|
|
91
|
+
delEmbedding(e, t, i) {
|
|
92
|
+
var {
|
|
93
|
+
hashToEmbeddingMap: r,
|
|
94
|
+
qyCache: n,
|
|
95
|
+
qyDB: a
|
|
96
|
+
} = this;
|
|
97
|
+
delete r[t], null != t && null != i && a.insert(n.getOrCreateRecycleFile(t), {
|
|
98
|
+
[i]: 1
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function m(e, t, i) {
|
|
104
|
+
var r = i.length, e = g(e, r), n = e.totalCount;
|
|
105
|
+
return e.append(i), a.info(`Append ${t} ${r} ` + n), n;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function p(e, t, i, r) {
|
|
109
|
+
var n = i.length;
|
|
110
|
+
return g(e, i.length).pWrite(i, r), a.info(`pWrite ${t} ${n} ` + r), r;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function h(e, t) {
|
|
114
|
+
var {
|
|
115
|
+
qyEmbeddingWriters: e,
|
|
116
|
+
embeddingFolder: i
|
|
117
|
+
} = e;
|
|
118
|
+
return e[t] = new d(s(i, t + ".bin"), t);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function g(e, t) {
|
|
122
|
+
let i = e.qyEmbeddingWriters[t];
|
|
123
|
+
return i || (i = h(e, t)).start(), i;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export {
|
|
127
|
+
l as QyEmbeddings
|
|
128
|
+
};
|