@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.
@@ -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,sCAAsC;QACtC,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"}
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
- "name": "@peerbit/indexer-sqlite3",
3
- "version": "1.1.1",
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.3.0",
73
- "@peerbit/indexer-interface": "^1.1.1",
74
- "@sqlite.org/sqlite-wasm": "^3.46.1-build3"
75
- },
76
- "devDependencies": {
77
- "@types/better-sqlite3": "^7.6.11",
78
- "@peerbit/indexer-tests": "^1.1.1"
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([id.key]);
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
- offsetStart,
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
- row[
393
- getTablePrefixedField(selectedTable, this.primaryKeyString)
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
- (ret as any) = result.sum as number;
570
+ ret = value;
553
571
  } else {
554
- (ret as any) += result.sum as number;
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 (type === "bool") {
64
- if (value != null) {
69
+ if (value != null) {
70
+ if (type === "bool") {
65
71
  return value ? 1 : 0;
66
72
  }
67
- return null;
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
- return typeof value === "number" || typeof value === "string"
105
- ? BigInt(value)
106
- : nullAsUndefined(value);
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(${table.name}.${getInlineTableFieldName(request.key)}) as sum FROM ${table.name} ${query}`,
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
- shape: types.Shape | undefined,
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
- if (request?.sort) {
1392
- let sortArr = Array.isArray(request.sort) ? request.sort : [request.sort];
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
- bindable.push(query.value.value);
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
- /* db.pragma('journal_mode = WAL'); */
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
  };