datafolder 1.0.7 → 1.0.9

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 (124) hide show
  1. package/README.md +4 -1
  2. package/index.js +1 -1
  3. package/internal.md +5 -3
  4. package/package.json +7 -5
  5. package/scripts/airbnb.js +77 -72
  6. package/scripts/airbnb2.js +78 -73
  7. package/scripts/airbnb2_queries.js +181 -229
  8. package/scripts/airbnb_queries.js +214 -265
  9. package/scripts/convertBinFiles.js +47 -49
  10. package/scripts/downloadFile.js +41 -40
  11. package/scripts/express.js +44 -48
  12. package/scripts/fastify.js +71 -80
  13. package/scripts/flights.js +71 -75
  14. package/scripts/flights2.js +78 -81
  15. package/scripts/flights2_queries.js +417 -455
  16. package/scripts/flights_queries.js +381 -407
  17. package/src/QyAcl.d.ts +17 -0
  18. package/src/QyAcl.js +113 -116
  19. package/src/QyAclSaver.d.ts +4 -0
  20. package/src/QyAclSaver.js +3 -3
  21. package/src/QyAclSaver_Worker.d.ts +9 -0
  22. package/src/QyAclSaver_Worker.js +2 -4
  23. package/src/QyAclWriter.d.ts +5 -0
  24. package/src/QyBatch.d.ts +42 -0
  25. package/src/QyBatch.js +8 -8
  26. package/src/QyBinWriter.d.ts +15 -0
  27. package/src/QyCD.d.ts +37 -0
  28. package/src/QyCD.js +8 -6
  29. package/src/QyCache.d.ts +44 -0
  30. package/src/QyCache.js +65 -59
  31. package/src/QyCompressor.d.ts +9 -0
  32. package/src/QyCompressor.js +29 -29
  33. package/src/QyCompressor_Worker.d.ts +1 -0
  34. package/src/QyDB.d.ts +42 -0
  35. package/src/QyDB.js +13 -11
  36. package/src/QyDefaultOptions.d.ts +1 -0
  37. package/src/QyDefaultOptions.js +3 -0
  38. package/src/QyDir.d.ts +48 -0
  39. package/src/QyDir.js +41 -41
  40. package/src/QyFetch.d.ts +7 -0
  41. package/src/QyFetch.js +2 -3
  42. package/src/QyFile.d.ts +19 -0
  43. package/src/QyFile.js +35 -34
  44. package/src/QyFileContentUtils.d.ts +13 -0
  45. package/src/QyFileContentUtils.js +126 -126
  46. package/src/QyFileLogger.d.ts +11 -0
  47. package/src/QyIndex.d.ts +6 -0
  48. package/src/QyIndex.js +73 -75
  49. package/src/QyIndexPropTree.d.ts +7 -0
  50. package/src/QyIndexPropTree.js +24 -24
  51. package/src/QyIntersectNode.d.ts +7 -0
  52. package/src/QyIntersectNode.js +15 -15
  53. package/src/QyItem.d.ts +30 -0
  54. package/src/QyItem.js +32 -28
  55. package/src/QyJsonSaver.d.ts +6 -0
  56. package/src/QyKVData.d.ts +12 -0
  57. package/src/QyKVData.js +11 -10
  58. package/src/QyKVDataCleaner.d.ts +4 -0
  59. package/src/QyKVDataCleaner.js +1 -1
  60. package/src/QyKVDataCleaner_Worker.d.ts +13 -0
  61. package/src/QyKVDataCleaner_Worker.js +2 -4
  62. package/src/QyKVDataLoader.d.ts +9 -0
  63. package/src/QyKVDataLoader.js +11 -11
  64. package/src/QyKVDataSaver.d.ts +4 -0
  65. package/src/QyKVDataSaver.js +6 -6
  66. package/src/QyKVDataSaver_Worker.d.ts +13 -0
  67. package/src/QyKVDataSaver_Worker.js +7 -9
  68. package/src/QyLogFileSaver.d.ts +4 -0
  69. package/src/QyLogFileSaver.js +1 -1
  70. package/src/QyLogFileSaver_Worker.d.ts +8 -0
  71. package/src/QyLogFileSaver_Worker.js +2 -4
  72. package/src/QyLogger.d.ts +10 -0
  73. package/src/QyLogger.js +40 -40
  74. package/src/QyMessageWorker.d.ts +5 -0
  75. package/src/QyMessageWorker.js +7 -7
  76. package/src/QyMessager.d.ts +7 -0
  77. package/src/QyMessager.js +30 -27
  78. package/src/QyMessager_Run.d.ts +1 -0
  79. package/src/QyMessager_Run.js +11 -6
  80. package/src/QyMod.d.ts +1 -0
  81. package/src/QyMod.js +6 -6
  82. package/src/QyOpRunner.d.ts +10 -0
  83. package/src/QyOpRunner.js +39 -39
  84. package/src/QyQueue.d.ts +11 -0
  85. package/src/QySaver.d.ts +10 -0
  86. package/src/QySnapshotCompactor.d.ts +4 -0
  87. package/src/QySnapshotCompactor.js +1 -1
  88. package/src/QySnapshotCompactor_Worker.d.ts +11 -0
  89. package/src/QySnapshotCompactor_Worker.js +2 -4
  90. package/src/QySnapshotSaver.d.ts +4 -0
  91. package/src/QySnapshotSaver.js +1 -1
  92. package/src/QySnapshotSaver_Worker.d.ts +16 -0
  93. package/src/QySnapshotSaver_Worker.js +17 -16
  94. package/src/QySnapshots.d.ts +27 -0
  95. package/src/QySnapshots.js +3 -3
  96. package/src/QyStructure.d.ts +1 -0
  97. package/src/QyStructure.js +18 -18
  98. package/src/QyTrigger.d.ts +9 -0
  99. package/src/QyTrigger.js +30 -30
  100. package/src/QyUnionNode.d.ts +17 -0
  101. package/src/QyUnionNode.js +2 -2
  102. package/src/QyUtils.d.ts +53 -0
  103. package/src/QyUtils.js +140 -117
  104. package/src/QyWorker.d.ts +5 -0
  105. package/src/QyWorker.js +18 -18
  106. package/src/hackernews.d.ts +1 -0
  107. package/src/hackernews.js +59 -47
  108. package/src/rpc/getRpcFiles.js +1 -0
  109. package/src/simulate.d.ts +1 -0
  110. package/src/simulate2.d.ts +1 -0
  111. package/src/soc_pokec.d.ts +1 -0
  112. package/static/codemirror.bundle/editor.bundle.js +399 -184
  113. package/static/datafolderui/QyStyledElement.js +2 -2
  114. package/static/datafolderui/QyUIFolderViewer.js +97 -77
  115. package/static/datafolderui/QyUIUtils.js +4 -4
  116. package/static/datafolderui/code-mirror.js +7 -7
  117. package/static/datafolderui/display-tree.js +13 -10
  118. package/static/datafolderui/hscrpt.js +26 -7
  119. package/static/datafolderui/json-view.js +27 -0
  120. package/static/datafolderui/main-page.js +65 -37
  121. package/static/datafolderui/query-editor.js +8 -8
  122. package/static/datafolderui/rpc-editor.js +31 -0
  123. package/static/datafolderui/trigger-editor.js +9 -6
  124. package/static/datafolderui/QyUIFolderTree.js +0 -188
