datafolder 1.0.2 → 1.0.3

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