@graffy/pg 0.15.24-alpha.1 → 0.15.24

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/index.cjs CHANGED
@@ -175,12 +175,16 @@ const lookup = (prop) => {
175
175
  const [prefix, ...suffix] = common.encodePath(prop);
176
176
  return suffix.length ? sql__default["default"]`"${sql.raw(prefix)}" #> ${suffix}` : sql__default["default"]`"${sql.raw(prefix)}"`;
177
177
  };
178
+ const lookupNumeric = (prop) => {
179
+ const [prefix, ...suffix] = common.encodePath(prop);
180
+ return suffix.length ? sql__default["default"]`CASE WHEN "${sql.raw(prefix)}" #> ${suffix} = 'null'::jsonb THEN 0 ELSE ("${sql.raw(prefix)}" #> ${suffix})::numeric END` : sql__default["default"]`"${sql.raw(prefix)}"`;
181
+ };
178
182
  const aggSql = {
179
- $sum: (prop) => sql__default["default"]`sum((${lookup(prop)})::numeric)`,
183
+ $sum: (prop) => sql__default["default"]`sum((${lookupNumeric(prop)})::numeric)`,
180
184
  $card: (prop) => sql__default["default"]`count(distinct(${lookup(prop)}))`,
181
- $avg: (prop) => sql__default["default"]`avg((${lookup(prop)})::numeric)`,
182
- $max: (prop) => sql__default["default"]`max((${lookup(prop)})::numeric)`,
183
- $min: (prop) => sql__default["default"]`min((${lookup(prop)})::numeric)`
185
+ $avg: (prop) => sql__default["default"]`avg((${lookupNumeric(prop)})::numeric)`,
186
+ $max: (prop) => sql__default["default"]`max((${lookupNumeric(prop)})::numeric)`,
187
+ $min: (prop) => sql__default["default"]`min((${lookupNumeric(prop)})::numeric)`
184
188
  };
