@naturalcycles/datastore-lib 3.35.2 → 3.37.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.
@@ -66,7 +66,7 @@ export declare class DatastoreDBTransaction implements DBTransaction {
66
66
  tx: Transaction;
67
67
  constructor(db: DatastoreDB, tx: Transaction);
68
68
  rollback(): Promise<void>;
69
- getByIds<ROW extends ObjectWithId>(table: string, ids: string[], opt?: CommonDBOptions | undefined): Promise<ROW[]>;
70
- saveBatch<ROW extends ObjectWithId>(table: string, rows: ROW[], opt?: CommonDBSaveOptions<ROW> | undefined): Promise<void>;
71
- deleteByIds(table: string, ids: string[], opt?: CommonDBOptions | undefined): Promise<number>;
69
+ getByIds<ROW extends ObjectWithId>(table: string, ids: string[], opt?: CommonDBOptions): Promise<ROW[]>;
70
+ saveBatch<ROW extends ObjectWithId>(table: string, rows: ROW[], opt?: CommonDBSaveOptions<ROW>): Promise<void>;
71
+ deleteByIds(table: string, ids: string[], opt?: CommonDBOptions): Promise<number>;
72
72
  }
@@ -17,4 +17,5 @@ export declare class DatastoreKeyValueDB implements CommonKeyValueDB {
17
17
  streamValues(table: string, limit?: number): ReadableTyped<Buffer>;
18
18
  streamEntries(table: string, limit?: number): ReadableTyped<KeyValueDBTuple>;
19
19
  count(table: string): Promise<number>;
20
+ increment(_table: string, _id: string, _by?: number): Promise<number>;
20
21
  }
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.DatastoreKeyValueDB = void 0;
4
4
  const db_lib_1 = require("@naturalcycles/db-lib");
5
+ const js_lib_1 = require("@naturalcycles/js-lib");
5
6
  const datastore_db_1 = require("./datastore.db");
6
7
  const excludeFromIndexes = ['v'];
7
8
  class DatastoreKeyValueDB {
@@ -52,5 +53,8 @@ class DatastoreKeyValueDB {
52
53
  const q = db_lib_1.DBQuery.create(table);
53
54
  return await this.db.runQueryCount(q);
54
55
  }
56
+ async increment(_table, _id, _by) {
57
+ throw new js_lib_1.AppError('DatastoreKeyValueDB.increment() is not implemented');
58
+ }
55
59
  }
56
60
  exports.DatastoreKeyValueDB = DatastoreKeyValueDB;
