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/src/QyCache.js CHANGED
@@ -1,78 +1,83 @@
1
1
  import {
2
- join as f
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 D
8
+ QyDir as l
9
9
  } from "./QyDir.js";
10
10
 
11
11
  import {
12
- QyFileLogger as c
12
+ QyFileLogger as g
13
13
  } from "./QyFileLogger.js";
14
14
 
15
15
  import {
16
- QyKVData as F
16
+ QyKVData as h
17
17
  } from "./QyKVData.js";
18
18
 
19
19
  import {
20
- QyTriggerNode as v,
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 R,
27
- unlockExclusiveFilePath as i
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 x
34
+ dumpStructure as O
32
35
  } from "./QyStructure.js";
33
36
 
34
37
  import {
35
38
  getIndexPropPaths as n,
36
- parseNamePathAndQuery as g
39
+ parseNamePathAndQuery as d
37
40
  } from "./QyIndex.js";
38
41
 
39
42
  import {
40
- getDefaultOptions as m
43
+ getDefaultOptions as u
41
44
  } from "./QyDefaultOptions.js";
42
45
 
43
46
  import {
44
- ensureDir as q,
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 b
51
+ QyKVDataLoader as P
54
52
  } from "./QyKVDataLoader.js";
55
53
 
56
54
  import {
57
- requireFromModCode as d
55
+ requireFromModCode as c
58
56
  } from "./QyMod.js";
59
57
 
