datafolder 1.0.0

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 (182) hide show
  1. package/README.md +169 -0
  2. package/index.js +3 -0
  3. package/package.json +27 -0
  4. package/sample.js +37 -0
  5. package/scripts/airbnb.js +73 -0
  6. package/scripts/airbnb2.js +74 -0
  7. package/scripts/airbnb2_queries.js +231 -0
  8. package/scripts/airbnb_queries.js +264 -0
  9. package/scripts/downloadFile.js +42 -0
  10. package/scripts/express.js +46 -0
  11. package/scripts/fastify.js +79 -0
  12. package/scripts/flights.js +75 -0
  13. package/scripts/flights2.js +81 -0
  14. package/scripts/flights2_queries.js +453 -0
  15. package/scripts/flights_queries.js +403 -0
  16. package/src/QyAcl.js +252 -0
  17. package/src/QyAclSaver.js +14 -0
  18. package/src/QyAclSaver_Worker.js +29 -0
  19. package/src/QyAclWriter.js +19 -0
  20. package/src/QyBatch.js +501 -0
  21. package/src/QyBinWriter.js +140 -0
  22. package/src/QyCD.js +61 -0
  23. package/src/QyCache.js +212 -0
  24. package/src/QyCompressor.js +60 -0
  25. package/src/QyCompressor_Worker.js +13 -0
  26. package/src/QyDB.js +122 -0
  27. package/src/QyDefaultOptions.js +59 -0
  28. package/src/QyDir.js +192 -0
  29. package/src/QyFetch.js +38 -0
  30. package/src/QyFile.js +124 -0
  31. package/src/QyFileContentUtils.js +175 -0
  32. package/src/QyFileLogger.js +58 -0
  33. package/src/QyIndex.js +237 -0
  34. package/src/QyIndexPropTree.js +92 -0
  35. package/src/QyIntersectNode.js +48 -0
  36. package/src/QyItem.js +105 -0
  37. package/src/QyJsonSaver.js +20 -0
  38. package/src/QyKVData.js +289 -0
  39. package/src/QyKVDataCleaner.js +17 -0
  40. package/src/QyKVDataCleaner_Worker.js +94 -0
  41. package/src/QyKVDataLoader.js +65 -0
  42. package/src/QyKVDataSaver.js +17 -0
  43. package/src/QyKVDataSaver_Worker.js +81 -0
  44. package/src/QyLogFileSaver.js +14 -0
  45. package/src/QyLogFileSaver_Worker.js +26 -0
  46. package/src/QyLogger.js +76 -0
  47. package/src/QyMessageWorker.js +41 -0
  48. package/src/QyMessager.js +84 -0
  49. package/src/QyMessager_Run.js +13 -0
  50. package/src/QyMod.js +15 -0
  51. package/src/QyOpRunner.js +73 -0
  52. package/src/QyQueue.js +60 -0
  53. package/src/QySaver.js +83 -0
  54. package/src/QySnapshotCompactor.js +17 -0
  55. package/src/QySnapshotCompactor_Worker.js +151 -0
  56. package/src/QySnapshotSaver.js +17 -0
  57. package/src/QySnapshotSaver_Worker.js +164 -0
  58. package/src/QySnapshots.js +354 -0
  59. package/src/QyStructure.js +50 -0
  60. package/src/QyTrigger.js +133 -0
  61. package/src/QyUnionNode.js +105 -0
  62. package/src/QyUtils.js +250 -0
  63. package/src/QyWorker.js +33 -0
  64. package/src/hackernews.js +93 -0
  65. package/src/rpc/evalCode.js +9 -0
  66. package/src/rpc/getFileContent.js +16 -0
  67. package/src/rpc/getSubItems.js +32 -0
  68. package/src/rpc/queryFiles.js +33 -0
  69. package/src/rpc/reloadRpc.js +1 -0
  70. package/src/simulate.js +114 -0
  71. package/src/simulate2.js +110 -0
  72. package/src/soc_pokec.js +43 -0
  73. package/static/bootstrap-5.3.8-dist/css/bootstrap.min.css +6 -0
  74. package/static/bootstrap-5.3.8-dist/js/bootstrap.bundle.js +6312 -0
  75. package/static/datafolderui/QyStyledElement.js +30 -0
  76. package/static/datafolderui/QyUIFolderTree.js +203 -0
  77. package/static/datafolderui/QyUIUtils.js +42 -0
  78. package/static/datafolderui/display-tree.js +108 -0
  79. package/static/datafolderui/explore-tree.js +122 -0
  80. package/static/datafolderui/folder-tree.js +5 -0
  81. package/static/datafolderui/hscrpt.js +25 -0
  82. package/static/datafolderui/index.css +6 -0
  83. package/static/datafolderui/index.html +20 -0
  84. package/static/datafolderui/json-view.js +74 -0
  85. package/static/datafolderui/kv-input.js +66 -0
  86. package/static/datafolderui/list-input.js +52 -0
  87. package/static/datafolderui/main-page.js +98 -0
  88. package/static/datafolderui/num-input.js +27 -0
  89. package/static/datafolderui/query-editor.js +229 -0
  90. package/static/datafolderui/querySelectorShadowRoot.js +24 -0
  91. package/static/datafolderui/resizable-input.js +67 -0
  92. package/static/favicon.ico +0 -0
  93. package/static/icons-1.13.1/font/bootstrap-icons.min.css +5 -0
  94. package/static/icons-1.13.1/font/fonts/bootstrap-icons.woff +0 -0
  95. package/static/icons-1.13.1/font/fonts/bootstrap-icons.woff2 +0 -0
  96. package/static/json-view/dist/jsonview.js +433 -0
  97. package/static/tree.js/tree.css +106 -0
  98. package/static/tree.js/tree.js +374 -0
  99. package/static/w2ui/dist/w2ui.min.css +2 -0
  100. package/static/w2ui/src/less/icons/icons.json +1 -0
  101. package/static/w2ui/src/less/icons/preview.html +33 -0
  102. package/static/w2ui/src/less/icons/readme.md +15 -0
  103. package/static/w2ui/src/less/icons/svg/box.svg +3 -0
  104. package/static/w2ui/src/less/icons/svg/check.svg +3 -0
  105. package/static/w2ui/src/less/icons/svg/colors.svg +3 -0
  106. package/static/w2ui/src/less/icons/svg/columns.svg +5 -0
  107. package/static/w2ui/src/less/icons/svg/cross.svg +4 -0
  108. package/static/w2ui/src/less/icons/svg/drop.svg +6 -0
  109. package/static/w2ui/src/less/icons/svg/empty.svg +3 -0
  110. package/static/w2ui/src/less/icons/svg/eye-dropper.svg +4 -0
  111. package/static/w2ui/src/less/icons/svg/info.svg +8 -0
  112. package/static/w2ui/src/less/icons/svg/paste.svg +4 -0
  113. package/static/w2ui/src/less/icons/svg/pencil.svg +5 -0
  114. package/static/w2ui/src/less/icons/svg/plus.svg +3 -0
  115. package/static/w2ui/src/less/icons/svg/reload.svg +5 -0
  116. package/static/w2ui/src/less/icons/svg/search.svg +3 -0
  117. package/static/w2ui/src/less/icons/svg/settings.svg +8 -0
  118. package/static/w2ui/src/less/icons/w2ui-font.css +36 -0
  119. package/static/w2ui/src/less/icons/w2ui-font.woff +0 -0
  120. package/static/w2ui/src/less/src/buttons.less +184 -0
  121. package/static/w2ui/src/less/src/common.less +541 -0
  122. package/static/w2ui/src/less/src/fields.less +302 -0
  123. package/static/w2ui/src/less/src/form.less +319 -0
  124. package/static/w2ui/src/less/src/grid.less +1057 -0
  125. package/static/w2ui/src/less/src/icons.less +37 -0
  126. package/static/w2ui/src/less/src/layout.less +86 -0
  127. package/static/w2ui/src/less/src/mixins.less +87 -0
  128. package/static/w2ui/src/less/src/popup.less +277 -0
  129. package/static/w2ui/src/less/src/sidebar.less +343 -0
  130. package/static/w2ui/src/less/src/tabs.less +145 -0
  131. package/static/w2ui/src/less/src/toolbar.less +219 -0
  132. package/static/w2ui/src/less/src/tooltip.less +948 -0
  133. package/static/w2ui/src/less/w2ui.less +196 -0
  134. package/static/w2ui/src/locale/az-az.json +114 -0
  135. package/static/w2ui/src/locale/ba-ba.json +114 -0
  136. package/static/w2ui/src/locale/bg-bg.json +114 -0
  137. package/static/w2ui/src/locale/ca-es.json +114 -0
  138. package/static/w2ui/src/locale/da-dk.json +114 -0
  139. package/static/w2ui/src/locale/de-de.json +114 -0
  140. package/static/w2ui/src/locale/en-gb.json +17 -0
  141. package/static/w2ui/src/locale/en-us.json +17 -0
  142. package/static/w2ui/src/locale/es-ar.json +115 -0
  143. package/static/w2ui/src/locale/es-cr.json +119 -0
  144. package/static/w2ui/src/locale/es-es.json +114 -0
  145. package/static/w2ui/src/locale/es-mx.json +114 -0
  146. package/static/w2ui/src/locale/fr-fr.json +114 -0
  147. package/static/w2ui/src/locale/gl-es.json +114 -0
  148. package/static/w2ui/src/locale/hr-hr.json +114 -0
  149. package/static/w2ui/src/locale/hu-hu.json +114 -0
  150. package/static/w2ui/src/locale/id-id.json +114 -0
  151. package/static/w2ui/src/locale/it-it.json +114 -0
  152. package/static/w2ui/src/locale/ja-jp.json +114 -0
  153. package/static/w2ui/src/locale/kk-kz.json +116 -0
  154. package/static/w2ui/src/locale/ko-kr.json +114 -0
  155. package/static/w2ui/src/locale/lt-lt.json +114 -0
  156. package/static/w2ui/src/locale/nl-nl.json +114 -0
  157. package/static/w2ui/src/locale/no-no.json +114 -0
  158. package/static/w2ui/src/locale/pl-pl.json +114 -0
  159. package/static/w2ui/src/locale/pt-br.json +114 -0
  160. package/static/w2ui/src/locale/ru-ru.json +116 -0
  161. package/static/w2ui/src/locale/sk-sk.json +114 -0
  162. package/static/w2ui/src/locale/sl-si.json +116 -0
  163. package/static/w2ui/src/locale/sr-rs.json +114 -0
  164. package/static/w2ui/src/locale/tr-tr.json +114 -0
  165. package/static/w2ui/src/locale/uk-ua.json +114 -0
  166. package/static/w2ui/src/locale/zh-cn.json +114 -0
  167. package/static/w2ui/src/locale/zh-tw.json +114 -0
  168. package/static/w2ui/src/query.js +583 -0
  169. package/static/w2ui/src/readme.md +11 -0
  170. package/static/w2ui/src/w2base.js +311 -0
  171. package/static/w2ui/src/w2compat.js +207 -0
  172. package/static/w2ui/src/w2field.js +1854 -0
  173. package/static/w2ui/src/w2form.js +2411 -0
  174. package/static/w2ui/src/w2grid.js +8916 -0
  175. package/static/w2ui/src/w2layout.js +1194 -0
  176. package/static/w2ui/src/w2locale.js +129 -0
  177. package/static/w2ui/src/w2popup.js +909 -0
  178. package/static/w2ui/src/w2sidebar.js +1769 -0
  179. package/static/w2ui/src/w2tabs.js +669 -0
  180. package/static/w2ui/src/w2toolbar.js +1180 -0
  181. package/static/w2ui/src/w2tooltip.js +3134 -0
  182. package/static/w2ui/src/w2utils.js +2457 -0
