datafolder 1.0.19 → 1.0.21

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 CHANGED
@@ -4,6 +4,10 @@ datafolder is a lightning fluid JSON database for high speed SSDs, featuring an
4
4
 
5
5
  ### Changelog
6
6
 
7
+ 1.0.21 Add ArangoDB Query Language (AQL) test case (test/testQyAQL.js)
8
+
9
+ 1.0.20 Add HNSW support.
10
+
7
11
  1.0.19 Add DocumentDB test case (test/testQyDocumentDB.js)
8
12
 
9
13
  1.0.18 Add Embedding Storage Support. Related APIs: dataFolder.insertEmbedding() and dataFolder.delEmbedding(). TODO: Add HNSW support and vector query.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "datafolder",
3
- "version": "1.0.19",
3
+ "version": "1.0.21",
4
4
  "author": {
5
5
  "name": "lysh",
6
6
  "email": "datafolderdev@outlook.com"
@@ -10,7 +10,7 @@ import { runQueries } from "./flights2_queries.js";
10
10
  logger.level = "info";
11
11
  const arangoJsonFolderPath = "D:\\scripts\\GraphCourse_DemoData_ArangoDB-2";
12
12
  const dataFolder = "./tmp/flights2";
13
- const qyDB = new QyDB(dataFolder, { preloadFoldersAtStart: false });
13
+ const qyDB = new QyDB(dataFolder, { fileLogLevel: "basic" });
14
14
  run();
15
15
  function insertAirports() {
16
16
  const data = JSON.parse(readFileSync(join(arangoJsonFolderPath, "airports.json")));
@@ -19,7 +19,7 @@ function insertAirports() {
19
19
  const { batch } = qyDB;
20
20
  for (const record of data) {
21
21
  const { country, state, city } = record;
22
- batch.insert(`airports/${country}/${state}/${city}/${record._key}`, record, true);
22
+ batch.put(`airports/${country}/${state}/${city}/${record._key}`, record);
23
23
  }
24
24
  batch.run();
25
25
  console.timeEnd("insertAirports");
@@ -32,7 +32,7 @@ function insertFlights() {
32
32
  for (let i = 0; i < data.length; ++i) {
33
33
  const record = data[i];
34
34
  const { Year, Month, Day } = record;
35
- batch.insert(`flights/${Year}/${Month}/${Day}/${i}`, record, true);
35
+ batch.put(`flights/${Year}/${Month}/${Day}/${i}`, record);
36
36
  // batch.insertP(["flights", Year, Month, Day, i], record);
37
37
  }
38
38
  batch.run();
package/src/QyAcl.js CHANGED
@@ -1,4 +1,4 @@
1
- import l from "node:fs/promises";
1
+ import c from "node:fs/promises";
2
2
 
3
3
  import {
4
4
  cleanContent as s,
@@ -19,9 +19,8 @@ import {
19
19
 
20
20
  let {
21
21
  $del: f,
22
- $rpl: u,
23
- $u8: c
24
- } = r, d = {
22
+ $rpl: l
23
+ } = r, u = {
25
24
  M: 0,
26
25
  A: 1,
27
26
  R: 2,
@@ -32,16 +31,16 @@ function t(r, t) {
32
31
  var e, a, n, i, [ s, o, f, t ] = t;
33
32
  for (e in t) null != r[e] && (r[e] = void 0);
34
33
  for (a in o) {
35
- var u, c = r[a] || (r[a] = {});
36
- for (u of o[a]) c[u] = 1;
34
+ var l, u = r[a] || (r[a] = {});
35
+ for (l of o[a]) u[l] = 1;
37
36
  }
38
37
  for (n in f) {
39
- var l = r[n];
40
- if (l) {
38
+ var c = r[n];
39
+ if (c) {
41
40
  var h = f[n];
42
41
  if (h) {
43
- for (var d of h) delete l[d];
44
- m(l) && (r[n] = void 0);
42
+ for (var d of h) delete c[d];
43
+ m(c) && (r[n] = void 0);
45
44
  }
46
45
  }
47
46
  }
@@ -59,35 +58,35 @@ class i {
59
58
  constructor() {}
60
59
  pushCmd(r, t, e = void 0) {
61
60
  switch (++this.cmdCount, r) {
62
- case d.A:
63
- v(this, [ d.A, t, e ]), A(this, [ d.R, t, e ]);
61
+ case u.A:
62
+ d(this, [ u.A, t, e ]), v(this, [ u.R, t, e ]);
64
63
  break;
65
64
 
66
- case d.R:
67
- v(this, [ d.R, t, e ]), A(this, [ d.A, t, e ]);
65
+ case u.R:
66
+ d(this, [ u.R, t, e ]), v(this, [ u.A, t, e ]);
68
67
  break;
69
68
 
70
- case d.D:
71
- if (v(this, [ d.D, t ]), t.startsWith("c")) A(this, [ d.M, t ]); else for (var a of [ d.A, d.R ]) A(this, [ a, t ]);
69
+ case u.D:
70
+ if (d(this, [ u.D, t ]), t.startsWith("c")) v(this, [ u.M, t ]); else for (var a of [ u.A, u.R ]) v(this, [ a, t ]);
72
71
  break;
73
72
 
74
- case d.M:
73
+ case u.M:
75
74
  {
76
75
  var n = this.cmdArgAsMapChanges;
77
76
  let [ r ] = n;
78
- n = (r = null == r ? n[d.M] = {} : r)[t];
77
+ n = (r = null == r ? n[u.M] = {} : r)[t];
79
78
  r[t] = null != n ? function e(a, n) {
80
79
  if (n == f) return f;
81
- let r = n[u];
80
+ let r = n.$rpl;
82
81
  if (null != r) return n;
83
- let t = a[u];
84
- if (null != t) return a[u] = g(t, n), a;
82
+ let t = a.$rpl;
83
+ if (null != t) return a[l] = g(t, n), a;
85
84
  if (a == f) return {
86
- [u]: s(n)
85
+ [l]: s(n)
87
86
  };
88
87
  if (o(a) || o(n)) return n;
89
- if (c in n) return n;
90
- for (var i in n) {
88
+ if (n.$u8) return n;
89
+ for (var i of Object.keys(n)) {
91
90
  let r = n[i], t = a[i];
92
91
  null == t ? a[i] = r : a[i] = e(t, r);
93
92
  }
@@ -102,13 +101,13 @@ class i {
102
101
  }
103
102
  pushCmdArgAsListObj(r) {
104
103
  if (r) {
105
- for (var t in ++this.batchSize, r[d.D]) this.pushCmd(d.D, t);
106
- for (var e of [ d.A, d.R ]) {
104
+ for (var t in ++this.batchSize, r[u.D]) this.pushCmd(u.D, t);
105
+ for (var e of [ u.A, u.R ]) {
107
106
  var a, n = r[e];
108
107
  for (a in n) for (var i of n[a]) this.pushCmd(e, a, i);
109
108
  }
110
109
  var s, [ o ] = r;
111
- for (s in o) this.pushCmd(d.M, s, o[s]);
110
+ for (s in o) this.pushCmd(u.M, s, o[s]);
112
111
  }
113
112
  return this;
114
113
  }
@@ -119,7 +118,7 @@ class i {
119
118
  cmdCount: 0,
120
119
  batchSize: 0
121
120
  });
122
- for (r of [ d.A, d.R ]) {
121
+ for (r of [ u.A, u.R ]) {
123
122
  var e, a = t[r];
124
123
  for (e in a) {
125
124
  var n = Object.keys(a[e]);
@@ -127,20 +126,20 @@ class i {
127
126
  }
128
127
  m(a) && delete t[r];
129
128
  }
130
- var i = t[d.D], i = (i && m(i) && delete t[d.D], t[d.M]);
131
- return i && m(i) && delete t[d.M], t;
129
+ var i = t[u.D], i = (i && m(i) && delete t[u.D], t[u.M]);
130
+ return i && m(i) && delete t[u.M], t;
132
131
  }
133
132
  toAclBuffer(r) {
134
133
  var t = this.batchSize;
135
- if (0 < t) return y(r, t, JSON.stringify(this.takeCmdArgAsListObj()));
134
+ if (0 < t) return w(r, t, JSON.stringify(this.takeCmdArgAsListObj()));
136
135
  }
137
136
  }
138
137
 
139
- function v(r, t, e = 1) {
138
+ function d(r, t, e = 1) {
140
139
  a(r.cmdArgAsMapChanges, t, e);
141
140
  }
142
141
 
143
- function A(r, t) {
142
+ function v(r, t) {
144
143
  let e = r.cmdArgAsMapChanges;
145
144
  if (e && t && !(t.length <= 1)) {
146
145
  for (let r = 0; r < t.length - 1; ++r) if (null == (e = e[t[r]])) return;
@@ -150,53 +149,53 @@ function A(r, t) {
150
149
 
151
150
  async function p(t, r = !1, e = 0) {
152
151
  try {
153
- return await I(t, await l.readFile(t), r, e);
152
+ return await y(t, await c.readFile(t), r, e);
154
153
  } catch (r) {
155
154
  throw h.error(`Reading ${t} failed:`, r), r;
156
155
  }
157
156
  }
158
157
 
159
- let C = [ 1, 2, 4, 8 ];
158
+ let A = [ 1, 2, 4, 8 ];
160
159
 
161
160
  function b(t) {
162
161
  var e = t.length, a = new Array(e), n = new Array(e);
163
162
  let i = e << 6, s = 1;
164
163
  for (let r = 0; r < e; ++r) {
165
164
  var o = a[r] = (o = t[r]) <= 255 ? 0 : o <= 65535 ? 1 : o <= 4294967295 ? 2 : 3, o = (i |= o << (r << 1),
166
- n[r] = C[o]);
165
+ n[r] = A[o]);
167
166
  s += o;
168
167
  }
169
168
  var f = Buffer.allocUnsafe(s);
170
169
  f.writeUInt8(i);
171
- let u = 1;
170
+ let l = 1;
172
171
  for (let r = 0; r < e; ++r) {
173
- d = h = l = c = void 0;
174
- var [ c, l, h, d = 0 ] = [ f, t[r], n[r], u ];
172
+ d = h = c = u = void 0;
173
+ var [ u, c, h, d = 0 ] = [ f, t[r], n[r], l ];
175
174
  switch (h) {
176
175
  case 1:
177
- c.writeUInt8(l, d);
176
+ u.writeUInt8(c, d);
178
177
  break;
179
178
 
180
179
  case 2:
181
- c.writeUInt16BE(l, d);
180
+ u.writeUInt16BE(c, d);
182
181
  break;
183
182
 
184
183
  case 4:
185
- c.writeUInt32BE(l, d);
184
+ u.writeUInt32BE(c, d);
186
185
  break;
187
186
 
188
187
  default:
189
- c.writeBigUInt64BE(BigInt(l), d);
188
+ u.writeBigUInt64BE(BigInt(c), d);
190
189
  }
191
- u += n[r];
190
+ l += n[r];
192
191
  }
193
192
  return f;
194
193
  }
195
194
 
196
- function w(t, e, a) {
195
+ function C(t, e, a) {
197
196
  var n = t.readUInt8(e), i = (++e, n >> 6 & 3);
198
197
  for (let r = 0; r < i; ++r) {
199
- var s = C[n >> (r << 1) & 3];
198
+ var s = A[n >> (r << 1) & 3];
200
199
  a[r] = ((r, t, e = 0) => {
201
200
  switch (t) {
202
201
  case 1:
@@ -216,24 +215,24 @@ function w(t, e, a) {
216
215
  return e;
217
216
  }
218
217
 
219
- function y(r, t, e) {
218
+ function w(r, t, e) {
220
219
  e = n(e);
221
220
  return Buffer.concat([ b([ r, t, e.length ]), e ]);
222
221
  }
223
222
 
224
- async function I(e, r, a, n) {
223
+ async function y(e, r, a, n) {
225
224
  var i = [];
226
225
  for (let t = 0; t < r.length; ) {
227
- var s = [], o = w(r, t, s), [ s, f, u ] = s;
226
+ var s = [], o = C(r, t, s), [ s, f, l ] = s;
228
227
  if (s <= n) h.warn(`changeId ${s} <= currentChangeId ${n} at ${e}:${t}. Ignored.`),
229
- t = o + u; else {
228
+ t = o + l; else {
230
229
  n + f != s && h.warn(`currentChangeId ${n} + batchSize ${f} != changeId ` + s);
231
230
  try {
232
- var c = JSON.parse(r.subarray(o, o + u));
233
- i.push([ s, c ]), n = s, t = o + u;
231
+ var u = JSON.parse(r.subarray(o, o + l));
232
+ i.push([ s, u ]), n = s, t = o + l;
234
233
  } catch (r) {
235
234
  if (h.error(`Parse ${e} failed at ${t}:`, r), a) return h.warn(`Autorepair by truncating ${e} to ` + t),
236
- null == (f = await l.truncate(e, t)) ? h.log("truncate success") : h.error("truncate failed:", f),
235
+ null == (f = await c.truncate(e, t)) ? h.log("truncate success") : h.error("truncate failed:", f),
237
236
  i;
238
237
  throw r;
239
238
  }
@@ -243,13 +242,13 @@ async function I(e, r, a, n) {
243
242
  }
244
243
 
245
244
  export {
246
- d as CmdNames,
245
+ u as CmdNames,
247
246
  t as applyAclChange,
248
247
  e as iterCmdKeys,
249
248
  i as QyAclCmdGenerator,
250
249
  p as readAclFile,
251
250
  b as numsToBuffer,
252
- w as bufferToNums,
253
- y as toAclBuffer,
254
- I as readAclBuffer
251
+ C as bufferToNums,
252
+ w as toAclBuffer,
253
+ y as readAclBuffer
255
254
  };
package/src/QyBatch.d.ts CHANGED
@@ -29,7 +29,7 @@ export declare class QyBatch extends QyCD {
29
29
  delEmbedding(namePath: any, parentDir?: any): any;
30
30
  insertWithEmbedding(namePath: any, content: any, embedding: any, noClone?: boolean, noCreate?: boolean, parentDir?: any): any;
31
31
  remove(namePath: any, content: any, parentDir?: any): any;
32
- put(namePath: any, content: any, noClone?: boolean, parentDir?: any): any;
32
+ put(namePath: any, content: any, parentDir?: any): any;
33
33
  delContent(namePath: any, parentDir?: any): any;
34
34
  insertTrigger(triggerName: any, fileNamePath: any, propNamePathList: any, modCode: any): any;
35
35
  removeTrigger(triggerName: any): any;
@@ -48,6 +48,7 @@ export declare class QyBatch extends QyCD {
48
48
  _action_delContent(action: any): boolean;
49
49
  _action_insertEmbedding(action: any): boolean;
50
50
  _action_delEmbedding(action: any): true | undefined;
51
+ _action_put(action: any): boolean;
51
52
  _action_insert(action: any): boolean;
52
53
  _action_createFile(action: any): boolean;
53
54
  _action_createDir(action: any): boolean;