@@ -13,16 +13,25 @@ const OP_MAP = {
13
13
  function dbQueryToDatastoreQuery(dbQuery, emptyQuery) {
14
14
  let q = emptyQuery;
15
15
  // filter
16
- // eslint-disable-next-line unicorn/no-array-reduce
17
- q = dbQuery._filters.reduce(
18
- // keeping "previous syntax" commented out
19
- // (q, f) => q.filter(f.name as string, OP_MAP[f.op] || (f.op as any), f.val),
20
- (q, f) => q.filter(new datastore_1.PropertyFilter(f.name, OP_MAP[f.op] || f.op, f.val)), q);
16
+ for (const f of dbQuery._filters) {
17
+ // keeping "previous syntax" commented out
18
+ // (q, f) => q.filter(f.name as string, OP_MAP[f.op] || (f.op as any), f.val),
19
+ // Datastore doesn't allow `undefined` as filter value.
20
+ // We don't want to throw on it, so instead we'll replace it with valid value of `null`.
21
+ // `a > null` will return anything that's indexed
22
+ // `a < null` should return nothing
23
+ // `a == null` will return just that - rows with null values
24
+ let { op, val } = f;
25
+ if (val === undefined)
26
+ val = null;
27
+ q = q.filter(new datastore_1.PropertyFilter(f.name, OP_MAP[op] || op, val));
28
+ }
21
29
  // limit
22
30
  q = q.limit(dbQuery._limitValue || 0);
23
31
  // order
24
- // eslint-disable-next-line unicorn/no-array-reduce
25
- q = dbQuery._orders.reduce((q, ord) => q.order(ord.name, { descending: ord.descending }), q);
32
+ for (const ord of dbQuery._orders) {
33
+ q = q.order(ord.name, { descending: ord.descending });
34
+ }
26
35
  // select
27
36
  if (dbQuery._selectedFieldNames) {
28
37
  const fields = dbQuery._selectedFieldNames.map(f => FNAME_MAP[f] || f);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@naturalcycles/datastore-lib",
3
- "version": "3.35.2",
3
+ "version": "3.37.0",
4
4
  "description": "Opinionated library to work with Google Datastore",
5
5
  "scripts": {
6
6
  "prepare": "husky",
@@ -571,7 +571,7 @@ export class DatastoreDBTransaction implements DBTransaction {
571
571
  async getByIds<ROW extends ObjectWithId>(
572
572
  table: string,
573
573
  ids: string[],
574
- opt?: CommonDBOptions | undefined,
574
+ opt?: CommonDBOptions,
575
575
  ): Promise<ROW[]> {
576
576
  return await this.db.getByIds(table, ids, { ...opt, tx: this })
577
577
  }
@@ -579,16 +579,12 @@ export class DatastoreDBTransaction implements DBTransaction {
579
579
  async saveBatch<ROW extends ObjectWithId>(
580
580
  table: string,
581
581
  rows: ROW[],
582
- opt?: CommonDBSaveOptions<ROW> | undefined,
582
+ opt?: CommonDBSaveOptions<ROW>,
583
583
  ): Promise<void> {
584
584
  await this.db.saveBatch(table, rows, { ...opt, tx: this })
585
585
  }
586
586
 
587
- async deleteByIds(
588
- table: string,
589
- ids: string[],
590
- opt?: CommonDBOptions | undefined,
591
- ): Promise<number> {
587
+ async deleteByIds(table: string, ids: string[], opt?: CommonDBOptions): Promise<number> {
592
588
  return await this.db.deleteByIds(table, ids, { ...opt, tx: this })
593
589
  }
594
590
  }
@@ -1,4 +1,5 @@
1
1
  import { CommonKeyValueDB, DBQuery, KeyValueDBTuple } from '@naturalcycles/db-lib'
2
+ import { AppError } from '@naturalcycles/js-lib'
2
3
  import { ReadableTyped } from '@naturalcycles/nodejs-lib'
3
4
  import { DatastoreDB } from './datastore.db'
4
5
  import { DatastoreDBCfg } from './datastore.model'
@@ -83,4 +84,8 @@ export class DatastoreKeyValueDB implements CommonKeyValueDB {
83
84
  const q = DBQuery.create<KVObject>(table)
84
85
  return await this.db.runQueryCount(q)
85
86
  }
87
+
88
+ async increment(_table: string, _id: string, _by?: number): Promise<number> {
89
+ throw new AppError('DatastoreKeyValueDB.increment() is not implemented')
90
+ }
86
91
  }
package/src/query.util.ts CHANGED
@@ -19,23 +19,27 @@ export function dbQueryToDatastoreQuery<ROW extends ObjectWithId>(
19
19
  let q = emptyQuery
20
20
 
21
21
  // filter
22
- // eslint-disable-next-line unicorn/no-array-reduce
23
- q = dbQuery._filters.reduce(
22
+ for (const f of dbQuery._filters) {
24
23
  // keeping "previous syntax" commented out
25
24
  // (q, f) => q.filter(f.name as string, OP_MAP[f.op] || (f.op as any), f.val),
26
- (q, f) => q.filter(new PropertyFilter(f.name as string, OP_MAP[f.op] || (f.op as any), f.val)),
27
- q,
28
- )
25
+
26
+ // Datastore doesn't allow `undefined` as filter value.
27
+ // We don't want to throw on it, so instead we'll replace it with valid value of `null`.
28
+ // `a > null` will return anything that's indexed
29
+ // `a < null` should return nothing
30
+ // `a == null` will return just that - rows with null values
31
+ let { op, val } = f
32
+ if (val === undefined) val = null
33
+ q = q.filter(new PropertyFilter(f.name as string, OP_MAP[op] || (op as any), val))
34
+ }
29
35
 
30
36
  // limit
31
37
  q = q.limit(dbQuery._limitValue || 0)
32
38
 
33
39
  // order
34
- // eslint-disable-next-line unicorn/no-array-reduce
35
- q = dbQuery._orders.reduce(
36
- (q, ord) => q.order(ord.name as string, { descending: ord.descending }),
37
- q,
38
- )
40
+ for (const ord of dbQuery._orders) {
41
+ q = q.order(ord.name as string, { descending: ord.descending })
42
+ }
39
43
 
40
44
  // select
41
45
  if (dbQuery._selectedFieldNames) {