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.
- package/README.md +4 -1
- package/index.js +1 -1
- package/internal.md +5 -3
- package/package.json +7 -5
- package/scripts/airbnb.js +77 -72
- package/scripts/airbnb2.js +78 -73
- package/scripts/airbnb2_queries.js +181 -229
- package/scripts/airbnb_queries.js +214 -265
- package/scripts/convertBinFiles.js +47 -49
- package/scripts/downloadFile.js +41 -40
- package/scripts/express.js +44 -48
- package/scripts/fastify.js +71 -80
- package/scripts/flights.js +71 -75
- package/scripts/flights2.js +78 -81
- package/scripts/flights2_queries.js +417 -455
- package/scripts/flights_queries.js +381 -407
- package/src/QyAcl.d.ts +17 -0
- package/src/QyAcl.js +113 -116
- package/src/QyAclSaver.d.ts +4 -0
- package/src/QyAclSaver.js +3 -3
- package/src/QyAclSaver_Worker.d.ts +9 -0
- package/src/QyAclSaver_Worker.js +2 -4
- package/src/QyAclWriter.d.ts +5 -0
- package/src/QyBatch.d.ts +42 -0
- package/src/QyBatch.js +8 -8
- package/src/QyBinWriter.d.ts +15 -0
- package/src/QyCD.d.ts +37 -0
- package/src/QyCD.js +8 -6
- package/src/QyCache.d.ts +44 -0
- package/src/QyCache.js +65 -59
- package/src/QyCompressor.d.ts +9 -0
- package/src/QyCompressor.js +29 -29
- package/src/QyCompressor_Worker.d.ts +1 -0
- package/src/QyDB.d.ts +42 -0
- package/src/QyDB.js +13 -11
- package/src/QyDefaultOptions.d.ts +1 -0
- package/src/QyDefaultOptions.js +3 -0
- package/src/QyDir.d.ts +48 -0
- package/src/QyDir.js +41 -41
- package/src/QyFetch.d.ts +7 -0
- package/src/QyFetch.js +2 -3
- package/src/QyFile.d.ts +19 -0
- package/src/QyFile.js +35 -34
- package/src/QyFileContentUtils.d.ts +13 -0
- package/src/QyFileContentUtils.js +126 -126
- package/src/QyFileLogger.d.ts +11 -0
- package/src/QyIndex.d.ts +6 -0
- package/src/QyIndex.js +73 -75
- package/src/QyIndexPropTree.d.ts +7 -0
- package/src/QyIndexPropTree.js +24 -24
- package/src/QyIntersectNode.d.ts +7 -0
- package/src/QyIntersectNode.js +15 -15
- package/src/QyItem.d.ts +30 -0
- package/src/QyItem.js +32 -28
- package/src/QyJsonSaver.d.ts +6 -0
- package/src/QyKVData.d.ts +12 -0
- package/src/QyKVData.js +11 -10
- package/src/QyKVDataCleaner.d.ts +4 -0
- package/src/QyKVDataCleaner.js +1 -1
- package/src/QyKVDataCleaner_Worker.d.ts +13 -0
- package/src/QyKVDataCleaner_Worker.js +2 -4
- package/src/QyKVDataLoader.d.ts +9 -0
- package/src/QyKVDataLoader.js +11 -11
- package/src/QyKVDataSaver.d.ts +4 -0
- package/src/QyKVDataSaver.js +6 -6
- package/src/QyKVDataSaver_Worker.d.ts +13 -0
- package/src/QyKVDataSaver_Worker.js +7 -9
- package/src/QyLogFileSaver.d.ts +4 -0
- package/src/QyLogFileSaver.js +1 -1
- package/src/QyLogFileSaver_Worker.d.ts +8 -0
- package/src/QyLogFileSaver_Worker.js +2 -4
- package/src/QyLogger.d.ts +10 -0
- package/src/QyLogger.js +40 -40
- package/src/QyMessageWorker.d.ts +5 -0
- package/src/QyMessageWorker.js +7 -7
- package/src/QyMessager.d.ts +7 -0
- package/src/QyMessager.js +30 -27
- package/src/QyMessager_Run.d.ts +1 -0
- package/src/QyMessager_Run.js +11 -6
- package/src/QyMod.d.ts +1 -0
- package/src/QyMod.js +6 -6
- package/src/QyOpRunner.d.ts +10 -0
- package/src/QyOpRunner.js +39 -39
- package/src/QyQueue.d.ts +11 -0
- package/src/QySaver.d.ts +10 -0
- package/src/QySnapshotCompactor.d.ts +4 -0
- package/src/QySnapshotCompactor.js +1 -1
- package/src/QySnapshotCompactor_Worker.d.ts +11 -0
- package/src/QySnapshotCompactor_Worker.js +2 -4
- package/src/QySnapshotSaver.d.ts +4 -0
- package/src/QySnapshotSaver.js +1 -1
- package/src/QySnapshotSaver_Worker.d.ts +16 -0
- package/src/QySnapshotSaver_Worker.js +17 -16
- package/src/QySnapshots.d.ts +27 -0
- package/src/QySnapshots.js +3 -3
- package/src/QyStructure.d.ts +1 -0
- package/src/QyStructure.js +18 -18
- package/src/QyTrigger.d.ts +9 -0
- package/src/QyTrigger.js +30 -30
- package/src/QyUnionNode.d.ts +17 -0
- package/src/QyUnionNode.js +2 -2
- package/src/QyUtils.d.ts +53 -0
- package/src/QyUtils.js +140 -117
- package/src/QyWorker.d.ts +5 -0
- package/src/QyWorker.js +18 -18
- package/src/hackernews.d.ts +1 -0
- package/src/hackernews.js +59 -47
- package/src/rpc/getRpcFiles.js +1 -0
- package/src/simulate.d.ts +1 -0
- package/src/simulate2.d.ts +1 -0
- package/src/soc_pokec.d.ts +1 -0
- package/static/codemirror.bundle/editor.bundle.js +399 -184
- package/static/datafolderui/QyStyledElement.js +2 -2
- package/static/datafolderui/QyUIFolderViewer.js +97 -77
- package/static/datafolderui/QyUIUtils.js +4 -4
- package/static/datafolderui/code-mirror.js +7 -7
- package/static/datafolderui/display-tree.js +13 -10
- package/static/datafolderui/hscrpt.js +26 -7
- package/static/datafolderui/json-view.js +27 -0
- package/static/datafolderui/main-page.js +65 -37
- package/static/datafolderui/query-editor.js +8 -8
- package/static/datafolderui/rpc-editor.js +31 -0
- package/static/datafolderui/trigger-editor.js +9 -6
- package/static/datafolderui/QyUIFolderTree.js +0 -188
|
@@ -1,265 +1,214 @@
|
|
|
1
|
-
import { deepEqual } from "node:assert/strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
);
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
)
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
);
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
"
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
console.
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
);
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
}
|
|
216
|
-
function query9(qyDB) {
|
|
217
|
-
console.time("query9");
|
|
218
|
-
deepEqual(
|
|
219
|
-
qyDB
|
|
220
|
-
.queryFiles(
|
|
221
|
-
"airbnb1",
|
|
222
|
-
{
|
|
223
|
-
$or: [
|
|
224
|
-
{
|
|
225
|
-
property_type: "Loft",
|
|
226
|
-
room_type: "Entire home/apt",
|
|
227
|
-
bed_type: "Real Bed",
|
|
228
|
-
address: { street: "Porto, Porto, Portugal" },
|
|
229
|
-
},
|
|
230
|
-
{ property_type: (x) => x == "Loft", minimum_nights: (x) => x >= 60 },
|
|
231
|
-
],
|
|
232
|
-
},
|
|
233
|
-
3,
|
|
234
|
-
)
|
|
235
|
-
.map((x) => x.prop("name")),
|
|
236
|
-
[
|
|
237
|
-
"Porto city centre apartment H",
|
|
238
|
-
"Romantic loft near historic center",
|
|
239
|
-
"Lovely sun light in a stylish loft, Downtown Spot",
|
|
240
|
-
],
|
|
241
|
-
);
|
|
242
|
-
console.timeEnd("query9");
|
|
243
|
-
}
|
|
244
|
-
function runQueries(qyDB) {
|
|
245
|
-
query1(qyDB);
|
|
246
|
-
query1(qyDB);
|
|
247
|
-
query2(qyDB);
|
|
248
|
-
query2(qyDB);
|
|
249
|
-
query3(qyDB);
|
|
250
|
-
query3(qyDB);
|
|
251
|
-
query4(qyDB);
|
|
252
|
-
query4(qyDB);
|
|
253
|
-
query5(qyDB);
|
|
254
|
-
query5(qyDB);
|
|
255
|
-
query6(qyDB);
|
|
256
|
-
query6(qyDB);
|
|
257
|
-
query7(qyDB);
|
|
258
|
-
query7(qyDB);
|
|
259
|
-
query8(qyDB);
|
|
260
|
-
query8(qyDB);
|
|
261
|
-
query9(qyDB);
|
|
262
|
-
query9(qyDB);
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
export { runQueries };
|
|
1
|
+
import { deepEqual } from "node:assert/strict";
|
|
2
|
+
function query1(qyDB) {
|
|
3
|
+
console.time("query1");
|
|
4
|
+
deepEqual(qyDB
|
|
5
|
+
.queryFiles("airbnb1", {
|
|
6
|
+
property_type: "Loft",
|
|
7
|
+
room_type: "Entire home/apt",
|
|
8
|
+
bed_type: "Real Bed",
|
|
9
|
+
address: { street: "Porto, Porto, Portugal" },
|
|
10
|
+
})
|
|
11
|
+
.map((x) => x.prop("name")), [
|
|
12
|
+
"Porto city centre apartment H",
|
|
13
|
+
"Romantic loft near historic center",
|
|
14
|
+
"Lovely sun light in a stylish loft, Downtown Spot",
|
|
15
|
+
"Charming & Sunny Mezzanine Loft",
|
|
16
|
+
"Be Happy in Porto",
|
|
17
|
+
"Quarry Apartment",
|
|
18
|
+
"Loft with balcony and view of Casa da Música PORTO",
|
|
19
|
+
"For 4 or 6 - Wonderful Apartment downtown",
|
|
20
|
+
"Clérigos Apartments - Apt. 4E for 2/3 Pax",
|
|
21
|
+
"Bright Top Floor Two Rooms Apartment w/ Terrace",
|
|
22
|
+
"ReUrban Flats - Santa Catarina #3",
|
|
23
|
+
"The Blue and White Porto House - Vintage",
|
|
24
|
+
"4twoLoft at Great Location",
|
|
25
|
+
"Step In Porto - Loft w/Mezzanine",
|
|
26
|
+
"Your OWM Invicta",
|
|
27
|
+
"Pury Apartments",
|
|
28
|
+
"Live Porto & Douro - Breiner III",
|
|
29
|
+
]);
|
|
30
|
+
console.timeEnd("query1");
|
|
31
|
+
}
|
|
32
|
+
function query2(qyDB) {
|
|
33
|
+
console.time("query2");
|
|
34
|
+
deepEqual(qyDB
|
|
35
|
+
.queryFiles("airbnb1", {
|
|
36
|
+
property_type: "Loft",
|
|
37
|
+
room_type: "Entire home/apt",
|
|
38
|
+
bed_type: "Real Bed",
|
|
39
|
+
address: { street: "Porto, Porto, Portugal" },
|
|
40
|
+
}, 9)
|
|
41
|
+
.map((x) => x.prop("name")), [
|
|
42
|
+
"Porto city centre apartment H",
|
|
43
|
+
"Romantic loft near historic center",
|
|
44
|
+
"Lovely sun light in a stylish loft, Downtown Spot",
|
|
45
|
+
"Charming & Sunny Mezzanine Loft",
|
|
46
|
+
"Be Happy in Porto",
|
|
47
|
+
"Quarry Apartment",
|
|
48
|
+
"Loft with balcony and view of Casa da Música PORTO",
|
|
49
|
+
"For 4 or 6 - Wonderful Apartment downtown",
|
|
50
|
+
"Clérigos Apartments - Apt. 4E for 2/3 Pax",
|
|
51
|
+
]);
|
|
52
|
+
console.timeEnd("query2");
|
|
53
|
+
}
|
|
54
|
+
function query3(qyDB) {
|
|
55
|
+
console.time("query3");
|
|
56
|
+
deepEqual(qyDB
|
|
57
|
+
.queryFiles("airbnb1", {
|
|
58
|
+
property_type: "Loft",
|
|
59
|
+
room_type: "Entire home/apt",
|
|
60
|
+
bed_type: "Real Bed",
|
|
61
|
+
address: { street: "Porto, Porto, Portugal" },
|
|
62
|
+
}, 9, 9)
|
|
63
|
+
.map((x) => x.prop("name")), [
|
|
64
|
+
"Bright Top Floor Two Rooms Apartment w/ Terrace",
|
|
65
|
+
"ReUrban Flats - Santa Catarina #3",
|
|
66
|
+
"The Blue and White Porto House - Vintage",
|
|
67
|
+
"4twoLoft at Great Location",
|
|
68
|
+
"Step In Porto - Loft w/Mezzanine",
|
|
69
|
+
"Your OWM Invicta",
|
|
70
|
+
"Pury Apartments",
|
|
71
|
+
"Live Porto & Douro - Breiner III",
|
|
72
|
+
]);
|
|
73
|
+
console.timeEnd("query3");
|
|
74
|
+
}
|
|
75
|
+
function query4(qyDB) {
|
|
76
|
+
console.time("query4");
|
|
77
|
+
deepEqual(qyDB
|
|
78
|
+
.queryFiles("airbnb1", {
|
|
79
|
+
$or: [
|
|
80
|
+
{
|
|
81
|
+
property_type: "Loft",
|
|
82
|
+
room_type: "Entire home/apt",
|
|
83
|
+
bed_type: "Real Bed",
|
|
84
|
+
address: { street: "Porto, Porto, Portugal" },
|
|
85
|
+
},
|
|
86
|
+
{ property_type: (x) => x == "Loft", minimum_nights: (x) => x >= 60 },
|
|
87
|
+
],
|
|
88
|
+
})
|
|
89
|
+
.map((x) => x.prop("name"))
|
|
90
|
+
.sort(), [
|
|
91
|
+
"Porto city centre apartment H",
|
|
92
|
+
"Romantic loft near historic center",
|
|
93
|
+
"Lovely sun light in a stylish loft, Downtown Spot",
|
|
94
|
+
"Charming & Sunny Mezzanine Loft",
|
|
95
|
+
"Brand New Luxury Downtown Studio",
|
|
96
|
+
"Be Happy in Porto",
|
|
97
|
+
"Quarry Apartment",
|
|
98
|
+
"Loft with balcony and view of Casa da Música PORTO",
|
|
99
|
+
"For 4 or 6 - Wonderful Apartment downtown",
|
|
100
|
+
"Clérigos Apartments - Apt. 4E for 2/3 Pax",
|
|
101
|
+
"Bright Top Floor Two Rooms Apartment w/ Terrace",
|
|
102
|
+
"ReUrban Flats - Santa Catarina #3",
|
|
103
|
+
"The Blue and White Porto House - Vintage",
|
|
104
|
+
"4twoLoft at Great Location",
|
|
105
|
+
"Step In Porto - Loft w/Mezzanine",
|
|
106
|
+
"Your OWM Invicta",
|
|
107
|
+
"Pury Apartments",
|
|
108
|
+
"Live Porto & Douro - Breiner III",
|
|
109
|
+
].sort());
|
|
110
|
+
console.timeEnd("query4");
|
|
111
|
+
}
|
|
112
|
+
function query5(qyDB) {
|
|
113
|
+
console.time("query5");
|
|
114
|
+
deepEqual(qyDB
|
|
115
|
+
.queryFiles("airbnb1", {
|
|
116
|
+
$or: [
|
|
117
|
+
{
|
|
118
|
+
property_type: "Loft",
|
|
119
|
+
room_type: "Entire home/apt",
|
|
120
|
+
bed_type: "Real Bed",
|
|
121
|
+
address: { street: "Porto, Porto, Portugal" },
|
|
122
|
+
},
|
|
123
|
+
{ property_type: (x) => x == "Loft", minimum_nights: (x) => x >= 60 },
|
|
124
|
+
],
|
|
125
|
+
}, 3)
|
|
126
|
+
.map((x) => x.prop("name")), [
|
|
127
|
+
"Porto city centre apartment H",
|
|
128
|
+
"Romantic loft near historic center",
|
|
129
|
+
"Lovely sun light in a stylish loft, Downtown Spot",
|
|
130
|
+
]);
|
|
131
|
+
console.timeEnd("query5");
|
|
132
|
+
}
|
|
133
|
+
function query6(qyDB) {
|
|
134
|
+
console.time("query6");
|
|
135
|
+
deepEqual(qyDB
|
|
136
|
+
.queryFiles("airbnb1", {
|
|
137
|
+
$or: [
|
|
138
|
+
{
|
|
139
|
+
property_type: "Loft",
|
|
140
|
+
room_type: "Entire home/apt",
|
|
141
|
+
bed_type: "Real Bed",
|
|
142
|
+
address: { street: "Porto, Porto, Portugal" },
|
|
143
|
+
},
|
|
144
|
+
{ property_type: (x) => x == "Loft", minimum_nights: (x) => x >= 60 },
|
|
145
|
+
],
|
|
146
|
+
}, 20, 10)
|
|
147
|
+
.map((x) => x.prop("name")), [
|
|
148
|
+
"ReUrban Flats - Santa Catarina #3",
|
|
149
|
+
"The Blue and White Porto House - Vintage",
|
|
150
|
+
"4twoLoft at Great Location",
|
|
151
|
+
"Step In Porto - Loft w/Mezzanine",
|
|
152
|
+
"Your OWM Invicta",
|
|
153
|
+
"Pury Apartments",
|
|
154
|
+
"Live Porto & Douro - Breiner III",
|
|
155
|
+
"Brand New Luxury Downtown Studio",
|
|
156
|
+
]);
|
|
157
|
+
console.timeEnd("query6");
|
|
158
|
+
}
|
|
159
|
+
function query7(qyDB) {
|
|
160
|
+
console.time("query7");
|
|
161
|
+
deepEqual(qyDB
|
|
162
|
+
.queryFiles("airbnb1", { property_type: (x) => x == "Loft", minimum_nights: (x) => x >= 60 })
|
|
163
|
+
.map((x) => x.prop("name")), ["Romantic loft near historic center", "Brand New Luxury Downtown Studio"]);
|
|
164
|
+
console.timeEnd("query7");
|
|
165
|
+
}
|
|
166
|
+
function query8(qyDB) {
|
|
167
|
+
console.time("query8");
|
|
168
|
+
deepEqual(qyDB
|
|
169
|
+
.queryFiles("airbnb1", { property_type: (x) => x == "Loft", minimum_nights: (x) => x >= 60 }, 10, 10)
|
|
170
|
+
.map((x) => x.prop("name")), []);
|
|
171
|
+
console.timeEnd("query8");
|
|
172
|
+
}
|
|
173
|
+
function query9(qyDB) {
|
|
174
|
+
console.time("query9");
|
|
175
|
+
deepEqual(qyDB
|
|
176
|
+
.queryFiles("airbnb1", {
|
|
177
|
+
$or: [
|
|
178
|
+
{
|
|
179
|
+
property_type: "Loft",
|
|
180
|
+
room_type: "Entire home/apt",
|
|
181
|
+
bed_type: "Real Bed",
|
|
182
|
+
address: { street: "Porto, Porto, Portugal" },
|
|
183
|
+
},
|
|
184
|
+
{ property_type: (x) => x == "Loft", minimum_nights: (x) => x >= 60 },
|
|
185
|
+
],
|
|
186
|
+
}, 3)
|
|
187
|
+
.map((x) => x.prop("name")), [
|
|
188
|
+
"Porto city centre apartment H",
|
|
189
|
+
"Romantic loft near historic center",
|
|
190
|
+
"Lovely sun light in a stylish loft, Downtown Spot",
|
|
191
|
+
]);
|
|
192
|
+
console.timeEnd("query9");
|
|
193
|
+
}
|
|
194
|
+
function runQueries(qyDB) {
|
|
195
|
+
query1(qyDB);
|
|
196
|
+
query1(qyDB);
|
|
197
|
+
query2(qyDB);
|
|
198
|
+
query2(qyDB);
|
|
199
|
+
query3(qyDB);
|
|
200
|
+
query3(qyDB);
|
|
201
|
+
query4(qyDB);
|
|
202
|
+
query4(qyDB);
|
|
203
|
+
query5(qyDB);
|
|
204
|
+
query5(qyDB);
|
|
205
|
+
query6(qyDB);
|
|
206
|
+
query6(qyDB);
|
|
207
|
+
query7(qyDB);
|
|
208
|
+
query7(qyDB);
|
|
209
|
+
query8(qyDB);
|
|
210
|
+
query8(qyDB);
|
|
211
|
+
query9(qyDB);
|
|
212
|
+
query9(qyDB);
|
|
213
|
+
}
|
|
214
|
+
export { runQueries };
|
|
@@ -1,49 +1,47 @@
|
|
|
1
|
-
import { join, basename } from "node:path";
|
|
2
|
-
import { readFile, readdir, writeFile } from "node:fs/promises";
|
|
3
|
-
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
await
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
await Promise.all(promises);
|
|
49
|
-
}
|
|
1
|
+
import { join, basename } from "node:path";
|
|
2
|
+
import { readFile, readdir, writeFile } from "node:fs/promises";
|
|
3
|
+
import { iterPMBuffer, loadPrefixPMFile } from "../src/QySnapshots.js";
|
|
4
|
+
import { ensureDir, folderOrFileExists } from "../src/QyUtils.js";
|
|
5
|
+
logger.level = "info";
|
|
6
|
+
run();
|
|
7
|
+
async function loadPosMapFile(posMapFilePath) {
|
|
8
|
+
const buffer = await readFile(posMapFilePath);
|
|
9
|
+
const posMap = {};
|
|
10
|
+
iterPMBuffer(buffer, (key, nums) => (posMap[key] = nums));
|
|
11
|
+
return posMap;
|
|
12
|
+
}
|
|
13
|
+
async function run() {
|
|
14
|
+
const folderPath = process.argv[2];
|
|
15
|
+
let destFolderPath = process.argv[3];
|
|
16
|
+
if (!folderPath || !destFolderPath) {
|
|
17
|
+
console.log(`Usage: node ${basename(import.meta.filename)} folder/to/convert folder/to/save or inplace`);
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
if (destFolderPath == "inplace")
|
|
21
|
+
destFolderPath = folderPath;
|
|
22
|
+
await convertFolder(folderPath, destFolderPath);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
async function convertFolder(folder, destFolder) {
|
|
26
|
+
const promises = [];
|
|
27
|
+
for (const item of await readdir(folder, { withFileTypes: true })) {
|
|
28
|
+
const { name } = item;
|
|
29
|
+
if (item.isDirectory()) {
|
|
30
|
+
promises.push(convertFolder(join(folder, name), join(destFolder, name)));
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
const match = /^[0-9]+_(pM|prefixPM)\.txt/.exec(name);
|
|
34
|
+
if (match) {
|
|
35
|
+
const filePath = join(folder, name);
|
|
36
|
+
const destFilePath = join(destFolder, "dump_" + name + ".json");
|
|
37
|
+
if (await folderOrFileExists(destFilePath))
|
|
38
|
+
continue;
|
|
39
|
+
await ensureDir(destFolder);
|
|
40
|
+
console.log(`Converting ${filePath} -> ${destFilePath}`);
|
|
41
|
+
const map = await (match[1] == "pM" ? loadPosMapFile(filePath) : loadPrefixPMFile(filePath));
|
|
42
|
+
promises.push(writeFile(destFilePath, JSON.stringify(map, null, 2)));
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
await Promise.all(promises);
|
|
47
|
+
}
|