60
58
  import {
61
- logger as O
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: P,
67
- TriggerDirPath: Q,
68
- RpcDirPath: w,
69
- ExpireDirPath: S,
70
- MetaFilePath: t,
71
- EmbeddingDirPath: L,
72
- H2FDirPath: E
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 o extends r {
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
- embeddingRootDir;
87
- h2FRootDir;
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
- ...m("QyCache"),
100
+ super(), this.rootFolder = r, e = this.options = {
101
+ ...u("QyCache"),
95
102
  ...e
96
- }, o = new D("", !0, void 0, i = this), a = S.at(-1), s = P.at(-1), n = L.at(-1),
97
- g = E.at(-1), p = new D(y, !0, o), l = new D(a, !0, p), d = new D(s, !0, p),
98
- h = new D(n, !0, p), u = new D(g, !0, p), o._subdirMap = {
99
- [y]: p
100
- }, p._subdirMap = {
101
- [a]: l,
102
- [s]: d,
103
- [n]: h,
104
- [g]: u
105
- }, Object.assign(i, {
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
- rootFolder: r,
115
- options: e,
116
- qyDB: t,
117
- kvFolder: p,
118
- rpcFolder: f(r, "rpc"),
119
- exclusiveFilePath: f(r, ".opened"),
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
- O.log(`Starting at ${r}...`);
133
+ b.log(`Starting at ${r}...`);
135
134
  try {
136
135
  await q(e), o.start();
137
136
  var [ {
138
- maxChangeId: n,
137
+ maxChangeId: l,
139
138
  loadedMaxAclNum: g,
140
- qySnapshots: l,
139
+ qySnapshots: h,
141
140
  aclKeyValueMap: d
142
- } ] = await Promise.all([ ((r, e) => (r = new b(r, e)).load())(e, t), R(a) ]);
143
- i.start(n, g, l, 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();
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 h = this, e = h.rootDir;
155
- e.triggerNodes = [ new v() ];
156
- for (u of (e = h.triggerRootDir = e.searchOrCreateSubdir(Q)).fileList) {
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: u,
159
- fileContent: p
160
- } = u, [ p, D, c ] = p;
161
- h.insertTriggerToTree(u, p, D, c);
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(w);
163
+ F.rpcRootDir = F.rootDir.searchOrCreateSubdir(E);
165
164
  for (m of F.rpcRootDir.fileList) {
166
165
  var {
167
166
  name: m,
168
- fileContent: y
167
+ fileContent: f
169
168
  } = m;
170
- C(y) && F.insertRpc(m, y);
169
+ C(f) && F.insertRpc(m, f);
171
170
  }
172
- return t.dumpStructureAtStart && await x(f(r, "qystruct"), s), O.log("Started."),
171
+ return t.dumpStructureAtStart && await O(v(r, "qystruct"), s), b.log("Started."),
173
172
  this;
174
173
  }
175
174
  async stop() {
176
- O.log("Stopping...");
175
+ b.log("Stopping...");
177
176
  var {
178
177
  qyKVData: r,
179
- qyFileLogger: e,
180
- exclusiveFilePath: t
178
+ qyEmbeddings: e,
179
+ qyFileLogger: t,
180
+ exclusiveFilePath: i
181
181
  } = this;
182
- return await r.stop(), O.log("QyFileLogger stopped."), await e.stop(), i(t),
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
- embeddingRootDir: void 0,
190
- h2FRootDir: void 0,
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
- }), O.log("Stopped."), this;
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(p(r.fullPathHash));
224
+ return this.indexRootDir.searchSubdir(K(r.fullPathHash));
224
225
  }
225
226
  getOrCreateIndexDir(r) {
226
- return this.indexRootDir.searchOrCreateSubdir(p(r.fullPathHash));
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(u(r, e));
236
+ return this.expireRootDir.searchFile(L(r, e));
236
237
  }
237
238
  getOrCreateExpireInfoFile(r, e = "c") {
238
- return this.expireRootDir.searchOrCreateFile(u(r, e));
239
+ return this.expireRootDir.searchOrCreateFile(L(r, e));
239
240
  }
240
- getH2FFile(r) {
241
- return this.h2FRootDir.searchFile(a(r));
241
+ getInfoFile(r) {
242
+ return this.infoRootDir.searchFile(I(r.fullPathHash));
242
243
  }
243
- getOrCreateH2FFile(r) {
244
- return this.h2FRootDir.searchOrCreateFile(a(r));
244
+ getOrCreateInfoFile(r) {
245
+ return this.infoRootDir.searchOrCreateFile(I(r.fullPathHash));
245
246
  }
246
- h2F(r) {
247
- r = this.getH2FFile(r);
248
- if (r) return this.getOrCreateFile(r.fileContent);
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
- getEmbeddingFile(r) {
251
- return this.embeddingRootDir.searchFile(h(r));
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
- getOrCreateEmbeddingFile(r) {
254
- return this.embeddingRootDir.searchOrCreateFile(h(r));
261
+ getOrCreateRecycleFile(r) {
262
+ return this.recycleRootDir.getOrCreateFile(r);
255
263
  }
256
- getEmbedding(r) {
257
- return this.embeddingRootDir.searchFile(h(r))?.fileContent;
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(t);
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 = d("trigger", r, i, a);
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 = d("rpc", r, e, i);
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 l(t, i)), i = this.options.queryAutoCreateIndex;
297
- return I(r, e, a, t, o, i), a;
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 l(e, t), g = this.options.queryAutoCreateIndex;
301
- for ([ o, a ] of r) I(o, a, s, n, i, g);
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 O.warn(i = `RPC ${e} not implemented.`), new Error(i);
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 O.error(`Calling RPC ${e} failed:`, r), r;
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 a(r) {
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 u(r, e) {
339
+ function L(r, e) {
336
340
  return [ e, r.substring(0, 2), r ];
337
341
  }
338
342
 
339
- function p(r) {
343
+ function K(r) {
340
344
  return [ r[0], r ];
341
345
  }
342
346
 
343
- function I(r, e, t, i, o, a) {
344
- e && (a = a ? n(e) : void 0, g(r, o, a, e, t, i));
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
- o as QyCache
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 i of [ "createIndex", "delIndex", "insert", "put", "remove", "delDir", "delFile", "delContent", "insertTrigger", "removeTrigger", "insertRpc", "removeRpc", "insertEmbedding", "delEmbedding", "expireFile", "expireDir", "expireContent", "expireFileM", "expireDirM", "expireContentM", "removeFileExpire", "removeDirExpire", "removeContentExpire" ]) this[i] = (...e) => {
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;
@@ -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
+ };