datafolder 1.0.17 → 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 +9 -0
- package/package.json +17 -17
- package/sample.js +12 -0
- package/scripts/fastify.js +1 -0
- package/scripts/hnsw.js +39 -0
- package/src/QyAcl.js +109 -87
- package/src/QyBatch.d.ts +5 -0
- package/src/QyBatch.js +213 -129
- package/src/QyBinWriter.d.ts +5 -9
- package/src/QyBinWriter.js +36 -45
- package/src/QyBinaryHeap.d.ts +10 -0
- package/src/QyBinaryHeap.js +55 -0
- package/src/QyCD.d.ts +3 -0
- package/src/QyCD.js +51 -38
- package/src/QyCache.d.ts +11 -1
- package/src/QyCache.js +132 -90
- package/src/QyDB.js +4 -7
- 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/QyFile.js +8 -7
- package/src/QyFileContentUtils.d.ts +0 -1
- package/src/QyFileContentUtils.js +138 -127
- package/src/QyHNSW.d.ts +7 -0
- package/src/QyHNSW.js +49 -0
- package/src/QyIndex.js +28 -27
- package/src/QyIndexPropTree.js +3 -1
- package/src/QySnapshots.js +127 -131
- package/src/QyTrigger.js +5 -6
- package/src/QyUtils.d.ts +7 -0
- package/src/QyUtils.js +130 -104
- package/static/codemirror.bundle/editor.bundle.js +33 -12
- package/test/testQyDocumentDB.js +38 -0
package/src/QyCache.js
CHANGED
|
@@ -5,52 +5,50 @@ import {
|
|
|
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
|
-
isString as
|
|
26
|
-
lockExclusiveFilePath as
|
|
27
|
-
unlockExclusiveFilePath as
|
|
25
|
+
isString as C,
|
|
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 {
|
|
@@ -58,19 +56,28 @@ import {
|
|
|
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
|
-
HiddenFolderName:
|
|
69
|
+
HiddenFolderName: y,
|
|
66
70
|
IndexDirPath: F,
|
|
67
|
-
TriggerDirPath:
|
|
68
|
-
RpcDirPath:
|
|
71
|
+
TriggerDirPath: w,
|
|
72
|
+
RpcDirPath: E,
|
|
69
73
|
ExpireDirPath: m,
|
|
70
|
-
MetaFilePath:
|
|
74
|
+
MetaFilePath: i,
|
|
75
|
+
HNSWDirPath: f,
|
|
76
|
+
InfoDirPath: Q,
|
|
77
|
+
RecycleDirPath: S
|
|
71
78
|
} = e;
|
|
72
79
|
|
|
73
|
-
class
|
|
80
|
+
class a extends r {
|
|
74
81
|
rootFolder;
|
|
75
82
|
options;
|
|
76
83
|
qyDB;
|
|
@@ -81,35 +88,35 @@ class o extends r {
|
|
|
81
88
|
rpcRootDir;
|
|
82
89
|
indexRootDir;
|
|
83
90
|
expireRootDir;
|
|
91
|
+
hnswRootDir;
|
|
92
|
+
infoRootDir;
|
|
93
|
+
recycleRootDir;
|
|
84
94
|
exclusiveFilePath;
|
|
85
95
|
qyKVData;
|
|
86
96
|
qyFileLogger;
|
|
97
|
+
qyEmbeddings;
|
|
87
98
|
rpcFunMap = {};
|
|
88
99
|
constructor(r, e, t) {
|
|
89
|
-
super(), e = {
|
|
90
|
-
...
|
|
100
|
+
super(), this.rootFolder = r, e = this.options = {
|
|
101
|
+
...u("QyCache"),
|
|
91
102
|
...e
|
|
92
|
-
},
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
});
|
|
103
|
-
var i, o, a, s, n, g, l = v(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");
|
|
104
113
|
Object.assign(this, {
|
|
105
|
-
|
|
106
|
-
options: e,
|
|
107
|
-
qyDB: t,
|
|
108
|
-
kvFolder: l,
|
|
114
|
+
kvFolder: t,
|
|
109
115
|
rpcFolder: v(r, "rpc"),
|
|
110
116
|
exclusiveFilePath: v(r, ".opened"),
|
|
111
|
-
qyKVData: new
|
|
112
|
-
qyFileLogger: new
|
|
117
|
+
qyKVData: new h(t, e, this),
|
|
118
|
+
qyFileLogger: new g(v(r, "qylog"), e),
|
|
119
|
+
qyEmbeddings: new D(this, e)
|
|
113
120
|
});
|
|
114
121
|
}
|
|
115
122
|
async start() {
|
|
@@ -120,20 +127,21 @@ class o extends r {
|
|
|
120
127
|
qyKVData: i,
|
|
121
128
|
qyFileLogger: o,
|
|
122
129
|
exclusiveFilePath: a,
|
|
123
|
-
rootDir: s
|
|
130
|
+
rootDir: s,
|
|
131
|
+
qyEmbeddings: n
|
|
124
132
|
} = this;
|
|
125
|
-
|
|
133
|
+
b.log(`Starting at ${r}...`);
|
|
126
134
|
try {
|
|
127
|
-
await
|
|
135
|
+
await q(e), o.start();
|
|
128
136
|
var [ {
|
|
129
|
-
maxChangeId:
|
|
137
|
+
maxChangeId: l,
|
|
130
138
|
loadedMaxAclNum: g,
|
|
131
|
-
qySnapshots:
|
|
132
|
-
aclKeyValueMap:
|
|
133
|
-
} ] = await Promise.all([ ((r, e) => (r = new
|
|
134
|
-
i.start(
|
|
139
|
+
qySnapshots: h,
|
|
140
|
+
aclKeyValueMap: d
|
|
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();
|
|
135
143
|
} catch (r) {
|
|
136
|
-
throw o.stop(), r;
|
|
144
|
+
throw o.stop(), n.stop(), r;
|
|
137
145
|
}
|
|
138
146
|
t.preloadFoldersAtStart && !function r(e) {
|
|
139
147
|
let {
|
|
@@ -143,45 +151,49 @@ class o extends r {
|
|
|
143
151
|
for (var o of t) r(o);
|
|
144
152
|
}(s);
|
|
145
153
|
var u = this, e = u.rootDir;
|
|
146
|
-
e.triggerNodes = [ new
|
|
147
|
-
for (
|
|
154
|
+
e.triggerNodes = [ new R() ];
|
|
155
|
+
for (p of (e = u.triggerRootDir = e.searchOrCreateSubdir(w)).fileList) {
|
|
148
156
|
var {
|
|
149
|
-
name:
|
|
150
|
-
fileContent:
|
|
151
|
-
} =
|
|
152
|
-
u.insertTriggerToTree(
|
|
157
|
+
name: p,
|
|
158
|
+
fileContent: c
|
|
159
|
+
} = p, [ c, D, y ] = c;
|
|
160
|
+
u.insertTriggerToTree(p, c, D, y);
|
|
153
161
|
}
|
|
154
162
|
var F = this;
|
|
155
|
-
F.rpcRootDir = F.rootDir.searchOrCreateSubdir(
|
|
163
|
+
F.rpcRootDir = F.rootDir.searchOrCreateSubdir(E);
|
|
156
164
|
for (m of F.rpcRootDir.fileList) {
|
|
157
165
|
var {
|
|
158
166
|
name: m,
|
|
159
|
-
fileContent:
|
|
167
|
+
fileContent: f
|
|
160
168
|
} = m;
|
|
161
|
-
|
|
169
|
+
C(f) && F.insertRpc(m, f);
|
|
162
170
|
}
|
|
163
|
-
return t.dumpStructureAtStart && await
|
|
171
|
+
return t.dumpStructureAtStart && await O(v(r, "qystruct"), s), b.log("Started."),
|
|
164
172
|
this;
|
|
165
173
|
}
|
|
166
174
|
async stop() {
|
|
167
|
-
|
|
175
|
+
b.log("Stopping...");
|
|
168
176
|
var {
|
|
169
177
|
qyKVData: r,
|
|
170
|
-
|
|
171
|
-
|
|
178
|
+
qyEmbeddings: e,
|
|
179
|
+
qyFileLogger: t,
|
|
180
|
+
exclusiveFilePath: i
|
|
172
181
|
} = this;
|
|
173
|
-
return await r.stop(),
|
|
174
|
-
Object.assign(this, {
|
|
182
|
+
return await r.stop(), await e.stop(), b.log("QyFileLogger stopped."), await t.stop(),
|
|
183
|
+
o(i), Object.assign(this, {
|
|
175
184
|
rootDir: void 0,
|
|
176
185
|
indexRootDir: void 0,
|
|
177
186
|
expireRootDir: void 0,
|
|
178
187
|
triggerRootDir: void 0,
|
|
179
188
|
rpcRootDir: void 0,
|
|
189
|
+
hnswRootDir: void 0,
|
|
190
|
+
infoRootDir: void 0,
|
|
191
|
+
recycleRootDir: void 0,
|
|
180
192
|
qyKVData: void 0,
|
|
181
193
|
rpcFunMap: void 0,
|
|
182
194
|
qyDB: void 0,
|
|
183
195
|
qyFileLogger: void 0
|
|
184
|
-
}),
|
|
196
|
+
}), b.log("Stopped."), this;
|
|
185
197
|
}
|
|
186
198
|
increaseChangeId() {
|
|
187
199
|
return this.qyKVData.increaseChangeId();
|
|
@@ -197,22 +209,22 @@ class o extends r {
|
|
|
197
209
|
return t && s.save(r, t), a.save(r, e, i, o);
|
|
198
210
|
}
|
|
199
211
|
getFile(r, e = this.rootDir) {
|
|
200
|
-
return r.isFile ? r :
|
|
201
|
-
}
|
|
202
|
-
getDir(r, e = this.rootDir) {
|
|
203
|
-
return r.isDir ? r : x(r) ? e.getSubdir(r) : e.searchSubdir(r);
|
|
212
|
+
return r.isFile ? r : C(r) ? e.getFile(r) : e.searchFile(r);
|
|
204
213
|
}
|
|
205
214
|
getOrCreateFile(r, e = this.rootDir) {
|
|
206
|
-
return r.isFile ? r :
|
|
215
|
+
return r.isFile ? r : C(r) ? e.getOrCreateFile(r) : e.searchOrCreateFile(r);
|
|
216
|
+
}
|
|
217
|
+
getDir(r, e = this.rootDir) {
|
|
218
|
+
return r.isDir ? r : C(r) ? e.getSubdir(r) : e.searchSubdir(r);
|
|
207
219
|
}
|
|
208
220
|
getOrCreateDir(r, e = this.rootDir) {
|
|
209
|
-
return r.isDir ? r :
|
|
221
|
+
return r.isDir ? r : C(r) ? e.getOrCreateSubdir(r) : e.searchOrCreateSubdir(r);
|
|
210
222
|
}
|
|
211
223
|
getIndexDir(r) {
|
|
212
|
-
return this.indexRootDir.searchSubdir(
|
|
224
|
+
return this.indexRootDir.searchSubdir(K(r.fullPathHash));
|
|
213
225
|
}
|
|
214
226
|
getOrCreateIndexDir(r) {
|
|
215
|
-
return this.indexRootDir.searchOrCreateSubdir(
|
|
227
|
+
return this.indexRootDir.searchOrCreateSubdir(K(r.fullPathHash));
|
|
216
228
|
}
|
|
217
229
|
getTriggerFile(r) {
|
|
218
230
|
return this.triggerRootDir.getFile(r);
|
|
@@ -221,10 +233,36 @@ class o extends r {
|
|
|
221
233
|
return this.triggerRootDir.getOrCreateFile(r);
|
|
222
234
|
}
|
|
223
235
|
getExpireInfoFile(r, e = "c") {
|
|
224
|
-
return this.expireRootDir.searchFile(
|
|
236
|
+
return this.expireRootDir.searchFile(L(r, e));
|
|
225
237
|
}
|
|
226
238
|
getOrCreateExpireInfoFile(r, e = "c") {
|
|
227
|
-
return this.expireRootDir.searchOrCreateFile(
|
|
239
|
+
return this.expireRootDir.searchOrCreateFile(L(r, e));
|
|
240
|
+
}
|
|
241
|
+
getInfoFile(r) {
|
|
242
|
+
return this.infoRootDir.searchFile(I(r.fullPathHash));
|
|
243
|
+
}
|
|
244
|
+
getOrCreateInfoFile(r) {
|
|
245
|
+
return this.infoRootDir.searchOrCreateFile(I(r.fullPathHash));
|
|
246
|
+
}
|
|
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
|
+
}
|
|
253
|
+
}
|
|
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);
|
|
260
|
+
}
|
|
261
|
+
getOrCreateRecycleFile(r) {
|
|
262
|
+
return this.recycleRootDir.getOrCreateFile(r);
|
|
263
|
+
}
|
|
264
|
+
getRecycleFile(r) {
|
|
265
|
+
return this.recycleRootDir.getFile(r);
|
|
228
266
|
}
|
|
229
267
|
get triggerFileList() {
|
|
230
268
|
return this.triggerRootDir.fileList;
|
|
@@ -239,7 +277,7 @@ class o extends r {
|
|
|
239
277
|
return this.rpcRootDir.fileList;
|
|
240
278
|
}
|
|
241
279
|
get metaFile() {
|
|
242
|
-
return this.rootDir.searchOrCreateFile(
|
|
280
|
+
return this.rootDir.searchOrCreateFile(i);
|
|
243
281
|
}
|
|
244
282
|
insertTriggerToTree(r, e, t, i) {
|
|
245
283
|
var {
|
|
@@ -263,21 +301,21 @@ class o extends r {
|
|
|
263
301
|
delete this.rpcFunMap[r];
|
|
264
302
|
}
|
|
265
303
|
queryFiles(r, e, t, i, o = this.rootDir) {
|
|
266
|
-
var a = [], t = (
|
|
267
|
-
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;
|
|
268
306
|
}
|
|
269
307
|
queryFilesMulti(r, e, t, i = this.rootDir) {
|
|
270
|
-
var o, a, s = [], n = new
|
|
271
|
-
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);
|
|
272
310
|
return s;
|
|
273
311
|
}
|
|
274
312
|
async callRpc(e, r, t) {
|
|
275
313
|
var i, o = this.rpcFunMap[e];
|
|
276
|
-
if (!o) return
|
|
314
|
+
if (!o) return b.warn(i = `RPC ${e} not implemented.`), new Error(i);
|
|
277
315
|
try {
|
|
278
316
|
return await o(r, t);
|
|
279
317
|
} catch (r) {
|
|
280
|
-
return
|
|
318
|
+
return b.error(`Calling RPC ${e} failed:`, r), r;
|
|
281
319
|
}
|
|
282
320
|
}
|
|
283
321
|
monitorItemExpire(r, e) {
|
|
@@ -294,18 +332,22 @@ class o extends r {
|
|
|
294
332
|
}
|
|
295
333
|
}
|
|
296
334
|
|
|
297
|
-
function
|
|
335
|
+
function I(r) {
|
|
336
|
+
return [ r.substring(0, 2), r ];
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
function L(r, e) {
|
|
298
340
|
return [ e, r.substring(0, 2), r ];
|
|
299
341
|
}
|
|
300
342
|
|
|
301
|
-
function
|
|
343
|
+
function K(r) {
|
|
302
344
|
return [ r[0], r ];
|
|
303
345
|
}
|
|
304
346
|
|
|
305
|
-
function
|
|
306
|
-
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));
|
|
307
349
|
}
|
|
308
350
|
|
|
309
351
|
export {
|
|
310
|
-
|
|
352
|
+
a as QyCache
|
|
311
353
|
};
|
package/src/QyDB.js
CHANGED
|
@@ -33,7 +33,7 @@ import {
|
|
|
33
33
|
logger as m
|
|
34
34
|
} from "./QyLogger.js";
|
|
35
35
|
|
|
36
|
-
let
|
|
36
|
+
let d = e(n, "../data/sampleDataFolder");
|
|
37
37
|
|
|
38
38
|
class l extends t {
|
|
39
39
|
rootFolder;
|
|
@@ -42,15 +42,12 @@ class l extends t {
|
|
|
42
42
|
batch;
|
|
43
43
|
_immediate;
|
|
44
44
|
creationTime;
|
|
45
|
-
constructor(e =
|
|
46
|
-
s(e) && (t = e, e =
|
|
45
|
+
constructor(e = d, t) {
|
|
46
|
+
s(e) && (t = e, e = d), super(), this.options = {
|
|
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
|
+
};
|