This is an automated email from the ASF dual-hosted git repository. jackie pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/pinot.git
The following commit(s) were added to refs/heads/master by this push: new 04cf96e03e Implement IN and NOT_IN filters in FilterOperand class (#12285 fix) (#12305) 04cf96e03e is described below commit 04cf96e03e3266ad922ff16112e99a7f0d0a6589 Author: Miklos Gyorfi <gyorf...@users.noreply.github.com> AuthorDate: Thu Feb 1 18:20:39 2024 +0100 Implement IN and NOT_IN filters in FilterOperand class (#12285 fix) (#12305) --- .../runtime/operator/operands/FilterOperand.java | 32 ++++++++++++++++++++++ .../operator/operands/TransformOperandFactory.java | 6 ++++ 2 files changed, 38 insertions(+) diff --git a/pinot-query-runtime/src/main/java/org/apache/pinot/query/runtime/operator/operands/FilterOperand.java b/pinot-query-runtime/src/main/java/org/apache/pinot/query/runtime/operator/operands/FilterOperand.java index 62fd6478a9..46fc0845de 100644 --- a/pinot-query-runtime/src/main/java/org/apache/pinot/query/runtime/operator/operands/FilterOperand.java +++ b/pinot-query-runtime/src/main/java/org/apache/pinot/query/runtime/operator/operands/FilterOperand.java @@ -110,6 +110,38 @@ public abstract class FilterOperand implements TransformOperand { } } + public static class In extends FilterOperand { + List<TransformOperand> _childOperands; + boolean _isNotIn; + + public In(List<RexExpression> children, DataSchema dataSchema, boolean isNotIn) { + _childOperands = new ArrayList<>(children.size()); + for (RexExpression child : children) { + _childOperands.add(TransformOperandFactory.getTransformOperand(child, dataSchema)); + } + _isNotIn = isNotIn; + } + + @Nullable + @Override + public Integer apply(Object[] row) { + Object firstResult = _childOperands.get(0).apply(row); + if (firstResult == null) { + return null; + } + for (int i = 1; i < _childOperands.size(); i++) { + Object result = _childOperands.get(i).apply(row); + if (result == null) { + return null; + } + if (firstResult.equals(result)) { + return _isNotIn ? 0 : 1; + } + } + return _isNotIn ? 1 : 0; + } + } + public static class IsTrue extends FilterOperand { TransformOperand _childOperand; diff --git a/pinot-query-runtime/src/main/java/org/apache/pinot/query/runtime/operator/operands/TransformOperandFactory.java b/pinot-query-runtime/src/main/java/org/apache/pinot/query/runtime/operator/operands/TransformOperandFactory.java index 4a95a8b162..0759fc4ce3 100644 --- a/pinot-query-runtime/src/main/java/org/apache/pinot/query/runtime/operator/operands/TransformOperandFactory.java +++ b/pinot-query-runtime/src/main/java/org/apache/pinot/query/runtime/operator/operands/TransformOperandFactory.java @@ -46,6 +46,12 @@ public class TransformOperandFactory { int numOperands = operands.size(); String canonicalName = OperatorUtils.canonicalizeFunctionName(functionCall.getFunctionName()); switch (canonicalName) { + case "IN": + Preconditions.checkState(numOperands >= 2, "IN takes >=2 arguments, got: %s", numOperands); + return new FilterOperand.In(operands, dataSchema, false); + case "NOT_IN": + Preconditions.checkState(numOperands >= 2, "NOT_IN takes >=2 arguments, got: %s", numOperands); + return new FilterOperand.In(operands, dataSchema, true); case "AND": Preconditions.checkState(numOperands >= 2, "AND takes >=2 arguments, got: %s", numOperands); return new FilterOperand.And(operands, dataSchema); --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@pinot.apache.org For additional commands, e-mail: commits-h...@pinot.apache.org