@naturalcycles/datastore-lib 3.35.2 → 3.36.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.
@@ -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.36.0",
4
4
  "description": "Opinionated library to work with Google Datastore",
5
5
  "scripts": {
6
6
  "prepare": "husky",
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) {