@peerbit/indexer-sqlite3 1.1.1 → 1.1.2-1c77281
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/dist/peerbit/sqlite3-bundler-friendly.mjs +2578 -3099
- package/dist/peerbit/sqlite3-node.mjs +2578 -3110
- package/dist/peerbit/sqlite3-opfs-async-proxy.js +2 -4
- package/dist/peerbit/sqlite3.js +2581 -3108
- package/dist/peerbit/sqlite3.min.js +2003 -2529
- package/dist/peerbit/sqlite3.mjs +2578 -3099
- package/dist/peerbit/sqlite3.wasm +0 -0
- package/dist/peerbit/sqlite3.worker.min.js +1931 -2515
- package/dist/src/engine.d.ts.map +1 -1
- package/dist/src/engine.js +23 -12
- package/dist/src/engine.js.map +1 -1
- package/dist/src/schema.d.ts +7 -1
- package/dist/src/schema.d.ts.map +1 -1
- package/dist/src/schema.js +47 -14
- package/dist/src/schema.js.map +1 -1
- package/dist/src/sqlite3.d.ts.map +1 -1
- package/dist/src/sqlite3.js +2 -1
- package/dist/src/sqlite3.js.map +1 -1
- package/package.json +78 -78
- package/src/engine.ts +36 -18
- package/src/schema.ts +63 -13
- package/src/sqlite3.ts +2 -1
package/dist/src/sqlite3.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite3.js","sourceRoot":"","sources":["../../src/sqlite3.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAChC,OAAO,EAAE,MAAM,IAAI,CAAC;AAMpB,IAAI,MAAM,GAAG,KAAK,EAAE,SAAkB,EAAE,EAAE;IACzC,IAAI,EAAE,GAA4B,SAAS,CAAC;IAC5C,IAAI,UAAU,GAA4B,IAAI,GAAG,EAAE,CAAC;IAEpD,IAAI,KAAK,GAAG,GAAG,EAAE;QAChB,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC;YACxC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;QACnB,CAAC;QACD,UAAU,CAAC,KAAK,EAAE,CAAC;QAEnB,IAAI,EAAE,EAAE,CAAC;YACR,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,EAAE,GAAG,SAAS,CAAC;QAChB,CAAC;IACF,CAAC,CAAC;IACF,IAAI,IAAI,GAAG,GAAG,EAAE;QACf,IAAI,EAAE,EAAE,CAAC;YACR,OAAO,EAAE,CAAC;QACX,CAAC;QAED,IAAI,UAAkB,CAAC;QACvB,IAAI,SAAS,EAAE,CAAC;YACf,uEAAuE;YACvE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC/B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9C,CAAC;YACD,UAAU,GAAG,GAAG,SAAS,YAAY,CAAC;QACvC,CAAC;aAAM,CAAC;YACP,UAAU,GAAG,UAAU,CAAC;QACzB,CAAC;QAED,EAAE,GAAG,IAAI,EAAE,CAAC,UAAU,EAAE;YACvB,aAAa,EAAE,KAAK;YACpB,QAAQ,EAAE,KAAK,CAAC,mDAAmD;SACnE,CAAC,CAAC;QACH,
|
|
1
|
+
{"version":3,"file":"sqlite3.js","sourceRoot":"","sources":["../../src/sqlite3.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAChC,OAAO,EAAE,MAAM,IAAI,CAAC;AAMpB,IAAI,MAAM,GAAG,KAAK,EAAE,SAAkB,EAAE,EAAE;IACzC,IAAI,EAAE,GAA4B,SAAS,CAAC;IAC5C,IAAI,UAAU,GAA4B,IAAI,GAAG,EAAE,CAAC;IAEpD,IAAI,KAAK,GAAG,GAAG,EAAE;QAChB,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC;YACxC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;QACnB,CAAC;QACD,UAAU,CAAC,KAAK,EAAE,CAAC;QAEnB,IAAI,EAAE,EAAE,CAAC;YACR,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,EAAE,GAAG,SAAS,CAAC;QAChB,CAAC;IACF,CAAC,CAAC;IACF,IAAI,IAAI,GAAG,GAAG,EAAE;QACf,IAAI,EAAE,EAAE,CAAC;YACR,OAAO,EAAE,CAAC;QACX,CAAC;QAED,IAAI,UAAkB,CAAC;QACvB,IAAI,SAAS,EAAE,CAAC;YACf,uEAAuE;YACvE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC/B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9C,CAAC;YACD,UAAU,GAAG,GAAG,SAAS,YAAY,CAAC;QACvC,CAAC;aAAM,CAAC;YACP,UAAU,GAAG,UAAU,CAAC;QACzB,CAAC;QAED,EAAE,GAAG,IAAI,EAAE,CAAC,UAAU,EAAE;YACvB,aAAa,EAAE,KAAK;YACpB,QAAQ,EAAE,KAAK,CAAC,mDAAmD;SACnE,CAAC,CAAC;QACH,+HAA+H;QAC/H,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAChC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAC/B,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC,CAAC;IAEF,OAAO;QACN,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE;YACrB,IAAI,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;YAC9C,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,GAAW,EAAE,EAAW;YACrC,IAAI,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;YAC9C,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC;gBAChB,IAAI,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAE9B,IAAI,IAAI,EAAE,CAAC;oBACV,MAAM,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;oBACrB,OAAO,IAAI,CAAC;gBACb,CAAC;YACF,CAAC;YACD,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAsB,CAAC,CAAC,aAAa;YAChE,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC;gBAChB,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAC1B,CAAC;YACD,OAAO,IAAI,CAAC;QACb,CAAC;QACD,UAAU;QACV,KAAK;QACL,IAAI;QACJ,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;KACzB,CAAC,CAAC,gBAAgB;AACjC,CAAC,CAAC;AAEF,OAAO,EAAE,MAAM,EAAE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,80 +1,80 @@
|
|
|
1
1
|
{
|
|
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
|
-
|
|
2
|
+
"name": "@peerbit/indexer-sqlite3",
|
|
3
|
+
"version": "1.1.2-1c77281",
|
|
4
|
+
"description": "SQLite index for document store",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"sideEffects": false,
|
|
7
|
+
"types": "./dist/src/index.d.ts",
|
|
8
|
+
"typesVersions": {
|
|
9
|
+
"*": {
|
|
10
|
+
"*": [
|
|
11
|
+
"*",
|
|
12
|
+
"dist/*",
|
|
13
|
+
"dist/src/*",
|
|
14
|
+
"dist/src/*/index"
|
|
15
|
+
],
|
|
16
|
+
"src/*": [
|
|
17
|
+
"*",
|
|
18
|
+
"dist/*",
|
|
19
|
+
"dist/src/*",
|
|
20
|
+
"dist/src/*/index"
|
|
21
|
+
]
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"files": [
|
|
25
|
+
"src",
|
|
26
|
+
"dist",
|
|
27
|
+
"!dist/e2e",
|
|
28
|
+
"!dist/test",
|
|
29
|
+
"!**/*.tsbuildinfo"
|
|
30
|
+
],
|
|
31
|
+
"exports": {
|
|
32
|
+
".": {
|
|
33
|
+
"types": "./dist/src/index.d.ts",
|
|
34
|
+
"import": "./dist/src/index.js"
|
|
35
|
+
},
|
|
36
|
+
"./sqlite.org": {
|
|
37
|
+
"types": "./dist/peerbit/sqlite.org/sqlite3.d.ts",
|
|
38
|
+
"import": "./dist/peerbit/sqlite.org/sqlite3.js"
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
"browser": {
|
|
42
|
+
"./dist/src/sqlite3.js": "./dist/src/sqlite3.browser.js"
|
|
43
|
+
},
|
|
44
|
+
"eslintConfig": {
|
|
45
|
+
"extends": "peerbit",
|
|
46
|
+
"parserOptions": {
|
|
47
|
+
"project": true,
|
|
48
|
+
"sourceType": "module"
|
|
49
|
+
},
|
|
50
|
+
"ignorePatterns": [
|
|
51
|
+
"!.aegir.js",
|
|
52
|
+
"test/ts-use",
|
|
53
|
+
"*.d.ts"
|
|
54
|
+
]
|
|
55
|
+
},
|
|
56
|
+
"publishConfig": {
|
|
57
|
+
"access": "public"
|
|
58
|
+
},
|
|
59
|
+
"scripts": {
|
|
60
|
+
"clean": "aegir clean",
|
|
61
|
+
"copy-sqlite-wasm": "mkdir -p ./dist/peerbit/ && cp -r ../../../../node_modules/@sqlite.org/sqlite-wasm/sqlite-wasm/jswasm/. ./dist/peerbit/",
|
|
62
|
+
"build-worker": "node ../../../../node_modules/esbuild/bin/esbuild --bundle ./src/sqlite3.worker.ts --format=esm --outfile=./dist/peerbit/sqlite3.worker.min.js",
|
|
63
|
+
"build": "aegir build && npm run build-worker && npm run copy-sqlite-wasm",
|
|
64
|
+
"test": "aegir test",
|
|
65
|
+
"test:browser": "aegir clean && aegir test -t browser",
|
|
66
|
+
"test:node": "aegir clean && aegir test -t node",
|
|
67
|
+
"lint": "aegir lint"
|
|
68
|
+
},
|
|
69
|
+
"author": "dao.xyz",
|
|
70
|
+
"license": "MIT",
|
|
71
|
+
"dependencies": {
|
|
72
|
+
"better-sqlite3": "^11.5.0",
|
|
73
|
+
"@peerbit/indexer-interface": "1.1.1-1c77281",
|
|
74
|
+
"@sqlite.org/sqlite-wasm": "^3.47.0-build1"
|
|
75
|
+
},
|
|
76
|
+
"devDependencies": {
|
|
77
|
+
"@types/better-sqlite3": "^7.6.11",
|
|
78
|
+
"@peerbit/indexer-tests": "1.1.1-1c77281"
|
|
79
|
+
}
|
|
80
80
|
}
|
package/src/engine.ts
CHANGED
|
@@ -13,9 +13,11 @@ import {
|
|
|
13
13
|
buildJoin,
|
|
14
14
|
convertCountRequestToQuery,
|
|
15
15
|
convertDeleteRequestToQuery,
|
|
16
|
+
convertFromSQLType,
|
|
16
17
|
convertSearchRequestToQuery,
|
|
17
18
|
/* getTableName, */
|
|
18
19
|
convertSumRequestToQuery,
|
|
20
|
+
convertToSQLType,
|
|
19
21
|
escapeColumnName,
|
|
20
22
|
generateSelectQuery,
|
|
21
23
|
getInlineTableFieldName,
|
|
@@ -251,9 +253,13 @@ export class SQLLiteIndex<T extends Record<string, any>>
|
|
|
251
253
|
table,
|
|
252
254
|
options?.shape,
|
|
253
255
|
);
|
|
254
|
-
const sql = `${generateSelectQuery(table, selects)} ${buildJoin(joinMap, true)} where ${this.primaryKeyString} = ? `;
|
|
256
|
+
const sql = `${generateSelectQuery(table, selects)} ${buildJoin(joinMap, true)} where ${this.primaryKeyString} = ? limit 1`;
|
|
255
257
|
const stmt = await this.properties.db.prepare(sql, sql);
|
|
256
|
-
const rows = await stmt.get([
|
|
258
|
+
const rows = await stmt.get([
|
|
259
|
+
table.primaryField?.from?.type
|
|
260
|
+
? convertToSQLType(id.key, table.primaryField.from.type)
|
|
261
|
+
: id.key,
|
|
262
|
+
]);
|
|
257
263
|
if (!rows) {
|
|
258
264
|
continue;
|
|
259
265
|
}
|
|
@@ -324,12 +330,6 @@ export class SQLLiteIndex<T extends Record<string, any>>
|
|
|
324
330
|
): types.IndexIterator<T, S> {
|
|
325
331
|
// create a sql statement where the offset and the limit id dynamic and can be updated
|
|
326
332
|
// TODO don't use offset but sort and limit 'next' calls by the last value of the sort
|
|
327
|
-
let { sql: sqlFetch, bindable } = convertSearchRequestToQuery(
|
|
328
|
-
request,
|
|
329
|
-
this.tables,
|
|
330
|
-
this._rootTables,
|
|
331
|
-
options?.shape,
|
|
332
|
-
);
|
|
333
333
|
|
|
334
334
|
/* const totalCountKey = "count"; */
|
|
335
335
|
/* const sqlTotalCount = convertCountRequestToQuery(new types.CountRequest({ query: request.query }), this.tables, this.tables.get(this.rootTableName)!)
|
|
@@ -342,11 +342,25 @@ export class SQLLiteIndex<T extends Record<string, any>>
|
|
|
342
342
|
|
|
343
343
|
let stmt: Statement;
|
|
344
344
|
let kept: number | undefined = undefined;
|
|
345
|
+
let bindable: any[] = [];
|
|
346
|
+
let sqlFetch: string | undefined = undefined;
|
|
345
347
|
|
|
346
348
|
/* let totalCount: undefined | number = undefined; */
|
|
347
|
-
const fetch = async (amount: number) => {
|
|
349
|
+
const fetch = async (amount: number | "all") => {
|
|
348
350
|
kept = undefined;
|
|
349
351
|
if (!once) {
|
|
352
|
+
let { sql, bindable: toBind } = convertSearchRequestToQuery(
|
|
353
|
+
request,
|
|
354
|
+
this.tables,
|
|
355
|
+
this._rootTables,
|
|
356
|
+
{
|
|
357
|
+
shape: options?.shape,
|
|
358
|
+
stable: typeof amount === "number", // if we are to fetch all, we dont need stable sorting
|
|
359
|
+
},
|
|
360
|
+
);
|
|
361
|
+
sqlFetch = sql;
|
|
362
|
+
bindable = toBind;
|
|
363
|
+
|
|
350
364
|
stmt = await this.properties.db.prepare(sqlFetch, sqlFetch);
|
|
351
365
|
// stmt.reset?.(); // TODO dont invoke reset if not needed
|
|
352
366
|
/* countStmt.reset?.(); */
|
|
@@ -360,12 +374,11 @@ export class SQLLiteIndex<T extends Record<string, any>>
|
|
|
360
374
|
}
|
|
361
375
|
|
|
362
376
|
once = true;
|
|
363
|
-
const offsetStart = offset;
|
|
364
377
|
|
|
365
378
|
const allResults: Record<string, any>[] = await stmt.all([
|
|
366
379
|
...bindable,
|
|
367
|
-
amount,
|
|
368
|
-
|
|
380
|
+
amount === "all" ? Number.MAX_SAFE_INTEGER : amount,
|
|
381
|
+
offset,
|
|
369
382
|
]);
|
|
370
383
|
|
|
371
384
|
let results: IndexedResult<types.ReturnTypeFromShape<T, S>>[] =
|
|
@@ -389,9 +402,12 @@ export class SQLLiteIndex<T extends Record<string, any>>
|
|
|
389
402
|
return {
|
|
390
403
|
value,
|
|
391
404
|
id: types.toId(
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
405
|
+
convertFromSQLType(
|
|
406
|
+
row[
|
|
407
|
+
getTablePrefixedField(selectedTable, this.primaryKeyString)
|
|
408
|
+
],
|
|
409
|
+
selectedTable.primaryField!.from!.type,
|
|
410
|
+
),
|
|
395
411
|
),
|
|
396
412
|
};
|
|
397
413
|
}),
|
|
@@ -410,7 +426,7 @@ export class SQLLiteIndex<T extends Record<string, any>>
|
|
|
410
426
|
iterator.kept = 0;
|
|
411
427
|
} */
|
|
412
428
|
|
|
413
|
-
if (results.length < amount) {
|
|
429
|
+
if (amount === "all" || results.length < amount) {
|
|
414
430
|
hasMore = false;
|
|
415
431
|
await this.clearupIterator(requestId);
|
|
416
432
|
clearTimeout(iterator.timeout);
|
|
@@ -548,10 +564,12 @@ export class SQLLiteIndex<T extends Record<string, any>>
|
|
|
548
564
|
const stmt = await this.properties.db.prepare(sql, sql);
|
|
549
565
|
const result = await stmt.get(bindable);
|
|
550
566
|
if (result != null) {
|
|
567
|
+
const value = result.sum as number;
|
|
568
|
+
|
|
551
569
|
if (ret == null) {
|
|
552
|
-
|
|
570
|
+
ret = value;
|
|
553
571
|
} else {
|
|
554
|
-
|
|
572
|
+
ret += value;
|
|
555
573
|
}
|
|
556
574
|
once = true;
|
|
557
575
|
}
|
package/src/schema.ts
CHANGED
|
@@ -54,17 +54,27 @@ export type BindableValue =
|
|
|
54
54
|
| ArrayBuffer
|
|
55
55
|
| null;
|
|
56
56
|
|
|
57
|
+
export const u64ToI64 = (u64: bigint | number) => {
|
|
58
|
+
return (typeof u64 === "number" ? BigInt(u64) : u64) - 9223372036854775808n;
|
|
59
|
+
};
|
|
60
|
+
export const i64ToU64 = (i64: number | bigint) =>
|
|
61
|
+
(typeof i64 === "number" ? BigInt(i64) : i64) + 9223372036854775808n;
|
|
62
|
+
|
|
57
63
|
export const convertToSQLType = (
|
|
58
64
|
value: boolean | bigint | string | number | Uint8Array,
|
|
59
65
|
type?: FieldType,
|
|
60
66
|
): BindableValue => {
|
|
61
67
|
// add bigint when https://github.com/TryGhost/node-sqlite3/pull/1501 fixed
|
|
62
68
|
|
|
63
|
-
if (
|
|
64
|
-
if (
|
|
69
|
+
if (value != null) {
|
|
70
|
+
if (type === "bool") {
|
|
65
71
|
return value ? 1 : 0;
|
|
66
72
|
}
|
|
67
|
-
|
|
73
|
+
if (type === "u64") {
|
|
74
|
+
// shift to fit in i64
|
|
75
|
+
|
|
76
|
+
return u64ToI64(value as number | bigint);
|
|
77
|
+
}
|
|
68
78
|
}
|
|
69
79
|
return value as BindableValue;
|
|
70
80
|
};
|
|
@@ -101,9 +111,15 @@ export const convertFromSQLType = (
|
|
|
101
111
|
: nullAsUndefined(value);
|
|
102
112
|
}
|
|
103
113
|
if (type === "u64") {
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
114
|
+
if (typeof value === "number" || typeof value === "bigint") {
|
|
115
|
+
return i64ToU64(value as number | bigint); // TODO is not always value type bigint?
|
|
116
|
+
}
|
|
117
|
+
if (value == null) {
|
|
118
|
+
return nullAsUndefined(value);
|
|
119
|
+
}
|
|
120
|
+
throw new Error(
|
|
121
|
+
`Unexpected value type for value ${value} expected number or bigint for u64 field`,
|
|
122
|
+
);
|
|
107
123
|
}
|
|
108
124
|
return nullAsUndefined(value);
|
|
109
125
|
};
|
|
@@ -145,7 +161,8 @@ export interface Table {
|
|
|
145
161
|
name: string;
|
|
146
162
|
ctor: Constructor<any>;
|
|
147
163
|
primary: string | false;
|
|
148
|
-
primaryIndex: number;
|
|
164
|
+
primaryIndex: number; // can be -1 for nested tables TODO make it more clear
|
|
165
|
+
primaryField?: SQLField; // can be undefined for nested tables TODO make it required
|
|
149
166
|
path: string[];
|
|
150
167
|
parentPath: string[] | undefined; // field path of the parent where this table originates from
|
|
151
168
|
fields: SQLField[];
|
|
@@ -195,6 +212,7 @@ export const getSQLTable = (
|
|
|
195
212
|
ctor,
|
|
196
213
|
parentPath: path,
|
|
197
214
|
path: newPath,
|
|
215
|
+
primaryField: fields.find((x) => x.isPrimary)!,
|
|
198
216
|
primary,
|
|
199
217
|
primaryIndex: fields.findIndex((x) => x.isPrimary),
|
|
200
218
|
children: dependencies,
|
|
@@ -1254,8 +1272,16 @@ export const convertSumRequestToQuery = (
|
|
|
1254
1272
|
tables,
|
|
1255
1273
|
table,
|
|
1256
1274
|
);
|
|
1275
|
+
|
|
1276
|
+
const inlineName = getInlineTableFieldName(request.key);
|
|
1277
|
+
const field = table.fields.find((x) => x.name === inlineName);
|
|
1278
|
+
if (unwrapNestedType(field!.from!.type) === "u64") {
|
|
1279
|
+
throw new Error("Summing is not supported for u64 fields");
|
|
1280
|
+
}
|
|
1281
|
+
const column = `${table.name}.${getInlineTableFieldName(request.key)}`;
|
|
1282
|
+
|
|
1257
1283
|
return {
|
|
1258
|
-
sql: `SELECT SUM(${
|
|
1284
|
+
sql: `SELECT SUM(${column}) as sum FROM ${table.name} ${query}`,
|
|
1259
1285
|
bindable,
|
|
1260
1286
|
};
|
|
1261
1287
|
};
|
|
@@ -1281,7 +1307,10 @@ export const convertSearchRequestToQuery = (
|
|
|
1281
1307
|
request: types.IterateOptions | undefined,
|
|
1282
1308
|
tables: Map<string, Table>,
|
|
1283
1309
|
rootTables: Table[],
|
|
1284
|
-
|
|
1310
|
+
options?: {
|
|
1311
|
+
shape?: types.Shape | undefined;
|
|
1312
|
+
stable?: boolean;
|
|
1313
|
+
},
|
|
1285
1314
|
): { sql: string; bindable: any[] } => {
|
|
1286
1315
|
let unionBuilder = "";
|
|
1287
1316
|
let orderByClause: string = "";
|
|
@@ -1289,7 +1318,7 @@ export const convertSearchRequestToQuery = (
|
|
|
1289
1318
|
let matchedOnce = false;
|
|
1290
1319
|
let lastError: Error | undefined = undefined;
|
|
1291
1320
|
|
|
1292
|
-
const selectsPerTable = selectAllFieldsFromTables(rootTables, shape);
|
|
1321
|
+
const selectsPerTable = selectAllFieldsFromTables(rootTables, options?.shape);
|
|
1293
1322
|
let bindableBuilder: any[] = [];
|
|
1294
1323
|
for (const [i, table] of rootTables.entries()) {
|
|
1295
1324
|
const { selects, joins: joinFromSelect } = selectsPerTable[i];
|
|
@@ -1301,6 +1330,10 @@ export const convertSearchRequestToQuery = (
|
|
|
1301
1330
|
tables,
|
|
1302
1331
|
table,
|
|
1303
1332
|
joinFromSelect,
|
|
1333
|
+
[],
|
|
1334
|
+
{
|
|
1335
|
+
stable: options?.stable,
|
|
1336
|
+
},
|
|
1304
1337
|
);
|
|
1305
1338
|
unionBuilder += `${unionBuilder.length > 0 ? " UNION ALL " : ""} ${selectQuery} ${query}`;
|
|
1306
1339
|
orderByClause =
|
|
@@ -1358,6 +1391,9 @@ const convertRequestToQuery = <
|
|
|
1358
1391
|
table: Table,
|
|
1359
1392
|
extraJoin?: Map<string, JoinTable>,
|
|
1360
1393
|
path: string[] = [],
|
|
1394
|
+
options?: {
|
|
1395
|
+
stable?: boolean;
|
|
1396
|
+
},
|
|
1361
1397
|
): R => {
|
|
1362
1398
|
let whereBuilder = "";
|
|
1363
1399
|
let bindableBuilder: any[] = [];
|
|
@@ -1388,8 +1424,16 @@ const convertRequestToQuery = <
|
|
|
1388
1424
|
}
|
|
1389
1425
|
|
|
1390
1426
|
if (isIterateRequest(request, type)) {
|
|
1391
|
-
|
|
1392
|
-
|
|
1427
|
+
let sort = request?.sort;
|
|
1428
|
+
if (!sort && options?.stable) {
|
|
1429
|
+
sort =
|
|
1430
|
+
table.primary && path.length === 0
|
|
1431
|
+
? [{ key: [table.primary], direction: types.SortDirection.ASC }]
|
|
1432
|
+
: undefined;
|
|
1433
|
+
}
|
|
1434
|
+
|
|
1435
|
+
if (sort) {
|
|
1436
|
+
let sortArr = Array.isArray(sort) ? sort : [sort];
|
|
1393
1437
|
if (sortArr.length > 0) {
|
|
1394
1438
|
orderByBuilder = "";
|
|
1395
1439
|
let once = false;
|
|
@@ -1793,7 +1837,13 @@ const convertStateFieldQuery = (
|
|
|
1793
1837
|
} else {
|
|
1794
1838
|
throw new Error(`Unsupported compare type: ${query.compare}`);
|
|
1795
1839
|
}
|
|
1796
|
-
|
|
1840
|
+
|
|
1841
|
+
if (unwrapNestedType(tableField.from!.type) === "u64") {
|
|
1842
|
+
// shift left because that is how we insert the value
|
|
1843
|
+
bindable.push(u64ToI64(query.value.value));
|
|
1844
|
+
} else {
|
|
1845
|
+
bindable.push(query.value.value);
|
|
1846
|
+
}
|
|
1797
1847
|
}
|
|
1798
1848
|
} else if (query instanceof types.IsNull) {
|
|
1799
1849
|
where = `${keyWithTable} IS NULL`;
|
package/src/sqlite3.ts
CHANGED
|
@@ -40,7 +40,8 @@ let create = async (directory?: string) => {
|
|
|
40
40
|
fileMustExist: false,
|
|
41
41
|
readonly: false /* , verbose: (message) => console.log(message) */,
|
|
42
42
|
});
|
|
43
|
-
|
|
43
|
+
// TODO this test makes things faster, but for benchmarking it might yield wierd results where some runs are faster than others
|
|
44
|
+
db.pragma("journal_mode = WAL");
|
|
44
45
|
db.pragma("foreign_keys = on");
|
|
45
46
|
db.defaultSafeIntegers(true);
|
|
46
47
|
};
|