Skip to content

Commit 9a15451

Browse files
authored
Merge pull request #35 from graphile-contrib/fix-for-undefined-variables
Fix handling of undefined GraphQL variables
2 parents 0dcdd2b + 5f17d81 commit 9a15451

1 file changed

Lines changed: 40 additions & 28 deletions

File tree

src/PgConnectionArgFilterPlugin.js

Lines changed: 40 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -370,35 +370,47 @@ module.exports = function PgConnectionArgFilterPlugin(
370370
}
371371

372372
function resolveWhereLogic(obj) {
373-
return sql.query`(${sql.join(
374-
Object.keys(obj).map(key => {
375-
if (key === "or") {
376-
return sql.query`(${sql.join(
377-
obj[key].map(o => {
378-
return resolveWhereLogic(o);
379-
}),
380-
") or ("
381-
)})`;
382-
} else if (key === "and") {
383-
return sql.query`(${sql.join(
384-
obj[key].map(o => {
385-
return resolveWhereLogic(o);
386-
}),
387-
") and ("
388-
)})`;
389-
} else if (key === "not") {
390-
return sql.query`NOT (${resolveWhereLogic(obj[key])})`;
391-
} else {
392-
return sql.query`(${sql.join(
393-
Object.keys(obj[key]).map(k => {
394-
return resolveWhereComparison(key, k, obj[key][k]);
395-
}),
396-
") and ("
397-
)})`;
373+
// Ignore fields where the expression is {}
374+
const entries = Object.entries(obj).filter(
375+
([, value]) => Object.keys(value).length > 0
376+
);
377+
// If no fields remain, return TRUE
378+
if (entries.length === 0) {
379+
return sql.query`TRUE`;
380+
}
381+
const whereLogic = entries.map(([key, value]) => {
382+
if (key === "or") {
383+
return sql.query`(${sql.join(
384+
value.map(o => {
385+
return resolveWhereLogic(o);
386+
}),
387+
") or ("
388+
)})`;
389+
} else if (key === "and") {
390+
return sql.query`(${sql.join(
391+
value.map(o => {
392+
return resolveWhereLogic(o);
393+
}),
394+
") and ("
395+
)})`;
396+
} else if (key === "not") {
397+
return sql.query`NOT (${resolveWhereLogic(value)})`;
398+
} else {
399+
// Ignore filter expressions where the value is null
400+
const e = Object.entries(value).filter(([, v]) => v != null);
401+
// If no filter expressions remain, return TRUE
402+
if (e.length === 0) {
403+
return sql.query`TRUE`;
398404
}
399-
}),
400-
") and ("
401-
)})`;
405+
return sql.query`(${sql.join(
406+
Object.entries(value).map(([k, v]) =>
407+
resolveWhereComparison(key, k, v)
408+
),
409+
") and ("
410+
)})`;
411+
}
412+
});
413+
return sql.query`(${sql.join(whereLogic, ") and (")})`;
402414
}
403415

404416
if (filter != null) {

0 commit comments

Comments
 (0)