datafolder 1.0.2 → 1.0.4
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 +34 -31
- package/index.js +1 -3
- package/package.json +5 -3
- package/sample.js +37 -37
- package/scripts/airbnb.js +10 -11
- package/scripts/airbnb2.js +10 -11
- package/scripts/airbnb2_queries.js +20 -22
- package/scripts/airbnb_queries.js +23 -22
- package/scripts/downloadFile.js +29 -31
- package/scripts/express.js +7 -5
- package/scripts/fastify.js +12 -11
- package/scripts/flights.js +9 -9
- package/scripts/flights2.js +9 -9
- package/scripts/flights2_queries.js +107 -105
- package/scripts/flights_queries.js +113 -109
- package/src/QyAcl.js +153 -152
- package/src/QyAclSaver.js +16 -10
- package/src/QyAclSaver_Worker.js +21 -15
- package/src/QyAclWriter.js +23 -13
- package/src/QyBatch.js +298 -263
- package/src/QyBinWriter.js +49 -37
- package/src/QyCD.js +13 -14
- package/src/QyCache.js +177 -140
- package/src/QyCompressor.js +71 -45
- package/src/QyCompressor_Worker.js +17 -9
- package/src/QyDB.js +67 -12
- package/src/QyDefaultOptions.js +13 -10
- package/src/QyDir.js +89 -53
- package/src/QyFetch.js +27 -24
- package/src/QyFile.js +89 -77
- package/src/QyFileContentUtils.js +129 -132
- package/src/QyFileLogger.js +63 -41
- package/src/QyIndex.js +175 -197
- package/src/QyIndexPropTree.js +25 -25
- package/src/QyIntersectNode.js +34 -31
- package/src/QyItem.js +54 -52
- package/src/QyJsonSaver.js +12 -6
- package/src/QyKVData.js +279 -245
- package/src/QyKVDataCleaner.js +12 -6
- package/src/QyKVDataCleaner_Worker.js +77 -59
- package/src/QyKVDataLoader.js +67 -46
- package/src/QyKVDataSaver.js +15 -9
- package/src/QyKVDataSaver_Worker.js +83 -60
- package/src/QyLogFileSaver.js +12 -6
- package/src/QyLogFileSaver_Worker.js +24 -14
- package/src/QyLogger.js +51 -40
- package/src/QyMessageWorker.js +43 -29
- package/src/QyMessager.js +74 -54
- package/src/QyMessager_Run.js +20 -7
- package/src/QyMod.js +15 -11
- package/src/QyOpRunner.js +58 -41
- package/src/QyQueue.js +35 -30
- package/src/QySaver.js +52 -29
- package/src/QySnapshotCompactor.js +15 -9
- package/src/QySnapshotCompactor_Worker.js +131 -110
- package/src/QySnapshotSaver.js +15 -9
- package/src/QySnapshotSaver_Worker.js +125 -110
- package/src/QySnapshots.js +264 -242
- package/src/QyStructure.js +35 -27
- package/src/QyTrigger.js +62 -55
- package/src/QyUnionNode.js +54 -56
- package/src/QyUtils.js +170 -158
- package/src/QyWorker.js +34 -20
- package/src/hackernews.js +63 -71
- package/src/rpc/getFileContent.js +7 -7
- package/src/rpc/getSubItems.js +12 -28
- package/src/rpc/queryFiles.js +2 -25
- package/src/simulate.js +85 -80
- package/src/simulate2.js +77 -78
- package/src/soc_pokec.js +44 -32
- package/static/datafolderui/QyStyledElement.js +12 -12
- package/static/datafolderui/QyUIFolderTree.js +20 -20
- package/static/datafolderui/QyUIUtils.js +8 -8
- package/static/datafolderui/explore-tree.js +31 -31
- package/static/datafolderui/folder-tree.js +2 -2
- package/static/datafolderui/hscrpt.js +9 -17
- package/static/datafolderui/json-view.js +3 -5
- package/static/datafolderui/kv-input.js +15 -15
- package/static/datafolderui/list-input.js +17 -17
- package/static/datafolderui/main-page.js +18 -18
- package/static/datafolderui/num-input.js +5 -5
- package/static/datafolderui/query-editor.js +6 -1
- package/static/datafolderui/querySelectorShadowRoot.js +15 -19
- package/static/datafolderui/resizable-input.js +18 -18
package/src/QyUtils.js
CHANGED
|
@@ -1,250 +1,262 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import e from "node:crypto";
|
|
2
|
+
|
|
3
|
+
import t from "node:path";
|
|
4
|
+
|
|
5
|
+
import n from "node:process";
|
|
6
|
+
|
|
7
|
+
import a from "node:fs/promises";
|
|
8
|
+
|
|
9
|
+
import o from "node:fs";
|
|
10
|
+
|
|
11
|
+
import i from "node:timers/promises";
|
|
12
|
+
|
|
13
|
+
import {
|
|
14
|
+
fileURLToPath as r
|
|
15
|
+
} from "node:url";
|
|
16
|
+
|
|
17
|
+
var s = t.dirname(r(import.meta.url)), u = Object.fromEntries([ "$del", "$link", "$rpl", "$spec", "$raw", "$all", "$clone", "$ext", "$or", "$and", "$gt", "$lt", "$gte", "$lte" ].map(r => [ r, r ])), f = "%", f = {
|
|
18
|
+
HiddenFolderName: f,
|
|
19
|
+
TriggerDirPath: [ f, "trigger" ],
|
|
20
|
+
RpcDirPath: [ f, "rpc" ],
|
|
21
|
+
IndexDirPath: [ f, "index" ],
|
|
6
22
|
IndexPropPathsFileName: "propPaths"
|
|
7
23
|
};
|
|
8
24
|
|
|
9
|
-
function
|
|
10
|
-
return
|
|
25
|
+
function c(r) {
|
|
26
|
+
return r.startsWith("{") && r.endsWith("}");
|
|
11
27
|
}
|
|
12
28
|
|
|
13
|
-
function
|
|
14
|
-
return
|
|
29
|
+
function l(r) {
|
|
30
|
+
return c(r) && r.substring(1, r.length - 1);
|
|
15
31
|
}
|
|
16
32
|
|
|
17
|
-
function
|
|
18
|
-
return 1e12 <
|
|
33
|
+
function m(r) {
|
|
34
|
+
return 1e12 < r ? Math.round(100 * r / 1e12) / 100 + "TB" : 1e9 < r ? Math.round(100 * r / 1e9) / 100 + "GB" : 1e6 < r ? Math.round(100 * r / 1e6) / 100 + "MB" : 1e3 < r ? Math.round(100 * r / 1e3) / 100 + "KB" : r;
|
|
19
35
|
}
|
|
20
36
|
|
|
21
|
-
let
|
|
37
|
+
let p = 10;
|
|
22
38
|
|
|
23
|
-
function
|
|
24
|
-
return
|
|
39
|
+
function d(r, t = 10) {
|
|
40
|
+
return e.createHash("sha256").update(r, "utf8").digest("base64url").slice(0, t);
|
|
25
41
|
}
|
|
26
42
|
|
|
27
|
-
|
|
43
|
+
var g = 11;
|
|
28
44
|
|
|
29
|
-
function
|
|
30
|
-
return "d" +
|
|
45
|
+
function h(r) {
|
|
46
|
+
return "d" + r;
|
|
31
47
|
}
|
|
32
48
|
|
|
33
|
-
function
|
|
34
|
-
return "f" +
|
|
49
|
+
function y(r) {
|
|
50
|
+
return "f" + r;
|
|
35
51
|
}
|
|
36
52
|
|
|
37
|
-
function
|
|
38
|
-
return "c" +
|
|
53
|
+
function S(r) {
|
|
54
|
+
return "c" + r;
|
|
39
55
|
}
|
|
40
56
|
|
|
41
|
-
function
|
|
42
|
-
return
|
|
57
|
+
function b(r = 8) {
|
|
58
|
+
return e.randomBytes(r).toString("hex");
|
|
43
59
|
}
|
|
44
60
|
|
|
45
|
-
function
|
|
46
|
-
return
|
|
61
|
+
function v(r) {
|
|
62
|
+
return r[r.length - 1];
|
|
47
63
|
}
|
|
48
64
|
|
|
49
|
-
function
|
|
50
|
-
if (null !=
|
|
65
|
+
function $(r) {
|
|
66
|
+
if (null != r) for (var t in r) if (null != r[t]) return !1;
|
|
51
67
|
return !0;
|
|
52
68
|
}
|
|
53
69
|
|
|
54
|
-
function
|
|
55
|
-
return null !=
|
|
70
|
+
function P(r) {
|
|
71
|
+
return null != r && "object" == typeof r && !(r instanceof Date);
|
|
56
72
|
}
|
|
57
73
|
|
|
58
|
-
function
|
|
59
|
-
return "string" == typeof
|
|
74
|
+
function M(r) {
|
|
75
|
+
return "string" == typeof r;
|
|
60
76
|
}
|
|
61
77
|
|
|
62
|
-
function
|
|
63
|
-
return "number" == typeof
|
|
78
|
+
function x(r) {
|
|
79
|
+
return "number" == typeof r;
|
|
64
80
|
}
|
|
65
81
|
|
|
66
|
-
function
|
|
67
|
-
return "boolean" == typeof
|
|
82
|
+
function N(r) {
|
|
83
|
+
return "boolean" == typeof r;
|
|
68
84
|
}
|
|
69
85
|
|
|
70
|
-
function
|
|
71
|
-
return "function" == typeof
|
|
86
|
+
function w(r) {
|
|
87
|
+
return "function" == typeof r;
|
|
72
88
|
}
|
|
73
89
|
|
|
74
|
-
function
|
|
75
|
-
var t = typeof
|
|
76
|
-
return "string" == t || "number" == t || "boolean" == t ||
|
|
90
|
+
function B(r) {
|
|
91
|
+
var t = typeof r;
|
|
92
|
+
return "string" == t || "number" == t || "boolean" == t || r instanceof Date;
|
|
77
93
|
}
|
|
78
94
|
|
|
79
|
-
function
|
|
80
|
-
let t =
|
|
81
|
-
for (;null ==
|
|
82
|
-
return
|
|
95
|
+
function j(r) {
|
|
96
|
+
let t = r.length;
|
|
97
|
+
for (;null == r[t - 1] && 0 < t; ) --t;
|
|
98
|
+
return r.length = t, r;
|
|
83
99
|
}
|
|
84
100
|
|
|
85
|
-
function
|
|
86
|
-
return
|
|
87
|
-
resolve:
|
|
101
|
+
function F(e) {
|
|
102
|
+
return e.promise || (e.promise = new Promise((r, t) => Object.assign(e, {
|
|
103
|
+
resolve: r,
|
|
88
104
|
reject: t
|
|
89
|
-
}))),
|
|
105
|
+
}))), e;
|
|
90
106
|
}
|
|
91
107
|
|
|
92
|
-
function
|
|
93
|
-
return Buffer.isBuffer(
|
|
108
|
+
function A(r) {
|
|
109
|
+
return Buffer.isBuffer(r) ? r : Buffer.from(r);
|
|
94
110
|
}
|
|
95
111
|
|
|
96
|
-
function
|
|
97
|
-
return 1 <
|
|
112
|
+
function H(r) {
|
|
113
|
+
return 1 < r ? "s" : "";
|
|
98
114
|
}
|
|
99
115
|
|
|
100
|
-
function
|
|
101
|
-
return
|
|
116
|
+
function O(r) {
|
|
117
|
+
return a.mkdir(r, {
|
|
102
118
|
recursive: !0
|
|
103
119
|
});
|
|
104
120
|
}
|
|
105
121
|
|
|
106
|
-
function
|
|
107
|
-
return
|
|
122
|
+
function T(r) {
|
|
123
|
+
return O(t.dirname(r));
|
|
108
124
|
}
|
|
109
125
|
|
|
110
|
-
async function
|
|
126
|
+
async function k(r) {
|
|
111
127
|
try {
|
|
112
|
-
return (await
|
|
113
|
-
} catch (
|
|
128
|
+
return (await a.stat(r)).size;
|
|
129
|
+
} catch (r) {
|
|
114
130
|
return !1;
|
|
115
131
|
}
|
|
116
132
|
}
|
|
117
133
|
|
|
118
|
-
async function
|
|
119
|
-
return !1 !== await
|
|
134
|
+
async function K(r) {
|
|
135
|
+
return !1 !== await k(r);
|
|
120
136
|
}
|
|
121
137
|
|
|
122
|
-
function
|
|
123
|
-
return
|
|
138
|
+
function L(r, t) {
|
|
139
|
+
return i.setTimeout(1e3 * r, !0, {
|
|
124
140
|
signal: t
|
|
125
141
|
});
|
|
126
142
|
}
|
|
127
143
|
|
|
128
|
-
let
|
|
144
|
+
let D = void 0;
|
|
129
145
|
|
|
130
|
-
function
|
|
131
|
-
for (var
|
|
146
|
+
function E() {
|
|
147
|
+
for (var r of Object.keys(D)) I(r);
|
|
132
148
|
}
|
|
133
149
|
|
|
134
|
-
async function
|
|
150
|
+
async function U(t) {
|
|
135
151
|
try {
|
|
136
|
-
await
|
|
137
|
-
var
|
|
138
|
-
await
|
|
152
|
+
await T(t);
|
|
153
|
+
var r = new Date().toISOString() + ": " + n.argv.join(" ");
|
|
154
|
+
await a.writeFile(t, r, {
|
|
139
155
|
flag: "wx",
|
|
140
156
|
flush: !0
|
|
141
|
-
}), logger.info("Locked " + t),
|
|
157
|
+
}), logger.info("Locked " + t), D ? D[t] = 1 : (D = {
|
|
142
158
|
[t]: 1
|
|
143
|
-
},
|
|
144
|
-
} catch (
|
|
145
|
-
throw "EEXIST" ==
|
|
146
|
-
|
|
159
|
+
}, n.on("exit", E), n.on("SIGINT", E));
|
|
160
|
+
} catch (r) {
|
|
161
|
+
throw "EEXIST" == r.code && logger.error(`Already started by ${(await a.readFile(t)).toString()}:`, r),
|
|
162
|
+
r;
|
|
147
163
|
}
|
|
148
164
|
}
|
|
149
165
|
|
|
150
|
-
function
|
|
166
|
+
function I(r) {
|
|
151
167
|
try {
|
|
152
|
-
|
|
153
|
-
} catch (
|
|
168
|
+
o.unlinkSync(r), logger.info("Unlocked " + r);
|
|
169
|
+
} catch (r) {}
|
|
154
170
|
}
|
|
155
171
|
|
|
156
|
-
function
|
|
157
|
-
return
|
|
172
|
+
function _(r) {
|
|
173
|
+
return r.startsWith("[") && r.endsWith("]") ? JSON.parse(r) : r;
|
|
158
174
|
}
|
|
159
175
|
|
|
160
|
-
function
|
|
161
|
-
return Array.isArray(
|
|
176
|
+
function R(r) {
|
|
177
|
+
return Array.isArray(r) ? 1 == r.length ? r[0] : JSON.stringify(r) : r;
|
|
162
178
|
}
|
|
163
179
|
|
|
164
|
-
function
|
|
165
|
-
|
|
166
|
-
return
|
|
180
|
+
function W(r) {
|
|
181
|
+
r = r.split("/");
|
|
182
|
+
return r[0] || (r[0] = "/"), r;
|
|
167
183
|
}
|
|
168
184
|
|
|
169
|
-
function
|
|
170
|
-
return
|
|
185
|
+
function z(r) {
|
|
186
|
+
return r.split(".");
|
|
171
187
|
}
|
|
172
188
|
|
|
173
|
-
function
|
|
174
|
-
return
|
|
189
|
+
function J(r) {
|
|
190
|
+
return r.join(".");
|
|
175
191
|
}
|
|
176
192
|
|
|
177
|
-
function
|
|
178
|
-
return Math.floor(Math.random() * (
|
|
193
|
+
function G(r, t = 0) {
|
|
194
|
+
return Math.floor(Math.random() * (r - t)) + t;
|
|
179
195
|
}
|
|
180
196
|
|
|
181
|
-
function
|
|
182
|
-
var t,
|
|
183
|
-
for (t of
|
|
184
|
-
return
|
|
197
|
+
function C(r) {
|
|
198
|
+
var t, e = {};
|
|
199
|
+
for (t of r) e[t] = 1;
|
|
200
|
+
return e;
|
|
185
201
|
}
|
|
186
202
|
|
|
187
|
-
async function
|
|
188
|
-
var
|
|
189
|
-
for (let
|
|
190
|
-
var
|
|
191
|
-
if (0 ==
|
|
192
|
-
|
|
203
|
+
async function Q(t, e, n, a) {
|
|
204
|
+
var o = Buffer.allocUnsafe(a);
|
|
205
|
+
for (let r = 0; r < a; ) {
|
|
206
|
+
var i = (await e.read(o, r, a - r, n + r)).bytesRead;
|
|
207
|
+
if (0 == i) return void logger.error(`read ${t} at ${n + r} returning 0 byte`);
|
|
208
|
+
r += i;
|
|
193
209
|
}
|
|
194
|
-
return
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
function
|
|
198
|
-
var
|
|
199
|
-
return Math.round(
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
readBufferAsync: readBufferAsync,
|
|
248
|
-
memoryPercent: memoryPercent,
|
|
249
|
-
generatorToList: generatorToList
|
|
250
|
-
});
|
|
210
|
+
return o;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
function X() {
|
|
214
|
+
var r = n.availableMemory();
|
|
215
|
+
return Math.round(r / (n.memoryUsage.rss() + r) * 100);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
export * as default from "./QyUtils.js";
|
|
219
|
+
|
|
220
|
+
export {
|
|
221
|
+
u as SpecialOperators,
|
|
222
|
+
d as calHash,
|
|
223
|
+
p as Hash_Length,
|
|
224
|
+
g as Hash_Key_Length,
|
|
225
|
+
W as pathSplit,
|
|
226
|
+
c as isMatchName,
|
|
227
|
+
l as getMatchParam,
|
|
228
|
+
x as isNumber,
|
|
229
|
+
M as isString,
|
|
230
|
+
N as isBoolean,
|
|
231
|
+
w as isFunction,
|
|
232
|
+
P as isNotNullObj,
|
|
233
|
+
B as isSimpleType,
|
|
234
|
+
$ as isEmptyObj,
|
|
235
|
+
h as getSubdirMapKey,
|
|
236
|
+
y as getFileMapKey,
|
|
237
|
+
S as getContentKey,
|
|
238
|
+
v as arrayLast,
|
|
239
|
+
b as getRandomStr,
|
|
240
|
+
m as getSizeStr,
|
|
241
|
+
F as setPromise,
|
|
242
|
+
j as trimArrayTail,
|
|
243
|
+
A as toBuffer,
|
|
244
|
+
H as getSuffix,
|
|
245
|
+
L as sleep,
|
|
246
|
+
O as ensureDir,
|
|
247
|
+
T as ensureParentDir,
|
|
248
|
+
k as getSize,
|
|
249
|
+
U as lockExclusiveFilePath,
|
|
250
|
+
I as unlockExclusiveFilePath,
|
|
251
|
+
K as folderOrFileExists,
|
|
252
|
+
f as SpecialFilePaths,
|
|
253
|
+
_ as fromSingleName,
|
|
254
|
+
R as toSingleName,
|
|
255
|
+
G as randomInt,
|
|
256
|
+
z as propNameSplit,
|
|
257
|
+
J as propNameJoin,
|
|
258
|
+
C as listToMap,
|
|
259
|
+
Q as readBufferAsync,
|
|
260
|
+
X as memoryPercent,
|
|
261
|
+
s as __dirname
|
|
262
|
+
};
|
package/src/QyWorker.js
CHANGED
|
@@ -1,33 +1,47 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
}
|
|
1
|
+
import {
|
|
2
|
+
isAbsolute as a,
|
|
3
|
+
join as m
|
|
4
|
+
} from "node:path";
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
import {
|
|
7
|
+
Worker as l,
|
|
8
|
+
setEnvironmentData as p
|
|
9
|
+
} from "node:worker_threads";
|
|
10
|
+
|
|
11
|
+
import {
|
|
12
|
+
logger as g
|
|
13
|
+
} from "./QyLogger.js";
|
|
14
|
+
|
|
15
|
+
import {
|
|
16
|
+
setPromise as k,
|
|
17
|
+
__dirname as d
|
|
18
|
+
} from "./QyUtils.js";
|
|
19
|
+
|
|
20
|
+
function e(e, r) {
|
|
21
|
+
p("logLevel", g.level);
|
|
8
22
|
var o = r.operation;
|
|
9
23
|
let t = e + " " + o, {
|
|
10
|
-
promise:
|
|
11
|
-
resolve:
|
|
12
|
-
} = (
|
|
13
|
-
|
|
14
|
-
o = new
|
|
24
|
+
promise: s,
|
|
25
|
+
resolve: i
|
|
26
|
+
} = (g.info("Starting worker " + t), k({}));
|
|
27
|
+
a(e) || (e = m(d, e));
|
|
28
|
+
o = new l(e, {
|
|
15
29
|
workerData: r
|
|
16
30
|
});
|
|
17
|
-
let
|
|
31
|
+
let n;
|
|
18
32
|
return o.on("message", e => {
|
|
19
|
-
|
|
33
|
+
n = !0, i(e);
|
|
20
34
|
}), o.on("error", e => {
|
|
21
|
-
|
|
35
|
+
n = !0, i(e);
|
|
22
36
|
}), o.on("exit", e => {
|
|
23
|
-
|
|
24
|
-
|
|
37
|
+
n ? g.info(`Worker ${t} exited.`) : (g.log(`Worker ${t} stopped with exitCode ` + e),
|
|
38
|
+
i());
|
|
25
39
|
}), {
|
|
26
40
|
worker: o,
|
|
27
|
-
promise:
|
|
41
|
+
promise: s
|
|
28
42
|
};
|
|
29
43
|
}
|
|
30
44
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
}
|
|
45
|
+
export {
|
|
46
|
+
e as runOnceWithWorker
|
|
47
|
+
};
|
package/src/hackernews.js
CHANGED
|
@@ -1,93 +1,85 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import {
|
|
2
|
+
join as o
|
|
3
|
+
} from "node:path";
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
readdir as n,
|
|
7
|
+
readFile as i
|
|
8
|
+
} from "node:fs/promises";
|
|
9
|
+
|
|
10
|
+
import {
|
|
11
|
+
QyDB as e
|
|
12
|
+
} from "./QyDB.js";
|
|
13
|
+
|
|
14
|
+
logger.level = "info";
|
|
15
|
+
|
|
16
|
+
let s = "D:\\exp\\HackerBook\\static-shards_json", w = new e({
|
|
3
17
|
fileLogLevel: "basic",
|
|
4
18
|
maxInMemSnapshotCount: 1,
|
|
5
19
|
snapshotMaxChangeCount: 2e3,
|
|
6
20
|
unloadMemInterval: 2e4
|
|
7
|
-
}),
|
|
21
|
+
}), C = 100;
|
|
8
22
|
|
|
9
|
-
function
|
|
23
|
+
function l(e, t) {
|
|
10
24
|
var a, r = {}, o = {};
|
|
11
25
|
for (a of e) {
|
|
12
26
|
var {
|
|
13
27
|
parent_id: n,
|
|
14
|
-
child_id:
|
|
28
|
+
child_id: i
|
|
15
29
|
} = a;
|
|
16
|
-
let e = o[
|
|
17
|
-
(r = r || (t.children = {}))[
|
|
30
|
+
let e = o[i], t = (e = e || (o[i] = {}), o[n]), r = (t = t || (o[n] = {})).children;
|
|
31
|
+
(r = r || (t.children = {}))[i] = e;
|
|
18
32
|
}
|
|
19
|
-
var
|
|
20
|
-
let
|
|
21
|
-
for (
|
|
33
|
+
var s, l, c, m = {};
|
|
34
|
+
let d = 0, f = 0;
|
|
35
|
+
for (s of t) {
|
|
22
36
|
var {
|
|
23
|
-
id:
|
|
24
|
-
time:
|
|
37
|
+
id: h,
|
|
38
|
+
time: p,
|
|
25
39
|
parent: g
|
|
26
|
-
} =
|
|
40
|
+
} = s;
|
|
27
41
|
if (null == g) {
|
|
28
|
-
|
|
29
|
-
r[
|
|
30
|
-
let e = o[
|
|
31
|
-
e ? e.item =
|
|
32
|
-
item:
|
|
33
|
-
},
|
|
42
|
+
p = (e => [ (e = new Date(1e3 * e)).getUTCFullYear(), e.getUTCMonth() + 1, e.getUTCDate() ])(p);
|
|
43
|
+
r[h] = p;
|
|
44
|
+
let e = o[h];
|
|
45
|
+
e ? e.item = s : e = o[h] = {
|
|
46
|
+
item: s
|
|
47
|
+
}, m[h] = e, ++d;
|
|
34
48
|
} else {
|
|
35
|
-
|
|
36
|
-
if (
|
|
37
|
-
let e =
|
|
38
|
-
t ? t.item =
|
|
39
|
-
item:
|
|
49
|
+
p = o[g];
|
|
50
|
+
if (p) {
|
|
51
|
+
let e = p.children, t = (e = e || (p.children = {}))[h];
|
|
52
|
+
t ? t.item = s : t = e[h] = {
|
|
53
|
+
item: s
|
|
40
54
|
}, ++f;
|
|
41
|
-
} else logger.warn(
|
|
55
|
+
} else logger.warn(h + `'s parent ${g} not exist.`);
|
|
42
56
|
}
|
|
43
57
|
}
|
|
44
|
-
let
|
|
45
|
-
for (l in
|
|
46
|
-
var
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
}
|
|
50
|
-
for (c in 0 < p && qyDB.batch.run(), d) cleanContent(d[c]);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
function cleanContent(e) {
|
|
54
|
-
delete e.item;
|
|
55
|
-
var t, r = e.children;
|
|
56
|
-
for (t in r) cleanContent(r[t]);
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
function getDatePath(e) {
|
|
60
|
-
e = new Date(1e3 * e);
|
|
61
|
-
return [ e.getUTCFullYear(), e.getUTCMonth() + 1, e.getUTCDate() ];
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
async function insertShards() {
|
|
65
|
-
var e;
|
|
66
|
-
for (e of (await fsPromises.readdir(shardRootFolder)).map(e => /([0-9]+).json/.exec(e)[1]).sort((e, t) => e - t)) {
|
|
67
|
-
var t = `shard_${e}.json`, {
|
|
68
|
-
edges: r,
|
|
69
|
-
items: a
|
|
70
|
-
} = JSON.parse(await fsPromises.readFile(path.join(shardRootFolder, t)));
|
|
71
|
-
logger.warn(t), insertShard(r, a);
|
|
58
|
+
let v = 0;
|
|
59
|
+
for (l in m) {
|
|
60
|
+
var u = r[l];
|
|
61
|
+
w.batch.insert([ "hackernews", ...u, l ], m[l]), ++v >= C && (w.batch.run(),
|
|
62
|
+
v = 0);
|
|
72
63
|
}
|
|
64
|
+
for (c in 0 < v && w.batch.run(), m) !function e(t) {
|
|
65
|
+
delete t.item;
|
|
66
|
+
let r = t.children;
|
|
67
|
+
for (var a in r) e(r[a]);
|
|
68
|
+
}(m[c]);
|
|
73
69
|
}
|
|
74
70
|
|
|
75
|
-
async
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
logger.warn(
|
|
71
|
+
(async () => {
|
|
72
|
+
if (process.argv[2] && (logger.level = process.argv[2]), console.time("run"),
|
|
73
|
+
console.time("start"), await w.start(), console.timeEnd("start"), !w.dir("hackernews")) {
|
|
74
|
+
var e;
|
|
75
|
+
for (e of (await n(s)).map(e => /([0-9]+).json/.exec(e)[1]).sort((e, t) => e - t)) {
|
|
76
|
+
var t = `shard_${e}.json`, {
|
|
77
|
+
edges: r,
|
|
78
|
+
items: a
|
|
79
|
+
} = JSON.parse(await i(o(s, t)));
|
|
80
|
+
logger.warn(t), l(r, a);
|
|
85
81
|
}
|
|
86
|
-
|
|
87
|
-
}
|
|
88
|
-
console.time("
|
|
89
|
-
|
|
90
|
-
console.timeEnd("run"), console.timeEnd("accu");
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
run();
|
|
82
|
+
await 0;
|
|
83
|
+
}
|
|
84
|
+
console.time("stop"), await w.stop(), console.timeEnd("stop"), console.timeEnd("run");
|
|
85
|
+
})();
|