@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 +25 -25
- package/index.mjs +25 -25
- package/package.json +2 -2
- package/types/sql/clauses.d.ts +1 -0
- package/types/sql/getArgSql.d.ts +2 -1
- package/types/sql/getMeta.d.ts +1 -1
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((${
|
|
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((${
|
|
182
|
-
$max: (prop) => sql__default["default"]`max((${
|
|
183
|
-
$min: (prop) => sql__default["default"]`min((${
|
|
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,
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
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
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
const
|
|
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(
|
|
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
|
|
382
|
-
|
|
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
|
|
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((${
|
|
175
|
+
$sum: (prop) => sql`sum((${lookupNumeric(prop)})::numeric)`,
|
|
172
176
|
$card: (prop) => sql`count(distinct(${lookup(prop)}))`,
|
|
173
|
-
$avg: (prop) => sql`avg((${
|
|
174
|
-
$max: (prop) => sql`max((${
|
|
175
|
-
$min: (prop) => sql`min((${
|
|
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,
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
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
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
const
|
|
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(
|
|
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
|
|
374
|
-
|
|
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
|
|
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
|
|
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
|
|
19
|
+
"@graffy/common": "0.15.24",
|
|
20
20
|
"sql-template-tag": "^4.1.0",
|
|
21
21
|
"debug": "^4.3.3"
|
|
22
22
|
},
|
package/types/sql/clauses.d.ts
CHANGED
|
@@ -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;
|
package/types/sql/getArgSql.d.ts
CHANGED
|
@@ -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[];
|
package/types/sql/getMeta.d.ts
CHANGED
|
@@ -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,
|
|
10
|
+
export function getAggMeta(key: any, { verDefault }: {
|
|
11
11
|
verDefault: any;
|
|
12
12
|
}): import("sql-template-tag").Sql;
|