datafolder 1.0.19 → 1.0.20
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/scripts/flights2.js +3 -3
- package/src/QyAcl.js +56 -57
- package/src/QyBatch.d.ts +2 -1
- package/src/QyBatch.js +161 -131
- package/src/QyDir.d.ts +3 -3
- package/src/QyDir.js +33 -39
- package/src/QyIndex.d.ts +1 -1
- package/src/QyIndex.js +79 -78
- package/src/QyIntersectNode.js +3 -3
- package/src/QyUnionNode.d.ts +3 -3
- package/src/QyUnionNode.js +36 -36
package/README.md
CHANGED
|
@@ -4,6 +4,8 @@ datafolder is a lightning fluid JSON database for high speed SSDs, featuring an
|
|
|
4
4
|
|
|
5
5
|
### Changelog
|
|
6
6
|
|
|
7
|
+
1.0.20 Add HNSW support.
|
|
8
|
+
|
|
7
9
|
1.0.19 Add DocumentDB test case (test/testQyDocumentDB.js)
|
|
8
10
|
|
|
9
11
|
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
package/scripts/flights2.js
CHANGED
|
@@ -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, {
|
|
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.
|
|
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.
|
|
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
|
|
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:
|
|
23
|
-
|
|
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
|
|
36
|
-
for (
|
|
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
|
|
40
|
-
if (
|
|
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
|
|
44
|
-
m(
|
|
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
|
|
63
|
-
|
|
61
|
+
case u.A:
|
|
62
|
+
d(this, [ u.A, t, e ]), v(this, [ u.R, t, e ]);
|
|
64
63
|
break;
|
|
65
64
|
|
|
66
|
-
case
|
|
67
|
-
|
|
65
|
+
case u.R:
|
|
66
|
+
d(this, [ u.R, t, e ]), v(this, [ u.A, t, e ]);
|
|
68
67
|
break;
|
|
69
68
|
|
|
70
|
-
case
|
|
71
|
-
if (
|
|
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
|
|
73
|
+
case u.M:
|
|
75
74
|
{
|
|
76
75
|
var n = this.cmdArgAsMapChanges;
|
|
77
76
|
let [ r ] = n;
|
|
78
|
-
n = (r = null == r ? n[
|
|
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
|
|
80
|
+
let r = n.$rpl;
|
|
82
81
|
if (null != r) return n;
|
|
83
|
-
let t = a
|
|
84
|
-
if (null != t) return a[
|
|
82
|
+
let t = a.$rpl;
|
|
83
|
+
if (null != t) return a[l] = g(t, n), a;
|
|
85
84
|
if (a == f) return {
|
|
86
|
-
[
|
|
85
|
+
[l]: s(n)
|
|
87
86
|
};
|
|
88
87
|
if (o(a) || o(n)) return n;
|
|
89
|
-
if (
|
|
90
|
-
for (var i
|
|
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[
|
|
106
|
-
for (var e of [
|
|
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(
|
|
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 [
|
|
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[
|
|
131
|
-
return i && m(i) && delete 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
|
|
134
|
+
if (0 < t) return w(r, t, JSON.stringify(this.takeCmdArgAsListObj()));
|
|
136
135
|
}
|
|
137
136
|
}
|
|
138
137
|
|
|
139
|
-
function
|
|
138
|
+
function d(r, t, e = 1) {
|
|
140
139
|
a(r.cmdArgAsMapChanges, t, e);
|
|
141
140
|
}
|
|
142
141
|
|
|
143
|
-
function
|
|
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
|
|
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
|
|
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] =
|
|
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
|
|
170
|
+
let l = 1;
|
|
172
171
|
for (let r = 0; r < e; ++r) {
|
|
173
|
-
d = h =
|
|
174
|
-
var [
|
|
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
|
-
|
|
176
|
+
u.writeUInt8(c, d);
|
|
178
177
|
break;
|
|
179
178
|
|
|
180
179
|
case 2:
|
|
181
|
-
|
|
180
|
+
u.writeUInt16BE(c, d);
|
|
182
181
|
break;
|
|
183
182
|
|
|
184
183
|
case 4:
|
|
185
|
-
|
|
184
|
+
u.writeUInt32BE(c, d);
|
|
186
185
|
break;
|
|
187
186
|
|
|
188
187
|
default:
|
|
189
|
-
|
|
188
|
+
u.writeBigUInt64BE(BigInt(c), d);
|
|
190
189
|
}
|
|
191
|
-
|
|
190
|
+
l += n[r];
|
|
192
191
|
}
|
|
193
192
|
return f;
|
|
194
193
|
}
|
|
195
194
|
|
|
196
|
-
function
|
|
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 =
|
|
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
|
|
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
|
|
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 =
|
|
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 +
|
|
228
|
+
t = o + l; else {
|
|
230
229
|
n + f != s && h.warn(`currentChangeId ${n} + batchSize ${f} != changeId ` + s);
|
|
231
230
|
try {
|
|
232
|
-
var
|
|
233
|
-
i.push([ s,
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
253
|
-
|
|
254
|
-
|
|
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,
|
|
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;
|