Add support for IN and NOT IN clauses in Postgres

This commit is contained in:
Felipe Martins Diel 2024-11-15 20:17:54 -03:00
parent 54e1f62535
commit 21b5e86151
3 changed files with 59 additions and 10 deletions

View file

@ -250,6 +250,14 @@ export const whereFixedCollection: INodeProperties = {
name: 'Not Equal', name: 'Not Equal',
value: '!=', value: '!=',
}, },
{
name: 'In',
value: 'IN',
},
{
name: 'Not In',
value: 'NOT IN',
},
{ {
name: 'Like', name: 'Like',
value: 'LIKE', value: 'LIKE',

View file

@ -4,11 +4,15 @@ import type pg from 'pg-promise/typescript/pg-subset';
export type QueryMode = 'single' | 'transaction' | 'independently'; export type QueryMode = 'single' | 'transaction' | 'independently';
export type QueryValue = string | number | IDataObject | string[]; export type QueryValue = string | number | IDataObject | string[] | number[];
export type QueryValues = QueryValue[]; export type QueryValues = QueryValue[];
export type QueryWithValues = { query: string; values?: QueryValues }; export type QueryWithValues = { query: string; values?: QueryValues };
export type WhereClause = { column: string; condition: string; value: string | number }; export type WhereClause = {
column: string;
condition: string;
value: string | number | string[] | number[];
};
export type SortRule = { column: string; direction: string }; export type SortRule = { column: string; direction: string };
export type ColumnInfo = { export type ColumnInfo = {
column_name: string; column_name: string;

View file

@ -142,20 +142,57 @@ export function addWhereClauses(
clause.value = value; clause.value = value;
} }
let formattedClause = '';
if (['IN', 'NOT IN'].includes(clause.condition)) {
if (!Array.isArray(clause.value)) {
throw new NodeOperationError(
node,
`Operator in entry ${index + 1} of 'Select Rows' works with arrays, but value ${
clause.value
} is not an array`,
{
itemIndex,
},
);
}
if (clause.value.length > 0) {
const columnReplacement = `$${replacementIndex}:name`; const columnReplacement = `$${replacementIndex}:name`;
values.push(clause.column); values.push(clause.column);
replacementIndex = replacementIndex + 1; replacementIndex = replacementIndex + 1;
let valueReplacement = ''; const valueReplacement = "(" + clause.value
if (clause.condition !== 'IS NULL' && clause.condition !== 'IS NOT NULL') { .map((_, idx) => `$${replacementIndex + idx}`)
valueReplacement = ` $${replacementIndex}`; .join(', ') + ")";
values.push(...clause.value);
replacementIndex += clause.value.length;
formattedClause = `${columnReplacement} ${clause.condition} ${valueReplacement}`;
} else {
formattedClause = '1 = 0'
}
} else if (['IS NULL', 'IS NOT NULL'].includes(clause.condition)) {
const columnReplacement = `$${replacementIndex}:name`;
values.push(clause.column);
replacementIndex = replacementIndex++;
formattedClause = `${columnReplacement} ${clause.condition}`;
} else {
const columnReplacement = `$${replacementIndex}:name`;
values.push(clause.column);
replacementIndex++;
const valueReplacement = `$${replacementIndex}`;
values.push(clause.value); values.push(clause.value);
replacementIndex = replacementIndex + 1; replacementIndex++;
formattedClause = ` ${columnReplacement} ${clause.condition} ${valueReplacement}`;
} }
const operator = index === clauses.length - 1 ? '' : ` ${combineWith}`; const operator = index === clauses.length - 1 ? '' : ` ${combineWith}`;
whereQuery += ` ${columnReplacement} ${clause.condition}${valueReplacement}${operator}`; whereQuery += ` ${formattedClause}${operator}`;
}); });
return [`${query}${whereQuery}`, replacements.concat(...values)]; return [`${query}${whereQuery}`, replacements.concat(...values)];