imodel-pg 0.16.1 → 0.19.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.
- package/index.d.mts +1 -1
- package/index.mjs +75 -74
- package/package.json +1 -1
package/index.d.mts
CHANGED
package/index.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* imodel v0.
|
|
2
|
+
* imodel v0.19.0
|
|
3
3
|
* (c) 2019-2026 undefined
|
|
4
4
|
* @license undefined
|
|
5
5
|
*/
|
|
@@ -66,7 +66,6 @@ function getBaseType(s, {
|
|
|
66
66
|
case 'ip':
|
|
67
67
|
case 'ipv4':
|
|
68
68
|
case 'ipv6':
|
|
69
|
-
return 'cidr';
|
|
70
69
|
case 'ipnet':
|
|
71
70
|
case 'ipnetv4':
|
|
72
71
|
case 'ipnetv6':
|
|
@@ -503,6 +502,41 @@ function getSelect(table, select) {
|
|
|
503
502
|
return Sql`, `.glue(...selectList);
|
|
504
503
|
}
|
|
505
504
|
|
|
505
|
+
/** @import { DBColumn, Environment, FindArg, SelectItem } from 'imodel' */
|
|
506
|
+
/**
|
|
507
|
+
*
|
|
508
|
+
* @param {Environment} env
|
|
509
|
+
* @param {SelectItem[]} selectList
|
|
510
|
+
* @returns {Sql?}
|
|
511
|
+
*/
|
|
512
|
+
function buildSelect(env, selectList) {
|
|
513
|
+
/** @type {Sql[]} */
|
|
514
|
+
const list = [];
|
|
515
|
+
for (const {
|
|
516
|
+
distinct,
|
|
517
|
+
table,
|
|
518
|
+
columns,
|
|
519
|
+
select,
|
|
520
|
+
where,
|
|
521
|
+
sort,
|
|
522
|
+
offset,
|
|
523
|
+
limit,
|
|
524
|
+
group,
|
|
525
|
+
having
|
|
526
|
+
} of selectList) {
|
|
527
|
+
const Table = Sql.Table(table);
|
|
528
|
+
const selectSql = getSelect(Table, select);
|
|
529
|
+
const orderSql = getOrder(sort);
|
|
530
|
+
const limitSql = limit && limit > 0 ? Sql('LIMIT', limit) : undefined;
|
|
531
|
+
const offsetSql = offset && offset > 0 ? Sql('OFFSET', offset) : undefined;
|
|
532
|
+
list.push(Sql(Sql`SELECT`, distinct ? Sql`DISTINCT` : undefined, Sql`${selectSql}`, Sql`FROM ${Table}`, getWhere(env, where), orderSql, limitSql, offsetSql, group?.length ? Sql`GROUP BY ${Sql`,`.glue(group.map(v => Sql.Field(v)))}` : undefined, getWhere(env, having, 'HAVING')));
|
|
533
|
+
}
|
|
534
|
+
if (!list.length) {
|
|
535
|
+
return null;
|
|
536
|
+
}
|
|
537
|
+
return list.length === 1 && list[0] || Sql`UNION`.glue(list);
|
|
538
|
+
}
|
|
539
|
+
|
|
506
540
|
/** @import { Environment, WhereValue } from 'imodel' */
|
|
507
541
|
/**
|
|
508
542
|
*
|
|
@@ -527,7 +561,7 @@ function toField(k) {
|
|
|
527
561
|
* @param {WhereValue[]?} [wheres]
|
|
528
562
|
* @returns {Sql | undefined}
|
|
529
563
|
*/
|
|
530
|
-
function
|
|
564
|
+
function buildWhere(env, wheres) {
|
|
531
565
|
if (!wheres?.length) {
|
|
532
566
|
return;
|
|
533
567
|
}
|
|
@@ -569,14 +603,14 @@ function getWhere2(env, wheres) {
|
|
|
569
603
|
const {
|
|
570
604
|
field: k,
|
|
571
605
|
operator: o,
|
|
572
|
-
value: v
|
|
606
|
+
value: v,
|
|
607
|
+
subquery
|
|
573
608
|
} = where;
|
|
574
609
|
if (Array.isArray(k)) {
|
|
575
610
|
let {
|
|
576
611
|
not
|
|
577
612
|
} = where;
|
|
578
613
|
const column = Sql`(${Sql`,`.glue(k.map(toField))})`;
|
|
579
|
-
let values = v;
|
|
580
614
|
switch (o?.toUpperCase().replaceAll('_', '').replaceAll(' ', '')) {
|
|
581
615
|
case 'NOTIN':
|
|
582
616
|
case 'NOT':
|
|
@@ -585,7 +619,15 @@ function getWhere2(env, wheres) {
|
|
|
585
619
|
not = !not;
|
|
586
620
|
break;
|
|
587
621
|
}
|
|
588
|
-
|
|
622
|
+
if (subquery?.length) {
|
|
623
|
+
const select = buildSelect(env, subquery);
|
|
624
|
+
if (!select) {
|
|
625
|
+
return null;
|
|
626
|
+
}
|
|
627
|
+
const value = Sql`(${select})`;
|
|
628
|
+
return Sql`${column} ${Sql(not ? `NOT IN` : `IN`)} ${value}`;
|
|
629
|
+
}
|
|
630
|
+
const values = Array.isArray(v) ? Sql`(${Sql`,`.glue(v.map(v => Sql`(${Array.isArray(v) && v.length ? Sql(['', ...Array(v.length - 1).fill(','), ''], ...v.map(v => v ?? null)) : v ?? null})`))})` : Sql`(${v ?? null})`;
|
|
589
631
|
return Sql`${column} ${Sql(not ? `NOT IN` : `IN`)} ${values}`;
|
|
590
632
|
}
|
|
591
633
|
let {
|
|
@@ -639,7 +681,13 @@ function getWhere2(env, wheres) {
|
|
|
639
681
|
break;
|
|
640
682
|
}
|
|
641
683
|
}
|
|
642
|
-
if (
|
|
684
|
+
if (subquery?.length) {
|
|
685
|
+
const select = buildSelect(env, subquery);
|
|
686
|
+
if (!select) {
|
|
687
|
+
return null;
|
|
688
|
+
}
|
|
689
|
+
values = Sql`(${select})`;
|
|
690
|
+
} else if ((values ?? null) === null) {
|
|
643
691
|
values = Sql`null`;
|
|
644
692
|
if (operator === '=') {
|
|
645
693
|
operator = 'IS';
|
|
@@ -665,7 +713,7 @@ function getWhere2(env, wheres) {
|
|
|
665
713
|
break;
|
|
666
714
|
}
|
|
667
715
|
}
|
|
668
|
-
if (Array.isArray(v) && (operator === 'IN' || operator === 'NOT IN') && v.length) {
|
|
716
|
+
if (!subquery?.length && Array.isArray(v) && (operator === 'IN' || operator === 'NOT IN') && v.length) {
|
|
669
717
|
values = Sql(['(', ...Array(v.length - 1).fill(','), ')'], ...v.map(v => v ?? null));
|
|
670
718
|
}
|
|
671
719
|
if (!not) {
|
|
@@ -688,37 +736,13 @@ function getWhere2(env, wheres) {
|
|
|
688
736
|
* @returns {Sql | undefined}
|
|
689
737
|
*/
|
|
690
738
|
function getWhere(env, where, key = 'WHERE') {
|
|
691
|
-
const andList =
|
|
739
|
+
const andList = buildWhere(env, where);
|
|
692
740
|
if (!andList) {
|
|
693
741
|
return;
|
|
694
742
|
}
|
|
695
743
|
return Sql`${Sql(key)} ${andList}`;
|
|
696
744
|
}
|
|
697
745
|
|
|
698
|
-
/** @import { DBColumn, Environment, FindArg } from 'imodel' */
|
|
699
|
-
/**
|
|
700
|
-
*
|
|
701
|
-
* @param {Environment} env
|
|
702
|
-
* @param {string} table
|
|
703
|
-
* @param {Record<string, DBColumn>} columns
|
|
704
|
-
* @param {FindArg} param1
|
|
705
|
-
* @returns {Sql}
|
|
706
|
-
*/
|
|
707
|
-
function selectSql(env, table, columns, {
|
|
708
|
-
select,
|
|
709
|
-
where,
|
|
710
|
-
sort,
|
|
711
|
-
offset,
|
|
712
|
-
limit
|
|
713
|
-
}) {
|
|
714
|
-
const Table = Sql.Table(table);
|
|
715
|
-
const selectSql = getSelect(Table, select);
|
|
716
|
-
const orderSql = getOrder(sort);
|
|
717
|
-
const limitSql = limit && limit > 0 ? Sql('LIMIT', limit) : undefined;
|
|
718
|
-
const offsetSql = offset && offset > 0 ? Sql('OFFSET', offset) : undefined;
|
|
719
|
-
return Sql(Sql`SELECT ${selectSql} FROM ${Table}`, getWhere(env, where), orderSql, limitSql, offsetSql);
|
|
720
|
-
}
|
|
721
|
-
|
|
722
746
|
/** @import { Environment, DBColumn, WhereValue } from 'imodel' */
|
|
723
747
|
/**
|
|
724
748
|
*
|
|
@@ -949,7 +973,7 @@ FROM (values${Sql`,`.glue(list.map(data => Sql`(${Sql`,`.glue(dataFieldType.map(
|
|
|
949
973
|
}
|
|
950
974
|
return Sql(t, data[f] ?? null);
|
|
951
975
|
}))})`))}) as ${tmpId}(${Sql`,`.glue(dataFields.map(f => Sql.Field(f)))})
|
|
952
|
-
WHERE ${Sql`AND`.glue([pKeys.map(f => Sql`${main.field(f)}=${tmp.field(f)}`),
|
|
976
|
+
WHERE ${Sql`AND`.glue([pKeys.map(f => Sql`${main.field(f)}=${tmp.field(f)}`), buildWhere(env, where)].flat().filter(Boolean))}${returnSql}`;
|
|
953
977
|
}
|
|
954
978
|
|
|
955
979
|
const defaultSchema = Sql`(SELECT (current_schemas(false))[1])`;
|
|
@@ -1652,37 +1676,6 @@ async function syncTables(env, query, tables, schema) {
|
|
|
1652
1676
|
}
|
|
1653
1677
|
}
|
|
1654
1678
|
|
|
1655
|
-
/** @import { DBColumn, Environment, FindArg, SelectItem } from 'imodel' */
|
|
1656
|
-
/**
|
|
1657
|
-
*
|
|
1658
|
-
* @param {Environment} env
|
|
1659
|
-
* @param {SelectItem[]} selectList
|
|
1660
|
-
* @returns {Sql}
|
|
1661
|
-
*/
|
|
1662
|
-
function buildSelect(env, selectList) {
|
|
1663
|
-
/** @type {Sql[]} */
|
|
1664
|
-
const list = [];
|
|
1665
|
-
for (const {
|
|
1666
|
-
table,
|
|
1667
|
-
columns,
|
|
1668
|
-
select,
|
|
1669
|
-
where,
|
|
1670
|
-
sort,
|
|
1671
|
-
offset,
|
|
1672
|
-
limit,
|
|
1673
|
-
group,
|
|
1674
|
-
having
|
|
1675
|
-
} of selectList) {
|
|
1676
|
-
const Table = Sql.Table(table);
|
|
1677
|
-
const selectSql = getSelect(Table, select);
|
|
1678
|
-
const orderSql = getOrder(sort);
|
|
1679
|
-
const limitSql = limit && limit > 0 ? Sql('LIMIT', limit) : undefined;
|
|
1680
|
-
const offsetSql = offset && offset > 0 ? Sql('OFFSET', offset) : undefined;
|
|
1681
|
-
list.push(Sql(Sql`SELECT ${selectSql} FROM ${Table}`, getWhere(env, where), orderSql, limitSql, offsetSql, group?.length ? Sql`GROUP BY ${Sql`,`.glue(group.map(v => Sql.Field(v)))}` : undefined, getWhere(env, having, 'HAVING')));
|
|
1682
|
-
}
|
|
1683
|
-
return list.length === 1 && list[0] || Sql`UNION`.glue(list);
|
|
1684
|
-
}
|
|
1685
|
-
|
|
1686
1679
|
/** @import { Environment, IConnection } from 'imodel' */
|
|
1687
1680
|
const {
|
|
1688
1681
|
types
|
|
@@ -1832,20 +1825,26 @@ function index (pool, version) {
|
|
|
1832
1825
|
/**
|
|
1833
1826
|
* @template {pg.QueryResultRow} T
|
|
1834
1827
|
* @param {Environment<PgEnvTrans>} env
|
|
1835
|
-
* @param {Sql} sql
|
|
1828
|
+
* @param {Sql?} [sql]
|
|
1836
1829
|
* @returns {Promise<T[]>}
|
|
1837
1830
|
*/
|
|
1838
1831
|
async function query(env, sql) {
|
|
1832
|
+
if (!sql) {
|
|
1833
|
+
return [];
|
|
1834
|
+
}
|
|
1839
1835
|
/** @type {pg.QueryResult<T>} */
|
|
1840
1836
|
const result = await _exec(sql, env);
|
|
1841
1837
|
return result.rows;
|
|
1842
1838
|
}
|
|
1843
1839
|
/**
|
|
1844
1840
|
* @param {Environment<PgEnvTrans>} env
|
|
1845
|
-
* @param {Sql} sql
|
|
1841
|
+
* @param {Sql?} [sql]
|
|
1846
1842
|
* @returns {Promise<number>}
|
|
1847
1843
|
*/
|
|
1848
1844
|
async function exec(env, sql) {
|
|
1845
|
+
if (!sql) {
|
|
1846
|
+
return 0;
|
|
1847
|
+
}
|
|
1849
1848
|
const result = await _exec(sql, env);
|
|
1850
1849
|
return result.rowCount || 0;
|
|
1851
1850
|
}
|
|
@@ -1887,9 +1886,6 @@ function index (pool, version) {
|
|
|
1887
1886
|
upsert(env, table, columns, data, keys, conflict, conflictSet) {
|
|
1888
1887
|
return query(env, insertSql(env, table, columns, data, keys, conflict, conflictSet));
|
|
1889
1888
|
},
|
|
1890
|
-
find(env, table, columns, argv) {
|
|
1891
|
-
return query(env, selectSql(env, table, columns, argv));
|
|
1892
|
-
},
|
|
1893
1889
|
select(env, select) {
|
|
1894
1890
|
return query(env, buildSelect(env, select));
|
|
1895
1891
|
},
|
|
@@ -1904,12 +1900,17 @@ function index (pool, version) {
|
|
|
1904
1900
|
},
|
|
1905
1901
|
updateReturn(env, returning, table, columns, update, where) {
|
|
1906
1902
|
if (!Object.keys(update).length) {
|
|
1907
|
-
return query(env,
|
|
1908
|
-
|
|
1903
|
+
return query(env, buildSelect(env, [{
|
|
1904
|
+
table,
|
|
1905
|
+
columns,
|
|
1909
1906
|
select: returning.map(v => [v, {
|
|
1910
1907
|
field: v
|
|
1911
|
-
}])
|
|
1912
|
-
|
|
1908
|
+
}]),
|
|
1909
|
+
where: where || [],
|
|
1910
|
+
sort: [],
|
|
1911
|
+
group: [],
|
|
1912
|
+
having: []
|
|
1913
|
+
}]));
|
|
1913
1914
|
}
|
|
1914
1915
|
return query(env, updateSql(env, table, columns, update, where, returning));
|
|
1915
1916
|
},
|