@@ -0,0 +1,403 @@
1
+ const assert = require("node:assert/strict");
2
+
3
+ // Return the names of all airports one can reach
4
+ // directly (1 step) from Los Angeles International
5
+ // (LAX) following the flights edges:
6
+
7
+ function query1(qyDB) {
8
+ console.time("query1");
9
+ const resultMap = {};
10
+ for (const x of qyDB.queryFiles("flights", { _from: "airports/LAX" })) {
11
+ resultMap[x.fileContent._to] = 1;
12
+ }
13
+ assert.deepEqual(Object.keys(resultMap), [
14
+ "airports/CVG",
15
+ "airports/SMF",
16
+ "airports/ATL",
17
+ "airports/MSP",
18
+ "airports/DFW",
19
+ "airports/PHL",
20
+ "airports/IAH",
21
+ "airports/TUS",
22
+ "airports/ORD",
23
+ "airports/PDX",
24
+ "airports/MIA",
25
+ "airports/SFO",
26
+ "airports/DEN",
27
+ "airports/IAD",
28
+ "airports/SJC",
29
+ "airports/PHX",
30
+ "airports/SEA",
31
+ "airports/SLC",
32
+ "airports/JFK",
33
+ "airports/SAN",
34
+ "airports/ONT",
35
+ "airports/LAS",
36
+ "airports/MCI",
37
+ "airports/MDW",
38
+ "airports/FLL",
39
+ "airports/AUS",
40
+ "airports/EWR",
41
+ "airports/CLE",
42
+ "airports/SBP",
43
+ "airports/MEM",
44
+ "airports/SBA",
45
+ "airports/CLT",
46
+ "airports/COS",
47
+ "airports/ASE",
48
+ "airports/ICT",
49
+ "airports/HOU",
50
+ "airports/YUM",
51
+ "airports/STL",
52
+ "airports/FAT",
53
+ "airports/ABQ",
54
+ "airports/BOI",
55
+ "airports/BOS",
56
+ "airports/LIH",
57
+ "airports/HNL",
58
+ "airports/SMX",
59
+ "airports/MRY",
60
+ "airports/DTW",
61
+ "airports/RNO",
62
+ "airports/MCO",
63
+ "airports/OXR",
64
+ "airports/OAK",
65
+ "airports/OGG",
66
+ "airports/KOA",
67
+ "airports/BWI",
68
+ "airports/CLD",
69
+ "airports/IND",
70
+ "airports/PSP",
71
+ "airports/ELP",
72
+ "airports/TPA",
73
+ "airports/OKC",
74
+ "airports/MSY",
75
+ "airports/SNA",
76
+ "airports/IYK",
77
+ "airports/IPL",
78
+ "airports/SAT",
79
+ "airports/MOD",
80
+ "airports/BNA",
81
+ "airports/DCA",
82
+ "airports/SGU",
83
+ "airports/BFL",
84
+ "airports/EUG",
85
+ "airports/EGE",
86
+ "airports/GEG",
87
+ "airports/BDL",
88
+ "airports/JAX",
89
+ "airports/CMH",
90
+ "airports/PIT",
91
+ "airports/RDU",
92
+ "airports/SJU",
93
+ "airports/XNA",
94
+ "airports/MTJ",
95
+ "airports/JAC",
96
+ ]);
97
+ console.timeEnd("query1");
98
+ }
99
+
100
+ // Find all connections which depart from or
101
+ // land at BIS on January 5th and 7th and
102
+ // return the destination city and the arrival
103
+ // time in universal time (UTC):
104
+ // FOR airport, flight IN ANY
105
+ // 'airports/BIS' flights
106
+ // FILTER flight.Month == 1
107
+ // AND flight.Day >= 5
108
+ // AND flight.Day <= 7
109
+ // RETURN { city: airport.city,
110
+ // time: flight.ArrTimeUTC }
111
+
112
+ function query2(qyDB) {
113
+ console.time("query2");
114
+ assert.deepEqual(
115
+ qyDB
116
+ .queryFiles("flights", {
117
+ $and: [
118
+ { $or: [{ _from: "airports/BIS" }, { _to: "airports/BIS" }] },
119
+ { Month: 1 },
120
+ { Day: (x) => x >= 5 && x <= 7 },
121
+ ],
122
+ })
123
+ .map((x) => x.fileContent.FlightNum),
124
+ [
125
+ 6635, 646, 6541, 5651, 6541, 5648, 687, 309, 6678, 6678, 6636, 439, 1567, 6635, 5647, 6541, 5660, 6541,
126
+ 6553, 687, 6553, 309, 5649, 5650, 6636, 439, 6635, 574, 6541, 5651, 5648, 6541, 1705, 1535, 5649, 6678,
127
+ 5650, 6636, 6678, 1087,
128
+ ],
129
+ );
130
+ console.timeEnd("query2");
131
+ }
132
+
133
+ function query3(qyDB) {
134
+ console.time("query3");
135
+ assert.deepEqual(
136
+ qyDB
137
+ .queryFiles("flights", {
138
+ $or: [
139
+ { _from: "airports/BOI", _to: "airports/MSP" },
140
+ { _from: "airports/MSP", _to: "airports/BOI" },
141
+ ],
142
+ Month: 1,
143
+ Day: (x) => x >= 1 && x <= 7,
144
+ })
145
+ .map((x) => x.view(["_from", "_to", "ArrTimeUTC"])),
146
+ [
147
+ {
148
+ _from: "airports/BOI",
149
+ _to: "airports/MSP",
150
+ ArrTimeUTC: "2008-01-01T15:46:00.000Z",
151
+ },
152
+ {
153
+ _from: "airports/BOI",
154
+ _to: "airports/MSP",
155
+ ArrTimeUTC: "2008-01-01T17:28:00.000Z",
156
+ },
157
+ {
158
+ _from: "airports/MSP",
159
+ _to: "airports/BOI",
160
+ ArrTimeUTC: "2008-01-01T19:59:00.000Z",
161
+ },
162
+ {
163
+ _from: "airports/BOI",
164
+ _to: "airports/MSP",
165
+ ArrTimeUTC: "2008-01-01T23:34:00.000Z",
166
+ },
167
+ {
168
+ _from: "airports/MSP",
169
+ _to: "airports/BOI",
170
+ ArrTimeUTC: "2008-01-02T02:37:00.000Z",
171
+ },
172
+ {
173
+ _from: "airports/MSP",
174
+ _to: "airports/BOI",
175
+ ArrTimeUTC: "2008-01-02T06:55:00.000Z",
176
+ },
177
+ {
178
+ _from: "airports/BOI",
179
+ _to: "airports/MSP",
180
+ ArrTimeUTC: "2008-01-02T15:25:00.000Z",
181
+ },
182
+ {
183
+ _from: "airports/BOI",
184
+ _to: "airports/MSP",
185
+ ArrTimeUTC: "2008-01-02T18:31:00.000Z",
186
+ },
187
+ {
188
+ _from: "airports/MSP",
189
+ _to: "airports/BOI",
190
+ ArrTimeUTC: "2008-01-02T18:25:00.000Z",
191
+ },
192
+ {
193
+ _from: "airports/BOI",
194
+ _to: "airports/MSP",
195
+ ArrTimeUTC: "2008-01-02T23:28:00.000Z",
196
+ },
197
+ {
198
+ _from: "airports/MSP",
199
+ _to: "airports/BOI",
200
+ ArrTimeUTC: "2008-01-03T02:42:00.000Z",
201
+ },
202
+ {
203
+ _from: "airports/MSP",
204
+ _to: "airports/BOI",
205
+ ArrTimeUTC: "2008-01-03T06:58:00.000Z",
206
+ },
207
+ {
208
+ _from: "airports/BOI",
209
+ _to: "airports/MSP",
210
+ ArrTimeUTC: "2008-01-03T15:36:00.000Z",
211
+ },
212
+ {
213
+ _from: "airports/BOI",
214
+ _to: "airports/MSP",
215
+ ArrTimeUTC: "2008-01-03T17:54:00.000Z",
216
+ },
217
+ {
218
+ _from: "airports/MSP",
219
+ _to: "airports/BOI",
220
+ ArrTimeUTC: "2008-01-03T19:46:00.000Z",
221
+ },
222
+ {
223
+ _from: "airports/BOI",
224
+ _to: "airports/MSP",
225
+ ArrTimeUTC: "2008-01-03T23:22:00.000Z",
226
+ },
227
+ {
228
+ _from: "airports/MSP",
229
+ _to: "airports/BOI",
230
+ ArrTimeUTC: "2008-01-04T02:26:00.000Z",
231
+ },
232
+ {
233
+ _from: "airports/MSP",
234
+ _to: "airports/BOI",
235
+ ArrTimeUTC: "2008-01-04T07:20:00.000Z",
236
+ },
237
+ {
238
+ _from: "airports/BOI",
239
+ _to: "airports/MSP",
240
+ ArrTimeUTC: "2008-01-04T15:23:00.000Z",
241
+ },
242
+ {
243
+ _from: "airports/BOI",
244
+ _to: "airports/MSP",
245
+ ArrTimeUTC: "2008-01-04T17:26:00.000Z",
246
+ },
247
+ {
248
+ _from: "airports/MSP",
249
+ _to: "airports/BOI",
250
+ ArrTimeUTC: "2008-01-04T18:37:00.000Z",
251
+ },
252
+ {
253
+ _from: "airports/BOI",
254
+ _to: "airports/MSP",
255
+ ArrTimeUTC: "2008-01-04T23:29:00.000Z",
256
+ },
257
+ {
258
+ _from: "airports/MSP",
259
+ _to: "airports/BOI",
260
+ ArrTimeUTC: "2008-01-05T03:52:00.000Z",
261
+ },
262
+ {
263
+ _from: "airports/MSP",
264
+ _to: "airports/BOI",
265
+ ArrTimeUTC: "2008-01-05T07:01:00.000Z",
266
+ },
267
+ {
268
+ _from: "airports/BOI",
269
+ _to: "airports/MSP",
270
+ ArrTimeUTC: "2008-01-05T15:31:00.000Z",
271
+ },
272
+ {
273
+ _from: "airports/BOI",
274
+ _to: "airports/MSP",
275
+ ArrTimeUTC: "2008-01-05T17:15:00.000Z",
276
+ },
277
+ {
278
+ _from: "airports/MSP",
279
+ _to: "airports/BOI",
280
+ ArrTimeUTC: "2008-01-05T18:36:00.000Z",
281
+ },
282
+ {
283
+ _from: "airports/BOI",
284
+ _to: "airports/MSP",
285
+ ArrTimeUTC: "2008-01-05T23:17:00.000Z",
286
+ },
287
+ {
288
+ _from: "airports/MSP",
289
+ _to: "airports/BOI",
290
+ ArrTimeUTC: "2008-01-06T02:38:00.000Z",
291
+ },
292
+ {
293
+ _from: "airports/MSP",
294
+ _to: "airports/BOI",
295
+ ArrTimeUTC: "2008-01-06T06:56:00.000Z",
296
+ },
297
+ {
298
+ _from: "airports/BOI",
299
+ _to: "airports/MSP",
300
+ ArrTimeUTC: "2008-01-06T15:15:00.000Z",
301
+ },
302
+ {
303
+ _from: "airports/BOI",
304
+ _to: "airports/MSP",
305
+ ArrTimeUTC: "2008-01-06T18:18:00.000Z",
306
+ },
307
+ {
308
+ _from: "airports/MSP",
309
+ _to: "airports/BOI",
310
+ ArrTimeUTC: "2008-01-06T18:48:00.000Z",
311
+ },
312
+ {
313
+ _from: "airports/BOI",
314
+ _to: "airports/MSP",
315
+ ArrTimeUTC: "2008-01-06T23:22:00.000Z",
316
+ },
317
+ {
318
+ _from: "airports/MSP",
319
+ _to: "airports/BOI",
320
+ ArrTimeUTC: "2008-01-07T06:49:00.000Z",
321
+ },
322
+ {
323
+ _from: "airports/BOI",
324
+ _to: "airports/MSP",
325
+ ArrTimeUTC: "2008-01-07T18:15:00.000Z",
326
+ },
327
+ {
328
+ _from: "airports/MSP",
329
+ _to: "airports/BOI",
330
+ ArrTimeUTC: "2008-01-07T18:33:00.000Z",
331
+ },
332
+ {
333
+ _from: "airports/BOI",
334
+ _to: "airports/MSP",
335
+ ArrTimeUTC: "2008-01-08T00:35:00.000Z",
336
+ },
337
+ {
338
+ _from: "airports/MSP",
339
+ _to: "airports/BOI",
340
+ ArrTimeUTC: "2008-01-08T06:29:00.000Z",
341
+ },
342
+ ],
343
+ );
344
+
345
+ console.timeEnd("query3");
346
+ }
347
+
348
+ // Find all flights with FlightNum 860 (number) on
349
+ // January 5th and return the _from and _to
350
+ // attributes only (you may use KEEP() for this).
351
+ // FOR f IN flights
352
+ // FILTER f.FlightNum == 860
353
+ // AND f.Month == 1
354
+ // AND f.Day == 5
355
+ // RETURN KEEP(f, "_from", "_to")
356
+
357
+ function query4(qyDB) {
358
+ console.time("query4");
359
+ const result = qyDB
360
+ .queryFiles("flights", { Month: 1, Day: 5, FlightNum: 860 })
361
+ .map((x) => x.view(["_from", "_to"]));
362
+ assert.deepEqual(result, [
363
+ { _from: "airports/IAD", _to: "airports/BOS" },
364
+ { _from: "airports/PBI", _to: "airports/JFK" },
365
+ { _from: "airports/ORD", _to: "airports/DTW" },
366
+ { _from: "airports/PHX", _to: "airports/DEN" },
367
+ { _from: "airports/SEA", _to: "airports/ATL" },
368
+ ]);
369
+ console.timeEnd("query4");
370
+ }
371
+
372
+ function query5(qyDB) {
373
+ logger.info("Query begins");
374
+ console.time("query5");
375
+ assert.deepEqual(
376
+ qyDB.queryFiles("airports", { vip: true }).map((x) => x.view(["name"]).name),
377
+ [
378
+ "Amarillo International",
379
+ "William B Hartsfield-Atlanta Intl",
380
+ "Dallas-Fort Worth International",
381
+ "John F Kennedy Intl",
382
+ "Los Angeles International",
383
+ "Chicago O'Hare International",
384
+ "San Francisco International",
385
+ ],
386
+ );
387
+ console.timeEnd("query5");
388
+ }
389
+
390
+ function runQueries(qyDB) {
391
+ query1(qyDB);
392
+ query1(qyDB);
393
+ query2(qyDB);
394
+ query2(qyDB);
395
+ query3(qyDB);
396
+ query3(qyDB);
397
+ query4(qyDB);
398
+ query4(qyDB);
399
+ query5(qyDB);
400
+ query5(qyDB);
401
+ }
402
+
403
+ Object.assign(module.exports, { runQueries });
package/src/QyAcl.js ADDED
@@ -0,0 +1,252 @@
1
+ let fsPromises = require("node:fs/promises"), {
2
+ mergeContent,
3
+ mergeContentChanges,
4
+ setValByNamePath
5
+ } = require("./QyFileContentUtils.js"), {
6
+ isEmptyObj,
7
+ arrayLast
8
+ } = require("./QyUtils.js"), logger = require("./QyLogger.js").logger;
9
+
10
+ function delCmdKey(e, r) {
11
+ var {
12
+ A: e,
13
+ R: t,
14
+ M: a,
15
+ D: n
16
+ } = e;
17
+ n && delete n[r], r.startsWith("c") ? a && delete a[r] : (e && delete e[r],
18
+ t && delete t[r]);
19
+ }
20
+
21
+ function applyAclChange(e, r) {
22
+ var t, a, n, s, {
23
+ D: r,
24
+ A: i,
25
+ R: o,
26
+ M: l
27
+ } = r;
28
+ for (t in r) null != e[t] && (e[t] = void 0);
29
+ for (a in i) {
30
+ var f, u = e[a] || (e[a] = {});
31
+ for (f of i[a]) u[f] = 1;
32
+ }
33
+ for (n in o) {
34
+ var d = e[n];
35
+ if (d) {
36
+ var c = o[n];
37
+ if (c) {
38
+ for (var m of c) delete d[m];
39
+ isEmptyObj(d) && (e[n] = void 0);
40
+ }
41
+ }
42
+ }
43
+ for (s in l) e[s] = mergeContent(e[s], l[s]);
44
+ }
45
+
46
+ function iterCmdKeys(e, r) {
47
+ var t, {
48
+ D: e,
49
+ A: a,
50
+ R: n,
51
+ M: s
52
+ } = e;
53
+ for (t of [ e, a, n, s ]) for (var i in t) r(i);
54
+ }
55
+
56
+ class QyAclCmdGenerator {
57
+ constructor() {
58
+ Object.assign(this, {
59
+ cmdArgAsMapObj: {},
60
+ cmdCount: 0,
61
+ batchSize: 0
62
+ });
63
+ }
64
+ pushCmd(e, r, t) {
65
+ switch (++this.cmdCount, e) {
66
+ case "A":
67
+ this._setCmdByNamePath([ "A", r, t ]), this._delCmdByNamePath([ "R", r, t ]);
68
+ break;
69
+
70
+ case "R":
71
+ this._setCmdByNamePath([ "R", r, t ]), this._delCmdByNamePath([ "A", r, t ]);
72
+ break;
73
+
74
+ case "D":
75
+ if (this._setCmdByNamePath([ "D", r ]), r.startsWith("c")) this._delCmdByNamePath([ "M", r ]); else for (var a of [ "A", "R" ]) this._delCmdByNamePath([ a, r ]);
76
+ break;
77
+
78
+ case "M":
79
+ {
80
+ var n = this.cmdArgAsMapObj;
81
+ let e = n.M;
82
+ n = (e = null == e ? n.M = {} : e)[r];
83
+ e[r] = null != n ? mergeContentChanges(n, t) : t;
84
+ break;
85
+ }
86
+
87
+ default:
88
+ logger.error(`unsupported cmdName:${e}, called with ${r} ` + t), --this.cmdCount;
89
+ }
90
+ }
91
+ pushCmdArgAsListObj(e) {
92
+ if (e) {
93
+ ++this.batchSize;
94
+ var r, t, a, {
95
+ D: n,
96
+ M: s
97
+ } = e;
98
+ for (r in n) this.pushCmd("D", r);
99
+ for (t of [ "A", "R" ]) {
100
+ var i, o = e[t];
101
+ for (i in o) for (var l of o[i]) this.pushCmd(t, i, l);
102
+ }
103
+ for (a in s) this.pushCmd("M", a, s[a]);
104
+ }
105
+ return this;
106
+ }
107
+ takeCmdArgAsListObj() {
108
+ var e, r = this.cmdArgAsMapObj;
109
+ Object.assign(this, {
110
+ cmdArgAsMapObj: {},
111
+ cmdCount: 0,
112
+ batchSize: 0
113
+ });
114
+ for (e of [ "A", "R" ]) {
115
+ var t, a = r[e];
116
+ for (t in a) {
117
+ var n = Object.keys(a[t]);
118
+ 0 < n.length ? a[t] = n : delete a[t];
119
+ }
120
+ isEmptyObj(a) && delete r[e];
121
+ }
122
+ var {
123
+ D: s,
124
+ M: i
125
+ } = r;
126
+ return s && isEmptyObj(s) && delete r.D, i && isEmptyObj(i) && delete r.M,
127
+ r;
128
+ }
129
+ toAclBuffer(e) {
130
+ var r = this.batchSize;
131
+ if (0 < r) return _toAclBuffer(e, r, this.takeCmdArgAsListObj());
132
+ }
133
+ _setCmdByNamePath(e, r = 1) {
134
+ setValByNamePath(this.cmdArgAsMapObj, e, r);
135
+ }
136
+ _delCmdByNamePath(r) {
137
+ let t = this.cmdArgAsMapObj;
138
+ if (t && r && !(r.length <= 1)) {
139
+ for (let e = 0; e < r.length - 1; ++e) if (null == (t = t[r[e]])) return;
140
+ delete t[arrayLast(r)];
141
+ }
142
+ }
143
+ }
144
+
145
+ async function readAclFile(r, e = !1, t = 0) {
146
+ try {
147
+ return await readAclBuffer(r, await fsPromises.readFile(r), e, t);
148
+ } catch (e) {
149
+ throw logger.error(`Reading ${r} failed:`, e), e;
150
+ }
151
+ }
152
+
153
+ let ByteCountList = [ 1, 2, 4, 8 ];
154
+
155
+ function numsToBuffer(r) {
156
+ var t = r.length, a = new Array(t), n = new Array(t);
157
+ let s = t << 6, i = 1;
158
+ for (let e = 0; e < t; ++e) {
159
+ var o = a[e] = _getByteCountType(r[e]), o = (s |= o << (e << 1), n[e] = ByteCountList[o]);
160
+ i += o;
161
+ }
162
+ var l = Buffer.allocUnsafe(i);
163
+ l.writeUInt8(s);
164
+ let f = 1;
165
+ for (let e = 0; e < t; ++e) _writeNum(l, r[e], n[e], f), f += n[e];
166
+ return l;
167
+ }
168
+
169
+ function bufferToNums(r, t, a) {
170
+ var n = r.readUInt8(t), s = (++t, n >> 6 & 3);
171
+ for (let e = 0; e < s; ++e) {
172
+ var i = ByteCountList[n >> (e << 1) & 3];
173
+ a[e] = _readNum(r, i, t), t += i;
174
+ }
175
+ return t;
176
+ }
177
+
178
+ function _toAclBuffer(e, r, t) {
179
+ t = Buffer.from(JSON.stringify(t) + "\n");
180
+ return Buffer.concat([ numsToBuffer([ e, r, t.length ]), t ]);
181
+ }
182
+
183
+ async function readAclBuffer(t, e, a, n) {
184
+ var s = [];
185
+ for (let r = 0; r < e.length; ) {
186
+ var i = [], o = bufferToNums(e, r, i), [ i, l, f ] = i;
187
+ if (i <= n) logger.warn(`changeId ${i} <= currentChangeId ${n} at ${t}:${r}. Ignored.`),
188
+ r = o + f; else {
189
+ n + l != i && logger.warn(`currentChangeId ${n} + batchSize ${l} != changeId ` + i);
190
+ try {
191
+ var u = JSON.parse(e.subarray(o, o + f));
192
+ s.push([ i, u ]), n = i, r = o + f;
193
+ } catch (e) {
194
+ if (logger.error(`Parse ${t} failed at ${r}:`, e), a) return logger.warn(`Autorepair by truncating ${t} to ` + r),
195
+ null == (l = await fsPromises.truncate(t, r)) ? logger.log("truncate success") : logger.error("truncate failed:", l),
196
+ s;
197
+ throw e;
198
+ }
199
+ }
200
+ }
201
+ return s;
202
+ }
203
+
204
+ function _writeNum(e, r, t, a = 0) {
205
+ switch (t) {
206
+ case 1:
207
+ e.writeUInt8(r, a);
208
+ break;
209
+
210
+ case 2:
211
+ e.writeUInt16BE(r, a);
212
+ break;
213
+
214
+ case 4:
215
+ e.writeUInt32BE(r, a);
216
+ break;
217
+
218
+ default:
219
+ e.writeBigUInt64BE(BigInt(r), a);
220
+ }
221
+ }
222
+
223
+ function _readNum(e, r, t = 0) {
224
+ switch (r) {
225
+ case 1:
226
+ return e.readUInt8(t);
227
+
228
+ case 2:
229
+ return e.readUInt16BE(t);
230
+
231
+ case 4:
232
+ return e.readUInt32BE(t);
233
+
234
+ default:
235
+ return Number(e.readBigUInt64BE(t));
236
+ }
237
+ }
238
+
239
+ function _getByteCountType(e) {
240
+ return e <= 255 ? 0 : e <= 65535 ? 1 : e <= 4294967295 ? 2 : 3;
241
+ }
242
+
243
+ Object.assign(module.exports, {
244
+ QyAclCmdGenerator: QyAclCmdGenerator,
245
+ applyAclChange: applyAclChange,
246
+ iterCmdKeys: iterCmdKeys,
247
+ readAclFile: readAclFile,
248
+ readAclBuffer: readAclBuffer,
249
+ numsToBuffer: numsToBuffer,
250
+ bufferToNums: bufferToNums,
251
+ delCmdKey: delCmdKey
252
+ });
@@ -0,0 +1,14 @@
1
+ let QyMessager = require("./QyMessager.js").QyMessager, getDefaultOptions = require("./QyDefaultOptions.js").getDefaultOptions;
2
+
3
+ class QyAclSaver extends QyMessager {
4
+ constructor(e, s) {
5
+ super(e, "QyAclSaver_Worker.js", s = {
6
+ ...getDefaultOptions("QyAclSaver"),
7
+ ...s
8
+ }, s, [ "callSave" ], [ "switch", "castSave" ]);
9
+ }
10
+ }
11
+
12
+ Object.assign(module.exports, {
13
+ QyAclSaver: QyAclSaver
14
+ });
@@ -0,0 +1,29 @@
1
+ let QyMessageWorker = require("./QyMessageWorker.js").QyMessageWorker, QyAclWriter = require("./QyAclWriter.js").QyAclWriter;
2
+
3
+ class QyAclSaver_Worker extends QyMessageWorker {
4
+ constructor(r) {
5
+ super(r), Object.assign(this, {
6
+ options: r,
7
+ qyAclWriter: new QyAclWriter({
8
+ append: !0
9
+ })
10
+ });
11
+ }
12
+ async start(r) {
13
+ await this.qyAclWriter.start(r);
14
+ }
15
+ async stop() {
16
+ await this.qyAclWriter.stop();
17
+ }
18
+ switch(r) {
19
+ this.qyAclWriter.switch(r);
20
+ }
21
+ async callSave(r, e) {
22
+ await this.qyAclWriter.save(r, e, !0);
23
+ }
24
+ castSave(r, e) {
25
+ this.qyAclWriter.save(r, e);
26
+ }
27
+ }
28
+
29
+ module.exports = QyAclSaver_Worker;