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.
Files changed (3) hide show
  1. package/index.d.mts +1 -1
  2. package/index.mjs +75 -74
  3. package/package.json +1 -1
package/index.d.mts CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * imodel v0.16.1
2
+ * imodel v0.19.0
3
3
  * (c) 2019-2026 undefined
4
4
  * @license undefined
5
5
  */
package/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * imodel v0.16.1
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 getWhere2(env, wheres) {
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
- 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})`;
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 ((values ?? null) === null) {
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 = getWhere2(env, where);
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)}`), getWhere2(env, where)].flat().filter(Boolean))}${returnSql}`;
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, selectSql(env, table, columns, {
1908
- where: where || [],
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
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "imodel-pg",
3
- "version": "0.16.1",
3
+ "version": "0.19.0",
4
4
  "dependencies": {
5
5
  "pg": "^8.13.3",
6
6
  "tagged-sql": "^0.9.0"