184 lines
4.5 KiB
JavaScript
184 lines
4.5 KiB
JavaScript
import { Column } from "../../column.js";
|
|
import { is } from "../../entity.js";
|
|
import { Table } from "../../table.js";
|
|
import {
|
|
isDriverValueEncoder,
|
|
isSQLWrapper,
|
|
Param,
|
|
Placeholder,
|
|
SQL,
|
|
sql,
|
|
StringChunk,
|
|
View
|
|
} from "../sql.js";
|
|
function bindIfParam(value, column) {
|
|
if (isDriverValueEncoder(column) && !isSQLWrapper(value) && !is(value, Param) && !is(value, Placeholder) && !is(value, Column) && !is(value, Table) && !is(value, View)) {
|
|
return new Param(value, column);
|
|
}
|
|
return value;
|
|
}
|
|
const eq = (left, right) => {
|
|
return sql`${left} = ${bindIfParam(right, left)}`;
|
|
};
|
|
const ne = (left, right) => {
|
|
return sql`${left} <> ${bindIfParam(right, left)}`;
|
|
};
|
|
function and(...unfilteredConditions) {
|
|
const conditions = unfilteredConditions.filter(
|
|
(c) => c !== void 0
|
|
);
|
|
if (conditions.length === 0) {
|
|
return void 0;
|
|
}
|
|
if (conditions.length === 1) {
|
|
return new SQL(conditions);
|
|
}
|
|
return new SQL([
|
|
new StringChunk("("),
|
|
sql.join(conditions, new StringChunk(" and ")),
|
|
new StringChunk(")")
|
|
]);
|
|
}
|
|
function or(...unfilteredConditions) {
|
|
const conditions = unfilteredConditions.filter(
|
|
(c) => c !== void 0
|
|
);
|
|
if (conditions.length === 0) {
|
|
return void 0;
|
|
}
|
|
if (conditions.length === 1) {
|
|
return new SQL(conditions);
|
|
}
|
|
return new SQL([
|
|
new StringChunk("("),
|
|
sql.join(conditions, new StringChunk(" or ")),
|
|
new StringChunk(")")
|
|
]);
|
|
}
|
|
function not(condition) {
|
|
return sql`not ${condition}`;
|
|
}
|
|
const gt = (left, right) => {
|
|
return sql`${left} > ${bindIfParam(right, left)}`;
|
|
};
|
|
const gte = (left, right) => {
|
|
return sql`${left} >= ${bindIfParam(right, left)}`;
|
|
};
|
|
const lt = (left, right) => {
|
|
return sql`${left} < ${bindIfParam(right, left)}`;
|
|
};
|
|
const lte = (left, right) => {
|
|
return sql`${left} <= ${bindIfParam(right, left)}`;
|
|
};
|
|
function inArray(column, values) {
|
|
if (Array.isArray(values)) {
|
|
if (values.length === 0) {
|
|
return sql`false`;
|
|
}
|
|
return sql`${column} in ${values.map((v) => bindIfParam(v, column))}`;
|
|
}
|
|
return sql`${column} in ${bindIfParam(values, column)}`;
|
|
}
|
|
function notInArray(column, values) {
|
|
if (Array.isArray(values)) {
|
|
if (values.length === 0) {
|
|
return sql`true`;
|
|
}
|
|
return sql`${column} not in ${values.map((v) => bindIfParam(v, column))}`;
|
|
}
|
|
return sql`${column} not in ${bindIfParam(values, column)}`;
|
|
}
|
|
function isNull(value) {
|
|
return sql`${value} is null`;
|
|
}
|
|
function isNotNull(value) {
|
|
return sql`${value} is not null`;
|
|
}
|
|
function exists(subquery) {
|
|
return sql`exists ${subquery}`;
|
|
}
|
|
function notExists(subquery) {
|
|
return sql`not exists ${subquery}`;
|
|
}
|
|
function between(column, min, max) {
|
|
return sql`${column} between ${bindIfParam(min, column)} and ${bindIfParam(
|
|
max,
|
|
column
|
|
)}`;
|
|
}
|
|
function notBetween(column, min, max) {
|
|
return sql`${column} not between ${bindIfParam(
|
|
min,
|
|
column
|
|
)} and ${bindIfParam(max, column)}`;
|
|
}
|
|
function like(column, value) {
|
|
return sql`${column} like ${value}`;
|
|
}
|
|
function notLike(column, value) {
|
|
return sql`${column} not like ${value}`;
|
|
}
|
|
function ilike(column, value) {
|
|
return sql`${column} ilike ${value}`;
|
|
}
|
|
function notIlike(column, value) {
|
|
return sql`${column} not ilike ${value}`;
|
|
}
|
|
function arrayContains(column, values) {
|
|
if (Array.isArray(values)) {
|
|
if (values.length === 0) {
|
|
throw new Error("arrayContains requires at least one value");
|
|
}
|
|
const array = sql`${bindIfParam(values, column)}`;
|
|
return sql`${column} @> ${array}`;
|
|
}
|
|
return sql`${column} @> ${bindIfParam(values, column)}`;
|
|
}
|
|
function arrayContained(column, values) {
|
|
if (Array.isArray(values)) {
|
|
if (values.length === 0) {
|
|
throw new Error("arrayContained requires at least one value");
|
|
}
|
|
const array = sql`${bindIfParam(values, column)}`;
|
|
return sql`${column} <@ ${array}`;
|
|
}
|
|
return sql`${column} <@ ${bindIfParam(values, column)}`;
|
|
}
|
|
function arrayOverlaps(column, values) {
|
|
if (Array.isArray(values)) {
|
|
if (values.length === 0) {
|
|
throw new Error("arrayOverlaps requires at least one value");
|
|
}
|
|
const array = sql`${bindIfParam(values, column)}`;
|
|
return sql`${column} && ${array}`;
|
|
}
|
|
return sql`${column} && ${bindIfParam(values, column)}`;
|
|
}
|
|
export {
|
|
and,
|
|
arrayContained,
|
|
arrayContains,
|
|
arrayOverlaps,
|
|
between,
|
|
bindIfParam,
|
|
eq,
|
|
exists,
|
|
gt,
|
|
gte,
|
|
ilike,
|
|
inArray,
|
|
isNotNull,
|
|
isNull,
|
|
like,
|
|
lt,
|
|
lte,
|
|
ne,
|
|
not,
|
|
notBetween,
|
|
notExists,
|
|
notIlike,
|
|
notInArray,
|
|
notLike,
|
|
or
|
|
};
|
|
//# sourceMappingURL=conditions.js.map
|