185
189
  const getSelectCols = (table, projection = null) => {
186
190
  if (!projection)
@@ -346,44 +350,40 @@ const getArgMeta = (key, { prefix, idCol, verDefault }) => getJsonBuildTrusted({
346
350
  $ref: sql__default["default"]`jsonb_build_array(${sql.join(prefix.map((k) => sql__default["default"]`${k}::text`))}, "${sql.raw(idCol)}")`,
347
351
  $ver: sql.raw(verDefault)
348
352
  });
349
- const getAggMeta = (key, $group, { verDefault }) => {
350
- let $key = sql.join([key, getJsonBuildTrusted({ $group })].filter(Boolean), " || ");
351
- return getJsonBuildTrusted({
352
- $key,
353
- $ver: sql.raw(verDefault)
354
- });
355
- };
353
+ const getAggMeta = (key, { verDefault }) => getJsonBuildTrusted({
354
+ $key: key,
355
+ $ver: sql.raw(verDefault)
356
+ });
356
357
  function getArgSql(_a, options) {
357
358
  var _b = _a, { $first, $last, $after, $before, $since, $until, $all, $cursor: _ } = _b, rest = __objRest(_b, ["$first", "$last", "$after", "$before", "$since", "$until", "$all", "$cursor"]);
358
359
  const _a2 = rest, { $order, $group } = _a2, filter = __objRest(_a2, ["$order", "$group"]);
359
360
  const { prefix, idCol } = options;
361
+ const meta = (key2) => $group ? getAggMeta(key2, options) : getArgMeta(key2, options);
362
+ const hasRangeArg = $before || $after || $since || $until || $first || $last || $all;
360
363
  if ($order && $group) {
361
364
  throw Error("pg_arg.order_and_group_unsupported in " + prefix);
362
365
  }
363
- const meta = (key2) => $group ? getAggMeta(key2, $group, options) : getArgMeta(key2, options);
364
- const groupCols = Array.isArray($group) && $group.length && $group.map(lookup);
365
- const group = groupCols ? sql.join(groupCols, ", ") : void 0;
366
- const hasRangeArg = $before || $after || $since || $until || $first || $last || $all || $order;
367
- let filterKey;
366
+ if (($order || $group && $group !== true) && !hasRangeArg) {
367
+ throw Error("pg_arg.range_arg_expected in " + prefix);
368
+ }
369
+ const baseKey = sql__default["default"]`${JSON.stringify(rest)}::jsonb`;
368
370
  const where = [];
369
- if (!common.isEmpty(filter)) {
371
+ if (!common.isEmpty(filter))
370
372
  where.push(getSql(filter, options));
371
- filterKey = sql__default["default"]`${JSON.stringify(filter)}::jsonb`;
372
- }
373
373
  if (!hasRangeArg)
374
- return { meta: meta(filterKey), where, group, limit: 1 };
374
+ return { meta: meta(baseKey), where, limit: 1 };
375
+ const groupCols = Array.isArray($group) && $group.length && $group.map(lookup);
376
+ const group = groupCols ? sql.join(groupCols, ", ") : void 0;
375
377
  const orderCols = ($order || [idCol]).map((orderItem) => orderItem[0] === "!" ? sql__default["default"]`-(${lookup(orderItem.slice(1))})::float8` : lookup(orderItem));
376
378
  Object.entries({ $after, $before, $since, $until }).forEach(([name, value]) => {
377
379
  if (value)
378
380
  where.push(getBoundCond(orderCols, value, name));
379
381
  });
380
382
  const order = !$group && sql.join(($order || [idCol]).map((orderItem) => orderItem[0] === "!" ? sql__default["default"]`${lookup(orderItem.slice(1))} ${$last ? sql__default["default"]`ASC` : sql__default["default"]`DESC`}` : sql__default["default"]`${lookup(orderItem)} ${$last ? sql__default["default"]`DESC` : sql__default["default"]`ASC`}`), `, `);
381
- const orderKey = $order && getJsonBuildTrusted({ $order: sql__default["default"]`${JSON.stringify($order)}::jsonb` });
382
- const cursorKey = $group !== true && getJsonBuildTrusted({
383
- $cursor: sql__default["default"]`jsonb_build_array(${sql.join(groupCols || orderCols)})`
383
+ const cursorKey = getJsonBuildTrusted({
384
+ $cursor: $group === true ? sql__default["default"]`''` : sql__default["default"]`jsonb_build_array(${sql.join(groupCols || orderCols)})`
384
385
  });
385
- const keys = [filterKey, orderKey, cursorKey].filter(Boolean);
386
- const key = keys.length > 0 ? sql__default["default"]`(${sql.join(keys, ` || `)})` : void 0;
386
+ const key = sql__default["default"]`(${baseKey} || ${cursorKey})`;
387
387
  return {
388
388
  meta: meta(key),
389
389
  where,
package/index.mjs CHANGED
@@ -167,12 +167,16 @@ const lookup = (prop) => {
167
167
  const [prefix, ...suffix] = encodePath(prop);
168
168
  return suffix.length ? sql`"${raw(prefix)}" #> ${suffix}` : sql`"${raw(prefix)}"`;
169
169
  };
170
+ const lookupNumeric = (prop) => {
171
+ const [prefix, ...suffix] = encodePath(prop);
172
+ return suffix.length ? sql`CASE WHEN "${raw(prefix)}" #> ${suffix} = 'null'::jsonb THEN 0 ELSE ("${raw(prefix)}" #> ${suffix})::numeric END` : sql`"${raw(prefix)}"`;
173
+ };
170
174
  const aggSql = {
171
- $sum: (prop) => sql`sum((${lookup(prop)})::numeric)`,
175
+ $sum: (prop) => sql`sum((${lookupNumeric(prop)})::numeric)`,
172
176
  $card: (prop) => sql`count(distinct(${lookup(prop)}))`,
173
- $avg: (prop) => sql`avg((${lookup(prop)})::numeric)`,
174
- $max: (prop) => sql`max((${lookup(prop)})::numeric)`,
175
- $min: (prop) => sql`min((${lookup(prop)})::numeric)`
177
+ $avg: (prop) => sql`avg((${lookupNumeric(prop)})::numeric)`,
178
+ $max: (prop) => sql`max((${lookupNumeric(prop)})::numeric)`,
179
+ $min: (prop) => sql`min((${lookupNumeric(prop)})::numeric)`
176
180
  };
177
181
  const getSelectCols = (table, projection = null) => {
178
182
  if (!projection)
@@ -338,44 +342,40 @@ const getArgMeta = (key, { prefix, idCol, verDefault }) => getJsonBuildTrusted({
338
342
  $ref: sql`jsonb_build_array(${join(prefix.map((k) => sql`${k}::text`))}, "${raw(idCol)}")`,
339
343
  $ver: raw(verDefault)
340
344
  });
341
- const getAggMeta = (key, $group, { verDefault }) => {
342
- let $key = join([key, getJsonBuildTrusted({ $group })].filter(Boolean), " || ");
343
- return getJsonBuildTrusted({
344
- $key,
345
- $ver: raw(verDefault)
346
- });
347
- };
345
+ const getAggMeta = (key, { verDefault }) => getJsonBuildTrusted({
346
+ $key: key,
347
+ $ver: raw(verDefault)
348
+ });
348
349
  function getArgSql(_a, options) {
349
350
  var _b = _a, { $first, $last, $after, $before, $since, $until, $all, $cursor: _ } = _b, rest = __objRest(_b, ["$first", "$last", "$after", "$before", "$since", "$until", "$all", "$cursor"]);
350
351
  const _a2 = rest, { $order, $group } = _a2, filter = __objRest(_a2, ["$order", "$group"]);
351
352
  const { prefix, idCol } = options;
353
+ const meta = (key2) => $group ? getAggMeta(key2, options) : getArgMeta(key2, options);
354
+ const hasRangeArg = $before || $after || $since || $until || $first || $last || $all;
352
355
  if ($order && $group) {
353
356
  throw Error("pg_arg.order_and_group_unsupported in " + prefix);
354
357
  }
355
- const meta = (key2) => $group ? getAggMeta(key2, $group, options) : getArgMeta(key2, options);
356
- const groupCols = Array.isArray($group) && $group.length && $group.map(lookup);
357
- const group = groupCols ? join(groupCols, ", ") : void 0;
358
- const hasRangeArg = $before || $after || $since || $until || $first || $last || $all || $order;
359
- let filterKey;
358
+ if (($order || $group && $group !== true) && !hasRangeArg) {
359
+ throw Error("pg_arg.range_arg_expected in " + prefix);
360
+ }
361
+ const baseKey = sql`${JSON.stringify(rest)}::jsonb`;
360
362
  const where = [];
361
- if (!isEmpty(filter)) {
363
+ if (!isEmpty(filter))
362
364
  where.push(getSql(filter, options));
363
- filterKey = sql`${JSON.stringify(filter)}::jsonb`;
364
- }
365
365
  if (!hasRangeArg)
366
- return { meta: meta(filterKey), where, group, limit: 1 };
366
+ return { meta: meta(baseKey), where, limit: 1 };
367
+ const groupCols = Array.isArray($group) && $group.length && $group.map(lookup);
368
+ const group = groupCols ? join(groupCols, ", ") : void 0;
367
369
  const orderCols = ($order || [idCol]).map((orderItem) => orderItem[0] === "!" ? sql`-(${lookup(orderItem.slice(1))})::float8` : lookup(orderItem));
368
370
  Object.entries({ $after, $before, $since, $until }).forEach(([name, value]) => {
369
371
  if (value)
370
372
  where.push(getBoundCond(orderCols, value, name));
371
373
  });
372
374
  const order = !$group && join(($order || [idCol]).map((orderItem) => orderItem[0] === "!" ? sql`${lookup(orderItem.slice(1))} ${$last ? sql`ASC` : sql`DESC`}` : sql`${lookup(orderItem)} ${$last ? sql`DESC` : sql`ASC`}`), `, `);
373
- const orderKey = $order && getJsonBuildTrusted({ $order: sql`${JSON.stringify($order)}::jsonb` });
374
- const cursorKey = $group !== true && getJsonBuildTrusted({
375
- $cursor: sql`jsonb_build_array(${join(groupCols || orderCols)})`
375
+ const cursorKey = getJsonBuildTrusted({
376
+ $cursor: $group === true ? sql`''` : sql`jsonb_build_array(${join(groupCols || orderCols)})`
376
377
  });
377
- const keys = [filterKey, orderKey, cursorKey].filter(Boolean);
378
- const key = keys.length > 0 ? sql`(${join(keys, ` || `)})` : void 0;
378
+ const key = sql`(${baseKey} || ${cursorKey})`;
379
379
  return {
380
380
  meta: meta(key),
381
381
  where,
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@graffy/pg",
3
3
  "description": "The standard Postgres module for Graffy. Each instance this module mounts a Postgres table as a Graffy subtree.",
4
4
  "author": "aravind (https://github.com/aravindet)",
5
- "version": "0.15.24-alpha.1",
5
+ "version": "0.15.24",
6
6
  "main": "./index.cjs",
7
7
  "exports": {
8
8
  "import": "./index.mjs",
@@ -16,7 +16,7 @@
16
16
  },
17
17
  "license": "Apache-2.0",
18
18
  "dependencies": {
19
- "@graffy/common": "0.15.24-alpha.1",
19
+ "@graffy/common": "0.15.24",
20
20
  "sql-template-tag": "^4.1.0",
21
21
  "debug": "^4.3.3"
22
22
  },
@@ -1,6 +1,7 @@
1
1
  export function cubeLiteralSql(value: any): Sql;
2
2
  export function getJsonBuildTrusted(variadic: any): Sql;
3
3
  export function lookup(prop: any): Sql;
4
+ export function lookupNumeric(prop: any): Sql;
4
5
  export function getSelectCols(table: any, projection?: any): Sql;
5
6
  export function getInsert(row: any, options: any): {
6
7
  cols: Sql;
@@ -2,7 +2,7 @@
2
2
  Uses the args object (typically passed in the $key attribute)
3
3
 
4
4
  @param {object} args
5
- @param {{prefix: string, idCol: string}} options
5
+ @param {{prefix: string, idCol: string, verDefault: string}} options
6
6
 
7
7
  @typedef { import('sql-template-tag').Sql } Sql
8
8
  @return {{ meta: Sql, where: Sql[], order?: Sql, group?: Sql, limit: number }}
@@ -10,6 +10,7 @@
10
10
  export default function getArgSql({ $first, $last, $after, $before, $since, $until, $all, $cursor: _, ...rest }: object, options: {
11
11
  prefix: string;
12
12
  idCol: string;
13
+ verDefault: string;
13
14
  }): {
14
15
  meta: Sql;
15
16
  where: Sql[];
@@ -7,6 +7,6 @@ export function getArgMeta(key: any, { prefix, idCol, verDefault }: {
7
7
  idCol: any;
8
8
  verDefault: any;
9
9
  }): import("sql-template-tag").Sql;
10
- export function getAggMeta(key: any, $group: any, { verDefault }: {
10
+ export function getAggMeta(key: any, { verDefault }: {
11
11
  verDefault: any;
12
12
  }): import("sql-template-tag").Sql;