sunrise-cms/helpers/functions.sqlFilters.ts

107 lines
3.2 KiB
TypeScript

import { dateToInteger } from "@cityssm/expressjs-server-js/dateTimeFns.js";
type LotNameSearchType = "startsWith" | "endsWith" | "";
export const getLotNameWhereClause = (
lotName: string,
lotNameSearchType: LotNameSearchType,
lotsTableAlias = "l"
) => {
let sqlWhereClause = "";
const sqlParameters = [];
if (lotName) {
switch (lotNameSearchType) {
case "startsWith": {
sqlWhereClause += " and " + lotsTableAlias + ".lotName like ? || '%'";
sqlParameters.push(lotName);
break;
}
case "endsWith": {
sqlWhereClause += " and " + lotsTableAlias + ".lotName like '%' || ?";
sqlParameters.push(lotName);
break;
}
default: {
const lotNamePieces = lotName.toLowerCase().split(" ");
for (const lotNamePiece of lotNamePieces) {
sqlWhereClause += " and instr(lower(" + lotsTableAlias + ".lotName), ?)";
sqlParameters.push(lotNamePiece);
}
}
}
}
return {
sqlWhereClause,
sqlParameters
};
};
type OccupancyTime = "" | "current" | "past" | "future";
export const getOccupancyTimeWhereClause = (
occupancyTime: OccupancyTime,
lotOccupanciesTableAlias = "o"
) => {
let sqlWhereClause = "";
const sqlParameters = [];
if (occupancyTime) {
const currentDateString = dateToInteger(new Date());
switch (occupancyTime) {
case "current": {
sqlWhereClause +=
" and " +
lotOccupanciesTableAlias +
".occupancyStartDate <= ? and (" +
lotOccupanciesTableAlias +
".occupancyEndDate is null or " +
lotOccupanciesTableAlias +
".occupancyEndDate >= ?)";
sqlParameters.push(currentDateString, currentDateString);
break;
}
case "past": {
sqlWhereClause += " and " + lotOccupanciesTableAlias + ".occupancyEndDate < ?";
sqlParameters.push(currentDateString);
break;
}
case "future": {
sqlWhereClause += " and " + lotOccupanciesTableAlias + ".occupancyStartDate > ?";
sqlParameters.push(currentDateString);
break;
}
}
}
return {
sqlWhereClause,
sqlParameters
};
};
export const getOccupantNameWhereClause = (occupantName: string, tableAlias = "o") => {
let sqlWhereClause = "";
const sqlParameters = [];
if (occupantName) {
const occupantNamePieces = occupantName.toLowerCase().split(" ");
for (const occupantNamePiece of occupantNamePieces) {
sqlWhereClause +=
" and " +
tableAlias +
".lotOccupancyId in (select lotOccupancyId from LotOccupancyOccupants where recordDelete_timeMillis is null and instr(lower(occupantName), ?))";
sqlParameters.push(occupantNamePiece);
}
}
return {
sqlWhereClause,
sqlParameters
};
};