diff --git a/lib/IHP/DataSync/ihp-querybuilder.js b/lib/IHP/DataSync/ihp-querybuilder.js index 2eea462c2..4fb961568 100644 --- a/lib/IHP/DataSync/ihp-querybuilder.js +++ b/lib/IHP/DataSync/ihp-querybuilder.js @@ -214,7 +214,7 @@ class ConditionBuildable { } whereIn(field, values) { - return { + const expression = { tag: 'InfixOperatorExpression', left: { tag: 'ColumnExpression', @@ -223,9 +223,11 @@ class ConditionBuildable { op: 'OpIn', right: { tag: 'ListExpression', - value: values.map(jsValueToDynamicValue), + values: values.map(jsValueToDynamicValue), }, - } + }; + this._addCondition('OpAnd', expression); + return this; } } @@ -396,6 +398,9 @@ function jsValueToDynamicValue(value) { } export function recordMatchesQuery(query, record) { + function evaluateDynamicValue(value) { + return (value.tag === 'Null' ? null : value.contents); + } function evaluate(expression) { switch (expression.tag) { case 'ColumnExpression': return (expression.field in record) ? record[expression.field] : null; @@ -411,10 +416,16 @@ export function recordMatchesQuery(query, record) { case 'OpOr': return evaluate(expression.left) || evaluate(expression.right); case 'OpIs': return evaluate(expression.left) == evaluate(expression.right); case 'OpIsNot': return evaluate(expression.left) != evaluate(expression.right); + case 'OpIn': { + const left = evaluate(expression.left); + const right = evaluate(expression.right); + return Array.isArray(right) && right.includes(left); + } default: throw new Error('Unsupported operator ' + expression.op); } } - case 'LiteralExpression': return (expression.value.tag === 'Null' ? null : expression.value.contents); + case 'LiteralExpression': return evaluateDynamicValue(expression); + case 'ListExpression': return expression.values.map(value => evaluateDynamicValue(value)); default: throw new Error('Unsupported expression in evaluate: ' + expression.tag); } }