@peerbit/indexer-sqlite3 1.2.8 → 1.2.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.
|
@@ -7983,6 +7983,16 @@ hrtime.bigint = (time) => {
|
|
|
7983
7983
|
return BigInt(diff[0] * NS_PER_SEC + diff[1]);
|
|
7984
7984
|
};
|
|
7985
7985
|
|
|
7986
|
+
// ../../../../node_modules/p-defer/index.js
|
|
7987
|
+
function pDefer() {
|
|
7988
|
+
const deferred = {};
|
|
7989
|
+
deferred.promise = new Promise((resolve, reject) => {
|
|
7990
|
+
deferred.resolve = resolve;
|
|
7991
|
+
deferred.reject = reject;
|
|
7992
|
+
});
|
|
7993
|
+
return deferred;
|
|
7994
|
+
}
|
|
7995
|
+
|
|
7986
7996
|
// dist/src/schema.js
|
|
7987
7997
|
var __decorate3 = function(decorators, target, key, desc) {
|
|
7988
7998
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
@@ -9375,17 +9385,23 @@ var QueryPlanner = class {
|
|
|
9375
9385
|
}
|
|
9376
9386
|
let indexCreateCommands = void 0;
|
|
9377
9387
|
let pickedIndexKeys = /* @__PURE__ */ new Map();
|
|
9388
|
+
let indexCreationPromiseToAwait = [];
|
|
9378
9389
|
return {
|
|
9379
9390
|
beforePrepare: async () => {
|
|
9380
9391
|
if (indexCreateCommands != null) {
|
|
9381
|
-
for (const { key, cmd } of indexCreateCommands) {
|
|
9382
|
-
|
|
9383
|
-
|
|
9392
|
+
for (const { key, cmd, deferred } of indexCreateCommands) {
|
|
9393
|
+
try {
|
|
9394
|
+
if (this.pendingIndexCreation.has(key)) {
|
|
9395
|
+
await this.pendingIndexCreation.get(key);
|
|
9396
|
+
}
|
|
9397
|
+
const promise = this.props.exec(cmd);
|
|
9398
|
+
this.pendingIndexCreation.set(key, promise);
|
|
9399
|
+
await promise;
|
|
9400
|
+
this.pendingIndexCreation.delete(key);
|
|
9401
|
+
deferred.resolve();
|
|
9402
|
+
} catch (error2) {
|
|
9403
|
+
deferred.reject(error2);
|
|
9384
9404
|
}
|
|
9385
|
-
const promise = this.props.exec(cmd);
|
|
9386
|
-
this.pendingIndexCreation.set(key, promise);
|
|
9387
|
-
await promise;
|
|
9388
|
-
this.pendingIndexCreation.delete(key);
|
|
9389
9405
|
}
|
|
9390
9406
|
}
|
|
9391
9407
|
if (this.pendingIndexCreation.size > 0) {
|
|
@@ -9393,6 +9409,7 @@ var QueryPlanner = class {
|
|
|
9393
9409
|
await this.pendingIndexCreation.get(picked);
|
|
9394
9410
|
}
|
|
9395
9411
|
}
|
|
9412
|
+
await Promise.all(indexCreationPromiseToAwait);
|
|
9396
9413
|
},
|
|
9397
9414
|
resolveIndex: (tableName, columns) => {
|
|
9398
9415
|
const sortedNameKey = getSortedNameKey(tableName, columns);
|
|
@@ -9408,21 +9425,32 @@ var QueryPlanner = class {
|
|
|
9408
9425
|
for (const columns2 of permutations) {
|
|
9409
9426
|
const indexKey = createIndexKey(tableName, columns2);
|
|
9410
9427
|
const command = `create index if not exists ${indexKey} on ${tableName} (${columns2.map((n) => escapeColumnName(n)).join(", ")})`;
|
|
9428
|
+
let deferred = pDefer();
|
|
9411
9429
|
(indexCreateCommands || (indexCreateCommands = [])).push({
|
|
9412
9430
|
cmd: command,
|
|
9413
|
-
key: indexKey
|
|
9431
|
+
key: indexKey,
|
|
9432
|
+
deferred
|
|
9433
|
+
});
|
|
9434
|
+
let created = false;
|
|
9435
|
+
deferred.promise.then(() => {
|
|
9436
|
+
created = true;
|
|
9414
9437
|
});
|
|
9415
9438
|
indexStats.results.push({
|
|
9416
9439
|
used: 0,
|
|
9417
9440
|
times: [],
|
|
9418
9441
|
avg: -1,
|
|
9419
9442
|
// setting -1 will force the first time to be the fastest (i.e. new indices are always tested once)
|
|
9420
|
-
indexKey
|
|
9443
|
+
indexKey,
|
|
9444
|
+
created: () => created,
|
|
9445
|
+
creationPromiseDeferred: deferred
|
|
9421
9446
|
});
|
|
9422
9447
|
}
|
|
9423
9448
|
}
|
|
9424
9449
|
let fastestIndex = indexStats.results[0];
|
|
9425
9450
|
fastestIndex.used++;
|
|
9451
|
+
if (!fastestIndex.created()) {
|
|
9452
|
+
indexCreationPromiseToAwait.push(fastestIndex.creationPromiseDeferred.promise);
|
|
9453
|
+
}
|
|
9426
9454
|
pickedIndexKeys.set(fastestIndex.indexKey, sortedNameKey);
|
|
9427
9455
|
return fastestIndex.indexKey;
|
|
9428
9456
|
},
|
|
@@ -9940,16 +9968,6 @@ var SQLiteIndices = class _SQLiteIndices {
|
|
|
9940
9968
|
}
|
|
9941
9969
|
};
|
|
9942
9970
|
|
|
9943
|
-
// ../../../../node_modules/p-defer/index.js
|
|
9944
|
-
function pDefer() {
|
|
9945
|
-
const deferred = {};
|
|
9946
|
-
deferred.promise = new Promise((resolve, reject) => {
|
|
9947
|
-
deferred.resolve = resolve;
|
|
9948
|
-
deferred.reject = reject;
|
|
9949
|
-
});
|
|
9950
|
-
return deferred;
|
|
9951
|
-
}
|
|
9952
|
-
|
|
9953
9971
|
// dist/src/sqlite3-messages.worker.js
|
|
9954
9972
|
var encodeValue = (value) => {
|
|
9955
9973
|
if (value instanceof Uint8Array) {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Query, Sort } from "@peerbit/indexer-interface";
|
|
2
|
+
import { type DeferredPromise } from "p-defer";
|
|
2
3
|
export interface QueryIndexPlanner {
|
|
3
4
|
columnsToIndexes: Map<string, {
|
|
4
5
|
results: {
|
|
@@ -6,6 +7,8 @@ export interface QueryIndexPlanner {
|
|
|
6
7
|
avg: number;
|
|
7
8
|
times: number[];
|
|
8
9
|
indexKey: string;
|
|
10
|
+
created: () => boolean;
|
|
11
|
+
creationPromiseDeferred: DeferredPromise<void>;
|
|
9
12
|
}[];
|
|
10
13
|
}>;
|
|
11
14
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-planner.d.ts","sourceRoot":"","sources":["../../src/query-planner.ts"],"names":[],"mappings":"AAGA,OAAO,EAYN,KAAK,EACL,IAAI,EAGJ,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"query-planner.d.ts","sourceRoot":"","sources":["../../src/query-planner.ts"],"names":[],"mappings":"AAGA,OAAO,EAYN,KAAK,EACL,IAAI,EAGJ,MAAM,4BAA4B,CAAC;AAEpC,OAAe,EAAE,KAAK,eAAe,EAAE,MAAM,SAAS,CAAC;AAGvD,MAAM,WAAW,iBAAiB;IAGjC,gBAAgB,EAAE,GAAG,CACpB,MAAM,EACN;QACC,OAAO,EAAE;YACR,IAAI,EAAE,MAAM,CAAC;YACb,GAAG,EAAE,MAAM,CAAC;YACZ,KAAK,EAAE,MAAM,EAAE,CAAC;YAChB,QAAQ,EAAE,MAAM,CAAC;YACjB,OAAO,EAAE,MAAM,OAAO,CAAC;YACvB,uBAAuB,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC;SAC/C,EAAE,CAAC;KACJ,CACD,CAAC;CACF;AAED,KAAK,SAAS,GAAG,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;AAUhD,eAAO,MAAM,YAAY,WAAsB;IAC9C,KAAK,EAAE,KAAK,EAAE,CAAC;IACf,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;CACrB,KAAG,SAAS,CAAC;IAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,CAAA;CAAE,GAAG,SAAS,CA4CjE,CAAC;AAgEF,qBAAa,cAAc;IAE1B,KAAK,EAAE,KAAK,EAAE,CAAC;IAGf,IAAI,EAAE,IAAI,EAAE,CAAC;gBAED,KAAK,EAAE;QAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,CAAA;KAAE;IAS3D,IAAI,GAAG,IAAI,MAAM,CAOhB;CACD;AACD,MAAM,MAAM,eAAe,GAAG,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;AAEhE,qBAAa,YAAY;IAMvB,QAAQ,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAA;KAAE;IALhE,KAAK,EAAE,SAAS,CAAa;IAE7B,oBAAoB,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAa;gBAGnD,KAAK,EAAE;QAAE,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAA;KAAE;IAG1D,IAAI;IAOV,KAAK,CAAC,KAAK,EAAE,cAAc;;kCA6CC,MAAM,WAAW,MAAM,EAAE,KAAG,MAAM;kBAsD5C,CAAC,MAAM,MAAM,OAAO,CAAC,CAAC,CAAC,KAAG,OAAO,CAAC,CAAC,CAAC;;CAgCtD"}
|
|
@@ -12,6 +12,7 @@ import { field, serialize, vec } from "@dao-xyz/borsh";
|
|
|
12
12
|
import { sha256Base64Sync } from "@peerbit/crypto";
|
|
13
13
|
import { And, BigUnsignedIntegerValue, BoolQuery, ByteMatchQuery, Compare, IntegerCompare, IntegerValue, IsNull, Nested, Not, Or, Query, Sort, StringMatch, UnsignedIntegerValue, } from "@peerbit/indexer-interface";
|
|
14
14
|
import { hrtime } from "@peerbit/time";
|
|
15
|
+
import pDefer, {} from "p-defer";
|
|
15
16
|
import { escapeColumnName } from "./schema.js";
|
|
16
17
|
const getSortedNameKey = (tableName, names) => [tableName, ...names.sort()].join(",");
|
|
17
18
|
const createIndexKey = (tableName, fields) => `${tableName}_index_${fields.map((x) => x).join("_")}`;
|
|
@@ -179,18 +180,26 @@ export class QueryPlanner {
|
|
|
179
180
|
// returns a function that takes column names and return the index to use
|
|
180
181
|
let indexCreateCommands = undefined;
|
|
181
182
|
let pickedIndexKeys = new Map(); // index key to column names key
|
|
183
|
+
let indexCreationPromiseToAwait = [];
|
|
182
184
|
return {
|
|
183
185
|
beforePrepare: async () => {
|
|
184
186
|
// create missing indices
|
|
185
187
|
if (indexCreateCommands != null) {
|
|
186
|
-
for (const { key, cmd } of indexCreateCommands) {
|
|
187
|
-
|
|
188
|
-
|
|
188
|
+
for (const { key, cmd, deferred } of indexCreateCommands) {
|
|
189
|
+
try {
|
|
190
|
+
if (this.pendingIndexCreation.has(key)) {
|
|
191
|
+
// TODO is this kind of debouncing needed? how do we end up here?
|
|
192
|
+
await this.pendingIndexCreation.get(key);
|
|
193
|
+
}
|
|
194
|
+
const promise = this.props.exec(cmd);
|
|
195
|
+
this.pendingIndexCreation.set(key, promise);
|
|
196
|
+
await promise;
|
|
197
|
+
this.pendingIndexCreation.delete(key);
|
|
198
|
+
deferred.resolve();
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
deferred.reject(error);
|
|
189
202
|
}
|
|
190
|
-
const promise = this.props.exec(cmd);
|
|
191
|
-
this.pendingIndexCreation.set(key, promise);
|
|
192
|
-
await promise;
|
|
193
|
-
this.pendingIndexCreation.delete(key);
|
|
194
203
|
}
|
|
195
204
|
}
|
|
196
205
|
if (this.pendingIndexCreation.size > 0) {
|
|
@@ -198,6 +207,7 @@ export class QueryPlanner {
|
|
|
198
207
|
await this.pendingIndexCreation.get(picked);
|
|
199
208
|
}
|
|
200
209
|
}
|
|
210
|
+
await Promise.all(indexCreationPromiseToAwait);
|
|
201
211
|
},
|
|
202
212
|
resolveIndex: (tableName, columns) => {
|
|
203
213
|
// first we figure out whether we want to reuse the fastest index or try a new one
|
|
@@ -216,21 +226,32 @@ export class QueryPlanner {
|
|
|
216
226
|
for (const columns of permutations) {
|
|
217
227
|
const indexKey = createIndexKey(tableName, columns);
|
|
218
228
|
const command = `create index if not exists ${indexKey} on ${tableName} (${columns.map((n) => escapeColumnName(n)).join(", ")})`;
|
|
229
|
+
let deferred = pDefer();
|
|
219
230
|
(indexCreateCommands || (indexCreateCommands = [])).push({
|
|
220
231
|
cmd: command,
|
|
221
232
|
key: indexKey,
|
|
233
|
+
deferred,
|
|
234
|
+
});
|
|
235
|
+
let created = false;
|
|
236
|
+
deferred.promise.then(() => {
|
|
237
|
+
created = true;
|
|
222
238
|
});
|
|
223
239
|
indexStats.results.push({
|
|
224
240
|
used: 0,
|
|
225
241
|
times: [],
|
|
226
242
|
avg: -1, // setting -1 will force the first time to be the fastest (i.e. new indices are always tested once)
|
|
227
243
|
indexKey,
|
|
244
|
+
created: () => created,
|
|
245
|
+
creationPromiseDeferred: deferred,
|
|
228
246
|
});
|
|
229
247
|
}
|
|
230
248
|
}
|
|
231
249
|
// find the fastest index
|
|
232
250
|
let fastestIndex = indexStats.results[0];
|
|
233
251
|
fastestIndex.used++;
|
|
252
|
+
if (!fastestIndex.created()) {
|
|
253
|
+
indexCreationPromiseToAwait.push(fastestIndex.creationPromiseDeferred.promise);
|
|
254
|
+
}
|
|
234
255
|
pickedIndexKeys.set(fastestIndex.indexKey, sortedNameKey);
|
|
235
256
|
return fastestIndex.indexKey;
|
|
236
257
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-planner.js","sourceRoot":"","sources":["../../src/query-planner.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA2C;AAC3C,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EACN,GAAG,EACH,uBAAuB,EACvB,SAAS,EACT,cAAc,EACd,OAAO,EACP,cAAc,EACd,YAAY,EACZ,MAAM,EACN,MAAM,EACN,GAAG,EACH,EAAE,EACF,KAAK,EACL,IAAI,EACJ,WAAW,EACX,oBAAoB,GACpB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"query-planner.js","sourceRoot":"","sources":["../../src/query-planner.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/query-planner.ts
CHANGED
|
@@ -19,6 +19,7 @@ import {
|
|
|
19
19
|
UnsignedIntegerValue,
|
|
20
20
|
} from "@peerbit/indexer-interface";
|
|
21
21
|
import { hrtime } from "@peerbit/time";
|
|
22
|
+
import pDefer, { type DeferredPromise } from "p-defer";
|
|
22
23
|
import { escapeColumnName } from "./schema.js";
|
|
23
24
|
|
|
24
25
|
export interface QueryIndexPlanner {
|
|
@@ -32,6 +33,8 @@ export interface QueryIndexPlanner {
|
|
|
32
33
|
avg: number;
|
|
33
34
|
times: number[];
|
|
34
35
|
indexKey: string;
|
|
36
|
+
created: () => boolean;
|
|
37
|
+
creationPromiseDeferred: DeferredPromise<void>;
|
|
35
38
|
}[];
|
|
36
39
|
}
|
|
37
40
|
>; //
|
|
@@ -211,21 +214,30 @@ export class QueryPlanner {
|
|
|
211
214
|
}
|
|
212
215
|
|
|
213
216
|
// returns a function that takes column names and return the index to use
|
|
214
|
-
let indexCreateCommands:
|
|
215
|
-
|
|
217
|
+
let indexCreateCommands:
|
|
218
|
+
| { key: string; cmd: string; deferred: DeferredPromise<void> }[]
|
|
219
|
+
| undefined = undefined;
|
|
216
220
|
let pickedIndexKeys: Map<string, string> = new Map(); // index key to column names key
|
|
221
|
+
let indexCreationPromiseToAwait: Promise<void>[] = [];
|
|
217
222
|
return {
|
|
218
223
|
beforePrepare: async () => {
|
|
219
224
|
// create missing indices
|
|
220
225
|
if (indexCreateCommands != null) {
|
|
221
|
-
for (const { key, cmd } of indexCreateCommands) {
|
|
222
|
-
|
|
223
|
-
|
|
226
|
+
for (const { key, cmd, deferred } of indexCreateCommands) {
|
|
227
|
+
try {
|
|
228
|
+
if (this.pendingIndexCreation.has(key)) {
|
|
229
|
+
// TODO is this kind of debouncing needed? how do we end up here?
|
|
230
|
+
await this.pendingIndexCreation.get(key);
|
|
231
|
+
}
|
|
232
|
+
const promise = this.props.exec(cmd);
|
|
233
|
+
this.pendingIndexCreation.set(key, promise);
|
|
234
|
+
await promise;
|
|
235
|
+
|
|
236
|
+
this.pendingIndexCreation.delete(key);
|
|
237
|
+
deferred.resolve();
|
|
238
|
+
} catch (error) {
|
|
239
|
+
deferred.reject(error);
|
|
224
240
|
}
|
|
225
|
-
const promise = this.props.exec(cmd);
|
|
226
|
-
this.pendingIndexCreation.set(key, promise);
|
|
227
|
-
await promise;
|
|
228
|
-
this.pendingIndexCreation.delete(key);
|
|
229
241
|
}
|
|
230
242
|
}
|
|
231
243
|
|
|
@@ -234,6 +246,8 @@ export class QueryPlanner {
|
|
|
234
246
|
await this.pendingIndexCreation.get(picked);
|
|
235
247
|
}
|
|
236
248
|
}
|
|
249
|
+
|
|
250
|
+
await Promise.all(indexCreationPromiseToAwait);
|
|
237
251
|
},
|
|
238
252
|
resolveIndex: (tableName: string, columns: string[]): string => {
|
|
239
253
|
// first we figure out whether we want to reuse the fastest index or try a new one
|
|
@@ -254,16 +268,24 @@ export class QueryPlanner {
|
|
|
254
268
|
const indexKey = createIndexKey(tableName, columns);
|
|
255
269
|
const command = `create index if not exists ${indexKey} on ${tableName} (${columns.map((n) => escapeColumnName(n)).join(", ")})`;
|
|
256
270
|
|
|
271
|
+
let deferred = pDefer<void>();
|
|
257
272
|
(indexCreateCommands || (indexCreateCommands = [])).push({
|
|
258
273
|
cmd: command,
|
|
259
274
|
key: indexKey,
|
|
275
|
+
deferred,
|
|
260
276
|
});
|
|
261
277
|
|
|
278
|
+
let created = false;
|
|
279
|
+
deferred.promise.then(() => {
|
|
280
|
+
created = true;
|
|
281
|
+
});
|
|
262
282
|
indexStats.results.push({
|
|
263
283
|
used: 0,
|
|
264
284
|
times: [],
|
|
265
285
|
avg: -1, // setting -1 will force the first time to be the fastest (i.e. new indices are always tested once)
|
|
266
286
|
indexKey,
|
|
287
|
+
created: () => created,
|
|
288
|
+
creationPromiseDeferred: deferred,
|
|
267
289
|
});
|
|
268
290
|
}
|
|
269
291
|
}
|
|
@@ -271,6 +293,12 @@ export class QueryPlanner {
|
|
|
271
293
|
// find the fastest index
|
|
272
294
|
let fastestIndex = indexStats.results[0];
|
|
273
295
|
fastestIndex.used++;
|
|
296
|
+
|
|
297
|
+
if (!fastestIndex.created()) {
|
|
298
|
+
indexCreationPromiseToAwait.push(
|
|
299
|
+
fastestIndex.creationPromiseDeferred.promise,
|
|
300
|
+
);
|
|
301
|
+
}
|
|
274
302
|
pickedIndexKeys.set(fastestIndex.indexKey, sortedNameKey);
|
|
275
303
|
|
|
276
304
|
return fastestIndex.indexKey!;
|