@@ -1,40 +1,41 @@
1
- import { createWriteStream } from "fs";
2
- import { get } from "https";
3
- import { ensureParentDir, folderOrFileExists } from "../src/QyUtils.js";
4
- import { logger } from "../src/QyLogger.js";
5
-
6
- async function downloadFile(fileUrl, filePath) {
7
- if (await folderOrFileExists(filePath)) return;
8
- await ensureParentDir(filePath);
9
- let resolve, reject;
10
- const promise = new Promise((res, rej) => {
11
- resolve = res;
12
- reject = rej;
13
- });
14
- get(fileUrl, (response) => {
15
- if (response.statusCode !== 200) {
16
- logger.error(`Download failed: Status Code ${response.statusCode}`);
17
- reject(response.statusCode);
18
- } else {
19
- const fileStream = createWriteStream(filePath);
20
- let accu = 0;
21
- response.on("data", (chunk) => {
22
- fileStream.write(chunk);
23
- accu += chunk.length;
24
- if (accu >= 1000_000) {
25
- process.stdout.write(".");
26
- accu = 0;
27
- }
28
- });
29
- response.on("end", () => {
30
- fileStream.close();
31
- resolve();
32
- });
33
- }
34
- }).on("error", (err) => {
35
- logger.error(`Request error: ${err.message}`);
36
- reject(err.message);
37
- });
38
- return promise;
39
- }
40
- export { downloadFile };
1
+ import { createWriteStream } from "fs";
2
+ import { get } from "https";
3
+ import { ensureParentDir, folderOrFileExists } from "../src/QyUtils.js";
4
+ import { logger } from "../src/QyLogger.js";
5
+ async function downloadFile(fileUrl, filePath) {
6
+ if (await folderOrFileExists(filePath))
7
+ return;
8
+ await ensureParentDir(filePath);
9
+ let resolve, reject;
10
+ const promise = new Promise((res, rej) => {
11
+ resolve = res;
12
+ reject = rej;
13
+ });
14
+ get(fileUrl, (response) => {
15
+ if (response.statusCode !== 200) {
16
+ logger.error(`Download failed: Status Code ${response.statusCode}`);
17
+ reject(response.statusCode);
18
+ }
19
+ else {
20
+ const fileStream = createWriteStream(filePath);
21
+ let accu = 0;
22
+ response.on("data", (chunk) => {
23
+ fileStream.write(chunk);
24
+ accu += chunk.length;
25
+ if (accu >= 1000_000) {
26
+ process.stdout.write(".");
27
+ accu = 0;
28
+ }
29
+ });
30
+ response.on("end", () => {
31
+ fileStream.close();
32
+ resolve();
33
+ });
34
+ }
35
+ }).on("error", (err) => {
36
+ logger.error(`Request error: ${err.message}`);
37
+ reject(err.message);
38
+ });
39
+ return promise;
40
+ }
41
+ export { downloadFile };
@@ -1,48 +1,44 @@
1
- import { join } from "node:path";
2
- import { QyDB } from "../src/QyDB.js";
3
- import Express from "express";
4
- import { __dirname } from "../src/QyUtils.js";
5
-
6
- const config = {
7
- port: 3629,
8
- qyDBDataFolder: "./tmp/QyExpress",
9
- staticRoot: join(__dirname, "../static/"),
10
- rpcFolder: join(__dirname, "rpc"),
11
- };
12
-
13
- const { port, qyDBDataFolder } = config;
14
- const app = Express();
15
- const qyDB = new QyDB(qyDBDataFolder);
16
-
17
- let server;
18
- process.on("SIGINT", async () => {
19
- logger.log("SIGINT signal received: closing HTTP server");
20
- if (server) {
21
- server.close(() => logger.log("HTTP server closed"));
22
- server.closeAllConnections();
23
- }
24
- await qyDB.stop();
25
- });
26
-
27
- run();
28
-
29
- async function run() {
30
- try {
31
- await qyDB.start();
32
- server = app.listen(port, () => {
33
- logger.log(`Example app listening on port ${port}`);
34
- });
35
- app.get("/", (request, reply) => {
36
- reply.send({ hello: "world from express" });
37
- });
38
- app.get("/test", (request, reply) => {
39
- qyDB.insert("users/test", { a: 3, b: 4 });
40
- const content = qyDB.view("users/test");
41
- reply.send(content);
42
- logger.log(content);
43
- });
44
- } catch (exception) {
45
- logger.error(exception);
46
- await qyDB.stop();
47
- }
48
- }
1
+ import { join } from "node:path";
2
+ import { QyDB } from "../src/QyDB.js";
3
+ import Express from "express";
4
+ import { __dirname } from "../src/QyUtils.js";
5
+ const config = {
6
+ port: 3629,
7
+ qyDBDataFolder: "./tmp/QyExpress",
8
+ staticRoot: join(__dirname, "../static/"),
9
+ rpcFolder: join(__dirname, "rpc"),
10
+ };
11
+ const { port, qyDBDataFolder } = config;
12
+ const app = Express();
13
+ const qyDB = new QyDB(qyDBDataFolder);
14
+ let server;
15
+ process.on("SIGINT", async () => {
16
+ logger.log("SIGINT signal received: closing HTTP server");
17
+ if (server) {
18
+ server.close(() => logger.log("HTTP server closed"));
19
+ server.closeAllConnections();
20
+ }
21
+ await qyDB.stop();
22
+ });
23
+ run();
24
+ async function run() {
25
+ try {
26
+ await qyDB.start();
27
+ server = app.listen(port, () => {
28
+ logger.log(`Example app listening on port ${port}`);
29
+ });
30
+ app.get("/", (request, reply) => {
31
+ reply.send({ hello: "world from express" });
32
+ });
33
+ app.get("/test", (request, reply) => {
34
+ qyDB.insert("users/test", { a: 3, b: 4 });
35
+ const content = qyDB.view("users/test");
36
+ reply.send(content);
37
+ logger.log(content);
38
+ });
39
+ }
40
+ catch (exception) {
41
+ logger.error(exception);
42
+ await qyDB.stop();
43
+ }
44
+ }
@@ -1,80 +1,71 @@
1
- "use strict";
2
- import { join, basename } from "node:path";
3
- import { readdir, readFile } from "node:fs/promises";
4
- import fastifyStatic from "@fastify/static";
5
- import fastifyCompress from "@fastify/compress";
6
- import { QyDB } from "../src/QyDB.js";
7
- import { folderOrFileExists, __dirname } from "../src/QyUtils.js";
8
- import Fastify from "fastify";
9
-
10
- const config = {
11
- port: 3628,
12
- staticRoot: join(__dirname, "../static/"),
13
- rpcFolder: join(__dirname, "../src/rpc"),
14
- };
15
- const { port, staticRoot } = config;
16
-
17
- const fastify = Fastify({ logger: false, forceCloseConnections: true });
18
-
19
- const qyDB = new QyDB(join(__dirname, "../tmp/QyTrigger/1"));
20
-
21
- let sigintReceived = false;
22
-
23
- process.on("SIGINT", async () => {
24
- logger.log("SIGINT signal received: closing HTTP server");
25
- if (!sigintReceived) {
26
- sigintReceived = true;
27
- await fastify.close();
28
- await qyDB.stop();
29
- logger.log("All closed");
30
- }
31
- });
32
-
33
- run();
34
-
35
- async function insertRpcs() {
36
- const { rpcFolder } = config;
37
- if (await folderOrFileExists(rpcFolder)) {
38
- await Promise.all(
39
- (await readdir(rpcFolder)).map(async (x) => {
40
- qyDB.insertRpc(basename(x, ".js"), (await readFile(join(rpcFolder, x))).toString());
41
- }),
42
- );
43
- }
44
- }
45
-
46
- async function handleGet(request, reply) {
47
- const { query, params } = request;
48
- const result = await qyDB.callRpc(params.funName, query && query.args ? JSON.parse(query.args) : undefined);
49
- if (Error.isError(result)) {
50
- logger.warn(result.message);
51
- }
52
- return reply.send(result);
53
- }
54
-
55
- async function handlePost(request, reply) {
56
- logger.log("handling post", request.body);
57
- reply.send({ body: request.body });
58
- }
59
-
60
- async function run() {
61
- try {
62
- await qyDB.start();
63
- await insertRpcs();
64
- await fastify.register(fastifyStatic, { root: staticRoot });
65
- await fastify.register(fastifyCompress);
66
- fastify.get("/rpc/:funName", handleGet);
67
- fastify.post("/rpc/:funName", handlePost);
68
- fastify.listen({ port }, (err) => {
69
- if (err) {
70
- logger.error(err);
71
- process.exit(1);
72
- } else {
73
- logger.log(`Example app listening on port ${port}`);
74
- }
75
- });
76
- } catch (exception) {
77
- logger.error(exception);
78
- await qyDB.stop();
79
- }
80
- }
1
+ "use strict";
2
+ import { join, basename } from "node:path";
3
+ import { readdir, readFile } from "node:fs/promises";
4
+ import fastifyStatic from "@fastify/static";
5
+ import fastifyCompress from "@fastify/compress";
6
+ import { QyDB } from "../src/QyDB.js";
7
+ import { folderOrFileExists, __dirname } from "../src/QyUtils.js";
8
+ import Fastify from "fastify";
9
+ const config = {
10
+ port: 3628,
11
+ staticRoot: join(__dirname, "../static/"),
12
+ rpcFolder: join(__dirname, "../src/rpc"),
13
+ };
14
+ const { port, staticRoot } = config;
15
+ const fastify = Fastify({ logger: false, forceCloseConnections: true });
16
+ // const qyDB = new QyDB(join(__dirname, "../tmp/simulate2"));
17
+ const qyDB = new QyDB();
18
+ let sigintReceived = false;
19
+ process.on("SIGINT", async () => {
20
+ logger.log("SIGINT signal received: closing HTTP server");
21
+ if (!sigintReceived) {
22
+ sigintReceived = true;
23
+ await fastify.close();
24
+ await qyDB.stop();
25
+ logger.log("All closed");
26
+ }
27
+ });
28
+ run();
29
+ async function insertRpcs() {
30
+ const { rpcFolder } = config;
31
+ if (await folderOrFileExists(rpcFolder)) {
32
+ await Promise.all((await readdir(rpcFolder)).map(async (x) => {
33
+ qyDB.insertRpc(basename(x, ".js"), (await readFile(join(rpcFolder, x))).toString());
34
+ }));
35
+ }
36
+ }
37
+ async function handleGet(request, reply) {
38
+ const { query, params } = request;
39
+ const result = await qyDB.callRpc(params.funName, query && query.args ? JSON.parse(query.args) : undefined);
40
+ if (Error.isError(result)) {
41
+ logger.warn(result.message);
42
+ }
43
+ return reply.send(result);
44
+ }
45
+ async function handlePost(request, reply) {
46
+ logger.log("handling post", request.body);
47
+ reply.send({ body: request.body });
48
+ }
49
+ async function run() {
50
+ try {
51
+ await qyDB.start();
52
+ await insertRpcs();
53
+ await fastify.register(fastifyStatic, { root: staticRoot });
54
+ await fastify.register(fastifyCompress);
55
+ fastify.get("/rpc/:funName", handleGet);
56
+ fastify.post("/rpc/:funName", handlePost);
57
+ fastify.listen({ port }, (err) => {
58
+ if (err) {
59
+ logger.error(err);
60
+ process.exit(1);
61
+ }
62
+ else {
63
+ logger.log(`Example app listening on port ${port}`);
64
+ }
65
+ });
66
+ }
67
+ catch (exception) {
68
+ logger.error(exception);
69
+ await qyDB.stop();
70
+ }
71
+ }
@@ -1,75 +1,71 @@
1
- // node --prof profile.js
2
- // node --prof-process isolate-0xnnnnnnnnnnnn-v8.log > processed.txt
3
- import { join } from "node:path";
4
- import { readFileSync } from "node:fs";
5
- import { rm } from "node:fs/promises";
6
- import { QyDB } from "../src/QyDB.js";
7
- import { folderOrFileExists } from "../src/QyUtils.js";
8
- import { runQueries } from "./flights_queries.js";
9
-
10
- logger.level = "info";
11
-
12
- const arangoJsonFolderPath = "D:\\scripts\\GraphCourse_DemoData_ArangoDB-2";
13
- const dataFolder = "./tmp/flights";
14
-
15
- const qyDB = new QyDB(dataFolder, { preloadFoldersAtStart: false });
16
-
17
- run();
18
-
19
- function insertAirports() {
20
- const data = JSON.parse(readFileSync(join(arangoJsonFolderPath, "airports.json")));
21
- console.time("insertAirports");
22
- const { batch } = qyDB;
23
- for (const record of data) {
24
- batch.insert(`airports/${record._key}`, record);
25
- }
26
- batch.run();
27
- console.timeEnd("insertAirports");
28
- }
29
-
30
- function insertFlights() {
31
- const data = JSON.parse(readFileSync(join(arangoJsonFolderPath, "flights.json")));
32
- console.time("insertFlights");
33
- const { batch } = qyDB;
34
- for (let i = 0; i < data.length; ++i) {
35
- const record = data[i];
36
- // const filePath = `flights/${record._from}/${record._to}/${i}`;
37
- const filePath = `flights/${i}`;
38
- batch.insert(filePath, record);
39
- }
40
- batch.run();
41
- console.timeEnd("insertFlights");
42
- console.time("createIndex");
43
- // qyDB.createIndex("flights", ["_from", "_to"]);
44
- qyDB.createIndex("flights", ["_from", "_to", "Month", "Day", "Year"]);
45
- console.timeEnd("createIndex");
46
- }
47
-
48
- async function run() {
49
- console.time("total");
50
- if (process.argv[3]) {
51
- logger.level = process.argv[3];
52
- }
53
- let shouldInsertData;
54
- if (process.argv[2] == "true") {
55
- try {
56
- await rm(dataFolder, { recursive: true });
57
- } catch (exception) {}
58
- shouldInsertData = true;
59
- } else if (!(await folderOrFileExists(dataFolder))) shouldInsertData = true;
60
- console.time("run");
61
- console.time("start");
62
- await qyDB.start();
63
- console.timeEnd("start");
64
- if (shouldInsertData) {
65
- insertAirports();
66
- insertFlights();
67
- }
68
- // console.log(qyDB.dir("/%/index/0dJIntKA55/_from").subdirNameList);
69
- runQueries(qyDB);
70
- console.time("stop");
71
- await qyDB.stop();
72
- console.timeEnd("stop");
73
- console.timeEnd("run");
74
- console.timeEnd("total");
75
- }
1
+ // node --prof profile.js
2
+ // node --prof-process isolate-0xnnnnnnnnnnnn-v8.log > processed.txt
3
+ import { join } from "node:path";
4
+ import { readFileSync } from "node:fs";
5
+ import { rm } from "node:fs/promises";
6
+ import { QyDB } from "../src/QyDB.js";
7
+ import { folderOrFileExists } from "../src/QyUtils.js";
8
+ import { runQueries } from "./flights_queries.js";
9
+ logger.level = "info";
10
+ const arangoJsonFolderPath = "D:\\scripts\\GraphCourse_DemoData_ArangoDB-2";
11
+ const dataFolder = "./tmp/flights";
12
+ const qyDB = new QyDB(dataFolder, { preloadFoldersAtStart: false });
13
+ run();
14
+ function insertAirports() {
15
+ const data = JSON.parse(readFileSync(join(arangoJsonFolderPath, "airports.json")));
16
+ console.time("insertAirports");
17
+ const { batch } = qyDB;
18
+ for (const record of data) {
19
+ batch.insert(`airports/${record._key}`, record);
20
+ }
21
+ batch.run();
22
+ console.timeEnd("insertAirports");
23
+ }
24
+ function insertFlights() {
25
+ const data = JSON.parse(readFileSync(join(arangoJsonFolderPath, "flights.json")));
26
+ console.time("insertFlights");
27
+ const { batch } = qyDB;
28
+ for (let i = 0; i < data.length; ++i) {
29
+ const record = data[i];
30
+ // const filePath = `flights/${record._from}/${record._to}/${i}`;
31
+ const filePath = `flights/${i}`;
32
+ batch.insert(filePath, record);
33
+ }
34
+ batch.run();
35
+ console.timeEnd("insertFlights");
36
+ console.time("createIndex");
37
+ // qyDB.createIndex("flights", ["_from", "_to"]);
38
+ qyDB.createIndex("flights", ["_from", "_to", "Month", "Day", "Year"]);
39
+ console.timeEnd("createIndex");
40
+ }
41
+ async function run() {
42
+ console.time("total");
43
+ if (process.argv[3]) {
44
+ logger.level = process.argv[3];
45
+ }
46
+ let shouldInsertData;
47
+ if (process.argv[2] == "true") {
48
+ try {
49
+ await rm(dataFolder, { recursive: true });
50
+ }
51
+ catch (exception) { }
52
+ shouldInsertData = true;
53
+ }
54
+ else if (!(await folderOrFileExists(dataFolder)))
55
+ shouldInsertData = true;
56
+ console.time("run");
57
+ console.time("start");
58
+ await qyDB.start();
59
+ console.timeEnd("start");
60
+ if (shouldInsertData) {
61
+ insertAirports();
62
+ insertFlights();
63
+ }
64
+ // console.log(qyDB.dir("/%/index/0dJIntKA55/_from").subdirNameList);
65
+ runQueries(qyDB);
66
+ console.time("stop");
67
+ await qyDB.stop();
68
+ console.timeEnd("stop");
69
+ console.timeEnd("run");
70
+ console.timeEnd("total");
71
+ }
@@ -1,81 +1,78 @@
1
- // node --prof profile.js
2
- // node --prof-process isolate-0xnnnnnnnnnnnn-v8.log > processed.txt
3
- import { join } from "node:path";
4
- import { readFileSync } from "node:fs";
5
- import { rm } from "node:fs/promises";
6
- import { QyDB } from "../src/QyDB.js";
7
- import { folderOrFileExists } from "../src/QyUtils.js";
8
- import { runQueries } from "./flights2_queries.js";
9
-
10
- logger.level = "info";
11
-
12
- const arangoJsonFolderPath = "D:\\scripts\\GraphCourse_DemoData_ArangoDB-2";
13
- const dataFolder = "./tmp/flights2";
14
- const qyDB = new QyDB(dataFolder, { preloadFoldersAtStart: false });
15
-
16
- run();
17
-
18
- function insertAirports() {
19
- const data = JSON.parse(readFileSync(join(arangoJsonFolderPath, "airports.json")));
20
- console.time("insertAirports");
21
- const { batch } = qyDB;
22
- for (const record of data) {
23
- const { country, state, city } = record;
24
- batch.insert(`airports/${country}/${state}/${city}/${record._key}`, record);
25
- }
26
- batch.run();
27
- console.timeEnd("insertAirports");
28
- }
29
-
30
- function insertFlights() {
31
- const data = JSON.parse(readFileSync(join(arangoJsonFolderPath, "flights.json")));
32
- console.time("insertFlights");
33
- const { batch } = qyDB;
34
- for (let i = 0; i < data.length; ++i) {
35
- const record = data[i];
36
- const { Year, Month, Day } = record;
37
- batch.insert(`flights/${Year}/${Month}/${Day}/${i}`, record);
38
- // batch.insertP(["flights", Year, Month, Day, i], record);
39
- }
40
- batch.run();
41
- console.timeEnd("insertFlights");
42
- console.time("createFlightsIndex");
43
- // qyDB.createIndex("flights", ["_from", "_to"]);
44
- for (const yearDir of qyDB.dir("flights").subdirList) {
45
- for (const monthDir of yearDir.subdirList) {
46
- for (const dayDir of monthDir.subdirList) {
47
- batch.createIndex(dayDir, ["_from", "_to"]);
48
- }
49
- }
50
- }
51
- batch.run();
52
- console.timeEnd("createFlightsIndex");
53
- }
54
-
55
- async function run() {
56
- console.time("total");
57
- if (process.argv[3]) {
58
- logger.level = process.argv[3];
59
- }
60
- let shouldInsertData;
61
- if (process.argv[2] == "true") {
62
- try {
63
- await rm(dataFolder, { recursive: true });
64
- } catch (exception) {}
65
- shouldInsertData = true;
66
- } else if (!(await folderOrFileExists(dataFolder))) shouldInsertData = true;
67
- console.time("run");
68
- console.time("start");
69
- await qyDB.start();
70
- console.timeEnd("start");
71
- if (shouldInsertData) {
72
- insertAirports();
73
- insertFlights();
74
- }
75
- runQueries(qyDB);
76
- console.time("stop");
77
- await qyDB.stop();
78
- console.timeEnd("stop");
79
- console.timeEnd("run");
80
- console.timeEnd("total");
81
- }
1
+ // node --prof profile.js
2
+ // node --prof-process isolate-0xnnnnnnnnnnnn-v8.log > processed.txt
3
+ import { join } from "node:path";
4
+ import { readFileSync } from "node:fs";
5
+ import { rm } from "node:fs/promises";
6
+ import { QyDB } from "../src/QyDB.js";
7
+ import { folderOrFileExists } from "../src/QyUtils.js";
8
+ import { runQueries } from "./flights2_queries.js";
9
+ logger.level = "info";
10
+ const arangoJsonFolderPath = "D:\\scripts\\GraphCourse_DemoData_ArangoDB-2";
11
+ const dataFolder = "./tmp/flights2";
12
+ const qyDB = new QyDB(dataFolder, { preloadFoldersAtStart: false });
13
+ run();
14
+ function insertAirports() {
15
+ const data = JSON.parse(readFileSync(join(arangoJsonFolderPath, "airports.json")));
16
+ console.time("insertAirports");
17
+ const { batch } = qyDB;
18
+ for (const record of data) {
19
+ const { country, state, city } = record;
20
+ batch.insert(`airports/${country}/${state}/${city}/${record._key}`, record);
21
+ }
22
+ batch.run();
23
+ console.timeEnd("insertAirports");
24
+ }
25
+ function insertFlights() {
26
+ const data = JSON.parse(readFileSync(join(arangoJsonFolderPath, "flights.json")));
27
+ console.time("insertFlights");
28
+ const { batch } = qyDB;
29
+ for (let i = 0; i < data.length; ++i) {
30
+ const record = data[i];
31
+ const { Year, Month, Day } = record;
32
+ batch.insert(`flights/${Year}/${Month}/${Day}/${i}`, record);
33
+ // batch.insertP(["flights", Year, Month, Day, i], record);
34
+ }
35
+ batch.run();
36
+ console.timeEnd("insertFlights");
37
+ console.time("createFlightsIndex");
38
+ // qyDB.createIndex("flights", ["_from", "_to"]);
39
+ for (const yearDir of qyDB.dir("flights").subdirList) {
40
+ for (const monthDir of yearDir.subdirList) {
41
+ for (const dayDir of monthDir.subdirList) {
42
+ batch.createIndex(dayDir, ["_from", "_to"]);
43
+ }
44
+ }
45
+ }
46
+ batch.run();
47
+ console.timeEnd("createFlightsIndex");
48
+ }
49
+ async function run() {
50
+ console.time("total");
51
+ if (process.argv[3]) {
52
+ logger.level = process.argv[3];
53
+ }
54
+ let shouldInsertData;
55
+ if (process.argv[2] == "true") {
56
+ try {
57
+ await rm(dataFolder, { recursive: true });
58
+ }
59
+ catch (exception) { }
60
+ shouldInsertData = true;
61
+ }
62
+ else if (!(await folderOrFileExists(dataFolder)))
63
+ shouldInsertData = true;
64
+ console.time("run");
65
+ console.time("start");
66
+ await qyDB.start();
67
+ console.timeEnd("start");
68
+ if (shouldInsertData) {
69
+ insertAirports();
70
+ insertFlights();
71
+ }
72
+ runQueries(qyDB);
73
+ console.time("stop");
74
+ await qyDB.stop();
75
+ console.timeEnd("stop");
76
+ console.timeEnd("run");
77
+ console.timeEnd("total");
78
+ }