conditions.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. import { Column } from "../../column.js";
  2. import { is } from "../../entity.js";
  3. import { Table } from "../../table.js";
  4. import {
  5. isDriverValueEncoder,
  6. isSQLWrapper,
  7. Param,
  8. Placeholder,
  9. SQL,
  10. sql,
  11. StringChunk,
  12. View
  13. } from "../sql.js";
  14. function bindIfParam(value, column) {
  15. if (isDriverValueEncoder(column) && !isSQLWrapper(value) && !is(value, Param) && !is(value, Placeholder) && !is(value, Column) && !is(value, Table) && !is(value, View)) {
  16. return new Param(value, column);
  17. }
  18. return value;
  19. }
  20. const eq = (left, right) => {
  21. return sql`${left} = ${bindIfParam(right, left)}`;
  22. };
  23. const ne = (left, right) => {
  24. return sql`${left} <> ${bindIfParam(right, left)}`;
  25. };
  26. function and(...unfilteredConditions) {
  27. const conditions = unfilteredConditions.filter(
  28. (c) => c !== void 0
  29. );
  30. if (conditions.length === 0) {
  31. return void 0;
  32. }
  33. if (conditions.length === 1) {
  34. return new SQL(conditions);
  35. }
  36. return new SQL([
  37. new StringChunk("("),
  38. sql.join(conditions, new StringChunk(" and ")),
  39. new StringChunk(")")
  40. ]);
  41. }
  42. function or(...unfilteredConditions) {
  43. const conditions = unfilteredConditions.filter(
  44. (c) => c !== void 0
  45. );
  46. if (conditions.length === 0) {
  47. return void 0;
  48. }
  49. if (conditions.length === 1) {
  50. return new SQL(conditions);
  51. }
  52. return new SQL([
  53. new StringChunk("("),
  54. sql.join(conditions, new StringChunk(" or ")),
  55. new StringChunk(")")
  56. ]);
  57. }
  58. function not(condition) {
  59. return sql`not ${condition}`;
  60. }
  61. const gt = (left, right) => {
  62. return sql`${left} > ${bindIfParam(right, left)}`;
  63. };
  64. const gte = (left, right) => {
  65. return sql`${left} >= ${bindIfParam(right, left)}`;
  66. };
  67. const lt = (left, right) => {
  68. return sql`${left} < ${bindIfParam(right, left)}`;
  69. };
  70. const lte = (left, right) => {
  71. return sql`${left} <= ${bindIfParam(right, left)}`;
  72. };
  73. function inArray(column, values) {
  74. if (Array.isArray(values)) {
  75. if (values.length === 0) {
  76. return sql`false`;
  77. }
  78. return sql`${column} in ${values.map((v) => bindIfParam(v, column))}`;
  79. }
  80. return sql`${column} in ${bindIfParam(values, column)}`;
  81. }
  82. function notInArray(column, values) {
  83. if (Array.isArray(values)) {
  84. if (values.length === 0) {
  85. return sql`true`;
  86. }
  87. return sql`${column} not in ${values.map((v) => bindIfParam(v, column))}`;
  88. }
  89. return sql`${column} not in ${bindIfParam(values, column)}`;
  90. }
  91. function isNull(value) {
  92. return sql`${value} is null`;
  93. }
  94. function isNotNull(value) {
  95. return sql`${value} is not null`;
  96. }
  97. function exists(subquery) {
  98. return sql`exists ${subquery}`;
  99. }
  100. function notExists(subquery) {
  101. return sql`not exists ${subquery}`;
  102. }
  103. function between(column, min, max) {
  104. return sql`${column} between ${bindIfParam(min, column)} and ${bindIfParam(
  105. max,
  106. column
  107. )}`;
  108. }
  109. function notBetween(column, min, max) {
  110. return sql`${column} not between ${bindIfParam(
  111. min,
  112. column
  113. )} and ${bindIfParam(max, column)}`;
  114. }
  115. function like(column, value) {
  116. return sql`${column} like ${value}`;
  117. }
  118. function notLike(column, value) {
  119. return sql`${column} not like ${value}`;
  120. }
  121. function ilike(column, value) {
  122. return sql`${column} ilike ${value}`;
  123. }
  124. function notIlike(column, value) {
  125. return sql`${column} not ilike ${value}`;
  126. }
  127. function arrayContains(column, values) {
  128. if (Array.isArray(values)) {
  129. if (values.length === 0) {
  130. throw new Error("arrayContains requires at least one value");
  131. }
  132. const array = sql`${bindIfParam(values, column)}`;
  133. return sql`${column} @> ${array}`;
  134. }
  135. return sql`${column} @> ${bindIfParam(values, column)}`;
  136. }
  137. function arrayContained(column, values) {
  138. if (Array.isArray(values)) {
  139. if (values.length === 0) {
  140. throw new Error("arrayContained requires at least one value");
  141. }
  142. const array = sql`${bindIfParam(values, column)}`;
  143. return sql`${column} <@ ${array}`;
  144. }
  145. return sql`${column} <@ ${bindIfParam(values, column)}`;
  146. }
  147. function arrayOverlaps(column, values) {
  148. if (Array.isArray(values)) {
  149. if (values.length === 0) {
  150. throw new Error("arrayOverlaps requires at least one value");
  151. }
  152. const array = sql`${bindIfParam(values, column)}`;
  153. return sql`${column} && ${array}`;
  154. }
  155. return sql`${column} && ${bindIfParam(values, column)}`;
  156. }
  157. export {
  158. and,
  159. arrayContained,
  160. arrayContains,
  161. arrayOverlaps,
  162. between,
  163. bindIfParam,
  164. eq,
  165. exists,
  166. gt,
  167. gte,
  168. ilike,
  169. inArray,
  170. isNotNull,
  171. isNull,
  172. like,
  173. lt,
  174. lte,
  175. ne,
  176. not,
  177. notBetween,
  178. notExists,
  179. notIlike,
  180. notInArray,
  181. notLike,
  182. or
  183. };
  184. //# sourceMappingURL=conditions.js.map