diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/analysis/analyzer/Analyzer.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/analysis/analyzer/Analyzer.java index ec56e2c2f112b..6de93853f0211 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/analysis/analyzer/Analyzer.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/analysis/analyzer/Analyzer.java @@ -29,7 +29,7 @@ import org.elasticsearch.xpack.sql.expression.function.Functions; import org.elasticsearch.xpack.sql.expression.function.UnresolvedFunction; import org.elasticsearch.xpack.sql.expression.function.scalar.Cast; -import org.elasticsearch.xpack.sql.expression.function.scalar.arithmetic.ArithmeticFunction; +import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.ArithmeticOperation; import org.elasticsearch.xpack.sql.plan.TableIdentifier; import org.elasticsearch.xpack.sql.plan.logical.Aggregate; import org.elasticsearch.xpack.sql.plan.logical.EsRelation; @@ -1007,8 +1007,8 @@ private Expression implicitCast(Expression e) { // BinaryOperations are ignored as they are pushed down to ES // and casting (and thus Aliasing when folding) gets in the way - if (e instanceof ArithmeticFunction) { - ArithmeticFunction f = (ArithmeticFunction) e; + if (e instanceof ArithmeticOperation) { + ArithmeticOperation f = (ArithmeticOperation) e; left = f.left(); right = f.right(); } diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/execution/search/Querier.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/execution/search/Querier.java index d0bff77a6485d..5be361179b326 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/execution/search/Querier.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/execution/search/Querier.java @@ -32,11 +32,11 @@ import org.elasticsearch.xpack.sql.execution.search.extractor.FieldHitExtractor; import org.elasticsearch.xpack.sql.execution.search.extractor.HitExtractor; import org.elasticsearch.xpack.sql.execution.search.extractor.MetricAggExtractor; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.AggExtractorInput; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.AggPathInput; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.HitExtractorInput; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinition; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ReferenceInput; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.AggExtractorInput; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.AggPathInput; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.HitExtractorInput; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.ReferenceInput; import org.elasticsearch.xpack.sql.querydsl.agg.Aggs; import org.elasticsearch.xpack.sql.querydsl.container.ComputedRef; import org.elasticsearch.xpack.sql.querydsl.container.GlobalCountRef; @@ -275,7 +275,7 @@ private BucketExtractor createExtractor(FieldExtraction ref, BucketExtractor tot } if (ref instanceof ComputedRef) { - ProcessorDefinition proc = ((ComputedRef) ref).processor(); + Pipe proc = ((ComputedRef) ref).processor(); // wrap only agg inputs proc = proc.transformDown(l -> { @@ -351,7 +351,7 @@ private HitExtractor createExtractor(FieldExtraction ref) { } if (ref instanceof ComputedRef) { - ProcessorDefinition proc = ((ComputedRef) ref).processor(); + Pipe proc = ((ComputedRef) ref).processor(); // collect hitNames Set hitNames = new LinkedHashSet<>(); proc = proc.transformDown(l -> { diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/execution/search/extractor/ComputingExtractor.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/execution/search/extractor/ComputingExtractor.java index dded5adfcb84f..92f81b6ac4308 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/execution/search/extractor/ComputingExtractor.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/execution/search/extractor/ComputingExtractor.java @@ -9,8 +9,8 @@ import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.aggregations.bucket.MultiBucketsAggregation.Bucket; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.HitExtractorProcessor; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.Processor; +import org.elasticsearch.xpack.sql.expression.gen.processor.HitExtractorProcessor; +import org.elasticsearch.xpack.sql.expression.gen.processor.Processor; import java.io.IOException; import java.util.Objects; diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/Alias.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/Alias.java index 6f3ea405fbee9..fb3c0290f3148 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/Alias.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/Alias.java @@ -5,16 +5,18 @@ */ package org.elasticsearch.xpack.sql.expression; +import org.elasticsearch.xpack.sql.SqlIllegalArgumentException; +import org.elasticsearch.xpack.sql.expression.gen.script.ScriptTemplate; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; import org.elasticsearch.xpack.sql.type.DataType; import org.elasticsearch.xpack.sql.type.EsField; -import static java.util.Collections.singletonList; - import java.util.Collections; import java.util.List; +import static java.util.Collections.singletonList; + /** * An {@code Alias} is a {@code NamedExpression} that gets renamed to something else through the Alias. * @@ -91,6 +93,11 @@ public Attribute toAttribute() { return lazyAttribute; } + @Override + public ScriptTemplate asScript() { + throw new SqlIllegalArgumentException("Encountered a bug; an alias should never be scripted"); + } + private Attribute createAttribute() { if (resolved()) { Expression c = child(); @@ -114,4 +121,4 @@ private Attribute createAttribute() { public String toString() { return child + " AS " + name() + "#" + id(); } -} +} \ No newline at end of file diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/Attribute.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/Attribute.java index dd18363b2a828..3be4b02795465 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/Attribute.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/Attribute.java @@ -5,7 +5,10 @@ */ package org.elasticsearch.xpack.sql.expression; +import org.elasticsearch.xpack.sql.SqlIllegalArgumentException; +import org.elasticsearch.xpack.sql.expression.gen.script.ScriptTemplate; import org.elasticsearch.xpack.sql.tree.Location; +import org.elasticsearch.xpack.sql.tree.NodeInfo; import java.util.List; import java.util.Objects; @@ -60,6 +63,11 @@ public final Expression replaceChildren(List newChildren) { throw new UnsupportedOperationException("this type of node doesn't have any children to replace"); } + @Override + public ScriptTemplate asScript() { + throw new SqlIllegalArgumentException("Encountered a bug - an attribute should never be scripted"); + } + public String qualifier() { return qualifier; } @@ -103,6 +111,11 @@ public int semanticHash() { return id().hashCode(); } + @Override + protected NodeInfo info() { + return null; + } + @Override public boolean semanticEquals(Expression other) { return other instanceof Attribute ? id().equals(((Attribute) other).id()) : false; @@ -130,4 +143,4 @@ public String toString() { } protected abstract String label(); -} +} \ No newline at end of file diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/BinaryExpression.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/BinaryExpression.java deleted file mode 100644 index fd6b8632f8e3e..0000000000000 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/BinaryExpression.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -package org.elasticsearch.xpack.sql.expression; - -import org.elasticsearch.xpack.sql.tree.Location; - -import java.util.Arrays; -import java.util.List; -import java.util.Objects; - -public abstract class BinaryExpression extends Expression { - - private final Expression left, right; - - protected BinaryExpression(Location location, Expression left, Expression right) { - super(location, Arrays.asList(left, right)); - this.left = left; - this.right = right; - } - - @Override - public final BinaryExpression replaceChildren(List newChildren) { - if (newChildren.size() != 2) { - throw new IllegalArgumentException("expected [2] children but received [" + newChildren.size() + "]"); - } - return replaceChildren(newChildren.get(0), newChildren.get(1)); - } - protected abstract BinaryExpression replaceChildren(Expression newLeft, Expression newRight); - - public Expression left() { - return left; - } - - public Expression right() { - return right; - } - - @Override - public boolean foldable() { - return left.foldable() && right.foldable(); - } - - @Override - public boolean nullable() { - return left.nullable() || left.nullable(); - } - - @Override - public int hashCode() { - return Objects.hash(left, right); - } - - @Override - public boolean equals(Object obj) { - if (!super.equals(obj)) { - return false; - } - - BinaryExpression other = (BinaryExpression) obj; - return Objects.equals(left, other.left) - && Objects.equals(right, other.right); - } - - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append(left()); - sb.append(" "); - sb.append(symbol()); - sb.append(" "); - sb.append(right()); - return sb.toString(); - } - - public abstract String symbol(); - - public abstract BinaryExpression swapLeftAndRight(); -} diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/Expression.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/Expression.java index 846c06feb09f6..27291a9253ebf 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/Expression.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/Expression.java @@ -132,4 +132,4 @@ public boolean resolved() { public String toString() { return nodeName() + "[" + propertiesToString(false) + "]"; } -} +} \ No newline at end of file diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/Expressions.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/Expressions.java index 1b326e0474fd2..dfaef60abd558 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/Expressions.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/Expressions.java @@ -5,7 +5,9 @@ */ package org.elasticsearch.xpack.sql.expression; +import org.elasticsearch.xpack.sql.SqlIllegalArgumentException; import org.elasticsearch.xpack.sql.expression.Expression.TypeResolution; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; import java.util.ArrayList; import java.util.Collection; @@ -112,6 +114,13 @@ public static boolean equalsAsAttribute(Expression left, Expression right) { return true; } + public static Pipe pipe(Expression e) { + if (e instanceof NamedExpression) { + return ((NamedExpression) e).asPipe(); + } + throw new SqlIllegalArgumentException("Cannot create pipe for {}", e); + } + public static TypeResolution typeMustBe(Expression e, Predicate predicate, String message) { return predicate.test(e) ? TypeResolution.TYPE_RESOLVED : new TypeResolution(message); } diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/Literal.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/Literal.java index 4badfc7091c58..3c334c233f91a 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/Literal.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/Literal.java @@ -6,6 +6,8 @@ package org.elasticsearch.xpack.sql.expression; import org.elasticsearch.xpack.sql.SqlIllegalArgumentException; +import org.elasticsearch.xpack.sql.expression.gen.script.Params; +import org.elasticsearch.xpack.sql.expression.gen.script.ScriptTemplate; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; import org.elasticsearch.xpack.sql.type.DataType; @@ -77,6 +79,11 @@ public Attribute toAttribute() { return new LiteralAttribute(location(), name(), null, false, id(), false, dataType, this); } + @Override + public ScriptTemplate asScript() { + return new ScriptTemplate(String.valueOf(value), Params.EMPTY, dataType); + } + @Override public Expression replaceChildren(List newChildren) { throw new UnsupportedOperationException("this type of node doesn't have any children to replace"); @@ -87,9 +94,15 @@ public AttributeSet references() { return AttributeSet.EMPTY; } + @Override + protected Expression canonicalize() { + String s = String.valueOf(value); + return name().equals(s) ? this : Literal.of(location(), value); + } + @Override public int hashCode() { - return Objects.hash(name(), value, dataType); + return Objects.hash(value, dataType); } @Override @@ -102,8 +115,7 @@ public boolean equals(Object obj) { } Literal other = (Literal) obj; - return Objects.equals(name(), other.name()) - && Objects.equals(value, other.value) + return Objects.equals(value, other.value) && Objects.equals(dataType, other.dataType); } diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/LiteralAttribute.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/LiteralAttribute.java index a6483458a6b27..ef3db576b6671 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/LiteralAttribute.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/LiteralAttribute.java @@ -5,8 +5,7 @@ */ package org.elasticsearch.xpack.sql.expression; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ConstantInput; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinition; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; import org.elasticsearch.xpack.sql.type.DataType; @@ -33,12 +32,13 @@ protected LiteralAttribute clone(Location location, String name, String qualifie return new LiteralAttribute(location, name, qualifier, nullable, id, synthetic, dataType(), literal); } - public ProcessorDefinition asProcessorDefinition() { - return new ConstantInput(location(), literal, literal.value()); - } - @Override protected String label() { return "c"; } + + @Override + public Pipe asPipe() { + return literal.asPipe(); + } } \ No newline at end of file diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/NamedExpression.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/NamedExpression.java index cf06ddcc09ce9..1cd4510079b92 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/NamedExpression.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/NamedExpression.java @@ -5,16 +5,26 @@ */ package org.elasticsearch.xpack.sql.expression; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.AttributeInput; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.ConstantInput; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; +import org.elasticsearch.xpack.sql.expression.gen.script.ScriptTemplate; import org.elasticsearch.xpack.sql.tree.Location; import java.util.List; import java.util.Objects; +/** + * An expression that has a name. Named expressions can be used as a result + * (by converting to an attribute). + */ public abstract class NamedExpression extends Expression { private final String name; private final ExpressionId id; private final boolean synthetic; + private Pipe lazyPipe = null; + public NamedExpression(Location location, String name, List children, ExpressionId id) { this(location, name, children, id, false); @@ -41,6 +51,20 @@ public boolean synthetic() { public abstract Attribute toAttribute(); + public Pipe asPipe() { + if (lazyPipe == null) { + lazyPipe = foldable() ? new ConstantInput(location(), this, fold()) : makePipe(); + } + + return lazyPipe; + } + + protected Pipe makePipe() { + return new AttributeInput(location(), this, toAttribute()); + } + + public abstract ScriptTemplate asScript(); + @Override public int hashCode() { return Objects.hash(id, name, synthetic); @@ -67,4 +91,4 @@ public boolean equals(Object obj) { && Objects.equals(name, other.name) && Objects.equals(children(), other.children()); } -} +} \ No newline at end of file diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/Order.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/Order.java index 70e537527c867..79ffad823805e 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/Order.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/Order.java @@ -7,30 +7,53 @@ import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; +import org.elasticsearch.xpack.sql.type.DataType; +import java.util.List; import java.util.Objects; -public class Order extends UnaryExpression { +import static java.util.Collections.singletonList; + +public class Order extends Expression { public enum OrderDirection { ASC, DESC } + private final Expression child; private final OrderDirection direction; public Order(Location location, Expression child, OrderDirection direction) { - super(location, child); + super(location, singletonList(child)); + this.child = child; this.direction = direction; } @Override protected NodeInfo info() { - return NodeInfo.create(this, Order::new, child(), direction); + return NodeInfo.create(this, Order::new, child, direction); + } + + @Override + public boolean nullable() { + return false; } @Override - protected UnaryExpression replaceChild(Expression newChild) { - return new Order(location(), newChild, direction); + public DataType dataType() { + return child.dataType(); + } + + @Override + public Order replaceChildren(List newChildren) { + if (newChildren.size() != 1) { + throw new IllegalArgumentException("expected [1] child but received [" + newChildren.size() + "]"); + } + return new Order(location(), newChildren.get(0), direction); + } + + public Expression child() { + return child; } public OrderDirection direction() { @@ -44,7 +67,7 @@ public boolean foldable() { @Override public int hashCode() { - return Objects.hash(child(), direction); + return Objects.hash(child, direction); } @Override @@ -59,6 +82,6 @@ public boolean equals(Object obj) { Order other = (Order) obj; return Objects.equals(direction, other.direction) - && Objects.equals(child(), other.child()); + && Objects.equals(child, other.child); } -} +} \ No newline at end of file diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/SubQueryExpression.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/SubQueryExpression.java index 33f2f3d0b07a0..1a046724a34ec 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/SubQueryExpression.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/SubQueryExpression.java @@ -5,13 +5,13 @@ */ package org.elasticsearch.xpack.sql.expression; +import org.elasticsearch.xpack.sql.plan.logical.LogicalPlan; +import org.elasticsearch.xpack.sql.tree.Location; + import java.util.Collections; import java.util.List; import java.util.Objects; -import org.elasticsearch.xpack.sql.plan.logical.LogicalPlan; -import org.elasticsearch.xpack.sql.tree.Location; - public abstract class SubQueryExpression extends Expression { private final LogicalPlan query; diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/UnaryExpression.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/UnaryExpression.java index 710ee760328cf..c2e764522f46d 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/UnaryExpression.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/UnaryExpression.java @@ -5,21 +5,23 @@ */ package org.elasticsearch.xpack.sql.expression; +import org.elasticsearch.xpack.sql.SqlIllegalArgumentException; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; +import org.elasticsearch.xpack.sql.expression.gen.script.ScriptTemplate; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.type.DataType; +import java.util.List; import java.util.Objects; import static java.util.Collections.singletonList; -import java.util.List; - -public abstract class UnaryExpression extends Expression { +public abstract class UnaryExpression extends NamedExpression { private final Expression child; protected UnaryExpression(Location location, Expression child) { - super(location, singletonList(child)); + super(location, null, singletonList(child), null); this.child = child; } @@ -56,6 +58,21 @@ public DataType dataType() { return child.dataType(); } + @Override + public Attribute toAttribute() { + throw new SqlIllegalArgumentException("Not supported yet"); + } + + @Override + public ScriptTemplate asScript() { + throw new SqlIllegalArgumentException("Not supported yet"); + } + + @Override + protected Pipe makePipe() { + throw new SqlIllegalArgumentException("Not supported yet"); + } + @Override public int hashCode() { return Objects.hash(child); diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/UnresolvedNamedExpression.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/UnresolvedNamedExpression.java index ea35c38275039..a36e534fe3f9a 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/UnresolvedNamedExpression.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/UnresolvedNamedExpression.java @@ -7,6 +7,7 @@ import org.elasticsearch.xpack.sql.capabilities.Unresolvable; import org.elasticsearch.xpack.sql.capabilities.UnresolvedException; +import org.elasticsearch.xpack.sql.expression.gen.script.ScriptTemplate; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.type.DataType; @@ -42,4 +43,9 @@ public DataType dataType() { public Attribute toAttribute() { throw new UnresolvedException("attribute", this); } + + @Override + public ScriptTemplate asScript() { + throw new UnresolvedException("script", this); + } } diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/FunctionRegistry.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/FunctionRegistry.java index 84ac75e569636..b5d1b5c8167d1 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/FunctionRegistry.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/FunctionRegistry.java @@ -20,7 +20,6 @@ import org.elasticsearch.xpack.sql.expression.function.aggregate.Sum; import org.elasticsearch.xpack.sql.expression.function.aggregate.SumOfSquares; import org.elasticsearch.xpack.sql.expression.function.aggregate.VarPop; -import org.elasticsearch.xpack.sql.expression.function.scalar.arithmetic.Mod; import org.elasticsearch.xpack.sql.expression.function.scalar.datetime.DayName; import org.elasticsearch.xpack.sql.expression.function.scalar.datetime.DayOfMonth; import org.elasticsearch.xpack.sql.expression.function.scalar.datetime.DayOfWeek; @@ -81,6 +80,7 @@ import org.elasticsearch.xpack.sql.expression.function.scalar.string.Space; import org.elasticsearch.xpack.sql.expression.function.scalar.string.Substring; import org.elasticsearch.xpack.sql.expression.function.scalar.string.UCase; +import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.Mod; import org.elasticsearch.xpack.sql.parser.ParsingException; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.util.StringUtils; diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/Score.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/Score.java index c4a4097102f4b..e165d4388a06a 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/Score.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/Score.java @@ -5,17 +5,19 @@ */ package org.elasticsearch.xpack.sql.expression.function; +import org.elasticsearch.xpack.sql.SqlIllegalArgumentException; import org.elasticsearch.xpack.sql.expression.Attribute; import org.elasticsearch.xpack.sql.expression.Expression; -import org.elasticsearch.xpack.sql.expression.function.Function; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; +import org.elasticsearch.xpack.sql.expression.gen.script.ScriptTemplate; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; import org.elasticsearch.xpack.sql.type.DataType; -import static java.util.Collections.emptyList; - import java.util.List; +import static java.util.Collections.emptyList; + /** * Function referring to the {@code _score} in a search. Only available * in the search context, and only at the "root" so it can't be combined @@ -59,4 +61,14 @@ public boolean equals(Object obj) { public int hashCode() { return location().hashCode(); } + + @Override + protected Pipe makePipe() { + throw new SqlIllegalArgumentException("Scoring cannot be computed on the client"); + } + + @Override + public ScriptTemplate asScript() { + throw new SqlIllegalArgumentException("Scoring cannot be scripted"); + } } diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/ScoreAttribute.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/ScoreAttribute.java index c3f6ed8b26ae4..622f0755ef54b 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/ScoreAttribute.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/ScoreAttribute.java @@ -7,7 +7,8 @@ import org.elasticsearch.xpack.sql.expression.Attribute; import org.elasticsearch.xpack.sql.expression.ExpressionId; -import org.elasticsearch.xpack.sql.expression.function.FunctionAttribute; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.ScorePipe; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; import org.elasticsearch.xpack.sql.type.DataType; @@ -41,6 +42,11 @@ protected Attribute clone(Location location, String name, String qualifier, bool return new ScoreAttribute(location, name, dataType(), qualifier, nullable, id, synthetic); } + @Override + protected Pipe makePipe() { + return new ScorePipe(location(), this); + } + @Override protected String label() { return "SCORE"; diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/UnresolvedFunction.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/UnresolvedFunction.java index 338b926ce6fce..e774963b22f88 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/UnresolvedFunction.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/UnresolvedFunction.java @@ -10,6 +10,7 @@ import org.elasticsearch.xpack.sql.expression.Attribute; import org.elasticsearch.xpack.sql.expression.Expression; import org.elasticsearch.xpack.sql.expression.Literal; +import org.elasticsearch.xpack.sql.expression.gen.script.ScriptTemplate; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; import org.elasticsearch.xpack.sql.type.DataType; @@ -143,6 +144,11 @@ public Attribute toAttribute() { throw new UnresolvedException("attribute", this); } + @Override + public ScriptTemplate asScript() { + throw new UnresolvedException("script", this); + } + @Override public String unresolvedMessage() { return unresolvedMsg; diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/aggregate/AggregateFunction.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/aggregate/AggregateFunction.java index 413ecf96464c9..2b558970df5b1 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/aggregate/AggregateFunction.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/aggregate/AggregateFunction.java @@ -5,8 +5,12 @@ */ package org.elasticsearch.xpack.sql.expression.function.aggregate; +import org.elasticsearch.xpack.sql.SqlIllegalArgumentException; import org.elasticsearch.xpack.sql.expression.Expression; import org.elasticsearch.xpack.sql.expression.function.Function; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.AggNameInput; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; +import org.elasticsearch.xpack.sql.expression.gen.script.ScriptTemplate; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.util.CollectionUtils; @@ -53,6 +57,17 @@ public AggregateFunctionAttribute toAttribute() { return lazyAttribute; } + @Override + protected Pipe makePipe() { + // unresolved AggNameInput (should always get replaced by the folder) + return new AggNameInput(location(), this, name()); + } + + @Override + public ScriptTemplate asScript() { + throw new SqlIllegalArgumentException("Aggregate functions cannot be scripted"); + } + @Override public boolean equals(Object obj) { if (false == super.equals(obj)) { @@ -67,4 +82,4 @@ public boolean equals(Object obj) { public int hashCode() { return Objects.hash(field(), parameters()); } -} +} \ No newline at end of file diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/BinaryScalarFunction.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/BinaryScalarFunction.java index 4e2882d46c19e..5b9196f462b0a 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/BinaryScalarFunction.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/BinaryScalarFunction.java @@ -6,7 +6,7 @@ package org.elasticsearch.xpack.sql.expression.function.scalar; import org.elasticsearch.xpack.sql.expression.Expression; -import org.elasticsearch.xpack.sql.expression.function.scalar.script.ScriptTemplate; +import org.elasticsearch.xpack.sql.expression.gen.script.ScriptTemplate; import org.elasticsearch.xpack.sql.tree.Location; import java.util.Arrays; diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/Cast.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/Cast.java index ae94b0b9f830c..a8dfe43174911 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/Cast.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/Cast.java @@ -6,12 +6,9 @@ package org.elasticsearch.xpack.sql.expression.function.scalar; import org.elasticsearch.xpack.sql.expression.Expression; -import org.elasticsearch.xpack.sql.expression.FieldAttribute; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinition; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinitions; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.UnaryProcessorDefinition; -import org.elasticsearch.xpack.sql.expression.function.scalar.script.Params; -import org.elasticsearch.xpack.sql.expression.function.scalar.script.ScriptTemplate; +import org.elasticsearch.xpack.sql.expression.Expressions; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.UnaryPipe; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; import org.elasticsearch.xpack.sql.type.DataType; @@ -74,18 +71,8 @@ protected TypeResolution resolveType() { } @Override - protected ScriptTemplate asScriptFrom(ScalarFunctionAttribute scalar) { - return scalar.script(); - } - - @Override - protected ScriptTemplate asScriptFrom(FieldAttribute field) { - return new ScriptTemplate(field.name(), Params.EMPTY, field.dataType()); - } - - @Override - protected ProcessorDefinition makeProcessorDefinition() { - return new UnaryProcessorDefinition(location(), this, ProcessorDefinitions.toProcessorDefinition(field()), + protected Pipe makePipe() { + return new UnaryPipe(location(), this, Expressions.pipe(field()), new CastProcessor(DataTypeConversion.conversionFor(from(), to()))); } @@ -118,4 +105,4 @@ public String name() { sb.insert(sb.length() - 1, " AS " + to().sqlName()); return sb.toString(); } -} +} \ No newline at end of file diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/CastProcessor.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/CastProcessor.java index f5fe541fb4683..6d0173c23b8f5 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/CastProcessor.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/CastProcessor.java @@ -7,7 +7,7 @@ import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.Processor; +import org.elasticsearch.xpack.sql.expression.gen.processor.Processor; import org.elasticsearch.xpack.sql.type.DataTypeConversion.Conversion; import java.io.IOException; diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/Processors.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/Processors.java index a62aadab46705..ae35f9c760c43 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/Processors.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/Processors.java @@ -7,18 +7,11 @@ import org.elasticsearch.common.io.stream.NamedWriteableRegistry; import org.elasticsearch.common.io.stream.NamedWriteableRegistry.Entry; -import org.elasticsearch.xpack.sql.expression.function.scalar.arithmetic.BinaryArithmeticProcessor; -import org.elasticsearch.xpack.sql.expression.function.scalar.arithmetic.UnaryArithmeticProcessor; import org.elasticsearch.xpack.sql.expression.function.scalar.datetime.DateTimeProcessor; import org.elasticsearch.xpack.sql.expression.function.scalar.datetime.NamedDateTimeProcessor; import org.elasticsearch.xpack.sql.expression.function.scalar.datetime.QuarterProcessor; import org.elasticsearch.xpack.sql.expression.function.scalar.math.BinaryMathProcessor; import org.elasticsearch.xpack.sql.expression.function.scalar.math.MathProcessor; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.BucketExtractorProcessor; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.ChainingProcessor; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.ConstantProcessor; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.HitExtractorProcessor; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.Processor; import org.elasticsearch.xpack.sql.expression.function.scalar.string.BinaryStringNumericProcessor; import org.elasticsearch.xpack.sql.expression.function.scalar.string.BinaryStringStringProcessor; import org.elasticsearch.xpack.sql.expression.function.scalar.string.ConcatFunctionProcessor; @@ -27,6 +20,14 @@ import org.elasticsearch.xpack.sql.expression.function.scalar.string.ReplaceFunctionProcessor; import org.elasticsearch.xpack.sql.expression.function.scalar.string.StringProcessor; import org.elasticsearch.xpack.sql.expression.function.scalar.string.SubstringFunctionProcessor; +import org.elasticsearch.xpack.sql.expression.gen.processor.BucketExtractorProcessor; +import org.elasticsearch.xpack.sql.expression.gen.processor.ChainingProcessor; +import org.elasticsearch.xpack.sql.expression.gen.processor.ConstantProcessor; +import org.elasticsearch.xpack.sql.expression.gen.processor.HitExtractorProcessor; +import org.elasticsearch.xpack.sql.expression.gen.processor.Processor; +import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.BinaryArithmeticProcessor; +import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.UnaryArithmeticProcessor; +import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.BinaryComparisonProcessor; import java.util.ArrayList; import java.util.List; @@ -48,6 +49,9 @@ public static List getNamedWriteables() { entries.add(new Entry(Processor.class, CastProcessor.NAME, CastProcessor::new)); entries.add(new Entry(Processor.class, ChainingProcessor.NAME, ChainingProcessor::new)); + // comparators + entries.add(new Entry(Processor.class, BinaryComparisonProcessor.NAME, BinaryComparisonProcessor::new)); + // arithmetic entries.add(new Entry(Processor.class, BinaryArithmeticProcessor.NAME, BinaryArithmeticProcessor::new)); entries.add(new Entry(Processor.class, UnaryArithmeticProcessor.NAME, UnaryArithmeticProcessor::new)); diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/ScalarFunction.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/ScalarFunction.java index e7b8529557f4d..0be9ca86c5f76 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/ScalarFunction.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/ScalarFunction.java @@ -5,23 +5,14 @@ */ package org.elasticsearch.xpack.sql.expression.function.scalar; -import org.elasticsearch.xpack.sql.SqlIllegalArgumentException; -import org.elasticsearch.xpack.sql.expression.Attribute; import org.elasticsearch.xpack.sql.expression.Expression; -import org.elasticsearch.xpack.sql.expression.Expressions; -import org.elasticsearch.xpack.sql.expression.FieldAttribute; import org.elasticsearch.xpack.sql.expression.function.Function; -import org.elasticsearch.xpack.sql.expression.function.aggregate.AggregateFunctionAttribute; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinition; -import org.elasticsearch.xpack.sql.expression.function.scalar.script.Params; -import org.elasticsearch.xpack.sql.expression.function.scalar.script.ScriptTemplate; +import org.elasticsearch.xpack.sql.expression.gen.script.ScriptWeaver; import org.elasticsearch.xpack.sql.tree.Location; import java.util.List; import static java.util.Collections.emptyList; -import static org.elasticsearch.xpack.sql.expression.function.scalar.script.ParamsBuilder.paramsBuilder; -import static org.elasticsearch.xpack.sql.expression.function.scalar.script.ScriptTemplate.formatTemplate; /** * A {@code ScalarFunction} is a {@code Function} that takes values from some @@ -29,11 +20,9 @@ * {@code ABS()}, which takes one value at a time, applies a function to the * value (abs) and returns a new value. */ -public abstract class ScalarFunction extends Function { +public abstract class ScalarFunction extends Function implements ScriptWeaver { private ScalarFunctionAttribute lazyAttribute = null; - private ProcessorDefinition lazyProcessor = null; - protected ScalarFunction(Location location) { super(location, emptyList()); @@ -47,74 +36,14 @@ protected ScalarFunction(Location location, List fields) { public final ScalarFunctionAttribute toAttribute() { if (lazyAttribute == null) { lazyAttribute = new ScalarFunctionAttribute(location(), name(), dataType(), id(), functionId(), asScript(), orderBy(), - asProcessorDefinition()); + asPipe()); } return lazyAttribute; } - public abstract ScriptTemplate asScript(); - - // utility methods for creating the actual scripts - protected ScriptTemplate asScript(Expression exp) { - if (exp.foldable()) { - return asScriptFromFoldable(exp); - } - - Attribute attr = Expressions.attribute(exp); - if (attr != null) { - if (attr instanceof ScalarFunctionAttribute) { - return asScriptFrom((ScalarFunctionAttribute) attr); - } - if (attr instanceof AggregateFunctionAttribute) { - return asScriptFrom((AggregateFunctionAttribute) attr); - } - if (attr instanceof FieldAttribute) { - return asScriptFrom((FieldAttribute) attr); - } - } - throw new SqlIllegalArgumentException("Cannot evaluate script for expression {}", exp); - } - - protected ScriptTemplate asScriptFrom(ScalarFunctionAttribute scalar) { - ScriptTemplate nested = scalar.script(); - Params p = paramsBuilder().script(nested.params()).build(); - return new ScriptTemplate(formatScript(nested.template()), p, dataType()); - } - - protected ScriptTemplate asScriptFromFoldable(Expression foldable) { - return new ScriptTemplate(formatScript("{}"), - paramsBuilder().variable(foldable.fold()).build(), - foldable.dataType()); - } - - protected ScriptTemplate asScriptFrom(FieldAttribute field) { - return new ScriptTemplate(formatScript("doc[{}].value"), - paramsBuilder().variable(field.name()).build(), - field.dataType()); - } - - protected ScriptTemplate asScriptFrom(AggregateFunctionAttribute aggregate) { - return new ScriptTemplate(formatScript("{}"), - paramsBuilder().agg(aggregate).build(), - aggregate.dataType()); - } - - protected String formatScript(String scriptTemplate) { - return formatTemplate(scriptTemplate); - } - - public ProcessorDefinition asProcessorDefinition() { - if (lazyProcessor == null) { - lazyProcessor = makeProcessorDefinition(); - } - return lazyProcessor; - } - - protected abstract ProcessorDefinition makeProcessorDefinition(); - // used if the function is monotonic and thus does not have to be computed for ordering purposes // null means the script needs to be used; expression means the field/expression to be used instead public Expression orderBy() { return null; } -} +} \ No newline at end of file diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/ScalarFunctionAttribute.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/ScalarFunctionAttribute.java index 0e2870acd0944..f2b0f48a18f06 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/ScalarFunctionAttribute.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/ScalarFunctionAttribute.java @@ -9,8 +9,8 @@ import org.elasticsearch.xpack.sql.expression.Expression; import org.elasticsearch.xpack.sql.expression.ExpressionId; import org.elasticsearch.xpack.sql.expression.function.FunctionAttribute; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinition; -import org.elasticsearch.xpack.sql.expression.function.scalar.script.ScriptTemplate; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; +import org.elasticsearch.xpack.sql.expression.gen.script.ScriptTemplate; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; import org.elasticsearch.xpack.sql.type.DataType; @@ -21,28 +21,28 @@ public class ScalarFunctionAttribute extends FunctionAttribute { private final ScriptTemplate script; private final Expression orderBy; - private final ProcessorDefinition processorDef; + private final Pipe pipe; ScalarFunctionAttribute(Location location, String name, DataType dataType, ExpressionId id, - String functionId, ScriptTemplate script, Expression orderBy, ProcessorDefinition processorDef) { + String functionId, ScriptTemplate script, Expression orderBy, Pipe processorDef) { this(location, name, dataType, null, true, id, false, functionId, script, orderBy, processorDef); } public ScalarFunctionAttribute(Location location, String name, DataType dataType, String qualifier, boolean nullable, ExpressionId id, boolean synthetic, String functionId, ScriptTemplate script, - Expression orderBy, ProcessorDefinition processorDef) { + Expression orderBy, Pipe pipe) { super(location, name, dataType, qualifier, nullable, id, synthetic, functionId); this.script = script; this.orderBy = orderBy; - this.processorDef = processorDef; + this.pipe = pipe; } @Override protected NodeInfo info() { return NodeInfo.create(this, ScalarFunctionAttribute::new, name(), dataType(), qualifier(), nullable(), id(), synthetic(), - functionId(), script, orderBy, processorDef); + functionId(), script, orderBy, pipe); } public ScriptTemplate script() { @@ -53,34 +53,41 @@ public Expression orderBy() { return orderBy; } - public ProcessorDefinition processorDef() { - return processorDef; + @Override + public Pipe asPipe() { + return pipe; } @Override protected Expression canonicalize() { return new ScalarFunctionAttribute(location(), "", dataType(), null, true, id(), false, - functionId(), script, orderBy, processorDef); + functionId(), script, orderBy, pipe); } @Override protected Attribute clone(Location location, String name, String qualifier, boolean nullable, ExpressionId id, boolean synthetic) { return new ScalarFunctionAttribute(location, name, dataType(), qualifier, nullable, id, synthetic, - functionId(), script, orderBy, processorDef); + functionId(), script, orderBy, pipe); } @Override public int hashCode() { - return Objects.hash(super.hashCode(), orderBy); + return Objects.hash(super.hashCode(), script(), pipe, orderBy); } @Override public boolean equals(Object obj) { - return super.equals(obj) && Objects.equals(orderBy, ((ScalarFunctionAttribute) obj).orderBy()); + if (super.equals(obj)) { + ScalarFunctionAttribute other = (ScalarFunctionAttribute) obj; + return Objects.equals(script, other.script()) + && Objects.equals(pipe, other.asPipe()) + && Objects.equals(orderBy, other.orderBy()); + } + return false; } @Override protected String label() { return "s->" + functionId(); } -} +} \ No newline at end of file diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/UnaryScalarFunction.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/UnaryScalarFunction.java index e4a0953c11544..54fe2e834db02 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/UnaryScalarFunction.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/UnaryScalarFunction.java @@ -6,13 +6,13 @@ package org.elasticsearch.xpack.sql.expression.function.scalar; import org.elasticsearch.xpack.sql.expression.Expression; -import org.elasticsearch.xpack.sql.expression.function.scalar.script.ScriptTemplate; +import org.elasticsearch.xpack.sql.expression.gen.script.ScriptTemplate; import org.elasticsearch.xpack.sql.tree.Location; -import static java.util.Collections.singletonList; - import java.util.List; +import static java.util.Collections.singletonList; + public abstract class UnaryScalarFunction extends ScalarFunction { private final Expression field; diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/arithmetic/ArithmeticFunction.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/arithmetic/ArithmeticFunction.java deleted file mode 100644 index e95fec863971b..0000000000000 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/arithmetic/ArithmeticFunction.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -package org.elasticsearch.xpack.sql.expression.function.scalar.arithmetic; - -import org.elasticsearch.xpack.sql.expression.Expression; -import org.elasticsearch.xpack.sql.expression.Expressions; -import org.elasticsearch.xpack.sql.expression.Literal; -import org.elasticsearch.xpack.sql.expression.function.scalar.arithmetic.BinaryArithmeticProcessor.BinaryArithmeticOperation; -import org.elasticsearch.xpack.sql.expression.function.scalar.math.BinaryNumericFunction; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinition; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinitions; -import org.elasticsearch.xpack.sql.expression.function.scalar.script.ScriptTemplate; -import org.elasticsearch.xpack.sql.tree.Location; -import org.elasticsearch.xpack.sql.type.DataType; -import org.elasticsearch.xpack.sql.type.DataTypeConversion; - -import java.util.Locale; - -import static java.lang.String.format; -import static org.elasticsearch.xpack.sql.expression.function.scalar.script.ParamsBuilder.paramsBuilder; - -public abstract class ArithmeticFunction extends BinaryNumericFunction { - - private final BinaryArithmeticOperation operation; - - ArithmeticFunction(Location location, Expression left, Expression right, BinaryArithmeticOperation operation) { - super(location, left, right); - this.operation = operation; - } - - @Override - public BinaryArithmeticOperation operation() { - return operation; - } - - @Override - public DataType dataType() { - return DataTypeConversion.commonType(left().dataType(), right().dataType()); - } - - @Override - protected ScriptTemplate asScriptFrom(ScriptTemplate leftScript, ScriptTemplate rightScript) { - String op = operation.symbol(); - // escape % - if (operation == BinaryArithmeticOperation.MOD) { - op = "%" + op; - } - return new ScriptTemplate(format(Locale.ROOT, "(%s) %s (%s)", leftScript.template(), op, rightScript.template()), - paramsBuilder() - .script(leftScript.params()).script(rightScript.params()) - .build(), dataType()); - } - - @Override - protected ProcessorDefinition makeProcessorDefinition() { - return new BinaryArithmeticProcessorDefinition(location(), this, - ProcessorDefinitions.toProcessorDefinition(left()), - ProcessorDefinitions.toProcessorDefinition(right()), - operation); - } - - @Override - public String name() { - StringBuilder sb = new StringBuilder(); - sb.append("("); - sb.append(Expressions.name(left())); - if (!(left() instanceof Literal)) { - sb.insert(1, "("); - sb.append(")"); - } - sb.append(" "); - sb.append(operation); - sb.append(" "); - int pos = sb.length(); - sb.append(Expressions.name(right())); - if (!(right() instanceof Literal)) { - sb.insert(pos, "("); - sb.append(")"); - } - sb.append(")"); - return sb.toString(); - } - - @Override - public String toString() { - return name() + "#" + functionId(); - } -} diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/arithmetic/BinaryArithmeticProcessorDefinition.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/arithmetic/BinaryArithmeticProcessorDefinition.java deleted file mode 100644 index b94a726290ed9..0000000000000 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/arithmetic/BinaryArithmeticProcessorDefinition.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -package org.elasticsearch.xpack.sql.expression.function.scalar.arithmetic; - -import org.elasticsearch.xpack.sql.expression.Expression; -import org.elasticsearch.xpack.sql.expression.function.scalar.arithmetic.BinaryArithmeticProcessor.BinaryArithmeticOperation; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.BinaryProcessorDefinition; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinition; -import org.elasticsearch.xpack.sql.tree.Location; -import org.elasticsearch.xpack.sql.tree.NodeInfo; -import java.util.Objects; - -public class BinaryArithmeticProcessorDefinition extends BinaryProcessorDefinition { - - private final BinaryArithmeticOperation operation; - - public BinaryArithmeticProcessorDefinition(Location location, Expression expression, ProcessorDefinition left, - ProcessorDefinition right, BinaryArithmeticOperation operation) { - super(location, expression, left, right); - this.operation = operation; - } - - @Override - protected NodeInfo info() { - return NodeInfo.create(this, BinaryArithmeticProcessorDefinition::new, - expression(), left(), right(), operation); - } - - public BinaryArithmeticOperation operation() { - return operation; - } - - @Override - protected BinaryProcessorDefinition replaceChildren(ProcessorDefinition left, ProcessorDefinition right) { - return new BinaryArithmeticProcessorDefinition(location(), expression(), left, right, operation); - } - - @Override - public BinaryArithmeticProcessor asProcessor() { - return new BinaryArithmeticProcessor(left().asProcessor(), right().asProcessor(), operation); - } - - @Override - public int hashCode() { - return Objects.hash(left(), right(), operation); - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - - if (obj == null || getClass() != obj.getClass()) { - return false; - } - - BinaryArithmeticProcessorDefinition other = (BinaryArithmeticProcessorDefinition) obj; - return Objects.equals(operation, other.operation) - && Objects.equals(left(), other.left()) - && Objects.equals(right(), other.right()); - } -} diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/datetime/BaseDateTimeFunction.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/datetime/BaseDateTimeFunction.java index 2213fad8c8d9f..b3c621bc14a89 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/datetime/BaseDateTimeFunction.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/datetime/BaseDateTimeFunction.java @@ -8,9 +8,7 @@ import org.elasticsearch.xpack.sql.expression.Expression; import org.elasticsearch.xpack.sql.expression.Expressions; -import org.elasticsearch.xpack.sql.expression.function.aggregate.AggregateFunctionAttribute; import org.elasticsearch.xpack.sql.expression.function.scalar.UnaryScalarFunction; -import org.elasticsearch.xpack.sql.expression.function.scalar.script.ScriptTemplate; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; import org.elasticsearch.xpack.sql.type.DataType; @@ -62,9 +60,4 @@ public String name() { public boolean foldable() { return field().foldable(); } - - @Override - protected ScriptTemplate asScriptFrom(AggregateFunctionAttribute aggregate) { - throw new UnsupportedOperationException(); - } } diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/datetime/BaseDateTimeProcessor.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/datetime/BaseDateTimeProcessor.java index 95547ded22274..c8f42704ac525 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/datetime/BaseDateTimeProcessor.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/datetime/BaseDateTimeProcessor.java @@ -9,7 +9,7 @@ import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.xpack.sql.SqlIllegalArgumentException; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.Processor; +import org.elasticsearch.xpack.sql.expression.gen.processor.Processor; import org.joda.time.ReadableInstant; import java.io.IOException; diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/datetime/DateTimeFunction.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/datetime/DateTimeFunction.java index d87e15084a422..2ecfc27376de6 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/datetime/DateTimeFunction.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/datetime/DateTimeFunction.java @@ -6,13 +6,13 @@ package org.elasticsearch.xpack.sql.expression.function.scalar.datetime; import org.elasticsearch.xpack.sql.expression.Expression; +import org.elasticsearch.xpack.sql.expression.Expressions; import org.elasticsearch.xpack.sql.expression.FieldAttribute; import org.elasticsearch.xpack.sql.expression.function.scalar.datetime.DateTimeProcessor.DateTimeExtractor; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinition; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinitions; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.UnaryProcessorDefinition; -import org.elasticsearch.xpack.sql.expression.function.scalar.script.ParamsBuilder; -import org.elasticsearch.xpack.sql.expression.function.scalar.script.ScriptTemplate; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.UnaryPipe; +import org.elasticsearch.xpack.sql.expression.gen.script.ParamsBuilder; +import org.elasticsearch.xpack.sql.expression.gen.script.ScriptTemplate; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.type.DataType; import org.joda.time.DateTime; @@ -24,8 +24,7 @@ import java.util.Objects; import java.util.TimeZone; -import static org.elasticsearch.xpack.sql.expression.function.scalar.script.ParamsBuilder.paramsBuilder; -import static org.elasticsearch.xpack.sql.expression.function.scalar.script.ScriptTemplate.formatTemplate; +import static org.elasticsearch.xpack.sql.expression.gen.script.ParamsBuilder.paramsBuilder; public abstract class DateTimeFunction extends BaseDateTimeFunction { @@ -49,7 +48,7 @@ public static Integer dateTimeChrono(long millis, String tzId, String chronoName } @Override - protected ScriptTemplate asScriptFrom(FieldAttribute field) { + public ScriptTemplate scriptWithField(FieldAttribute field) { ParamsBuilder params = paramsBuilder(); String template = null; @@ -67,9 +66,8 @@ protected ScriptTemplate asScriptFrom(FieldAttribute field) { protected abstract ChronoField chronoField(); @Override - protected ProcessorDefinition makeProcessorDefinition() { - return new UnaryProcessorDefinition(location(), this, ProcessorDefinitions.toProcessorDefinition(field()), - new DateTimeProcessor(extractor(), timeZone())); + protected Pipe makePipe() { + return new UnaryPipe(location(), this, Expressions.pipe(field()), new DateTimeProcessor(extractor(), timeZone())); } protected abstract DateTimeExtractor extractor(); diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/datetime/DayName.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/datetime/DayName.java index 2f5ba7eeaca9f..77cf427770436 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/datetime/DayName.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/datetime/DayName.java @@ -16,7 +16,6 @@ * Extract the day of the week from a datetime in text format (Monday, Tuesday etc.) */ public class DayName extends NamedDateTimeFunction { - protected static final String DAY_NAME_FORMAT = "EEEE"; public DayName(Location location, Expression field, TimeZone timeZone) { super(location, field, timeZone); @@ -32,18 +31,8 @@ protected DayName replaceChild(Expression newChild) { return new DayName(location(), newChild, timeZone()); } - @Override - protected String dateTimeFormat() { - return DAY_NAME_FORMAT; - } - @Override protected NameExtractor nameExtractor() { return NameExtractor.DAY_NAME; } - - @Override - public String extractName(long millis, String tzId) { - return nameExtractor().extract(millis, tzId); - } } diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/datetime/MonthName.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/datetime/MonthName.java index 170c80c10f91a..75be997840661 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/datetime/MonthName.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/datetime/MonthName.java @@ -16,7 +16,6 @@ * Extract the month from a datetime in text format (January, February etc.) */ public class MonthName extends NamedDateTimeFunction { - protected static final String MONTH_NAME_FORMAT = "MMMM"; public MonthName(Location location, Expression field, TimeZone timeZone) { super(location, field, timeZone); @@ -32,16 +31,6 @@ protected MonthName replaceChild(Expression newChild) { return new MonthName(location(), newChild, timeZone()); } - @Override - protected String dateTimeFormat() { - return MONTH_NAME_FORMAT; - } - - @Override - public String extractName(long millis, String tzId) { - return nameExtractor().extract(millis, tzId); - } - @Override protected NameExtractor nameExtractor() { return NameExtractor.MONTH_NAME; diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/datetime/NamedDateTimeFunction.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/datetime/NamedDateTimeFunction.java index c3e10981ce1fe..935e517ee0ff7 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/datetime/NamedDateTimeFunction.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/datetime/NamedDateTimeFunction.java @@ -6,26 +6,26 @@ package org.elasticsearch.xpack.sql.expression.function.scalar.datetime; import org.elasticsearch.xpack.sql.expression.Expression; +import org.elasticsearch.xpack.sql.expression.Expressions; import org.elasticsearch.xpack.sql.expression.FieldAttribute; import org.elasticsearch.xpack.sql.expression.function.scalar.datetime.NamedDateTimeProcessor.NameExtractor; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinition; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinitions; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.UnaryProcessorDefinition; -import org.elasticsearch.xpack.sql.expression.function.scalar.script.ParamsBuilder; -import org.elasticsearch.xpack.sql.expression.function.scalar.script.ScriptTemplate; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.UnaryPipe; +import org.elasticsearch.xpack.sql.expression.gen.script.ScriptTemplate; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.type.DataType; import org.elasticsearch.xpack.sql.util.StringUtils; import org.joda.time.DateTime; +import java.util.Locale; import java.util.Objects; import java.util.TimeZone; -import static org.elasticsearch.xpack.sql.expression.function.scalar.script.ParamsBuilder.paramsBuilder; -import static org.elasticsearch.xpack.sql.expression.function.scalar.script.ScriptTemplate.formatTemplate; +import static java.lang.String.format; +import static org.elasticsearch.xpack.sql.expression.gen.script.ParamsBuilder.paramsBuilder; /* - * Base class for "naming" date/time functions like month_name and day_name + * Base class for "named" date/time functions like month_name and day_name */ abstract class NamedDateTimeFunction extends BaseDateTimeFunction { @@ -40,38 +40,28 @@ public Object fold() { return null; } - return extractName(folded.getMillis(), timeZone().getID()); + return nameExtractor().extract(folded.getMillis(), timeZone().getID()); } - public abstract String extractName(long millis, String tzId); - @Override - protected ScriptTemplate asScriptFrom(FieldAttribute field) { - ParamsBuilder params = paramsBuilder(); - - String template = null; - template = formatTemplate(formatMethodName("{sql}.{method_name}(doc[{}].value.millis, {})")); - params.variable(field.name()) - .variable(timeZone().getID()); - - return new ScriptTemplate(template, params.build(), dataType()); - } - - private String formatMethodName(String template) { - // the Painless method name will be the enum's lower camelcase name - return template.replace("{method_name}", StringUtils.underscoreToLowerCamelCase(nameExtractor().toString())); + public ScriptTemplate scriptWithField(FieldAttribute field) { + return new ScriptTemplate( + formatTemplate(format(Locale.ROOT, "{sql}.%s(doc[{}].value.millis, {})", + StringUtils.underscoreToLowerCamelCase(nameExtractor().name()))), + paramsBuilder() + .variable(field.name()) + .variable(timeZone().getID()).build(), + dataType()); } @Override - protected final ProcessorDefinition makeProcessorDefinition() { - return new UnaryProcessorDefinition(location(), this, ProcessorDefinitions.toProcessorDefinition(field()), + protected final Pipe makePipe() { + return new UnaryPipe(location(), this, Expressions.pipe(field()), new NamedDateTimeProcessor(nameExtractor(), timeZone())); } protected abstract NameExtractor nameExtractor(); - protected abstract String dateTimeFormat(); - @Override public DataType dataType() { return DataType.KEYWORD; diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/datetime/NamedDateTimeProcessor.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/datetime/NamedDateTimeProcessor.java index 478ad8ee09f04..43b3db07236a5 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/datetime/NamedDateTimeProcessor.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/datetime/NamedDateTimeProcessor.java @@ -24,11 +24,11 @@ public enum NameExtractor { // for the moment we'll use no specific Locale, but we might consider introducing a Locale parameter, just like the timeZone one DAY_NAME((Long millis, String tzId) -> { ZonedDateTime time = ZonedDateTime.ofInstant(Instant.ofEpochMilli(millis), ZoneId.of(tzId)); - return time.format(DateTimeFormatter.ofPattern(DayName.DAY_NAME_FORMAT, Locale.ROOT)); + return time.format(DateTimeFormatter.ofPattern(DAY_NAME_FORMAT, Locale.ROOT)); }), MONTH_NAME((Long millis, String tzId) -> { ZonedDateTime time = ZonedDateTime.ofInstant(Instant.ofEpochMilli(millis), ZoneId.of(tzId)); - return time.format(DateTimeFormatter.ofPattern(MonthName.MONTH_NAME_FORMAT, Locale.ROOT)); + return time.format(DateTimeFormatter.ofPattern(MONTH_NAME_FORMAT, Locale.ROOT)); }); private final BiFunction apply; @@ -43,6 +43,8 @@ public final String extract(Long millis, String tzId) { } public static final String NAME = "ndt"; + private static final String MONTH_NAME_FORMAT = "MMMM"; + private static final String DAY_NAME_FORMAT = "EEEE"; private final NameExtractor extractor; diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/datetime/Quarter.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/datetime/Quarter.java index 22e368b0ec6ba..9cf15f637df31 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/datetime/Quarter.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/datetime/Quarter.java @@ -7,12 +7,11 @@ package org.elasticsearch.xpack.sql.expression.function.scalar.datetime; import org.elasticsearch.xpack.sql.expression.Expression; +import org.elasticsearch.xpack.sql.expression.Expressions; import org.elasticsearch.xpack.sql.expression.FieldAttribute; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinition; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinitions; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.UnaryProcessorDefinition; -import org.elasticsearch.xpack.sql.expression.function.scalar.script.ParamsBuilder; -import org.elasticsearch.xpack.sql.expression.function.scalar.script.ScriptTemplate; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.UnaryPipe; +import org.elasticsearch.xpack.sql.expression.gen.script.ScriptTemplate; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo.NodeCtor2; import org.elasticsearch.xpack.sql.type.DataType; @@ -22,8 +21,7 @@ import java.util.TimeZone; import static org.elasticsearch.xpack.sql.expression.function.scalar.datetime.QuarterProcessor.quarter; -import static org.elasticsearch.xpack.sql.expression.function.scalar.script.ParamsBuilder.paramsBuilder; -import static org.elasticsearch.xpack.sql.expression.function.scalar.script.ScriptTemplate.formatTemplate; +import static org.elasticsearch.xpack.sql.expression.gen.script.ParamsBuilder.paramsBuilder; public class Quarter extends BaseDateTimeFunction { @@ -44,15 +42,13 @@ public Object fold() { } @Override - protected ScriptTemplate asScriptFrom(FieldAttribute field) { - ParamsBuilder params = paramsBuilder(); - - String template = null; - template = formatTemplate("{sql}.quarter(doc[{}].value.millis, {})"); - params.variable(field.name()) - .variable(timeZone().getID()); - - return new ScriptTemplate(template, params.build(), dataType()); + public ScriptTemplate scriptWithField(FieldAttribute field) { + return new ScriptTemplate(formatTemplate("{sql}.quarter(doc[{}].value.millis, {})"), + paramsBuilder() + .variable(field.name()) + .variable(timeZone().getID()) + .build(), + dataType()); } @Override @@ -66,9 +62,8 @@ protected Quarter replaceChild(Expression newChild) { } @Override - protected ProcessorDefinition makeProcessorDefinition() { - return new UnaryProcessorDefinition(location(), this, ProcessorDefinitions.toProcessorDefinition(field()), - new QuarterProcessor(timeZone())); + protected Pipe makePipe() { + return new UnaryPipe(location(), this, Expressions.pipe(field()), new QuarterProcessor(timeZone())); } @Override @@ -90,5 +85,4 @@ public boolean equals(Object obj) { public int hashCode() { return Objects.hash(field(), timeZone()); } - -} +} \ No newline at end of file diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/ATan2.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/ATan2.java index 24bbebd64c2db..9ade51084061f 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/ATan2.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/ATan2.java @@ -7,13 +7,9 @@ import org.elasticsearch.xpack.sql.expression.Expression; import org.elasticsearch.xpack.sql.expression.function.scalar.math.BinaryMathProcessor.BinaryMathOperation; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinition; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinitions; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; -import java.util.function.BiFunction; - /** * Multi-valued inverse tangent * function. @@ -21,12 +17,7 @@ public class ATan2 extends BinaryNumericFunction { public ATan2(Location location, Expression left, Expression right) { - super(location, left, right); - } - - @Override - protected BiFunction operation() { - return BinaryMathOperation.ATAN2; + super(location, left, right, BinaryMathOperation.ATAN2); } @Override @@ -38,12 +29,4 @@ protected NodeInfo info() { protected ATan2 replaceChildren(Expression newLeft, Expression newRight) { return new ATan2(location(), newLeft, newRight); } - - @Override - protected ProcessorDefinition makeProcessorDefinition() { - return new BinaryMathProcessorDefinition(location(), this, - ProcessorDefinitions.toProcessorDefinition(left()), - ProcessorDefinitions.toProcessorDefinition(right()), - BinaryMathOperation.ATAN2); - } } diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/BinaryMathPipe.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/BinaryMathPipe.java new file mode 100644 index 0000000000000..0a598275c7fb7 --- /dev/null +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/BinaryMathPipe.java @@ -0,0 +1,62 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +package org.elasticsearch.xpack.sql.expression.function.scalar.math; + +import org.elasticsearch.xpack.sql.expression.Expression; +import org.elasticsearch.xpack.sql.expression.function.scalar.math.BinaryMathProcessor.BinaryMathOperation; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.BinaryPipe; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; +import org.elasticsearch.xpack.sql.tree.Location; +import org.elasticsearch.xpack.sql.tree.NodeInfo; + +import java.util.Objects; + +/** + * Math operation pipe requiring two arguments. + */ +public class BinaryMathPipe extends BinaryPipe { + + private final BinaryMathOperation operation; + + public BinaryMathPipe(Location location, Expression expression, Pipe left, + Pipe right, BinaryMathOperation operation) { + super(location, expression, left, right); + this.operation = operation; + } + + @Override + protected NodeInfo info() { + return NodeInfo.create(this, BinaryMathPipe::new, expression(), left(), right(), operation); + } + + public BinaryMathOperation operation() { + return operation; + } + + @Override + protected BinaryPipe replaceChildren(Pipe left, Pipe right) { + return new BinaryMathPipe(location(), expression(), left, right, operation); + } + + @Override + public BinaryMathProcessor asProcessor() { + return new BinaryMathProcessor(left().asProcessor(), right().asProcessor(), operation); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), operation); + } + + @Override + public boolean equals(Object obj) { + if (super.equals(obj)) { + BinaryMathPipe other = (BinaryMathPipe) obj; + return Objects.equals(operation, other.operation); + } + return false; + } +} diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/BinaryMathProcessor.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/BinaryMathProcessor.java index 5c42f62a3b46c..3a4f6dd501453 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/BinaryMathProcessor.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/BinaryMathProcessor.java @@ -10,7 +10,8 @@ import org.elasticsearch.xpack.sql.SqlIllegalArgumentException; import org.elasticsearch.xpack.sql.expression.function.scalar.math.BinaryMathProcessor.BinaryMathOperation; import org.elasticsearch.xpack.sql.expression.function.scalar.math.MathProcessor.MathOperation; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.Processor; +import org.elasticsearch.xpack.sql.expression.gen.processor.Processor; +import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.Arithmetics; import java.io.IOException; import java.util.function.BiFunction; @@ -23,6 +24,7 @@ public class BinaryMathProcessor extends BinaryNumericProcessor { ATAN2((l, r) -> Math.atan2(l.doubleValue(), r.doubleValue())), + MOD(Arithmetics::mod), POWER((l, r) -> Math.pow(l.doubleValue(), r.doubleValue())), ROUND((l, r) -> { if (l == null) { @@ -87,4 +89,4 @@ protected void doWrite(StreamOutput out) throws IOException { public String getWriteableName() { return NAME; } -} +} \ No newline at end of file diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/BinaryMathProcessorDefinition.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/BinaryMathProcessorDefinition.java deleted file mode 100644 index 482029a8c1673..0000000000000 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/BinaryMathProcessorDefinition.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -package org.elasticsearch.xpack.sql.expression.function.scalar.math; - -import org.elasticsearch.xpack.sql.expression.Expression; -import org.elasticsearch.xpack.sql.expression.function.scalar.math.BinaryMathProcessor.BinaryMathOperation; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.BinaryProcessorDefinition; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinition; -import org.elasticsearch.xpack.sql.tree.Location; -import org.elasticsearch.xpack.sql.tree.NodeInfo; - -import java.util.Objects; - -/** - * Processor definition for math operations requiring two arguments. - */ -public class BinaryMathProcessorDefinition extends BinaryProcessorDefinition { - - private final BinaryMathOperation operation; - - public BinaryMathProcessorDefinition(Location location, Expression expression, ProcessorDefinition left, - ProcessorDefinition right, BinaryMathOperation operation) { - super(location, expression, left, right); - this.operation = operation; - } - - @Override - protected NodeInfo info() { - return NodeInfo.create(this, BinaryMathProcessorDefinition::new, expression(), left(), right(), operation); - } - - public BinaryMathOperation operation() { - return operation; - } - - @Override - protected BinaryProcessorDefinition replaceChildren(ProcessorDefinition left, ProcessorDefinition right) { - return new BinaryMathProcessorDefinition(location(), expression(), left, right, operation); - } - - @Override - public BinaryMathProcessor asProcessor() { - return new BinaryMathProcessor(left().asProcessor(), right().asProcessor(), operation); - } - - @Override - public int hashCode() { - return Objects.hash(left(), right(), operation); - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - - if (obj == null || getClass() != obj.getClass()) { - return false; - } - - BinaryMathProcessorDefinition other = (BinaryMathProcessorDefinition) obj; - return Objects.equals(operation, other.operation) - && Objects.equals(left(), other.left()) - && Objects.equals(right(), other.right()); - } -} diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/BinaryNumericFunction.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/BinaryNumericFunction.java index 14675270f9f07..4de63345aabeb 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/BinaryNumericFunction.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/BinaryNumericFunction.java @@ -6,26 +6,29 @@ package org.elasticsearch.xpack.sql.expression.function.scalar.math; import org.elasticsearch.xpack.sql.expression.Expression; +import org.elasticsearch.xpack.sql.expression.Expressions; import org.elasticsearch.xpack.sql.expression.function.scalar.BinaryScalarFunction; -import org.elasticsearch.xpack.sql.expression.function.scalar.script.ScriptTemplate; +import org.elasticsearch.xpack.sql.expression.function.scalar.math.BinaryMathProcessor.BinaryMathOperation; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; +import org.elasticsearch.xpack.sql.expression.gen.script.ScriptTemplate; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.type.DataType; import java.util.Locale; import java.util.Objects; -import java.util.function.BiFunction; import static java.lang.String.format; -import static org.elasticsearch.xpack.sql.expression.function.scalar.script.ParamsBuilder.paramsBuilder; +import static org.elasticsearch.xpack.sql.expression.gen.script.ParamsBuilder.paramsBuilder; public abstract class BinaryNumericFunction extends BinaryScalarFunction { - protected BinaryNumericFunction(Location location, Expression left, Expression right) { + private final BinaryMathOperation operation; + + protected BinaryNumericFunction(Location location, Expression left, Expression right, BinaryMathOperation operation) { super(location, left, right); + this.operation = operation; } - protected abstract BiFunction operation(); - @Override public DataType dataType() { return DataType.DOUBLE; @@ -46,14 +49,19 @@ protected TypeResolution resolveType() { } protected TypeResolution resolveInputType(DataType inputType) { - return inputType.isNumeric() ? - TypeResolution.TYPE_RESOLVED : + return inputType.isNumeric() ? + TypeResolution.TYPE_RESOLVED : new TypeResolution("'%s' requires a numeric type, received %s", mathFunction(), inputType.esType); } @Override public Object fold() { - return operation().apply((Number) left().fold(), (Number) right().fold()); + return operation.apply((Number) left().fold(), (Number) right().fold()); + } + + @Override + protected Pipe makePipe() { + return new BinaryMathPipe(location(), this, Expressions.pipe(left()), Expressions.pipe(right()), operation); } @Override @@ -70,7 +78,7 @@ protected String mathFunction() { @Override public int hashCode() { - return Objects.hash(left(), right(), operation()); + return Objects.hash(left(), right(), operation); } @Override @@ -81,6 +89,6 @@ public boolean equals(Object obj) { BinaryNumericFunction other = (BinaryNumericFunction) obj; return Objects.equals(other.left(), left()) && Objects.equals(other.right(), right()) - && Objects.equals(other.operation(), operation()); + && Objects.equals(other.operation, operation); } } \ No newline at end of file diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/BinaryNumericProcessor.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/BinaryNumericProcessor.java index 3acc1cabf2bd7..599db91673f89 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/BinaryNumericProcessor.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/BinaryNumericProcessor.java @@ -7,8 +7,8 @@ import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.xpack.sql.SqlIllegalArgumentException; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.BinaryProcessor; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.Processor; +import org.elasticsearch.xpack.sql.expression.gen.processor.BinaryProcessor; +import org.elasticsearch.xpack.sql.expression.gen.processor.Processor; import java.io.IOException; import java.util.Locale; diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/Cot.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/Cot.java index 5bb4e0630bb49..5bf51fd7a0f93 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/Cot.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/Cot.java @@ -34,8 +34,9 @@ protected Cot replaceChild(Expression newChild) { } @Override - protected String formatScript(String template) { - return super.formatScript(format(Locale.ROOT, "1.0 / Math.tan(%s)", template)); + public String processScript(String template) { + // FIXME: needs to be null aware + return super.processScript(format(Locale.ROOT, "1.0 / Math.tan(%s)", template)); } @Override diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/E.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/E.java index a3fdfa654dfa4..e9d5d4a37e89b 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/E.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/E.java @@ -9,8 +9,8 @@ import org.elasticsearch.xpack.sql.expression.Expression; import org.elasticsearch.xpack.sql.expression.Literal; import org.elasticsearch.xpack.sql.expression.function.scalar.math.MathProcessor.MathOperation; -import org.elasticsearch.xpack.sql.expression.function.scalar.script.Params; -import org.elasticsearch.xpack.sql.expression.function.scalar.script.ScriptTemplate; +import org.elasticsearch.xpack.sql.expression.gen.script.Params; +import org.elasticsearch.xpack.sql.expression.gen.script.ScriptTemplate; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; import org.elasticsearch.xpack.sql.type.DataType; diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/MathFunction.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/MathFunction.java index c50b7243f10ec..d119305322194 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/MathFunction.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/MathFunction.java @@ -6,11 +6,11 @@ package org.elasticsearch.xpack.sql.expression.function.scalar.math; import org.elasticsearch.xpack.sql.expression.Expression; +import org.elasticsearch.xpack.sql.expression.Expressions; import org.elasticsearch.xpack.sql.expression.function.scalar.UnaryScalarFunction; import org.elasticsearch.xpack.sql.expression.function.scalar.math.MathProcessor.MathOperation; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinition; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinitions; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.UnaryProcessorDefinition; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.UnaryPipe; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.type.DataType; @@ -40,8 +40,8 @@ public Object fold() { } @Override - protected String formatScript(String template) { - return super.formatScript(format(Locale.ROOT, "Math.%s(%s)", mathFunction(), template)); + public String processScript(String template) { + return super.processScript(format(Locale.ROOT, "Math.%s(%s)", mathFunction(), template)); } protected String mathFunction() { @@ -64,9 +64,8 @@ protected TypeResolution resolveType() { } @Override - protected final ProcessorDefinition makeProcessorDefinition() { - return new UnaryProcessorDefinition(location(), this, - ProcessorDefinitions.toProcessorDefinition(field()), new MathProcessor(operation())); + protected final Pipe makePipe() { + return new UnaryPipe(location(), this, Expressions.pipe(field()), new MathProcessor(operation())); } protected abstract MathOperation operation(); diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/MathProcessor.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/MathProcessor.java index 18d19776cc142..07da9b2e3cc27 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/MathProcessor.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/MathProcessor.java @@ -9,7 +9,7 @@ import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.xpack.sql.SqlIllegalArgumentException; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.Processor; +import org.elasticsearch.xpack.sql.expression.gen.processor.Processor; import java.io.IOException; import java.util.Random; diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/Pi.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/Pi.java index e57aa333f06c0..202d2763fc5a6 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/Pi.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/Pi.java @@ -9,8 +9,8 @@ import org.elasticsearch.xpack.sql.expression.Expression; import org.elasticsearch.xpack.sql.expression.Literal; import org.elasticsearch.xpack.sql.expression.function.scalar.math.MathProcessor.MathOperation; -import org.elasticsearch.xpack.sql.expression.function.scalar.script.Params; -import org.elasticsearch.xpack.sql.expression.function.scalar.script.ScriptTemplate; +import org.elasticsearch.xpack.sql.expression.gen.script.Params; +import org.elasticsearch.xpack.sql.expression.gen.script.ScriptTemplate; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; import org.elasticsearch.xpack.sql.type.DataType; diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/Power.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/Power.java index 4e362dbb8e5eb..03dbc41a34857 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/Power.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/Power.java @@ -7,22 +7,13 @@ import org.elasticsearch.xpack.sql.expression.Expression; import org.elasticsearch.xpack.sql.expression.function.scalar.math.BinaryMathProcessor.BinaryMathOperation; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinition; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinitions; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; -import java.util.function.BiFunction; - public class Power extends BinaryNumericFunction { public Power(Location location, Expression left, Expression right) { - super(location, left, right); - } - - @Override - protected BiFunction operation() { - return BinaryMathOperation.POWER; + super(location, left, right, BinaryMathOperation.POWER); } @Override @@ -35,14 +26,6 @@ protected Power replaceChildren(Expression newLeft, Expression newRight) { return new Power(location(), newLeft, newRight); } - @Override - protected ProcessorDefinition makeProcessorDefinition() { - return new BinaryMathProcessorDefinition(location(), this, - ProcessorDefinitions.toProcessorDefinition(left()), - ProcessorDefinitions.toProcessorDefinition(right()), - BinaryMathOperation.POWER); - } - @Override protected String mathFunction() { return "pow"; diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/Random.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/Random.java index 4e078ed212626..c3ee2201fdd2b 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/Random.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/Random.java @@ -34,9 +34,9 @@ protected Random replaceChild(Expression newChild) { } @Override - protected String formatScript(String template) { + public String processScript(String template) { //TODO: Painless script uses Random since Randomness is not whitelisted - return super.formatScript( + return super.processScript( format(Locale.ROOT, "%s != null ? new Random((long) %s).nextDouble() : Math.random()", template, template)); } diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/Round.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/Round.java index f008b031a3408..d2e87daa0e29d 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/Round.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/Round.java @@ -8,18 +8,15 @@ import org.elasticsearch.xpack.sql.expression.Expression; import org.elasticsearch.xpack.sql.expression.Literal; import org.elasticsearch.xpack.sql.expression.function.scalar.math.BinaryMathProcessor.BinaryMathOperation; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinition; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinitions; -import org.elasticsearch.xpack.sql.expression.function.scalar.script.ScriptTemplate; +import org.elasticsearch.xpack.sql.expression.gen.script.ScriptTemplate; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; import org.elasticsearch.xpack.sql.type.DataType; import java.util.Locale; -import java.util.function.BiFunction; import static java.lang.String.format; -import static org.elasticsearch.xpack.sql.expression.function.scalar.script.ParamsBuilder.paramsBuilder; +import static org.elasticsearch.xpack.sql.expression.gen.script.ParamsBuilder.paramsBuilder; /** * Function that takes two parameters: one is the field/value itself, the other is a non-floating point numeric @@ -30,7 +27,7 @@ public class Round extends BinaryNumericFunction { public Round(Location location, Expression left, Expression right) { - super(location, left, right == null ? Literal.of(Location.EMPTY, 0) : right); + super(location, left, right == null ? Literal.of(left.location(), 0) : right, BinaryMathOperation.ROUND); } @Override @@ -43,30 +40,11 @@ protected Round replaceChildren(Expression newLeft, Expression newRight) { return new Round(location(), newLeft, newRight); } - @Override - protected BiFunction operation() { - return BinaryMathOperation.ROUND; - } - - @Override - protected ProcessorDefinition makeProcessorDefinition() { - return new BinaryMathProcessorDefinition(location(), this, - ProcessorDefinitions.toProcessorDefinition(left()), - ProcessorDefinitions.toProcessorDefinition(right()), - BinaryMathOperation.ROUND); - } - - protected TypeResolution resolveInputType(DataType inputType) { - return inputType.isNumeric() ? - TypeResolution.TYPE_RESOLVED : - new TypeResolution("'%s' requires a numeric type, received %s", mathFunction(), inputType.esType); - } - @Override protected ScriptTemplate asScriptFrom(ScriptTemplate leftScript, ScriptTemplate rightScript) { - return new ScriptTemplate(format(Locale.ROOT, ScriptTemplate.formatTemplate("{sql}.%s(%s,%s)"), - mathFunction(), - leftScript.template(), + return new ScriptTemplate(format(Locale.ROOT, formatTemplate("{sql}.%s(%s,%s)"), + mathFunction(), + leftScript.template(), rightScript.template()), paramsBuilder() .script(leftScript.params()).script(rightScript.params()) diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/Truncate.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/Truncate.java index af7e20c1d997c..58fdede908767 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/Truncate.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/Truncate.java @@ -8,29 +8,26 @@ import org.elasticsearch.xpack.sql.expression.Expression; import org.elasticsearch.xpack.sql.expression.Literal; import org.elasticsearch.xpack.sql.expression.function.scalar.math.BinaryMathProcessor.BinaryMathOperation; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinition; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinitions; -import org.elasticsearch.xpack.sql.expression.function.scalar.script.ScriptTemplate; +import org.elasticsearch.xpack.sql.expression.gen.script.ScriptTemplate; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; import org.elasticsearch.xpack.sql.type.DataType; import java.util.Locale; -import java.util.function.BiFunction; import static java.lang.String.format; -import static org.elasticsearch.xpack.sql.expression.function.scalar.script.ParamsBuilder.paramsBuilder; +import static org.elasticsearch.xpack.sql.expression.gen.script.ParamsBuilder.paramsBuilder; /** * Function that takes two parameters: one is the field/value itself, the other is a non-floating point numeric - * which indicates how the truncation should behave. If positive, it will truncate the number till that + * which indicates how the truncation should behave. If positive, it will truncate the number till that * parameter count digits after the decimal point. If negative, it will truncate the number till that parameter * count digits before the decimal point, starting at the decimal point. */ public class Truncate extends BinaryNumericFunction { public Truncate(Location location, Expression left, Expression right) { - super(location, left, right == null ? Literal.of(Location.EMPTY, 0) : right); + super(location, left, right == null ? Literal.of(left.location(), 0) : right, BinaryMathOperation.TRUNCATE); } @Override @@ -43,24 +40,11 @@ protected Truncate replaceChildren(Expression newLeft, Expression newRight) { return new Truncate(location(), newLeft, newRight); } - @Override - protected BiFunction operation() { - return BinaryMathOperation.TRUNCATE; - } - - @Override - protected ProcessorDefinition makeProcessorDefinition() { - return new BinaryMathProcessorDefinition(location(), this, - ProcessorDefinitions.toProcessorDefinition(left()), - ProcessorDefinitions.toProcessorDefinition(right()), - BinaryMathOperation.TRUNCATE); - } - @Override protected ScriptTemplate asScriptFrom(ScriptTemplate leftScript, ScriptTemplate rightScript) { - return new ScriptTemplate(format(Locale.ROOT, ScriptTemplate.formatTemplate("{sql}.%s(%s,%s)"), - mathFunction(), - leftScript.template(), + return new ScriptTemplate(format(Locale.ROOT, formatTemplate("{sql}.%s(%s,%s)"), + mathFunction(), + leftScript.template(), rightScript.template()), paramsBuilder() .script(leftScript.params()).script(rightScript.params()) diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/ProcessorDefinitions.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/ProcessorDefinitions.java deleted file mode 100644 index e525b37b4dd7b..0000000000000 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/ProcessorDefinitions.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -package org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition; - -import org.elasticsearch.xpack.sql.SqlIllegalArgumentException; -import org.elasticsearch.xpack.sql.expression.Expression; -import org.elasticsearch.xpack.sql.expression.NamedExpression; -import org.elasticsearch.xpack.sql.expression.function.aggregate.AggregateFunction; -import org.elasticsearch.xpack.sql.expression.function.scalar.ScalarFunction; - -public abstract class ProcessorDefinitions { - - public static ProcessorDefinition toProcessorDefinition(Expression ex) { - if (ex.foldable()) { - return new ConstantInput(ex.location(), ex, ex.fold()); - } - if (ex instanceof ScalarFunction) { - return ((ScalarFunction) ex).asProcessorDefinition(); - } - if (ex instanceof AggregateFunction) { - // unresolved AggNameInput (should always get replaced by the folder) - return new AggNameInput(ex.location(), ex, ((AggregateFunction) ex).name()); - } - if (ex instanceof NamedExpression) { - return new AttributeInput(ex.location(), ex, ((NamedExpression) ex).toAttribute()); - } - throw new SqlIllegalArgumentException("Cannot extract processor from {}", ex); - } -} diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringFunction.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringFunction.java index 2ee241c8a0fe7..093d6c95e78fd 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringFunction.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringFunction.java @@ -8,18 +8,16 @@ import org.elasticsearch.xpack.sql.expression.Expression; import org.elasticsearch.xpack.sql.expression.FieldAttribute; import org.elasticsearch.xpack.sql.expression.function.scalar.BinaryScalarFunction; -import org.elasticsearch.xpack.sql.expression.function.scalar.script.ScriptTemplate; +import org.elasticsearch.xpack.sql.expression.gen.script.ScriptTemplate; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.type.DataType; -import org.elasticsearch.xpack.sql.util.StringUtils; import java.util.Locale; import java.util.Objects; import java.util.function.BiFunction; import static java.lang.String.format; -import static org.elasticsearch.xpack.sql.expression.function.scalar.script.ParamsBuilder.paramsBuilder; -import static org.elasticsearch.xpack.sql.expression.function.scalar.script.ScriptTemplate.formatTemplate; +import static org.elasticsearch.xpack.sql.expression.gen.script.ParamsBuilder.paramsBuilder; /** * Base class for binary functions that have the first parameter a string, the second parameter a number @@ -61,11 +59,11 @@ public Object fold() { } @Override - protected ScriptTemplate asScriptFrom(ScriptTemplate leftScript, ScriptTemplate rightScript) { + public ScriptTemplate asScriptFrom(ScriptTemplate leftScript, ScriptTemplate rightScript) { // basically, transform the script to InternalSqlScriptUtils.[function_name](function_or_field1, function_or_field2) - return new ScriptTemplate(format(Locale.ROOT, formatTemplate("{sql}.%s(%s,%s)"), - StringUtils.underscoreToLowerCamelCase(operation().toString()), - leftScript.template(), + return new ScriptTemplate(format(Locale.ROOT, formatTemplate("{sql}.%s(%s,%s)"), + operation().toString().toLowerCase(Locale.ROOT), + leftScript.template(), rightScript.template()), paramsBuilder() .script(leftScript.params()).script(rightScript.params()) @@ -73,8 +71,8 @@ protected ScriptTemplate asScriptFrom(ScriptTemplate leftScript, ScriptTemplate } @Override - protected ScriptTemplate asScriptFrom(FieldAttribute field) { - return new ScriptTemplate(formatScript("doc[{}].value"), + public ScriptTemplate scriptWithField(FieldAttribute field) { + return new ScriptTemplate(processScript("doc[{}].value"), paramsBuilder().variable(field.isInexact() ? field.exactAttribute().name() : field.name()).build(), dataType()); } diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringNumericFunction.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringNumericFunction.java index 3e3637d57df2d..eaddf4bc70f24 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringNumericFunction.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringNumericFunction.java @@ -6,6 +6,9 @@ package org.elasticsearch.xpack.sql.expression.function.scalar.string; import org.elasticsearch.xpack.sql.expression.Expression; +import org.elasticsearch.xpack.sql.expression.Expressions; +import org.elasticsearch.xpack.sql.expression.function.scalar.string.BinaryStringNumericProcessor.BinaryStringNumericOperation; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.type.DataType; @@ -18,13 +21,21 @@ public BinaryStringNumericFunction(Location location, Expression left, Expressio super(location, left, right); } + @Override + protected abstract BinaryStringNumericOperation operation(); + @Override protected TypeResolution resolveSecondParameterInputType(DataType inputType) { - return inputType.isNumeric() ? - TypeResolution.TYPE_RESOLVED : + return inputType.isNumeric() ? + TypeResolution.TYPE_RESOLVED : new TypeResolution("'%s' requires second parameter to be a numeric type, received %s", functionName(), inputType); } - + + @Override + protected Pipe makePipe() { + return new BinaryStringNumericPipe(location(), this, Expressions.pipe(left()), Expressions.pipe(right()), operation()); + } + @Override public DataType dataType() { return DataType.KEYWORD; diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringNumericPipe.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringNumericPipe.java new file mode 100644 index 0000000000000..55f5b677864b3 --- /dev/null +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringNumericPipe.java @@ -0,0 +1,62 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +package org.elasticsearch.xpack.sql.expression.function.scalar.string; + +import org.elasticsearch.xpack.sql.expression.Expression; +import org.elasticsearch.xpack.sql.expression.function.scalar.string.BinaryStringNumericProcessor.BinaryStringNumericOperation; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.BinaryPipe; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; +import org.elasticsearch.xpack.sql.tree.Location; +import org.elasticsearch.xpack.sql.tree.NodeInfo; + +import java.util.Objects; + +/** + * String operations pipe requiring one string and one numeric argument. + */ +public class BinaryStringNumericPipe extends BinaryPipe { + + private final BinaryStringNumericOperation operation; + + public BinaryStringNumericPipe(Location location, Expression expression, Pipe left, + Pipe right, BinaryStringNumericOperation operation) { + super(location, expression, left, right); + this.operation = operation; + } + + @Override + protected NodeInfo info() { + return NodeInfo.create(this, BinaryStringNumericPipe::new, expression(), left(), right(), operation()); + } + + public BinaryStringNumericOperation operation() { + return operation; + } + + @Override + protected BinaryPipe replaceChildren(Pipe newLeft, Pipe newRight) { + return new BinaryStringNumericPipe(location(), expression(), newLeft, newRight, operation()); + } + + @Override + public BinaryStringNumericProcessor asProcessor() { + return new BinaryStringNumericProcessor(left().asProcessor(), right().asProcessor(), operation()); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), operation); + } + + @Override + public boolean equals(Object obj) { + if (super.equals(obj)) { + BinaryStringNumericPipe other = (BinaryStringNumericPipe) obj; + return Objects.equals(operation, other.operation); + } + return false; + } +} diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringNumericProcessor.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringNumericProcessor.java index 683bcba5c3f45..164330dc9e61f 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringNumericProcessor.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringNumericProcessor.java @@ -8,8 +8,8 @@ import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.xpack.sql.SqlIllegalArgumentException; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.Processor; import org.elasticsearch.xpack.sql.expression.function.scalar.string.BinaryStringNumericProcessor.BinaryStringNumericOperation; +import org.elasticsearch.xpack.sql.expression.gen.processor.Processor; import java.io.IOException; import java.util.function.BiFunction; diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringNumericProcessorDefinition.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringNumericProcessorDefinition.java deleted file mode 100644 index b0adcdf1ff2c6..0000000000000 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringNumericProcessorDefinition.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -package org.elasticsearch.xpack.sql.expression.function.scalar.string; - -import org.elasticsearch.xpack.sql.expression.Expression; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.BinaryProcessorDefinition; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinition; -import org.elasticsearch.xpack.sql.expression.function.scalar.string.BinaryStringNumericProcessor.BinaryStringNumericOperation; -import org.elasticsearch.xpack.sql.tree.Location; -import org.elasticsearch.xpack.sql.tree.NodeInfo; - -import java.util.Objects; - -/** - * Processor definition for String operations requiring one string and one numeric argument. - */ -public class BinaryStringNumericProcessorDefinition extends BinaryProcessorDefinition { - - private final BinaryStringNumericOperation operation; - - public BinaryStringNumericProcessorDefinition(Location location, Expression expression, ProcessorDefinition left, - ProcessorDefinition right, BinaryStringNumericOperation operation) { - super(location, expression, left, right); - this.operation = operation; - } - - @Override - protected NodeInfo info() { - return NodeInfo.create(this, BinaryStringNumericProcessorDefinition::new, expression(), left(), right(), operation()); - } - - public BinaryStringNumericOperation operation() { - return operation; - } - - @Override - protected BinaryProcessorDefinition replaceChildren(ProcessorDefinition newLeft, ProcessorDefinition newRight) { - return new BinaryStringNumericProcessorDefinition(location(), expression(), newLeft, newRight, operation()); - } - - @Override - public BinaryStringNumericProcessor asProcessor() { - return new BinaryStringNumericProcessor(left().asProcessor(), right().asProcessor(), operation()); - } - - @Override - public int hashCode() { - return Objects.hash(left(), right(), operation); - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - - if (obj == null || getClass() != obj.getClass()) { - return false; - } - - BinaryStringNumericProcessorDefinition other = (BinaryStringNumericProcessorDefinition) obj; - return Objects.equals(operation, other.operation) - && Objects.equals(left(), other.left()) - && Objects.equals(right(), other.right()); - } -} diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringProcessor.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringProcessor.java index 0303d15adad7b..b19a441b320b6 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringProcessor.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringProcessor.java @@ -6,8 +6,8 @@ package org.elasticsearch.xpack.sql.expression.function.scalar.string; import org.elasticsearch.common.io.stream.StreamInput; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.BinaryProcessor; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.Processor; +import org.elasticsearch.xpack.sql.expression.gen.processor.BinaryProcessor; +import org.elasticsearch.xpack.sql.expression.gen.processor.Processor; import java.io.IOException; import java.util.Objects; diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringStringPipe.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringStringPipe.java new file mode 100644 index 0000000000000..ec1ab78c42d99 --- /dev/null +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringStringPipe.java @@ -0,0 +1,62 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +package org.elasticsearch.xpack.sql.expression.function.scalar.string; + +import org.elasticsearch.xpack.sql.expression.Expression; +import org.elasticsearch.xpack.sql.expression.function.scalar.string.BinaryStringStringProcessor.BinaryStringStringOperation; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.BinaryPipe; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; +import org.elasticsearch.xpack.sql.tree.Location; +import org.elasticsearch.xpack.sql.tree.NodeInfo; + +import java.util.Objects; + +/** + * String operations pipe requiring two string arguments. + */ +public class BinaryStringStringPipe extends BinaryPipe { + + private final BinaryStringStringOperation operation; + + public BinaryStringStringPipe(Location location, Expression expression, Pipe left, + Pipe right, BinaryStringStringOperation operation) { + super(location, expression, left, right); + this.operation = operation; + } + + @Override + protected NodeInfo info() { + return NodeInfo.create(this, BinaryStringStringPipe::new, expression(), left(), right(), operation); + } + + public BinaryStringStringOperation operation() { + return operation; + } + + @Override + protected BinaryPipe replaceChildren(Pipe left, Pipe right) { + return new BinaryStringStringPipe(location(), expression(), left, right, operation); + } + + @Override + public BinaryStringStringProcessor asProcessor() { + return new BinaryStringStringProcessor(left().asProcessor(), right().asProcessor(), operation); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), operation); + } + + @Override + public boolean equals(Object obj) { + if (super.equals(obj)) { + BinaryStringStringPipe other = (BinaryStringStringPipe) obj; + return Objects.equals(operation, other.operation); + } + return false; + } +} diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringStringProcessor.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringStringProcessor.java index 8f3425bdb4e88..c10232d22d6a3 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringStringProcessor.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringStringProcessor.java @@ -8,8 +8,8 @@ import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.xpack.sql.SqlIllegalArgumentException; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.Processor; import org.elasticsearch.xpack.sql.expression.function.scalar.string.BinaryStringStringProcessor.BinaryStringStringOperation; +import org.elasticsearch.xpack.sql.expression.gen.processor.Processor; import java.io.IOException; import java.util.function.BiFunction; diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringStringProcessorDefinition.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringStringProcessorDefinition.java deleted file mode 100644 index 33692845bf96e..0000000000000 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringStringProcessorDefinition.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -package org.elasticsearch.xpack.sql.expression.function.scalar.string; - -import org.elasticsearch.xpack.sql.expression.Expression; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.BinaryProcessorDefinition; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinition; -import org.elasticsearch.xpack.sql.expression.function.scalar.string.BinaryStringStringProcessor.BinaryStringStringOperation; -import org.elasticsearch.xpack.sql.tree.Location; -import org.elasticsearch.xpack.sql.tree.NodeInfo; - -import java.util.Objects; - -/** - * Processor definition for String operations requiring two string arguments. - */ -public class BinaryStringStringProcessorDefinition extends BinaryProcessorDefinition { - - private final BinaryStringStringOperation operation; - - public BinaryStringStringProcessorDefinition(Location location, Expression expression, ProcessorDefinition left, - ProcessorDefinition right, BinaryStringStringOperation operation) { - super(location, expression, left, right); - this.operation = operation; - } - - @Override - protected NodeInfo info() { - return NodeInfo.create(this, BinaryStringStringProcessorDefinition::new, expression(), left(), right(), operation); - } - - public BinaryStringStringOperation operation() { - return operation; - } - - @Override - protected BinaryProcessorDefinition replaceChildren(ProcessorDefinition left, ProcessorDefinition right) { - return new BinaryStringStringProcessorDefinition(location(), expression(), left, right, operation); - } - - @Override - public BinaryStringStringProcessor asProcessor() { - return new BinaryStringStringProcessor(left().asProcessor(), right().asProcessor(), operation); - } - - @Override - public int hashCode() { - return Objects.hash(left(), right(), operation); - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - - if (obj == null || getClass() != obj.getClass()) { - return false; - } - - BinaryStringStringProcessorDefinition other = (BinaryStringStringProcessorDefinition) obj; - return Objects.equals(operation, other.operation) - && Objects.equals(left(), other.left()) - && Objects.equals(right(), other.right()); - } -} diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/Concat.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/Concat.java index a5dc8fc9ac3d7..f996402694651 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/Concat.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/Concat.java @@ -6,11 +6,11 @@ package org.elasticsearch.xpack.sql.expression.function.scalar.string; import org.elasticsearch.xpack.sql.expression.Expression; +import org.elasticsearch.xpack.sql.expression.Expressions; import org.elasticsearch.xpack.sql.expression.FieldAttribute; import org.elasticsearch.xpack.sql.expression.function.scalar.BinaryScalarFunction; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinition; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinitions; -import org.elasticsearch.xpack.sql.expression.function.scalar.script.ScriptTemplate; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; +import org.elasticsearch.xpack.sql.expression.gen.script.ScriptTemplate; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; import org.elasticsearch.xpack.sql.type.DataType; @@ -18,9 +18,8 @@ import java.util.Locale; import static java.lang.String.format; -import static org.elasticsearch.xpack.sql.expression.function.scalar.script.ParamsBuilder.paramsBuilder; -import static org.elasticsearch.xpack.sql.expression.function.scalar.script.ScriptTemplate.formatTemplate; import static org.elasticsearch.xpack.sql.expression.function.scalar.string.ConcatFunctionProcessor.doProcessInScripts; +import static org.elasticsearch.xpack.sql.expression.gen.script.ParamsBuilder.paramsBuilder; /** * Returns a string that is the result of concatenating the two strings received as parameters. @@ -33,6 +32,7 @@ public Concat(Location location, Expression source1, Expression source2) { super(location, source1, source2); } + @Override protected TypeResolution resolveType() { if (!childrenResolved()) { return new TypeResolution("Unresolved children"); @@ -47,16 +47,13 @@ protected TypeResolution resolveType() { } @Override - protected ProcessorDefinition makeProcessorDefinition() { - return new ConcatFunctionProcessorDefinition(location(), this, - ProcessorDefinitions.toProcessorDefinition(left()), - ProcessorDefinitions.toProcessorDefinition(right())); + protected Pipe makePipe() { + return new ConcatFunctionPipe(location(), this, Expressions.pipe(left()), Expressions.pipe(right())); } @Override public boolean foldable() { - return left().foldable() - && right().foldable(); + return left().foldable() && right().foldable(); } @Override @@ -74,20 +71,12 @@ protected NodeInfo info() { return NodeInfo.create(this, Concat::new, left(), right()); } - @Override - public ScriptTemplate asScript() { - ScriptTemplate sourceScript1 = asScript(left()); - ScriptTemplate sourceScript2 = asScript(right()); - - return asScriptFrom(sourceScript1, sourceScript2); - } - @Override protected ScriptTemplate asScriptFrom(ScriptTemplate leftScript, ScriptTemplate rightScript) { // basically, transform the script to InternalSqlScriptUtils.[function_name](function_or_field1, function_or_field2) - return new ScriptTemplate(format(Locale.ROOT, formatTemplate("{sql}.%s(%s,%s)"), - "concat", - leftScript.template(), + return new ScriptTemplate(format(Locale.ROOT, formatTemplate("{sql}.%s(%s,%s)"), + "concat", + leftScript.template(), rightScript.template()), paramsBuilder() .script(leftScript.params()).script(rightScript.params()) @@ -95,8 +84,8 @@ protected ScriptTemplate asScriptFrom(ScriptTemplate leftScript, ScriptTemplate } @Override - protected ScriptTemplate asScriptFrom(FieldAttribute field) { - return new ScriptTemplate(formatScript("doc[{}].value"), + public ScriptTemplate scriptWithField(FieldAttribute field) { + return new ScriptTemplate(processScript("doc[{}].value"), paramsBuilder().variable(field.isInexact() ? field.exactAttribute().name() : field.name()).build(), dataType()); } @@ -105,5 +94,4 @@ protected ScriptTemplate asScriptFrom(FieldAttribute field) { public DataType dataType() { return DataType.KEYWORD; } - -} +} \ No newline at end of file diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/ConcatFunctionProcessorDefinition.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/ConcatFunctionPipe.java similarity index 56% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/ConcatFunctionProcessorDefinition.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/ConcatFunctionPipe.java index f7f86419be16b..82e65f88f1da8 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/ConcatFunctionProcessorDefinition.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/ConcatFunctionPipe.java @@ -6,28 +6,28 @@ package org.elasticsearch.xpack.sql.expression.function.scalar.string; import org.elasticsearch.xpack.sql.expression.Expression; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.BinaryProcessorDefinition; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinition; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.BinaryPipe; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; import java.util.Objects; -public class ConcatFunctionProcessorDefinition extends BinaryProcessorDefinition { +public class ConcatFunctionPipe extends BinaryPipe { - public ConcatFunctionProcessorDefinition(Location location, Expression expression, ProcessorDefinition left, - ProcessorDefinition right) { + public ConcatFunctionPipe(Location location, Expression expression, Pipe left, + Pipe right) { super(location, expression, left, right); } @Override - protected NodeInfo info() { - return NodeInfo.create(this, ConcatFunctionProcessorDefinition::new, expression(), left(), right()); + protected NodeInfo info() { + return NodeInfo.create(this, ConcatFunctionPipe::new, expression(), left(), right()); } @Override - protected BinaryProcessorDefinition replaceChildren(ProcessorDefinition left, ProcessorDefinition right) { - return new ConcatFunctionProcessorDefinition(location(), expression(), left, right); + protected BinaryPipe replaceChildren(Pipe left, Pipe right) { + return new ConcatFunctionPipe(location(), expression(), left, right); } @Override @@ -50,7 +50,7 @@ public boolean equals(Object obj) { return false; } - ConcatFunctionProcessorDefinition other = (ConcatFunctionProcessorDefinition) obj; + ConcatFunctionPipe other = (ConcatFunctionPipe) obj; return Objects.equals(left(), other.left()) && Objects.equals(right(), other.right()); } diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/ConcatFunctionProcessor.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/ConcatFunctionProcessor.java index 3a5e9bbee24d4..675851032ba7f 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/ConcatFunctionProcessor.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/ConcatFunctionProcessor.java @@ -8,15 +8,15 @@ import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.xpack.sql.SqlIllegalArgumentException; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.BinaryProcessor; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.Processor; +import org.elasticsearch.xpack.sql.expression.gen.processor.BinaryProcessor; +import org.elasticsearch.xpack.sql.expression.gen.processor.Processor; import java.io.IOException; import java.util.Objects; public class ConcatFunctionProcessor extends BinaryProcessor { - public static final String NAME = "cb"; + public static final String NAME = "scon"; public ConcatFunctionProcessor(Processor source1, Processor source2) { super(source1, source2); diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/Insert.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/Insert.java index 9d635b7cdcb89..990cd2921dc07 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/Insert.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/Insert.java @@ -6,11 +6,11 @@ package org.elasticsearch.xpack.sql.expression.function.scalar.string; import org.elasticsearch.xpack.sql.expression.Expression; +import org.elasticsearch.xpack.sql.expression.Expressions; import org.elasticsearch.xpack.sql.expression.FieldAttribute; import org.elasticsearch.xpack.sql.expression.function.scalar.ScalarFunction; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinition; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinitions; -import org.elasticsearch.xpack.sql.expression.function.scalar.script.ScriptTemplate; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; +import org.elasticsearch.xpack.sql.expression.gen.script.ScriptTemplate; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; import org.elasticsearch.xpack.sql.type.DataType; @@ -20,9 +20,8 @@ import java.util.Locale; import static java.lang.String.format; -import static org.elasticsearch.xpack.sql.expression.function.scalar.script.ParamsBuilder.paramsBuilder; -import static org.elasticsearch.xpack.sql.expression.function.scalar.script.ScriptTemplate.formatTemplate; import static org.elasticsearch.xpack.sql.expression.function.scalar.string.InsertFunctionProcessor.doProcess; +import static org.elasticsearch.xpack.sql.expression.gen.script.ParamsBuilder.paramsBuilder; /** * Returns a character string where length characters have been deleted from the source string, beginning at start, @@ -40,6 +39,7 @@ public Insert(Location location, Expression source, Expression start, Expression this.replacement = replacement; } + @Override protected TypeResolution resolveType() { if (!childrenResolved()) { return new TypeResolution("Unresolved children"); @@ -65,7 +65,7 @@ protected TypeResolution resolveType() { @Override public boolean foldable() { - return source.foldable() + return source.foldable() && start.foldable() && length.foldable() && replacement.foldable(); @@ -77,12 +77,12 @@ public Object fold() { } @Override - protected ProcessorDefinition makeProcessorDefinition() { - return new InsertFunctionProcessorDefinition(location(), this, - ProcessorDefinitions.toProcessorDefinition(source), - ProcessorDefinitions.toProcessorDefinition(start), - ProcessorDefinitions.toProcessorDefinition(length), - ProcessorDefinitions.toProcessorDefinition(replacement)); + protected Pipe makePipe() { + return new InsertFunctionPipe(location(), this, + Expressions.pipe(source), + Expressions.pipe(start), + Expressions.pipe(length), + Expressions.pipe(replacement)); } @Override @@ -100,13 +100,12 @@ public ScriptTemplate asScript() { return asScriptFrom(sourceScript, startScript, lengthScript, replacementScript); } - protected ScriptTemplate asScriptFrom(ScriptTemplate sourceScript, ScriptTemplate startScript, - ScriptTemplate lengthScript, ScriptTemplate replacementScript) - { + private ScriptTemplate asScriptFrom(ScriptTemplate sourceScript, ScriptTemplate startScript, + ScriptTemplate lengthScript, ScriptTemplate replacementScript) { // basically, transform the script to InternalSqlScriptUtils.[function_name](function_or_field1, function_or_field2,...) - return new ScriptTemplate(format(Locale.ROOT, formatTemplate("{sql}.%s(%s,%s,%s,%s)"), - "insert", - sourceScript.template(), + return new ScriptTemplate(format(Locale.ROOT, formatTemplate("{sql}.%s(%s,%s,%s,%s)"), + "insert", + sourceScript.template(), startScript.template(), lengthScript.template(), replacementScript.template()), @@ -117,8 +116,8 @@ protected ScriptTemplate asScriptFrom(ScriptTemplate sourceScript, ScriptTemplat } @Override - protected ScriptTemplate asScriptFrom(FieldAttribute field) { - return new ScriptTemplate(formatScript("doc[{}].value"), + public ScriptTemplate scriptWithField(FieldAttribute field) { + return new ScriptTemplate(processScript("doc[{}].value"), paramsBuilder().variable(field.isInexact() ? field.exactAttribute().name() : field.name()).build(), dataType()); } @@ -136,4 +135,4 @@ public Expression replaceChildren(List newChildren) { return new Insert(location(), newChildren.get(0), newChildren.get(1), newChildren.get(2), newChildren.get(3)); } -} +} \ No newline at end of file diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/InsertFunctionProcessorDefinition.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/InsertFunctionPipe.java similarity index 63% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/InsertFunctionProcessorDefinition.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/InsertFunctionPipe.java index ab82622788d6f..7c147bca93cbd 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/InsertFunctionProcessorDefinition.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/InsertFunctionPipe.java @@ -7,7 +7,7 @@ import org.elasticsearch.xpack.sql.execution.search.SqlSourceBuilder; import org.elasticsearch.xpack.sql.expression.Expression; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinition; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; @@ -15,13 +15,13 @@ import java.util.List; import java.util.Objects; -public class InsertFunctionProcessorDefinition extends ProcessorDefinition { +public class InsertFunctionPipe extends Pipe { - private final ProcessorDefinition source, start, length, replacement; + private final Pipe source, start, length, replacement; - public InsertFunctionProcessorDefinition(Location location, Expression expression, - ProcessorDefinition source, ProcessorDefinition start, - ProcessorDefinition length, ProcessorDefinition replacement) { + public InsertFunctionPipe(Location location, Expression expression, + Pipe source, Pipe start, + Pipe length, Pipe replacement) { super(location, expression, Arrays.asList(source, start, length, replacement)); this.source = source; this.start = start; @@ -30,7 +30,7 @@ public InsertFunctionProcessorDefinition(Location location, Expression expressio } @Override - public final ProcessorDefinition replaceChildren(List newChildren) { + public final Pipe replaceChildren(List newChildren) { if (newChildren.size() != 4) { throw new IllegalArgumentException("expected [4] children but received [" + newChildren.size() + "]"); } @@ -38,11 +38,11 @@ public final ProcessorDefinition replaceChildren(List newCh } @Override - public final ProcessorDefinition resolveAttributes(AttributeResolver resolver) { - ProcessorDefinition newSource = source.resolveAttributes(resolver); - ProcessorDefinition newStart = start.resolveAttributes(resolver); - ProcessorDefinition newLength = length.resolveAttributes(resolver); - ProcessorDefinition newReplacement = replacement.resolveAttributes(resolver); + public final Pipe resolveAttributes(AttributeResolver resolver) { + Pipe newSource = source.resolveAttributes(resolver); + Pipe newStart = start.resolveAttributes(resolver); + Pipe newLength = length.resolveAttributes(resolver); + Pipe newReplacement = replacement.resolveAttributes(resolver); if (newSource == source && newStart == start && newLength == length @@ -65,11 +65,11 @@ public boolean resolved() { return source.resolved() && start.resolved() && length.resolved() && replacement.resolved(); } - protected ProcessorDefinition replaceChildren(ProcessorDefinition newSource, - ProcessorDefinition newStart, - ProcessorDefinition newLength, - ProcessorDefinition newReplacement) { - return new InsertFunctionProcessorDefinition(location(), expression(), newSource, newStart, newLength, newReplacement); + protected Pipe replaceChildren(Pipe newSource, + Pipe newStart, + Pipe newLength, + Pipe newReplacement) { + return new InsertFunctionPipe(location(), expression(), newSource, newStart, newLength, newReplacement); } @Override @@ -81,8 +81,8 @@ public final void collectFields(SqlSourceBuilder sourceBuilder) { } @Override - protected NodeInfo info() { - return NodeInfo.create(this, InsertFunctionProcessorDefinition::new, expression(), source, start, length, replacement); + protected NodeInfo info() { + return NodeInfo.create(this, InsertFunctionPipe::new, expression(), source, start, length, replacement); } @Override @@ -90,19 +90,19 @@ public InsertFunctionProcessor asProcessor() { return new InsertFunctionProcessor(source.asProcessor(), start.asProcessor(), length.asProcessor(), replacement.asProcessor()); } - public ProcessorDefinition source() { + public Pipe source() { return source; } - public ProcessorDefinition start() { + public Pipe start() { return start; } - public ProcessorDefinition length() { + public Pipe length() { return length; } - public ProcessorDefinition replacement() { + public Pipe replacement() { return replacement; } @@ -121,7 +121,7 @@ public boolean equals(Object obj) { return false; } - InsertFunctionProcessorDefinition other = (InsertFunctionProcessorDefinition) obj; + InsertFunctionPipe other = (InsertFunctionPipe) obj; return Objects.equals(source, other.source) && Objects.equals(start, other.start) && Objects.equals(length, other.length) diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/InsertFunctionProcessor.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/InsertFunctionProcessor.java index 4649925614fa8..5202ab64065ef 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/InsertFunctionProcessor.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/InsertFunctionProcessor.java @@ -8,7 +8,7 @@ import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.xpack.sql.SqlIllegalArgumentException; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.Processor; +import org.elasticsearch.xpack.sql.expression.gen.processor.Processor; import java.io.IOException; import java.util.Objects; @@ -16,7 +16,7 @@ public class InsertFunctionProcessor implements Processor { private final Processor source, start, length, replacement; - public static final String NAME = "ins"; + public static final String NAME = "si"; public InsertFunctionProcessor(Processor source, Processor start, Processor length, Processor replacement) { this.source = source; @@ -81,8 +81,8 @@ public static Object doProcess(Object source, Object start, Object length, Objec StringBuilder sb = new StringBuilder(source.toString()); String replString = (replacement.toString()); - return sb.replace(realStart, - realStart + ((Number) length).intValue(), + return sb.replace(realStart, + realStart + ((Number) length).intValue(), replString).toString(); } diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/Left.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/Left.java index 2e31ecf3e7b0b..728c38e8f6284 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/Left.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/Left.java @@ -6,14 +6,10 @@ package org.elasticsearch.xpack.sql.expression.function.scalar.string; import org.elasticsearch.xpack.sql.expression.Expression; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinition; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinitions; import org.elasticsearch.xpack.sql.expression.function.scalar.string.BinaryStringNumericProcessor.BinaryStringNumericOperation; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; -import java.util.function.BiFunction; - /** * Returns the leftmost count characters of a string. */ @@ -24,7 +20,7 @@ public Left(Location location, Expression left, Expression right) { } @Override - protected BiFunction operation() { + protected BinaryStringNumericOperation operation() { return BinaryStringNumericOperation.LEFT; } @@ -33,14 +29,6 @@ protected Left replaceChildren(Expression newLeft, Expression newRight) { return new Left(location(), newLeft, newRight); } - @Override - protected ProcessorDefinition makeProcessorDefinition() { - return new BinaryStringNumericProcessorDefinition(location(), this, - ProcessorDefinitions.toProcessorDefinition(left()), - ProcessorDefinitions.toProcessorDefinition(right()), - BinaryStringNumericOperation.LEFT); - } - @Override protected NodeInfo info() { return NodeInfo.create(this, Left::new, left(), right()); diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/Locate.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/Locate.java index e33511cfbfd4a..53f73c170c63c 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/Locate.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/Locate.java @@ -6,11 +6,11 @@ package org.elasticsearch.xpack.sql.expression.function.scalar.string; import org.elasticsearch.xpack.sql.expression.Expression; +import org.elasticsearch.xpack.sql.expression.Expressions; import org.elasticsearch.xpack.sql.expression.FieldAttribute; import org.elasticsearch.xpack.sql.expression.function.scalar.ScalarFunction; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinition; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinitions; -import org.elasticsearch.xpack.sql.expression.function.scalar.script.ScriptTemplate; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; +import org.elasticsearch.xpack.sql.expression.gen.script.ScriptTemplate; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; import org.elasticsearch.xpack.sql.type.DataType; @@ -20,14 +20,13 @@ import java.util.Locale; import static java.lang.String.format; -import static org.elasticsearch.xpack.sql.expression.function.scalar.script.ParamsBuilder.paramsBuilder; -import static org.elasticsearch.xpack.sql.expression.function.scalar.script.ScriptTemplate.formatTemplate; import static org.elasticsearch.xpack.sql.expression.function.scalar.string.LocateFunctionProcessor.doProcess; +import static org.elasticsearch.xpack.sql.expression.gen.script.ParamsBuilder.paramsBuilder; /** * Returns the starting position of the first occurrence of the pattern within the source string. * The search for the first occurrence of the pattern begins with the first character position in the source string - * unless the optional argument, start, is specified. If start is specified, the search begins with the character + * unless the optional argument, start, is specified. If start is specified, the search begins with the character * position indicated by the value of start. The first character position in the source string is indicated by the value 1. * If the pattern is not found within the source string, the value 0 is returned. */ @@ -42,6 +41,7 @@ public Locate(Location location, Expression pattern, Expression source, Expressi this.start = start; } + @Override protected TypeResolution resolveType() { if (!childrenResolved()) { return new TypeResolution("Unresolved children"); @@ -61,11 +61,11 @@ protected TypeResolution resolveType() { } @Override - protected ProcessorDefinition makeProcessorDefinition() { - return new LocateFunctionProcessorDefinition(location(), this, - ProcessorDefinitions.toProcessorDefinition(pattern), - ProcessorDefinitions.toProcessorDefinition(source), - start == null ? null : ProcessorDefinitions.toProcessorDefinition(start)); + protected Pipe makePipe() { + return new LocateFunctionPipe(location(), this, + Expressions.pipe(pattern), + Expressions.pipe(source), + start == null ? null : Expressions.pipe(start)); } @Override @@ -75,7 +75,7 @@ protected NodeInfo info() { @Override public boolean foldable() { - return pattern.foldable() + return pattern.foldable() && source.foldable() && (start == null? true : start.foldable()); } @@ -94,22 +94,20 @@ public ScriptTemplate asScript() { return asScriptFrom(patternScript, sourceScript, startScript); } - protected ScriptTemplate asScriptFrom(ScriptTemplate patternScript, ScriptTemplate sourceScript, - ScriptTemplate startScript) - { + private ScriptTemplate asScriptFrom(ScriptTemplate patternScript, ScriptTemplate sourceScript, ScriptTemplate startScript) { if (start == null) { - return new ScriptTemplate(format(Locale.ROOT, formatTemplate("{sql}.%s(%s,%s)"), - "locate", - patternScript.template(), + return new ScriptTemplate(format(Locale.ROOT, formatTemplate("{sql}.%s(%s,%s)"), + "locate", + patternScript.template(), sourceScript.template()), paramsBuilder() .script(patternScript.params()).script(sourceScript.params()) .build(), dataType()); } // basically, transform the script to InternalSqlScriptUtils.[function_name](function_or_field1, function_or_field2,...) - return new ScriptTemplate(format(Locale.ROOT, formatTemplate("{sql}.%s(%s,%s,%s)"), - "locate", - patternScript.template(), + return new ScriptTemplate(format(Locale.ROOT, formatTemplate("{sql}.%s(%s,%s,%s)"), + "locate", + patternScript.template(), sourceScript.template(), startScript.template()), paramsBuilder() @@ -119,8 +117,8 @@ protected ScriptTemplate asScriptFrom(ScriptTemplate patternScript, ScriptTempla } @Override - protected ScriptTemplate asScriptFrom(FieldAttribute field) { - return new ScriptTemplate(formatScript("doc[{}].value"), + public ScriptTemplate scriptWithField(FieldAttribute field) { + return new ScriptTemplate(processScript("doc[{}].value"), paramsBuilder().variable(field.isInexact() ? field.exactAttribute().name() : field.name()).build(), dataType()); } @@ -138,4 +136,4 @@ public Expression replaceChildren(List newChildren) { return new Locate(location(), newChildren.get(0), newChildren.get(1), newChildren.get(2)); } -} +} \ No newline at end of file diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/LocateFunctionProcessorDefinition.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/LocateFunctionPipe.java similarity index 65% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/LocateFunctionProcessorDefinition.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/LocateFunctionPipe.java index 1902051185273..8477ff34277d9 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/LocateFunctionProcessorDefinition.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/LocateFunctionPipe.java @@ -7,7 +7,7 @@ import org.elasticsearch.xpack.sql.execution.search.SqlSourceBuilder; import org.elasticsearch.xpack.sql.expression.Expression; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinition; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; @@ -15,12 +15,12 @@ import java.util.List; import java.util.Objects; -public class LocateFunctionProcessorDefinition extends ProcessorDefinition { +public class LocateFunctionPipe extends Pipe { - private final ProcessorDefinition pattern, source, start; + private final Pipe pattern, source, start; - public LocateFunctionProcessorDefinition(Location location, Expression expression, ProcessorDefinition pattern, - ProcessorDefinition source, ProcessorDefinition start) { + public LocateFunctionPipe(Location location, Expression expression, Pipe pattern, + Pipe source, Pipe start) { super(location, expression, start == null ? Arrays.asList(pattern, source) : Arrays.asList(pattern, source, start)); this.pattern = pattern; this.source = source; @@ -28,7 +28,7 @@ public LocateFunctionProcessorDefinition(Location location, Expression expressio } @Override - public final ProcessorDefinition replaceChildren(List newChildren) { + public final Pipe replaceChildren(List newChildren) { int childrenSize = newChildren.size(); if (childrenSize > 3 || childrenSize < 2) { throw new IllegalArgumentException("expected [2 or 3] children but received [" + newChildren.size() + "]"); @@ -37,10 +37,10 @@ public final ProcessorDefinition replaceChildren(List newCh } @Override - public final ProcessorDefinition resolveAttributes(AttributeResolver resolver) { - ProcessorDefinition newPattern = pattern.resolveAttributes(resolver); - ProcessorDefinition newSource = source.resolveAttributes(resolver); - ProcessorDefinition newStart = start == null ? start : start.resolveAttributes(resolver); + public final Pipe resolveAttributes(AttributeResolver resolver) { + Pipe newPattern = pattern.resolveAttributes(resolver); + Pipe newSource = source.resolveAttributes(resolver); + Pipe newStart = start == null ? start : start.resolveAttributes(resolver); if (newPattern == pattern && newSource == source && newStart == start) { return this; } @@ -58,9 +58,9 @@ public boolean resolved() { return pattern.resolved() && source.resolved() && (start == null || start.resolved()); } - protected ProcessorDefinition replaceChildren(ProcessorDefinition newPattern, ProcessorDefinition newSource, - ProcessorDefinition newStart) { - return new LocateFunctionProcessorDefinition(location(), expression(), newPattern, newSource, newStart); + protected Pipe replaceChildren(Pipe newPattern, Pipe newSource, + Pipe newStart) { + return new LocateFunctionPipe(location(), expression(), newPattern, newSource, newStart); } @Override @@ -73,8 +73,8 @@ public final void collectFields(SqlSourceBuilder sourceBuilder) { } @Override - protected NodeInfo info() { - return NodeInfo.create(this, LocateFunctionProcessorDefinition::new, expression(), pattern, source, start); + protected NodeInfo info() { + return NodeInfo.create(this, LocateFunctionPipe::new, expression(), pattern, source, start); } @Override @@ -82,15 +82,15 @@ public LocateFunctionProcessor asProcessor() { return new LocateFunctionProcessor(pattern.asProcessor(), source.asProcessor(), start == null ? null : start.asProcessor()); } - public ProcessorDefinition source() { + public Pipe source() { return source; } - public ProcessorDefinition start() { + public Pipe start() { return start; } - public ProcessorDefinition pattern() { + public Pipe pattern() { return pattern; } @@ -109,7 +109,7 @@ public boolean equals(Object obj) { return false; } - LocateFunctionProcessorDefinition other = (LocateFunctionProcessorDefinition) obj; + LocateFunctionPipe other = (LocateFunctionPipe) obj; return Objects.equals(pattern, other.pattern) && Objects.equals(source, other.source) && Objects.equals(start, other.start); } -} +} \ No newline at end of file diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/LocateFunctionProcessor.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/LocateFunctionProcessor.java index 7831fc44df29d..dc26a4869c0d9 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/LocateFunctionProcessor.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/LocateFunctionProcessor.java @@ -8,7 +8,7 @@ import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.xpack.sql.SqlIllegalArgumentException; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.Processor; +import org.elasticsearch.xpack.sql.expression.gen.processor.Processor; import java.io.IOException; import java.util.Objects; @@ -16,7 +16,7 @@ public class LocateFunctionProcessor implements Processor { private final Processor pattern, source, start; - public static final String NAME = "lc"; + public static final String NAME = "sloc"; public LocateFunctionProcessor(Processor pattern, Processor source, Processor start) { this.pattern = pattern; @@ -63,9 +63,9 @@ public static Object doProcess(Object pattern, Object source, Object start) { String stringSource = source instanceof Character ? source.toString() : (String) source; String stringPattern = pattern instanceof Character ? pattern.toString() : (String) pattern; - return (Integer) (1 + (start != null ? + return 1 + (start != null ? stringSource.indexOf(stringPattern, ((Number) start).intValue() - 1) - : stringSource.indexOf(stringPattern))); + : stringSource.indexOf(stringPattern)); } @Override diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/Position.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/Position.java index 9dfd3e094bb2c..68549474e3a0a 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/Position.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/Position.java @@ -6,9 +6,9 @@ package org.elasticsearch.xpack.sql.expression.function.scalar.string; import org.elasticsearch.xpack.sql.expression.Expression; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinition; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinitions; +import org.elasticsearch.xpack.sql.expression.Expressions; import org.elasticsearch.xpack.sql.expression.function.scalar.string.BinaryStringStringProcessor.BinaryStringStringOperation; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; @@ -34,10 +34,10 @@ protected Position replaceChildren(Expression newLeft, Expression newRight) { } @Override - protected ProcessorDefinition makeProcessorDefinition() { - return new BinaryStringStringProcessorDefinition(location(), this, - ProcessorDefinitions.toProcessorDefinition(left()), - ProcessorDefinitions.toProcessorDefinition(right()), + protected Pipe makePipe() { + return new BinaryStringStringPipe(location(), this, + Expressions.pipe(left()), + Expressions.pipe(right()), BinaryStringStringOperation.POSITION); } @@ -45,5 +45,4 @@ protected ProcessorDefinition makeProcessorDefinition() { protected NodeInfo info() { return NodeInfo.create(this, Position::new, left(), right()); } - } diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/Repeat.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/Repeat.java index 89ea7664e40e6..05ebcfdc7597f 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/Repeat.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/Repeat.java @@ -6,14 +6,10 @@ package org.elasticsearch.xpack.sql.expression.function.scalar.string; import org.elasticsearch.xpack.sql.expression.Expression; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinition; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinitions; import org.elasticsearch.xpack.sql.expression.function.scalar.string.BinaryStringNumericProcessor.BinaryStringNumericOperation; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; -import java.util.function.BiFunction; - /** * Creates a string composed of a string repeated count times. */ @@ -24,7 +20,7 @@ public Repeat(Location location, Expression left, Expression right) { } @Override - protected BiFunction operation() { + protected BinaryStringNumericOperation operation() { return BinaryStringNumericOperation.REPEAT; } @@ -33,17 +29,8 @@ protected Repeat replaceChildren(Expression newLeft, Expression newRight) { return new Repeat(location(), newLeft, newRight); } - @Override - protected ProcessorDefinition makeProcessorDefinition() { - return new BinaryStringNumericProcessorDefinition(location(), this, - ProcessorDefinitions.toProcessorDefinition(left()), - ProcessorDefinitions.toProcessorDefinition(right()), - BinaryStringNumericOperation.REPEAT); - } - @Override protected NodeInfo info() { return NodeInfo.create(this, Repeat::new, left(), right()); } - } diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/Replace.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/Replace.java index 3834b16ff1e78..9c8e856dbad0d 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/Replace.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/Replace.java @@ -6,11 +6,11 @@ package org.elasticsearch.xpack.sql.expression.function.scalar.string; import org.elasticsearch.xpack.sql.expression.Expression; +import org.elasticsearch.xpack.sql.expression.Expressions; import org.elasticsearch.xpack.sql.expression.FieldAttribute; import org.elasticsearch.xpack.sql.expression.function.scalar.ScalarFunction; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinition; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinitions; -import org.elasticsearch.xpack.sql.expression.function.scalar.script.ScriptTemplate; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; +import org.elasticsearch.xpack.sql.expression.gen.script.ScriptTemplate; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; import org.elasticsearch.xpack.sql.type.DataType; @@ -20,9 +20,8 @@ import java.util.Locale; import static java.lang.String.format; -import static org.elasticsearch.xpack.sql.expression.function.scalar.script.ParamsBuilder.paramsBuilder; -import static org.elasticsearch.xpack.sql.expression.function.scalar.script.ScriptTemplate.formatTemplate; import static org.elasticsearch.xpack.sql.expression.function.scalar.string.ReplaceFunctionProcessor.doProcess; +import static org.elasticsearch.xpack.sql.expression.gen.script.ParamsBuilder.paramsBuilder; /** * Search the source string for occurrences of the pattern, and replace with the replacement string. @@ -38,6 +37,7 @@ public Replace(Location location, Expression source, Expression pattern, Express this.replacement = replacement; } + @Override protected TypeResolution resolveType() { if (!childrenResolved()) { return new TypeResolution("Unresolved children"); @@ -57,11 +57,11 @@ protected TypeResolution resolveType() { } @Override - protected ProcessorDefinition makeProcessorDefinition() { - return new ReplaceFunctionProcessorDefinition(location(), this, - ProcessorDefinitions.toProcessorDefinition(source), - ProcessorDefinitions.toProcessorDefinition(pattern), - ProcessorDefinitions.toProcessorDefinition(replacement)); + protected Pipe makePipe() { + return new ReplaceFunctionPipe(location(), this, + Expressions.pipe(source), + Expressions.pipe(pattern), + Expressions.pipe(replacement)); } @Override @@ -71,7 +71,7 @@ protected NodeInfo info() { @Override public boolean foldable() { - return source.foldable() + return source.foldable() && pattern.foldable() && replacement.foldable(); } @@ -90,13 +90,11 @@ public ScriptTemplate asScript() { return asScriptFrom(sourceScript, patternScript, replacementScript); } - protected ScriptTemplate asScriptFrom(ScriptTemplate sourceScript, ScriptTemplate patternScript, - ScriptTemplate replacementScript) - { + private ScriptTemplate asScriptFrom(ScriptTemplate sourceScript, ScriptTemplate patternScript, ScriptTemplate replacementScript) { // basically, transform the script to InternalSqlScriptUtils.[function_name](function_or_field1, function_or_field2,...) - return new ScriptTemplate(format(Locale.ROOT, formatTemplate("{sql}.%s(%s,%s,%s)"), - "replace", - sourceScript.template(), + return new ScriptTemplate(format(Locale.ROOT, formatTemplate("{sql}.%s(%s,%s,%s)"), + "replace", + sourceScript.template(), patternScript.template(), replacementScript.template()), paramsBuilder() @@ -106,8 +104,8 @@ protected ScriptTemplate asScriptFrom(ScriptTemplate sourceScript, ScriptTemplat } @Override - protected ScriptTemplate asScriptFrom(FieldAttribute field) { - return new ScriptTemplate(formatScript("doc[{}].value"), + public ScriptTemplate scriptWithField(FieldAttribute field) { + return new ScriptTemplate(processScript("doc[{}].value"), paramsBuilder().variable(field.isInexact() ? field.exactAttribute().name() : field.name()).build(), dataType()); } @@ -125,4 +123,4 @@ public Expression replaceChildren(List newChildren) { return new Replace(location(), newChildren.get(0), newChildren.get(1), newChildren.get(2)); } -} +} \ No newline at end of file diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/ReplaceFunctionProcessorDefinition.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/ReplaceFunctionPipe.java similarity index 63% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/ReplaceFunctionProcessorDefinition.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/ReplaceFunctionPipe.java index 14e7e929e3555..173ea3e9c0c39 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/ReplaceFunctionProcessorDefinition.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/ReplaceFunctionPipe.java @@ -7,7 +7,7 @@ import org.elasticsearch.xpack.sql.execution.search.SqlSourceBuilder; import org.elasticsearch.xpack.sql.expression.Expression; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinition; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; @@ -15,12 +15,12 @@ import java.util.List; import java.util.Objects; -public class ReplaceFunctionProcessorDefinition extends ProcessorDefinition { +public class ReplaceFunctionPipe extends Pipe { - private final ProcessorDefinition source, pattern, replacement; + private final Pipe source, pattern, replacement; - public ReplaceFunctionProcessorDefinition(Location location, Expression expression, ProcessorDefinition source, - ProcessorDefinition pattern, ProcessorDefinition replacement) { + public ReplaceFunctionPipe(Location location, Expression expression, Pipe source, + Pipe pattern, Pipe replacement) { super(location, expression, Arrays.asList(source, pattern, replacement)); this.source = source; this.pattern = pattern; @@ -28,7 +28,7 @@ public ReplaceFunctionProcessorDefinition(Location location, Expression expressi } @Override - public final ProcessorDefinition replaceChildren(List newChildren) { + public final Pipe replaceChildren(List newChildren) { if (newChildren.size() != 3) { throw new IllegalArgumentException("expected [3] children but received [" + newChildren.size() + "]"); } @@ -36,10 +36,10 @@ public final ProcessorDefinition replaceChildren(List newCh } @Override - public final ProcessorDefinition resolveAttributes(AttributeResolver resolver) { - ProcessorDefinition newSource = source.resolveAttributes(resolver); - ProcessorDefinition newPattern = pattern.resolveAttributes(resolver); - ProcessorDefinition newReplacement = replacement.resolveAttributes(resolver); + public final Pipe resolveAttributes(AttributeResolver resolver) { + Pipe newSource = source.resolveAttributes(resolver); + Pipe newPattern = pattern.resolveAttributes(resolver); + Pipe newReplacement = replacement.resolveAttributes(resolver); if (newSource == source && newPattern == pattern && newReplacement == replacement) { return this; } @@ -56,9 +56,9 @@ public boolean resolved() { return source.resolved() && pattern.resolved() && replacement.resolved(); } - protected ProcessorDefinition replaceChildren(ProcessorDefinition newSource, ProcessorDefinition newPattern, - ProcessorDefinition newReplacement) { - return new ReplaceFunctionProcessorDefinition(location(), expression(), newSource, newPattern, newReplacement); + protected Pipe replaceChildren(Pipe newSource, Pipe newPattern, + Pipe newReplacement) { + return new ReplaceFunctionPipe(location(), expression(), newSource, newPattern, newReplacement); } @Override @@ -69,8 +69,8 @@ public final void collectFields(SqlSourceBuilder sourceBuilder) { } @Override - protected NodeInfo info() { - return NodeInfo.create(this, ReplaceFunctionProcessorDefinition::new, expression(), source, pattern, replacement); + protected NodeInfo info() { + return NodeInfo.create(this, ReplaceFunctionPipe::new, expression(), source, pattern, replacement); } @Override @@ -78,15 +78,15 @@ public ReplaceFunctionProcessor asProcessor() { return new ReplaceFunctionProcessor(source.asProcessor(), pattern.asProcessor(), replacement.asProcessor()); } - public ProcessorDefinition source() { + public Pipe source() { return source; } - public ProcessorDefinition pattern() { + public Pipe pattern() { return pattern; } - public ProcessorDefinition replacement() { + public Pipe replacement() { return replacement; } @@ -105,7 +105,7 @@ public boolean equals(Object obj) { return false; } - ReplaceFunctionProcessorDefinition other = (ReplaceFunctionProcessorDefinition) obj; + ReplaceFunctionPipe other = (ReplaceFunctionPipe) obj; return Objects.equals(source, other.source) && Objects.equals(pattern, other.pattern) && Objects.equals(replacement, other.replacement); diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/ReplaceFunctionProcessor.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/ReplaceFunctionProcessor.java index 529ceb408aaa6..1745874469fcd 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/ReplaceFunctionProcessor.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/ReplaceFunctionProcessor.java @@ -9,7 +9,7 @@ import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.xpack.sql.SqlIllegalArgumentException; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.Processor; +import org.elasticsearch.xpack.sql.expression.gen.processor.Processor; import java.io.IOException; import java.util.Objects; @@ -17,7 +17,7 @@ public class ReplaceFunctionProcessor implements Processor { private final Processor source, pattern, replacement; - public static final String NAME = "r"; + public static final String NAME = "srep"; public ReplaceFunctionProcessor(Processor source, Processor pattern, Processor replacement) { this.source = source; @@ -60,8 +60,8 @@ public static Object doProcess(Object source, Object pattern, Object replacement throw new SqlIllegalArgumentException("A string/char is required; received [{}]", replacement); } - return Strings.replace(source instanceof Character ? source.toString() : (String)source, - pattern instanceof Character ? pattern.toString() : (String) pattern, + return Strings.replace(source instanceof Character ? source.toString() : (String)source, + pattern instanceof Character ? pattern.toString() : (String) pattern, replacement instanceof Character ? replacement.toString() : (String) replacement); } diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/Right.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/Right.java index 3250dcc0a6e79..39d220e2d658e 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/Right.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/Right.java @@ -6,14 +6,10 @@ package org.elasticsearch.xpack.sql.expression.function.scalar.string; import org.elasticsearch.xpack.sql.expression.Expression; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinition; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinitions; import org.elasticsearch.xpack.sql.expression.function.scalar.string.BinaryStringNumericProcessor.BinaryStringNumericOperation; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; -import java.util.function.BiFunction; - /** * Returns the rightmost count characters of a string. */ @@ -24,7 +20,7 @@ public Right(Location location, Expression left, Expression right) { } @Override - protected BiFunction operation() { + protected BinaryStringNumericOperation operation() { return BinaryStringNumericOperation.RIGHT; } @@ -33,14 +29,6 @@ protected Right replaceChildren(Expression newLeft, Expression newRight) { return new Right(location(), newLeft, newRight); } - @Override - protected ProcessorDefinition makeProcessorDefinition() { - return new BinaryStringNumericProcessorDefinition(location(), this, - ProcessorDefinitions.toProcessorDefinition(left()), - ProcessorDefinitions.toProcessorDefinition(right()), - BinaryStringNumericOperation.RIGHT); - } - @Override protected NodeInfo info() { return NodeInfo.create(this, Right::new, left(), right()); diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/StringProcessor.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/StringProcessor.java index 2a1ba3a10cf88..56ef820a4d3c5 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/StringProcessor.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/StringProcessor.java @@ -9,7 +9,7 @@ import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.xpack.sql.SqlIllegalArgumentException; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.Processor; +import org.elasticsearch.xpack.sql.expression.gen.processor.Processor; import java.io.IOException; import java.util.Arrays; diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/Substring.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/Substring.java index 199cda01b9b5c..e147566511092 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/Substring.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/Substring.java @@ -6,11 +6,11 @@ package org.elasticsearch.xpack.sql.expression.function.scalar.string; import org.elasticsearch.xpack.sql.expression.Expression; +import org.elasticsearch.xpack.sql.expression.Expressions; import org.elasticsearch.xpack.sql.expression.FieldAttribute; import org.elasticsearch.xpack.sql.expression.function.scalar.ScalarFunction; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinition; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinitions; -import org.elasticsearch.xpack.sql.expression.function.scalar.script.ScriptTemplate; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; +import org.elasticsearch.xpack.sql.expression.gen.script.ScriptTemplate; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; import org.elasticsearch.xpack.sql.type.DataType; @@ -20,12 +20,11 @@ import java.util.Locale; import static java.lang.String.format; -import static org.elasticsearch.xpack.sql.expression.function.scalar.script.ParamsBuilder.paramsBuilder; -import static org.elasticsearch.xpack.sql.expression.function.scalar.script.ScriptTemplate.formatTemplate; import static org.elasticsearch.xpack.sql.expression.function.scalar.string.SubstringFunctionProcessor.doProcess; +import static org.elasticsearch.xpack.sql.expression.gen.script.ParamsBuilder.paramsBuilder; /** - * Returns a character string that is derived from the source string, beginning at the character position specified by start + * Returns a character string that is derived from the source string, beginning at the character position specified by start * for length characters. */ public class Substring extends ScalarFunction { @@ -39,6 +38,7 @@ public Substring(Location location, Expression source, Expression start, Express this.length = length; } + @Override protected TypeResolution resolveType() { if (!childrenResolved()) { return new TypeResolution("Unresolved children"); @@ -58,18 +58,16 @@ protected TypeResolution resolveType() { } @Override - protected ProcessorDefinition makeProcessorDefinition() { - return new SubstringFunctionProcessorDefinition(location(), this, - ProcessorDefinitions.toProcessorDefinition(source), - ProcessorDefinitions.toProcessorDefinition(start), - ProcessorDefinitions.toProcessorDefinition(length)); + protected Pipe makePipe() { + return new SubstringFunctionPipe(location(), this, + Expressions.pipe(source), + Expressions.pipe(start), + Expressions.pipe(length)); } @Override public boolean foldable() { - return source.foldable() - && start.foldable() - && length.foldable(); + return source.foldable() && start.foldable() && length.foldable(); } @Override @@ -92,12 +90,11 @@ public ScriptTemplate asScript() { } protected ScriptTemplate asScriptFrom(ScriptTemplate sourceScript, ScriptTemplate startScript, - ScriptTemplate lengthScript) - { + ScriptTemplate lengthScript) { // basically, transform the script to InternalSqlScriptUtils.[function_name](function_or_field1, function_or_field2,...) - return new ScriptTemplate(format(Locale.ROOT, formatTemplate("{sql}.%s(%s,%s,%s)"), - "substring", - sourceScript.template(), + return new ScriptTemplate(format(Locale.ROOT, formatTemplate("{sql}.%s(%s,%s,%s)"), + "substring", + sourceScript.template(), startScript.template(), lengthScript.template()), paramsBuilder() @@ -107,8 +104,8 @@ protected ScriptTemplate asScriptFrom(ScriptTemplate sourceScript, ScriptTemplat } @Override - protected ScriptTemplate asScriptFrom(FieldAttribute field) { - return new ScriptTemplate(formatScript("doc[{}].value"), + public ScriptTemplate scriptWithField(FieldAttribute field) { + return new ScriptTemplate(processScript("doc[{}].value"), paramsBuilder().variable(field.isInexact() ? field.exactAttribute().name() : field.name()).build(), dataType()); } @@ -126,4 +123,4 @@ public Expression replaceChildren(List newChildren) { return new Substring(location(), newChildren.get(0), newChildren.get(1), newChildren.get(2)); } -} +} \ No newline at end of file diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/SubstringFunctionProcessorDefinition.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/SubstringFunctionPipe.java similarity index 62% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/SubstringFunctionProcessorDefinition.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/SubstringFunctionPipe.java index 653aac24f9855..078defec40b61 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/SubstringFunctionProcessorDefinition.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/SubstringFunctionPipe.java @@ -7,7 +7,7 @@ import org.elasticsearch.xpack.sql.execution.search.SqlSourceBuilder; import org.elasticsearch.xpack.sql.expression.Expression; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinition; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; @@ -15,12 +15,12 @@ import java.util.List; import java.util.Objects; -public class SubstringFunctionProcessorDefinition extends ProcessorDefinition { +public class SubstringFunctionPipe extends Pipe { - private final ProcessorDefinition source, start, length; + private final Pipe source, start, length; - public SubstringFunctionProcessorDefinition(Location location, Expression expression, ProcessorDefinition source, - ProcessorDefinition start, ProcessorDefinition length) { + public SubstringFunctionPipe(Location location, Expression expression, Pipe source, + Pipe start, Pipe length) { super(location, expression, Arrays.asList(source, start, length)); this.source = source; this.start = start; @@ -28,7 +28,7 @@ public SubstringFunctionProcessorDefinition(Location location, Expression expres } @Override - public final ProcessorDefinition replaceChildren(List newChildren) { + public final Pipe replaceChildren(List newChildren) { if (newChildren.size() != 3) { throw new IllegalArgumentException("expected [3] children but received [" + newChildren.size() + "]"); } @@ -36,10 +36,10 @@ public final ProcessorDefinition replaceChildren(List newCh } @Override - public final ProcessorDefinition resolveAttributes(AttributeResolver resolver) { - ProcessorDefinition newSource = source.resolveAttributes(resolver); - ProcessorDefinition newStart = start.resolveAttributes(resolver); - ProcessorDefinition newLength = length.resolveAttributes(resolver); + public final Pipe resolveAttributes(AttributeResolver resolver) { + Pipe newSource = source.resolveAttributes(resolver); + Pipe newStart = start.resolveAttributes(resolver); + Pipe newLength = length.resolveAttributes(resolver); if (newSource == source && newStart == start && newLength == length) { return this; } @@ -56,9 +56,9 @@ public boolean resolved() { return source.resolved() && start.resolved() && length.resolved(); } - protected ProcessorDefinition replaceChildren(ProcessorDefinition newSource, ProcessorDefinition newStart, - ProcessorDefinition newLength) { - return new SubstringFunctionProcessorDefinition(location(), expression(), newSource, newStart, newLength); + protected Pipe replaceChildren(Pipe newSource, Pipe newStart, + Pipe newLength) { + return new SubstringFunctionPipe(location(), expression(), newSource, newStart, newLength); } @Override @@ -69,8 +69,8 @@ public final void collectFields(SqlSourceBuilder sourceBuilder) { } @Override - protected NodeInfo info() { - return NodeInfo.create(this, SubstringFunctionProcessorDefinition::new, expression(), source, start, length); + protected NodeInfo info() { + return NodeInfo.create(this, SubstringFunctionPipe::new, expression(), source, start, length); } @Override @@ -78,15 +78,15 @@ public SubstringFunctionProcessor asProcessor() { return new SubstringFunctionProcessor(source.asProcessor(), start.asProcessor(), length.asProcessor()); } - public ProcessorDefinition source() { + public Pipe source() { return source; } - public ProcessorDefinition start() { + public Pipe start() { return start; } - public ProcessorDefinition length() { + public Pipe length() { return length; } @@ -105,7 +105,7 @@ public boolean equals(Object obj) { return false; } - SubstringFunctionProcessorDefinition other = (SubstringFunctionProcessorDefinition) obj; + SubstringFunctionPipe other = (SubstringFunctionPipe) obj; return Objects.equals(source, other.source) && Objects.equals(start, other.start) && Objects.equals(length, other.length); } } diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/SubstringFunctionProcessor.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/SubstringFunctionProcessor.java index 28f251bf0dbac..ca30a7804c454 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/SubstringFunctionProcessor.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/SubstringFunctionProcessor.java @@ -8,15 +8,16 @@ import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.xpack.sql.SqlIllegalArgumentException; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.Processor; +import org.elasticsearch.xpack.sql.expression.gen.processor.Processor; import java.io.IOException; import java.util.Objects; public class SubstringFunctionProcessor implements Processor { + public static final String NAME = "ssub"; + private final Processor source, start, length; - public static final String NAME = "sb"; public SubstringFunctionProcessor(Processor source, Processor start, Processor length) { this.source = source; @@ -62,7 +63,7 @@ public static Object doProcess(Object source, Object start, Object length) { throw new SqlIllegalArgumentException("A positive number is required for [length]; received [{}]", length); } - return StringFunctionUtils.substring(source instanceof Character ? source.toString() : (String) source, + return StringFunctionUtils.substring(source instanceof Character ? source.toString() : (String) source, ((Number) start).intValue() - 1, // SQL is 1-based when it comes to string manipulation ((Number) length).intValue()); } diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/UnaryStringFunction.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/UnaryStringFunction.java index a0cfd50422cc0..d387fe7e4a1bf 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/UnaryStringFunction.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/UnaryStringFunction.java @@ -6,13 +6,13 @@ package org.elasticsearch.xpack.sql.expression.function.scalar.string; import org.elasticsearch.xpack.sql.expression.Expression; +import org.elasticsearch.xpack.sql.expression.Expressions; import org.elasticsearch.xpack.sql.expression.FieldAttribute; import org.elasticsearch.xpack.sql.expression.function.scalar.UnaryScalarFunction; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinition; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinitions; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.UnaryProcessorDefinition; -import org.elasticsearch.xpack.sql.expression.function.scalar.script.ScriptTemplate; import org.elasticsearch.xpack.sql.expression.function.scalar.string.StringProcessor.StringOperation; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.UnaryPipe; +import org.elasticsearch.xpack.sql.expression.gen.script.ScriptTemplate; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.util.StringUtils; @@ -20,7 +20,7 @@ import java.util.Objects; import static java.lang.String.format; -import static org.elasticsearch.xpack.sql.expression.function.scalar.script.ParamsBuilder.paramsBuilder; +import static org.elasticsearch.xpack.sql.expression.gen.script.ParamsBuilder.paramsBuilder; public abstract class UnaryStringFunction extends UnaryScalarFunction { @@ -49,27 +49,25 @@ protected TypeResolution resolveType() { } @Override - protected final ProcessorDefinition makeProcessorDefinition() { - return new UnaryProcessorDefinition(location(), this, ProcessorDefinitions.toProcessorDefinition(field()), - new StringProcessor(operation())); + protected final Pipe makePipe() { + return new UnaryPipe(location(), this, Expressions.pipe(field()), new StringProcessor(operation())); } protected abstract StringOperation operation(); @Override - protected ScriptTemplate asScriptFrom(FieldAttribute field) { + public ScriptTemplate scriptWithField(FieldAttribute field) { //TODO change this to use _source instead of the exact form (aka field.keyword for text fields) - return new ScriptTemplate(formatScript("doc[{}].value"), + return new ScriptTemplate(processScript("doc[{}].value"), paramsBuilder().variable(field.isInexact() ? field.exactAttribute().name() : field.name()).build(), dataType()); } @Override - protected String formatScript(String template) { - // basically, transform the script to InternalSqlScriptUtils.[function_name](other_function_or_field_name) - return super.formatScript( - format(Locale.ROOT, "{sql}.%s(%s)", - StringUtils.underscoreToLowerCamelCase(operation().toString()), + public String processScript(String template) { + return formatTemplate( + format(Locale.ROOT, "{sql}.%s(%s)", + StringUtils.underscoreToLowerCamelCase(operation().name()), template)); } diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/UnaryStringIntFunction.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/UnaryStringIntFunction.java index 7e963eb9db78b..613b37dd7e8b5 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/UnaryStringIntFunction.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/UnaryStringIntFunction.java @@ -6,21 +6,20 @@ package org.elasticsearch.xpack.sql.expression.function.scalar.string; import org.elasticsearch.xpack.sql.expression.Expression; +import org.elasticsearch.xpack.sql.expression.Expressions; import org.elasticsearch.xpack.sql.expression.FieldAttribute; import org.elasticsearch.xpack.sql.expression.function.scalar.UnaryScalarFunction; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinition; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinitions; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.UnaryProcessorDefinition; -import org.elasticsearch.xpack.sql.expression.function.scalar.script.ScriptTemplate; import org.elasticsearch.xpack.sql.expression.function.scalar.string.StringProcessor.StringOperation; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.UnaryPipe; +import org.elasticsearch.xpack.sql.expression.gen.script.ScriptTemplate; import org.elasticsearch.xpack.sql.tree.Location; -import org.elasticsearch.xpack.sql.util.StringUtils; import java.util.Locale; import java.util.Objects; import static java.lang.String.format; -import static org.elasticsearch.xpack.sql.expression.function.scalar.script.ParamsBuilder.paramsBuilder; +import static org.elasticsearch.xpack.sql.expression.gen.script.ParamsBuilder.paramsBuilder; /** * Base unary function for text manipulating SQL functions that receive as parameter a number @@ -52,25 +51,24 @@ protected TypeResolution resolveType() { } @Override - protected final ProcessorDefinition makeProcessorDefinition() { - return new UnaryProcessorDefinition(location(), this, ProcessorDefinitions.toProcessorDefinition(field()), - new StringProcessor(operation())); + protected final Pipe makePipe() { + return new UnaryPipe(location(), this, Expressions.pipe(field()), new StringProcessor(operation())); } protected abstract StringOperation operation(); @Override - protected ScriptTemplate asScriptFrom(FieldAttribute field) { - return new ScriptTemplate(formatScript("doc[{}].value"), + public ScriptTemplate scriptWithField(FieldAttribute field) { + return new ScriptTemplate(processScript("doc[{}].value"), paramsBuilder().variable(field.name()).build(), dataType()); } @Override - protected String formatScript(String template) { - return super.formatScript( - format(Locale.ROOT, "{sql}.%s(%s)", - StringUtils.underscoreToLowerCamelCase(operation().toString()), + public String processScript(String template) { + return super.processScript( + format(Locale.ROOT, "{sql}.%s(%s)", + operation().toString().toLowerCase(Locale.ROOT), template)); } diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/whitelist/InternalSqlScriptUtils.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/whitelist/InternalSqlScriptUtils.java index a03a8e0a32591..782b2cc66cb15 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/whitelist/InternalSqlScriptUtils.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/whitelist/InternalSqlScriptUtils.java @@ -130,4 +130,4 @@ public static Number round(Number v, Number s) { public static Number truncate(Number v, Number s) { return BinaryMathOperation.TRUNCATE.apply(v, s); } -} +} \ No newline at end of file diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/AggExtractorInput.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/AggExtractorInput.java similarity index 76% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/AggExtractorInput.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/AggExtractorInput.java index 22a7ab2fa3e3b..15aff1e415547 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/AggExtractorInput.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/AggExtractorInput.java @@ -3,14 +3,14 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition; +package org.elasticsearch.xpack.sql.expression.gen.pipeline; import org.elasticsearch.xpack.sql.execution.search.SqlSourceBuilder; import org.elasticsearch.xpack.sql.execution.search.extractor.BucketExtractor; import org.elasticsearch.xpack.sql.expression.Expression; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.BucketExtractorProcessor; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.ChainingProcessor; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.Processor; +import org.elasticsearch.xpack.sql.expression.gen.processor.BucketExtractorProcessor; +import org.elasticsearch.xpack.sql.expression.gen.processor.ChainingProcessor; +import org.elasticsearch.xpack.sql.expression.gen.processor.Processor; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; @@ -40,7 +40,7 @@ public final boolean supportedByAggsOnlyQuery() { } @Override - public ProcessorDefinition resolveAttributes(AttributeResolver resolver) { + public Pipe resolveAttributes(AttributeResolver resolver) { return this; } diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/AggNameInput.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/AggNameInput.java similarity index 91% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/AggNameInput.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/AggNameInput.java index 43da886de4934..9e4a1bc857cdf 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/AggNameInput.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/AggNameInput.java @@ -3,7 +3,7 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition; +package org.elasticsearch.xpack.sql.expression.gen.pipeline; import org.elasticsearch.xpack.sql.expression.Expression; import org.elasticsearch.xpack.sql.tree.Location; diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/AggPathInput.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/AggPathInput.java similarity index 92% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/AggPathInput.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/AggPathInput.java index 957a13c2f3a9f..8e78f0e2ad407 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/AggPathInput.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/AggPathInput.java @@ -3,11 +3,11 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition; +package org.elasticsearch.xpack.sql.expression.gen.pipeline; import org.elasticsearch.xpack.sql.execution.search.AggRef; import org.elasticsearch.xpack.sql.expression.Expression; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.Processor; +import org.elasticsearch.xpack.sql.expression.gen.processor.Processor; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/AttributeInput.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/AttributeInput.java similarity index 89% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/AttributeInput.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/AttributeInput.java index ba97f0e64947e..ed1823e75a61e 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/AttributeInput.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/AttributeInput.java @@ -3,7 +3,7 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition; +package org.elasticsearch.xpack.sql.expression.gen.pipeline; import org.elasticsearch.xpack.sql.execution.search.SqlSourceBuilder; import org.elasticsearch.xpack.sql.expression.Attribute; @@ -31,7 +31,7 @@ public final boolean supportedByAggsOnlyQuery() { } @Override - public ProcessorDefinition resolveAttributes(AttributeResolver resolver) { + public Pipe resolveAttributes(AttributeResolver resolver) { return new ReferenceInput(location(), expression(), resolver.resolve(context())); } diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/BinaryProcessorDefinition.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/BinaryPipe.java similarity index 59% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/BinaryProcessorDefinition.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/BinaryPipe.java index e758b104f28a8..285470ad8fde2 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/BinaryProcessorDefinition.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/BinaryPipe.java @@ -3,7 +3,7 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition; +package org.elasticsearch.xpack.sql.expression.gen.pipeline; import org.elasticsearch.xpack.sql.execution.search.SqlSourceBuilder; import org.elasticsearch.xpack.sql.expression.Expression; @@ -11,30 +11,31 @@ import java.util.Arrays; import java.util.List; +import java.util.Objects; -public abstract class BinaryProcessorDefinition extends ProcessorDefinition { +public abstract class BinaryPipe extends Pipe { - private final ProcessorDefinition left, right; + private final Pipe left, right; - public BinaryProcessorDefinition(Location location, Expression expression, ProcessorDefinition left, ProcessorDefinition right) { + public BinaryPipe(Location location, Expression expression, Pipe left, Pipe right) { super(location, expression, Arrays.asList(left, right)); this.left = left; this.right = right; } @Override - public final ProcessorDefinition replaceChildren(List newChildren) { + public final Pipe replaceChildren(List newChildren) { if (newChildren.size() != 2) { throw new IllegalArgumentException("expected [2] children but received [" + newChildren.size() + "]"); } return replaceChildren(newChildren.get(0), newChildren.get(1)); } - public ProcessorDefinition left() { + public Pipe left() { return left; } - public ProcessorDefinition right() { + public Pipe right() { return right; } @@ -44,9 +45,9 @@ public boolean supportedByAggsOnlyQuery() { } @Override - public final ProcessorDefinition resolveAttributes(AttributeResolver resolver) { - ProcessorDefinition newLeft = left.resolveAttributes(resolver); - ProcessorDefinition newRight = right.resolveAttributes(resolver); + public final Pipe resolveAttributes(AttributeResolver resolver) { + Pipe newLeft = left.resolveAttributes(resolver); + Pipe newRight = right.resolveAttributes(resolver); if (newLeft == left && newRight == right) { return this; } @@ -57,7 +58,7 @@ public final ProcessorDefinition resolveAttributes(AttributeResolver resolver) { * Build a copy of this object with new left and right children. Used by * {@link #resolveAttributes(AttributeResolver)}. */ - protected abstract BinaryProcessorDefinition replaceChildren(ProcessorDefinition left, ProcessorDefinition right); + protected abstract BinaryPipe replaceChildren(Pipe left, Pipe right); @Override public boolean resolved() { @@ -69,4 +70,24 @@ public final void collectFields(SqlSourceBuilder sourceBuilder) { left.collectFields(sourceBuilder); right.collectFields(sourceBuilder); } -} + + @Override + public int hashCode() { + return Objects.hash(left(), right()); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + + if (obj == null || getClass() != obj.getClass()) { + return false; + } + + BinaryPipe other = (BinaryPipe) obj; + return Objects.equals(left(), other.left()) + && Objects.equals(right(), other.right()); + } +} \ No newline at end of file diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/CommonNonExecutableInput.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/CommonNonExecutableInput.java similarity index 81% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/CommonNonExecutableInput.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/CommonNonExecutableInput.java index c202f215457de..666b4c093d090 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/CommonNonExecutableInput.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/CommonNonExecutableInput.java @@ -3,12 +3,12 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition; +package org.elasticsearch.xpack.sql.expression.gen.pipeline; import org.elasticsearch.xpack.sql.SqlIllegalArgumentException; import org.elasticsearch.xpack.sql.execution.search.SqlSourceBuilder; import org.elasticsearch.xpack.sql.expression.Expression; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.Processor; +import org.elasticsearch.xpack.sql.expression.gen.processor.Processor; import org.elasticsearch.xpack.sql.tree.Location; /** @@ -26,7 +26,7 @@ public final Processor asProcessor() { } @Override - public final ProcessorDefinition resolveAttributes(AttributeResolver resolver) { + public final Pipe resolveAttributes(AttributeResolver resolver) { return this; } diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/ConstantInput.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/ConstantInput.java similarity index 76% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/ConstantInput.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/ConstantInput.java index 63db9d9a4c58d..ddab153cc4f34 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/ConstantInput.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/ConstantInput.java @@ -3,12 +3,12 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition; +package org.elasticsearch.xpack.sql.expression.gen.pipeline; import org.elasticsearch.xpack.sql.execution.search.SqlSourceBuilder; import org.elasticsearch.xpack.sql.expression.Expression; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.ConstantProcessor; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.Processor; +import org.elasticsearch.xpack.sql.expression.gen.processor.ConstantProcessor; +import org.elasticsearch.xpack.sql.expression.gen.processor.Processor; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; @@ -34,7 +34,7 @@ public final boolean supportedByAggsOnlyQuery() { } @Override - public ProcessorDefinition resolveAttributes(AttributeResolver resolver) { + public Pipe resolveAttributes(AttributeResolver resolver) { return this; } diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/HitExtractorInput.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/HitExtractorInput.java similarity index 78% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/HitExtractorInput.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/HitExtractorInput.java index 50a00880e9d07..750b948a48b7c 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/HitExtractorInput.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/HitExtractorInput.java @@ -3,13 +3,13 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition; +package org.elasticsearch.xpack.sql.expression.gen.pipeline; import org.elasticsearch.xpack.sql.execution.search.SqlSourceBuilder; import org.elasticsearch.xpack.sql.execution.search.extractor.HitExtractor; import org.elasticsearch.xpack.sql.expression.Expression; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.HitExtractorProcessor; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.Processor; +import org.elasticsearch.xpack.sql.expression.gen.processor.HitExtractorProcessor; +import org.elasticsearch.xpack.sql.expression.gen.processor.Processor; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; @@ -35,7 +35,7 @@ public final boolean supportedByAggsOnlyQuery() { } @Override - public ProcessorDefinition resolveAttributes(AttributeResolver resolver) { + public Pipe resolveAttributes(AttributeResolver resolver) { return this; } diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/LeafInput.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/LeafInput.java similarity index 85% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/LeafInput.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/LeafInput.java index 5b7468faa315c..b2a15ab44714b 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/LeafInput.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/LeafInput.java @@ -3,7 +3,7 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition; +package org.elasticsearch.xpack.sql.expression.gen.pipeline; import org.elasticsearch.xpack.sql.expression.Expression; import org.elasticsearch.xpack.sql.tree.Location; @@ -13,7 +13,7 @@ import static java.util.Collections.emptyList; -public abstract class LeafInput extends ProcessorDefinition { +public abstract class LeafInput extends Pipe { private T context; @@ -23,7 +23,7 @@ public LeafInput(Location location, Expression expression, T context) { } @Override - public final ProcessorDefinition replaceChildren(List newChildren) { + public final Pipe replaceChildren(List newChildren) { throw new UnsupportedOperationException("this type of node doesn't have any children to replace"); } diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/NonExecutableInput.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/NonExecutableInput.java similarity index 82% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/NonExecutableInput.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/NonExecutableInput.java index 2161f09d46ac2..be3eded19b2bd 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/NonExecutableInput.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/NonExecutableInput.java @@ -3,11 +3,11 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition; +package org.elasticsearch.xpack.sql.expression.gen.pipeline; import org.elasticsearch.xpack.sql.SqlIllegalArgumentException; import org.elasticsearch.xpack.sql.expression.Expression; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.Processor; +import org.elasticsearch.xpack.sql.expression.gen.processor.Processor; import org.elasticsearch.xpack.sql.tree.Location; public abstract class NonExecutableInput extends LeafInput { diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/ProcessorDefinition.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/Pipe.java similarity index 60% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/ProcessorDefinition.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/Pipe.java index 929367fca94f9..4d1604ff535d3 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/ProcessorDefinition.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/Pipe.java @@ -3,30 +3,32 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition; +package org.elasticsearch.xpack.sql.expression.gen.pipeline; import org.elasticsearch.xpack.sql.execution.search.FieldExtraction; import org.elasticsearch.xpack.sql.expression.Attribute; import org.elasticsearch.xpack.sql.expression.Expression; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.Processor; +import org.elasticsearch.xpack.sql.expression.gen.processor.Processor; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.Node; import java.util.List; /** - * Contains the tree for processing a function, so for example, the {@code ProcessorDefinition} of: + * Processing pipe for an expression (tree). Used for local execution of expressions + * on the invoking node. + * For example, the {@code Pipe} of: * * ABS(MAX(foo)) + CAST(bar) * - * Is an {@code Add} Function with left {@code ABS} over an aggregate (MAX), and + * Is an {@code Add} operator with left {@code ABS} over an aggregate (MAX), and * right being a {@code CAST} function. */ -public abstract class ProcessorDefinition extends Node implements FieldExtraction { +public abstract class Pipe extends Node implements FieldExtraction { private final Expression expression; - public ProcessorDefinition(Location location, Expression expression, List children) { + public Pipe(Location location, Expression expression, List children) { super(location, children); this.expression = expression; } @@ -41,12 +43,13 @@ public Expression expression() { /** * Resolve {@link Attribute}s which are unprocessable into - * {@link FieldExtraction}s which are processable. + * {@link Pipe}s that are. * * @return {@code this} if the resolution doesn't change the - * definition, a new {@link ProcessorDefinition} otherwise + * definition, a new {@link Pipe} otherwise */ - public abstract ProcessorDefinition resolveAttributes(AttributeResolver resolver); + public abstract Pipe resolveAttributes(AttributeResolver resolver); + public interface AttributeResolver { FieldExtraction resolve(Attribute attribute); } diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/ReferenceInput.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/ReferenceInput.java similarity index 83% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/ReferenceInput.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/ReferenceInput.java index 59c001093be79..ec4850a3e18d4 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/ReferenceInput.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/ReferenceInput.java @@ -3,7 +3,7 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition; +package org.elasticsearch.xpack.sql.expression.gen.pipeline; import org.elasticsearch.xpack.sql.execution.search.FieldExtraction; import org.elasticsearch.xpack.sql.execution.search.SqlSourceBuilder; @@ -17,7 +17,7 @@ public ReferenceInput(Location location, Expression expression, FieldExtraction } @Override - protected NodeInfo info() { + protected NodeInfo info() { return NodeInfo.create(this, ReferenceInput::new, expression(), context()); } @@ -27,7 +27,7 @@ public final boolean supportedByAggsOnlyQuery() { } @Override - public ProcessorDefinition resolveAttributes(AttributeResolver resolver) { + public Pipe resolveAttributes(AttributeResolver resolver) { return this; } diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/ScoreProcessorDefinition.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/ScorePipe.java similarity index 63% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/ScoreProcessorDefinition.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/ScorePipe.java index 5617fa016177f..c65070405a84f 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/ScoreProcessorDefinition.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/ScorePipe.java @@ -3,13 +3,13 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition; +package org.elasticsearch.xpack.sql.expression.gen.pipeline; import org.elasticsearch.xpack.sql.execution.search.SqlSourceBuilder; import org.elasticsearch.xpack.sql.execution.search.extractor.ScoreExtractor; import org.elasticsearch.xpack.sql.expression.Expression; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.HitExtractorProcessor; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.Processor; +import org.elasticsearch.xpack.sql.expression.gen.processor.HitExtractorProcessor; +import org.elasticsearch.xpack.sql.expression.gen.processor.Processor; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; @@ -17,18 +17,18 @@ import static java.util.Collections.emptyList; -public class ScoreProcessorDefinition extends ProcessorDefinition { - public ScoreProcessorDefinition(Location location, Expression expression) { +public class ScorePipe extends Pipe { + public ScorePipe(Location location, Expression expression) { super(location, expression, emptyList()); } @Override - protected NodeInfo info() { - return NodeInfo.create(this, ScoreProcessorDefinition::new, expression()); + protected NodeInfo info() { + return NodeInfo.create(this, ScorePipe::new, expression()); } @Override - public final ProcessorDefinition replaceChildren(List newChildren) { + public final Pipe replaceChildren(List newChildren) { throw new UnsupportedOperationException("this type of node doesn't have any children to replace"); } @@ -48,7 +48,7 @@ public boolean supportedByAggsOnlyQuery() { } @Override - public ProcessorDefinition resolveAttributes(AttributeResolver resolver) { + public Pipe resolveAttributes(AttributeResolver resolver) { return this; } diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/UnaryProcessorDefinition.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/UnaryPipe.java similarity index 63% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/UnaryProcessorDefinition.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/UnaryPipe.java index fe8a4099ec3c1..8e36f448929ab 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/UnaryProcessorDefinition.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/UnaryPipe.java @@ -3,12 +3,12 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition; +package org.elasticsearch.xpack.sql.expression.gen.pipeline; import org.elasticsearch.xpack.sql.execution.search.SqlSourceBuilder; import org.elasticsearch.xpack.sql.expression.Expression; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.ChainingProcessor; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.Processor; +import org.elasticsearch.xpack.sql.expression.gen.processor.ChainingProcessor; +import org.elasticsearch.xpack.sql.expression.gen.processor.Processor; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; @@ -17,31 +17,31 @@ import static java.util.Collections.singletonList; -public final class UnaryProcessorDefinition extends ProcessorDefinition { +public final class UnaryPipe extends Pipe { - private final ProcessorDefinition child; + private final Pipe child; private final Processor action; - public UnaryProcessorDefinition(Location location, Expression expression, ProcessorDefinition child, Processor action) { + public UnaryPipe(Location location, Expression expression, Pipe child, Processor action) { super(location, expression, singletonList(child)); this.child = child; this.action = action; } @Override - protected NodeInfo info() { - return NodeInfo.create(this, UnaryProcessorDefinition::new, expression(), child, action); + protected NodeInfo info() { + return NodeInfo.create(this, UnaryPipe::new, expression(), child, action); } @Override - public ProcessorDefinition replaceChildren(List newChildren) { + public Pipe replaceChildren(List newChildren) { if (newChildren.size() != 1) { throw new IllegalArgumentException("expected [1] child but received [" + newChildren.size() + "]"); } - return new UnaryProcessorDefinition(location(), expression(), newChildren.get(0), action); + return new UnaryPipe(location(), expression(), newChildren.get(0), action); } - public ProcessorDefinition child() { + public Pipe child() { return child; } @@ -65,12 +65,12 @@ public boolean supportedByAggsOnlyQuery() { } @Override - public ProcessorDefinition resolveAttributes(AttributeResolver resolver) { - ProcessorDefinition newChild = child.resolveAttributes(resolver); + public Pipe resolveAttributes(AttributeResolver resolver) { + Pipe newChild = child.resolveAttributes(resolver); if (newChild == child) { return this; } - return new UnaryProcessorDefinition(location(), expression(), newChild, action); + return new UnaryPipe(location(), expression(), newChild, action); } @Override @@ -93,7 +93,7 @@ public boolean equals(Object obj) { return false; } - UnaryProcessorDefinition other = (UnaryProcessorDefinition) obj; + UnaryPipe other = (UnaryPipe) obj; return Objects.equals(action, other.action) && Objects.equals(child, other.child) && Objects.equals(expression(), other.expression()); diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/runtime/BinaryProcessor.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/processor/BinaryProcessor.java similarity index 94% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/runtime/BinaryProcessor.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/processor/BinaryProcessor.java index 81795923915a3..c3222e2fa03a9 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/runtime/BinaryProcessor.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/processor/BinaryProcessor.java @@ -3,7 +3,7 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime; +package org.elasticsearch.xpack.sql.expression.gen.processor; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/runtime/BucketExtractorProcessor.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/processor/BucketExtractorProcessor.java similarity index 96% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/runtime/BucketExtractorProcessor.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/processor/BucketExtractorProcessor.java index 0a5a2b1f1e091..e3e8a2c9c8313 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/runtime/BucketExtractorProcessor.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/processor/BucketExtractorProcessor.java @@ -3,7 +3,7 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime; +package org.elasticsearch.xpack.sql.expression.gen.processor; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/runtime/ChainingProcessor.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/processor/ChainingProcessor.java similarity index 95% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/runtime/ChainingProcessor.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/processor/ChainingProcessor.java index 9be7de637e349..e9c1385818364 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/runtime/ChainingProcessor.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/processor/ChainingProcessor.java @@ -3,7 +3,7 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime; +package org.elasticsearch.xpack.sql.expression.gen.processor; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/runtime/ConstantProcessor.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/processor/ConstantProcessor.java similarity index 94% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/runtime/ConstantProcessor.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/processor/ConstantProcessor.java index cc419f3c7b71a..21cb72f2dab55 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/runtime/ConstantProcessor.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/processor/ConstantProcessor.java @@ -3,7 +3,7 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime; +package org.elasticsearch.xpack.sql.expression.gen.processor; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/runtime/HitExtractorProcessor.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/processor/HitExtractorProcessor.java similarity index 96% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/runtime/HitExtractorProcessor.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/processor/HitExtractorProcessor.java index 5960b8cfca04c..9f58b00898978 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/runtime/HitExtractorProcessor.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/processor/HitExtractorProcessor.java @@ -3,7 +3,7 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime; +package org.elasticsearch.xpack.sql.expression.gen.processor; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/runtime/Processor.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/processor/Processor.java similarity index 72% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/runtime/Processor.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/processor/Processor.java index 9fb67fb51a177..2b8433191e395 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/runtime/Processor.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/processor/Processor.java @@ -3,12 +3,12 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime; +package org.elasticsearch.xpack.sql.expression.gen.processor; import org.elasticsearch.common.io.stream.NamedWriteable; /** - * For a scalar function, a {@code Processor} is how we convert the value to convert one value to another value. For instance, ABS(foo). + * A {@code Processor} evaluates locally an expression. For instance, ABS(foo). * Aggregate functions are handled by ES but scalars are not. * * This is an opaque class, the computed/compiled result gets saved on the client during scrolling. diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/runtime/UnaryProcessor.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/processor/UnaryProcessor.java similarity index 95% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/runtime/UnaryProcessor.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/processor/UnaryProcessor.java index 613e263228366..7c1a5dd7d3594 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/runtime/UnaryProcessor.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/processor/UnaryProcessor.java @@ -3,7 +3,7 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime; +package org.elasticsearch.xpack.sql.expression.gen.processor; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/script/Agg.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/script/Agg.java similarity index 90% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/script/Agg.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/script/Agg.java index 3b75b7f98b5a8..55bba71306250 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/script/Agg.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/script/Agg.java @@ -3,7 +3,7 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression.function.scalar.script; +package org.elasticsearch.xpack.sql.expression.gen.script; import org.elasticsearch.xpack.sql.expression.function.aggregate.AggregateFunctionAttribute; diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/script/Param.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/script/Param.java similarity index 89% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/script/Param.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/script/Param.java index ff2e3322ae0fb..579eacd036b0e 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/script/Param.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/script/Param.java @@ -3,7 +3,7 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression.function.scalar.script; +package org.elasticsearch.xpack.sql.expression.gen.script; import java.util.Locale; diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/script/Params.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/script/Params.java similarity index 98% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/script/Params.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/script/Params.java index c7c331e3b5813..0fc85b3241f99 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/script/Params.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/script/Params.java @@ -3,7 +3,7 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression.function.scalar.script; +package org.elasticsearch.xpack.sql.expression.gen.script; import org.elasticsearch.xpack.sql.SqlIllegalArgumentException; diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/script/ParamsBuilder.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/script/ParamsBuilder.java similarity index 93% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/script/ParamsBuilder.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/script/ParamsBuilder.java index 8f99f29b9c1cd..6719776c84a57 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/script/ParamsBuilder.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/script/ParamsBuilder.java @@ -3,7 +3,7 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression.function.scalar.script; +package org.elasticsearch.xpack.sql.expression.gen.script; import org.elasticsearch.xpack.sql.expression.function.aggregate.AggregateFunctionAttribute; diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/script/Script.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/script/Script.java similarity index 85% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/script/Script.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/script/Script.java index ceabac9c49934..85c436cf69ec8 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/script/Script.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/script/Script.java @@ -3,7 +3,7 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression.function.scalar.script; +package org.elasticsearch.xpack.sql.expression.gen.script; class Script extends Param { diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/script/ScriptTemplate.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/script/ScriptTemplate.java similarity index 87% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/script/ScriptTemplate.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/script/ScriptTemplate.java index 35b7680dcca78..9279cdcc1b8aa 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/script/ScriptTemplate.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/script/ScriptTemplate.java @@ -3,11 +3,10 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression.function.scalar.script; +package org.elasticsearch.xpack.sql.expression.gen.script; import org.elasticsearch.script.Script; import org.elasticsearch.script.ScriptType; -import org.elasticsearch.xpack.sql.expression.function.scalar.whitelist.InternalSqlScriptUtils; import org.elasticsearch.xpack.sql.type.DataType; import org.elasticsearch.xpack.sql.util.StringUtils; @@ -91,8 +90,4 @@ public boolean equals(Object obj) { public String toString() { return bindTemplate(); } - - public static String formatTemplate(String template) { - return template.replace("{sql}", InternalSqlScriptUtils.class.getSimpleName()).replace("{}", "params.%s"); - } -} +} \ No newline at end of file diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/script/ScriptWeaver.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/script/ScriptWeaver.java new file mode 100644 index 0000000000000..f171c03b1e433 --- /dev/null +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/script/ScriptWeaver.java @@ -0,0 +1,80 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +package org.elasticsearch.xpack.sql.expression.gen.script; + +import org.elasticsearch.xpack.sql.SqlIllegalArgumentException; +import org.elasticsearch.xpack.sql.expression.Attribute; +import org.elasticsearch.xpack.sql.expression.Expression; +import org.elasticsearch.xpack.sql.expression.Expressions; +import org.elasticsearch.xpack.sql.expression.FieldAttribute; +import org.elasticsearch.xpack.sql.expression.function.aggregate.AggregateFunctionAttribute; +import org.elasticsearch.xpack.sql.expression.function.scalar.ScalarFunctionAttribute; +import org.elasticsearch.xpack.sql.expression.function.scalar.whitelist.InternalSqlScriptUtils; +import org.elasticsearch.xpack.sql.type.DataType; + +import static org.elasticsearch.xpack.sql.expression.gen.script.ParamsBuilder.paramsBuilder; + +/** + * Mixin-like interface for customizing the default script generation. + */ +public interface ScriptWeaver { + + default ScriptTemplate asScript(Expression exp) { + if (exp.foldable()) { + return scriptWithFoldable(exp); + } + + Attribute attr = Expressions.attribute(exp); + if (attr != null) { + if (attr instanceof ScalarFunctionAttribute) { + return scriptWithScalar((ScalarFunctionAttribute) attr); + } + if (attr instanceof AggregateFunctionAttribute) { + return scriptWithAggregate((AggregateFunctionAttribute) attr); + } + if (attr instanceof FieldAttribute) { + return scriptWithField((FieldAttribute) attr); + } + } + throw new SqlIllegalArgumentException("Cannot evaluate script for expression {}", exp); + } + + DataType dataType(); + + default ScriptTemplate scriptWithFoldable(Expression foldable) { + return new ScriptTemplate(processScript("{}"), + paramsBuilder().variable(foldable.fold()).build(), + dataType()); + } + + default ScriptTemplate scriptWithScalar(ScalarFunctionAttribute scalar) { + ScriptTemplate nested = scalar.script(); + return new ScriptTemplate(processScript(nested.template()), + paramsBuilder().script(nested.params()).build(), + dataType()); + } + + default ScriptTemplate scriptWithAggregate(AggregateFunctionAttribute aggregate) { + return new ScriptTemplate(processScript("{}"), + paramsBuilder().agg(aggregate).build(), + dataType()); + } + + default ScriptTemplate scriptWithField(FieldAttribute field) { + return new ScriptTemplate(processScript("doc[{}].value"), + paramsBuilder().variable(field.name()).build(), + dataType()); + } + + default String processScript(String script) { + return formatTemplate(script); + } + + default String formatTemplate(String template) { + return template.replace("{sql}", InternalSqlScriptUtils.class.getSimpleName()).replace("{}", "params.%s"); + } +} \ No newline at end of file diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/script/Var.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/script/Var.java similarity index 84% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/script/Var.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/script/Var.java index 96bda8eabe68f..f22e510fdc4e2 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/script/Var.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/script/Var.java @@ -3,7 +3,7 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression.function.scalar.script; +package org.elasticsearch.xpack.sql.expression.gen.script; class Var extends Param { diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/And.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/And.java index 0cabf065f8f57..c7f5b7dacec2f 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/And.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/And.java @@ -5,10 +5,8 @@ */ package org.elasticsearch.xpack.sql.expression.predicate; -import org.elasticsearch.xpack.sql.expression.BinaryLogic; -import org.elasticsearch.xpack.sql.expression.BinaryOperator; -import org.elasticsearch.xpack.sql.expression.BinaryOperator.Negateable; import org.elasticsearch.xpack.sql.expression.Expression; +import org.elasticsearch.xpack.sql.expression.predicate.BinaryOperator.Negateable; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; @@ -17,7 +15,7 @@ public class And extends BinaryLogic implements Negateable { public And(Location location, Expression left, Expression right) { - super(location, left, right); + super(location, left, right, "&&"); } @Override @@ -30,6 +28,7 @@ protected BinaryOperator replaceChildren(Expression newLeft, Expression newRight return new And(location(), newLeft, newRight); } + @Override public Object fold() { return Objects.equals(left().fold(), Boolean.TRUE) && Objects.equals(right().fold(), Boolean.TRUE); } @@ -43,9 +42,4 @@ public Or negate() { public And swapLeftAndRight() { return new And(location(), right(), left()); } - - @Override - public String symbol() { - return "&&"; - } } diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/BinaryLogic.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/BinaryLogic.java similarity index 54% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/BinaryLogic.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/BinaryLogic.java index 8cb51a6ea0ca9..01fefb2c8e737 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/BinaryLogic.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/BinaryLogic.java @@ -3,15 +3,19 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression; +package org.elasticsearch.xpack.sql.expression.predicate; +import org.elasticsearch.xpack.sql.expression.Expression; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.AggNameInput; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; +import org.elasticsearch.xpack.sql.expression.gen.script.ScriptTemplate; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.type.DataType; public abstract class BinaryLogic extends BinaryOperator { - protected BinaryLogic(Location location, Expression left, Expression right) { - super(location, left, right); + protected BinaryLogic(Location location, Expression left, Expression right, String symbol) { + super(location, left, right, symbol); } @Override @@ -24,4 +28,14 @@ protected TypeResolution resolveInputType(DataType inputType) { return DataType.BOOLEAN == inputType ? TypeResolution.TYPE_RESOLVED : new TypeResolution( "'%s' requires type %s not %s", symbol(), DataType.BOOLEAN.sqlName(), inputType.sqlName()); } + + @Override + protected ScriptTemplate asScriptFrom(ScriptTemplate leftScript, ScriptTemplate rightScript) { + return new ScriptTemplate(""); + } } diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/BinaryOperator.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/BinaryOperator.java similarity index 65% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/BinaryOperator.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/BinaryOperator.java index bfa4358d240ac..27e979bc30a57 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/BinaryOperator.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/BinaryOperator.java @@ -3,24 +3,30 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression; +package org.elasticsearch.xpack.sql.expression.predicate; +import org.elasticsearch.xpack.sql.expression.Expression; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.type.DataType; -//Binary expression that requires both input expressions to have the same type -//Compatible types should be handled by the analyzer (by using the narrowest type) -public abstract class BinaryOperator extends BinaryExpression { + +/** + * Operator is a specialized binary predicate where both sides have the compatible types + * (it's up to the analyzer to do any conversion if needed). + */ +public abstract class BinaryOperator extends BinaryPredicate { public interface Negateable { - BinaryExpression negate(); + BinaryOperator negate(); } - protected BinaryOperator(Location location, Expression left, Expression right) { - super(location, left, right); + protected BinaryOperator(Location location, Expression left, Expression right, String symbol) { + super(location, left, right, symbol); } protected abstract TypeResolution resolveInputType(DataType inputType); + public abstract BinaryOperator swapLeftAndRight(); + @Override protected TypeResolution resolveType() { if (!childrenResolved()) { @@ -36,4 +42,4 @@ protected TypeResolution resolveType() { } return resolution; } -} +} \ No newline at end of file diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/BinaryPredicate.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/BinaryPredicate.java new file mode 100644 index 0000000000000..ead90c13e88e3 --- /dev/null +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/BinaryPredicate.java @@ -0,0 +1,84 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +package org.elasticsearch.xpack.sql.expression.predicate; + +import org.elasticsearch.xpack.sql.expression.Expression; +import org.elasticsearch.xpack.sql.expression.Expressions; +import org.elasticsearch.xpack.sql.expression.Literal; +import org.elasticsearch.xpack.sql.expression.function.scalar.BinaryScalarFunction; +import org.elasticsearch.xpack.sql.tree.Location; + +import java.util.Objects; + +/** + * Binary operator. Operators act as _special_ functions in that they have a symbol + * instead of a name and do not use parathensis. + * Further more they are not registered as the rest of the functions as are implicit + * to the language. + */ +public abstract class BinaryPredicate extends BinaryScalarFunction { + + private final String symbol; + private final String name; + + protected BinaryPredicate(Location location, Expression left, Expression right, String symbol) { + super(location, left, right); + this.name = name(left, right, symbol); + this.symbol = symbol; + } + + @Override + public int hashCode() { + return Objects.hash(left(), right()); + } + + @Override + public boolean equals(Object obj) { + // NB: the id and name are being ignored for binary expressions as most of them + // are operators + + if (this == obj) { + return true; + } + if (obj == null || getClass() != obj.getClass()) { + return false; + } + + BinaryPredicate other = (BinaryPredicate) obj; + + return Objects.equals(symbol, other.symbol) + && Objects.equals(left(), other.left()) + && Objects.equals(right(), other.right()); + } + + private static String name(Expression left, Expression right, String symbol) { + StringBuilder sb = new StringBuilder(); + sb.append(Expressions.name(left)); + if (!(left instanceof Literal)) { + sb.insert(0, "("); + sb.append(")"); + } + sb.append(" "); + sb.append(symbol); + sb.append(" "); + int pos = sb.length(); + sb.append(Expressions.name(right)); + if (!(right instanceof Literal)) { + sb.insert(pos, "("); + sb.append(")"); + } + return sb.toString(); + } + + @Override + public String name() { + return name; + } + + public final String symbol() { + return symbol; + } +} \ No newline at end of file diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/In.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/In.java index 5793f46c465b8..fb04f6d438a91 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/In.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/In.java @@ -5,23 +5,27 @@ */ package org.elasticsearch.xpack.sql.expression.predicate; -import java.util.List; -import java.util.Objects; - +import org.elasticsearch.xpack.sql.SqlIllegalArgumentException; +import org.elasticsearch.xpack.sql.expression.Attribute; import org.elasticsearch.xpack.sql.expression.Expression; +import org.elasticsearch.xpack.sql.expression.NamedExpression; +import org.elasticsearch.xpack.sql.expression.gen.script.ScriptTemplate; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; import org.elasticsearch.xpack.sql.type.DataType; import org.elasticsearch.xpack.sql.util.CollectionUtils; -public class In extends Expression { +import java.util.List; +import java.util.Objects; + +public class In extends NamedExpression { private final Expression value; private final List list; private final boolean nullable, foldable; public In(Location location, Expression value, List list) { - super(location, CollectionUtils.combine(list, value)); + super(location, null, CollectionUtils.combine(list, value), null); this.value = value; this.list = list; @@ -65,6 +69,16 @@ public boolean foldable() { return foldable; } + @Override + public Attribute toAttribute() { + throw new SqlIllegalArgumentException("not implemented yet"); + } + + @Override + public ScriptTemplate asScript() { + throw new SqlIllegalArgumentException("not implemented yet"); + } + @Override public int hashCode() { return Objects.hash(value, list); @@ -75,8 +89,7 @@ public boolean equals(Object obj) { if (this == obj) { return true; } - - if (!super.equals(obj) || getClass() != obj.getClass()) { + if (obj == null || getClass() != obj.getClass()) { return false; } @@ -84,4 +97,4 @@ public boolean equals(Object obj) { return Objects.equals(value, other.value) && Objects.equals(list, other.list); } -} +} \ No newline at end of file diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/IsNotNull.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/IsNotNull.java index 421405102459e..cabca2aaf2dd6 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/IsNotNull.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/IsNotNull.java @@ -5,8 +5,11 @@ */ package org.elasticsearch.xpack.sql.expression.predicate; +import org.elasticsearch.xpack.sql.SqlIllegalArgumentException; import org.elasticsearch.xpack.sql.expression.Expression; import org.elasticsearch.xpack.sql.expression.UnaryExpression; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; +import org.elasticsearch.xpack.sql.expression.gen.script.ScriptTemplate; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; import org.elasticsearch.xpack.sql.type.DataType; @@ -28,10 +31,21 @@ protected IsNotNull replaceChild(Expression newChild) { return new IsNotNull(location(), newChild); } + @Override public Object fold() { return child().fold() != null && !DataTypes.isNull(child().dataType()); } + @Override + protected Pipe makePipe() { + throw new SqlIllegalArgumentException("Not supported yet"); + } + + @Override + public ScriptTemplate asScript() { + throw new SqlIllegalArgumentException("Not supported yet"); + } + @Override public boolean nullable() { return false; diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/Not.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/Not.java index 71ce42ba8aa81..4b6e7ba4b46a4 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/Not.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/Not.java @@ -5,17 +5,20 @@ */ package org.elasticsearch.xpack.sql.expression.predicate; -import org.elasticsearch.xpack.sql.expression.BinaryOperator.Negateable; +import org.elasticsearch.xpack.sql.SqlIllegalArgumentException; import org.elasticsearch.xpack.sql.expression.Expression; import org.elasticsearch.xpack.sql.expression.Expressions; -import org.elasticsearch.xpack.sql.expression.UnaryExpression; +import org.elasticsearch.xpack.sql.expression.function.scalar.UnaryScalarFunction; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; +import org.elasticsearch.xpack.sql.expression.gen.script.ScriptTemplate; +import org.elasticsearch.xpack.sql.expression.predicate.BinaryOperator.Negateable; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; import org.elasticsearch.xpack.sql.type.DataType; import java.util.Objects; -public class Not extends UnaryExpression { +public class Not extends UnaryScalarFunction { public Not(Location location, Expression child) { super(location, child); @@ -23,7 +26,7 @@ public Not(Location location, Expression child) { @Override protected NodeInfo info() { - return NodeInfo.create(this, Not::new, child()); + return NodeInfo.create(this, Not::new, field()); } @Override @@ -31,22 +34,33 @@ protected Not replaceChild(Expression newChild) { return new Not(location(), newChild); } + @Override protected TypeResolution resolveType() { - if (DataType.BOOLEAN == child().dataType()) { + if (DataType.BOOLEAN == field().dataType()) { return TypeResolution.TYPE_RESOLVED; } - return new TypeResolution("Cannot negate expression ([" + Expressions.name(child()) + "] of type [" - + child().dataType().esType + "])"); + return new TypeResolution("Cannot negate expression ([" + Expressions.name(field()) + "] of type [" + + field().dataType().esType + "])"); } @Override public Object fold() { - return Objects.equals(child().fold(), Boolean.TRUE) ? Boolean.FALSE : Boolean.TRUE; + return Objects.equals(field().fold(), Boolean.TRUE) ? Boolean.FALSE : Boolean.TRUE; + } + + @Override + protected Pipe makePipe() { + throw new SqlIllegalArgumentException("Not supported yet"); + } + + @Override + public ScriptTemplate asScript() { + throw new SqlIllegalArgumentException("Not supported yet"); } @Override protected Expression canonicalize() { - Expression canonicalChild = child().canonical(); + Expression canonicalChild = field().canonical(); if (canonicalChild instanceof Negateable) { return ((Negateable) canonicalChild).negate(); } diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/Or.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/Or.java index 49bd40b284686..614ef94adaa5a 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/Or.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/Or.java @@ -5,10 +5,8 @@ */ package org.elasticsearch.xpack.sql.expression.predicate; -import org.elasticsearch.xpack.sql.expression.BinaryLogic; -import org.elasticsearch.xpack.sql.expression.BinaryOperator; -import org.elasticsearch.xpack.sql.expression.BinaryOperator.Negateable; import org.elasticsearch.xpack.sql.expression.Expression; +import org.elasticsearch.xpack.sql.expression.predicate.BinaryOperator.Negateable; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; @@ -17,7 +15,7 @@ public class Or extends BinaryLogic implements Negateable { public Or(Location location, Expression left, Expression right) { - super(location, left, right); + super(location, left, right, "||"); } @Override @@ -44,9 +42,4 @@ public Or swapLeftAndRight() { public And negate() { return new And(location(), new Not(location(), left()), new Not(location(), right())); } - - @Override - public String symbol() { - return "||"; - } } diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/Range.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/Range.java index c17e9634492a1..4395e263e060c 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/Range.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/Range.java @@ -5,23 +5,45 @@ */ package org.elasticsearch.xpack.sql.expression.predicate; +import org.elasticsearch.xpack.sql.SqlIllegalArgumentException; +import org.elasticsearch.xpack.sql.expression.Attribute; import org.elasticsearch.xpack.sql.expression.Expression; +import org.elasticsearch.xpack.sql.expression.FieldAttribute; +import org.elasticsearch.xpack.sql.expression.Foldables; +import org.elasticsearch.xpack.sql.expression.NamedExpression; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; +import org.elasticsearch.xpack.sql.expression.gen.script.Params; +import org.elasticsearch.xpack.sql.expression.gen.script.ScriptTemplate; +import org.elasticsearch.xpack.sql.expression.gen.script.ScriptWeaver; +import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.BinaryComparison; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; import org.elasticsearch.xpack.sql.type.DataType; +import org.elasticsearch.xpack.sql.type.EsField; import java.util.Arrays; import java.util.List; +import java.util.Locale; import java.util.Objects; +import static java.lang.String.format; +import static java.util.Collections.emptyMap; +import static org.elasticsearch.xpack.sql.expression.gen.script.ParamsBuilder.paramsBuilder; + // BETWEEN or range - is a mix of gt(e) AND lt(e) -public class Range extends Expression { +public class Range extends NamedExpression implements ScriptWeaver { private final Expression value, lower, upper; private final boolean includeLower, includeUpper; public Range(Location location, Expression value, Expression lower, boolean includeLower, Expression upper, boolean includeUpper) { - super(location, Arrays.asList(value, lower, upper)); + this(location, null, value, lower, includeLower, upper, includeUpper); + } + + public Range(Location location, String name, Expression value, Expression lower, boolean includeLower, Expression upper, + boolean includeUpper) { + super(location, name == null ? defaultName(value, lower, upper, includeLower, includeUpper) : name, + Arrays.asList(value, lower, upper), null); this.value = value; this.lower = lower; @@ -32,7 +54,7 @@ public Range(Location location, Expression value, Expression lower, boolean incl @Override protected NodeInfo info() { - return NodeInfo.create(this, Range::new, value, lower, includeLower, upper, includeUpper); + return NodeInfo.create(this, Range::new, name(), value, lower, includeLower, upper, includeUpper); } @Override @@ -106,6 +128,36 @@ public DataType dataType() { return DataType.BOOLEAN; } + @Override + public ScriptTemplate asScript() { + ScriptTemplate scriptTemplate = asScript(value); + + String template = formatTemplate(format(Locale.ROOT, "({} %s %s) && (%s %s {})", + includeLower() ? "<=" : "<", + scriptTemplate.template(), + scriptTemplate.template(), + includeUpper() ? "<=" : "<")); + + Params params = paramsBuilder().variable(Foldables.valueOf(lower)) + .script(scriptTemplate.params()) + .script(scriptTemplate.params()) + .variable(Foldables.valueOf(upper)) + .build(); + + return new ScriptTemplate(template, params, DataType.BOOLEAN); + } + + @Override + protected Pipe makePipe() { + throw new SqlIllegalArgumentException("Not supported yet"); + } + + @Override + public Attribute toAttribute() { + return new FieldAttribute(location(), "not yet implemented", + new EsField("not yet implemented", DataType.UNSUPPORTED, emptyMap(), false)); + } + @Override public int hashCode() { return Objects.hash(includeLower, includeUpper, value, lower, upper); @@ -129,8 +181,7 @@ public boolean equals(Object obj) { && Objects.equals(upper, other.upper); } - @Override - public String toString() { + private static String defaultName(Expression value, Expression lower, Expression upper, boolean includeLower, boolean includeUpper) { StringBuilder sb = new StringBuilder(); sb.append(lower); sb.append(includeLower ? " <= " : " < "); @@ -139,4 +190,9 @@ public String toString() { sb.append(upper); return sb.toString(); } -} + + @Override + public String toString() { + return name(); + } +} \ No newline at end of file diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/fulltext/FullTextPredicate.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/fulltext/FullTextPredicate.java index 0ec11351320d9..07f284c90ca9b 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/fulltext/FullTextPredicate.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/fulltext/FullTextPredicate.java @@ -84,4 +84,4 @@ public boolean equals(Object obj) { return Objects.equals(query, other.query) && Objects.equals(options, other.options); } -} +} \ No newline at end of file diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/arithmetic/Add.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/arithmetic/Add.java similarity index 77% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/arithmetic/Add.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/arithmetic/Add.java index 92d6e5218ac9c..36becf9f17be5 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/arithmetic/Add.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/arithmetic/Add.java @@ -3,17 +3,17 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression.function.scalar.arithmetic; +package org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic; import org.elasticsearch.xpack.sql.expression.Expression; -import org.elasticsearch.xpack.sql.expression.function.scalar.arithmetic.BinaryArithmeticProcessor.BinaryArithmeticOperation; +import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.BinaryArithmeticProcessor.BinaryArithmeticOperation; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; /** * Addition function ({@code a + b}). */ -public class Add extends ArithmeticFunction { +public class Add extends ArithmeticOperation { public Add(Location location, Expression left, Expression right) { super(location, left, right, BinaryArithmeticOperation.ADD); } diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/arithmetic/ArithmeticOperation.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/arithmetic/ArithmeticOperation.java new file mode 100644 index 0000000000000..24a7281beb97a --- /dev/null +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/arithmetic/ArithmeticOperation.java @@ -0,0 +1,71 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +package org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic; + +import org.elasticsearch.xpack.sql.expression.Expression; +import org.elasticsearch.xpack.sql.expression.Expressions; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; +import org.elasticsearch.xpack.sql.expression.gen.script.ScriptTemplate; +import org.elasticsearch.xpack.sql.expression.predicate.BinaryOperator; +import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.BinaryArithmeticProcessor.BinaryArithmeticOperation; +import org.elasticsearch.xpack.sql.tree.Location; +import org.elasticsearch.xpack.sql.type.DataType; +import org.elasticsearch.xpack.sql.type.DataTypeConversion; + +import java.util.Locale; + +import static java.lang.String.format; +import static org.elasticsearch.xpack.sql.expression.gen.script.ParamsBuilder.paramsBuilder; + +public abstract class ArithmeticOperation extends BinaryOperator { + + private final BinaryArithmeticOperation operation; + + ArithmeticOperation(Location location, Expression left, Expression right, BinaryArithmeticOperation operation) { + super(location, left, right, operation.symbol()); + this.operation = operation; + } + + @Override + protected TypeResolution resolveInputType(DataType inputType) { + return inputType.isNumeric() ? + TypeResolution.TYPE_RESOLVED : + new TypeResolution("'%s' requires a numeric type, received %s", symbol(), inputType.esType); + } + + @Override + public ArithmeticOperation swapLeftAndRight() { + return this; + } + + @Override + public DataType dataType() { + return DataTypeConversion.commonType(left().dataType(), right().dataType()); + } + + @Override + public Object fold() { + return operation.apply((Number) left().fold(), (Number) right().fold()); + } + + @Override + protected ScriptTemplate asScriptFrom(ScriptTemplate leftScript, ScriptTemplate rightScript) { + String op = operation.symbol(); + // escape % + if (operation == BinaryArithmeticOperation.MOD) { + op = "%" + op; + } + return new ScriptTemplate(format(Locale.ROOT, "(%s) %s (%s)", leftScript.template(), op, rightScript.template()), + paramsBuilder() + .script(leftScript.params()).script(rightScript.params()) + .build(), dataType()); + } + + @Override + protected Pipe makePipe() { + return new BinaryArithmeticPipe(location(), this, Expressions.pipe(left()), Expressions.pipe(right()), operation); + } +} \ No newline at end of file diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/arithmetic/Arithmetics.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/arithmetic/Arithmetics.java similarity index 96% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/arithmetic/Arithmetics.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/arithmetic/Arithmetics.java index 51cccb850666b..07fcef391681e 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/arithmetic/Arithmetics.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/arithmetic/Arithmetics.java @@ -3,13 +3,13 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression.function.scalar.arithmetic; +package org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic; /** * Arithmetic operation using the type widening rules of the JLS 5.6.2 namely * widen to double or float or long or int in this order. */ -abstract class Arithmetics { +public abstract class Arithmetics { static Number add(Number l, Number r) { if (l == null || r == null) { @@ -83,7 +83,7 @@ static Number div(Number l, Number r) { return l.intValue() / r.intValue(); } - static Number mod(Number l, Number r) { + public static Number mod(Number l, Number r) { if (l == null || r == null) { return null; } diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/arithmetic/BinaryArithmeticPipe.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/arithmetic/BinaryArithmeticPipe.java new file mode 100644 index 0000000000000..06bed035141c9 --- /dev/null +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/arithmetic/BinaryArithmeticPipe.java @@ -0,0 +1,56 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +package org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic; + +import org.elasticsearch.xpack.sql.expression.Expression; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.BinaryPipe; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; +import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.BinaryArithmeticProcessor.BinaryArithmeticOperation; +import org.elasticsearch.xpack.sql.tree.Location; +import org.elasticsearch.xpack.sql.tree.NodeInfo; + +import java.util.Objects; + +public class BinaryArithmeticPipe extends BinaryPipe { + + private final BinaryArithmeticOperation operation; + + public BinaryArithmeticPipe(Location location, Expression expression, Pipe left, + Pipe right, BinaryArithmeticOperation operation) { + super(location, expression, left, right); + this.operation = operation; + } + + @Override + protected NodeInfo info() { + return NodeInfo.create(this, BinaryArithmeticPipe::new, + expression(), left(), right(), operation); + } + + @Override + protected BinaryPipe replaceChildren(Pipe left, Pipe right) { + return new BinaryArithmeticPipe(location(), expression(), left, right, operation); + } + + @Override + public BinaryArithmeticProcessor asProcessor() { + return new BinaryArithmeticProcessor(left().asProcessor(), right().asProcessor(), operation); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), operation); + } + + @Override + public boolean equals(Object obj) { + if (super.equals(obj)) { + BinaryArithmeticPipe other = (BinaryArithmeticPipe) obj; + return Objects.equals(operation, other.operation); + } + return false; + } +} diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/arithmetic/BinaryArithmeticProcessor.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/arithmetic/BinaryArithmeticProcessor.java similarity index 87% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/arithmetic/BinaryArithmeticProcessor.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/arithmetic/BinaryArithmeticProcessor.java index 3f54004c1b0dc..f7811ba7cba7e 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/arithmetic/BinaryArithmeticProcessor.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/arithmetic/BinaryArithmeticProcessor.java @@ -3,13 +3,13 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression.function.scalar.arithmetic; +package org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; -import org.elasticsearch.xpack.sql.expression.function.scalar.arithmetic.BinaryArithmeticProcessor.BinaryArithmeticOperation; import org.elasticsearch.xpack.sql.expression.function.scalar.math.BinaryNumericProcessor; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.Processor; +import org.elasticsearch.xpack.sql.expression.gen.processor.Processor; +import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.BinaryArithmeticProcessor.BinaryArithmeticOperation; import java.io.IOException; import java.util.function.BiFunction; diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/arithmetic/Div.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/arithmetic/Div.java similarity index 71% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/arithmetic/Div.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/arithmetic/Div.java index fa3a82f3113fb..643286b1ae40b 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/arithmetic/Div.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/arithmetic/Div.java @@ -3,11 +3,10 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression.function.scalar.arithmetic; +package org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic; import org.elasticsearch.xpack.sql.expression.Expression; -import org.elasticsearch.xpack.sql.expression.function.scalar.BinaryScalarFunction; -import org.elasticsearch.xpack.sql.expression.function.scalar.arithmetic.BinaryArithmeticProcessor.BinaryArithmeticOperation; +import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.BinaryArithmeticProcessor.BinaryArithmeticOperation; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; import org.elasticsearch.xpack.sql.type.DataType; @@ -16,7 +15,7 @@ /** * Division function ({@code a / b}). */ -public class Div extends ArithmeticFunction { +public class Div extends ArithmeticOperation { public Div(Location location, Expression left, Expression right) { super(location, left, right, BinaryArithmeticOperation.DIV); @@ -28,7 +27,7 @@ protected NodeInfo
info() { } @Override - protected BinaryScalarFunction replaceChildren(Expression newLeft, Expression newRight) { + protected Div replaceChildren(Expression newLeft, Expression newRight) { return new Div(location(), newLeft, newRight); } diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/arithmetic/Mod.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/arithmetic/Mod.java similarity index 66% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/arithmetic/Mod.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/arithmetic/Mod.java index 7cdfa72a86c18..95485281acdc2 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/arithmetic/Mod.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/arithmetic/Mod.java @@ -3,19 +3,20 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression.function.scalar.arithmetic; +package org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic; import org.elasticsearch.xpack.sql.expression.Expression; -import org.elasticsearch.xpack.sql.expression.function.scalar.BinaryScalarFunction; -import org.elasticsearch.xpack.sql.expression.function.scalar.arithmetic.BinaryArithmeticProcessor.BinaryArithmeticOperation; +import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.BinaryArithmeticProcessor.BinaryArithmeticOperation; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; /** * Modulo * function ({@code a % b}). + * + * Note this operator is also registered as a function (needed for ODBC/SQL) purposes. */ -public class Mod extends ArithmeticFunction { +public class Mod extends ArithmeticOperation { public Mod(Location location, Expression left, Expression right) { super(location, left, right, BinaryArithmeticOperation.MOD); @@ -27,7 +28,7 @@ protected NodeInfo info() { } @Override - protected BinaryScalarFunction replaceChildren(Expression newLeft, Expression newRight) { + protected Mod replaceChildren(Expression newLeft, Expression newRight) { return new Mod(location(), newLeft, newRight); } } diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/arithmetic/Mul.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/arithmetic/Mul.java similarity index 65% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/arithmetic/Mul.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/arithmetic/Mul.java index 87d2574c26221..edfea25d5c0a3 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/arithmetic/Mul.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/arithmetic/Mul.java @@ -3,18 +3,17 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression.function.scalar.arithmetic; +package org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic; import org.elasticsearch.xpack.sql.expression.Expression; -import org.elasticsearch.xpack.sql.expression.function.scalar.BinaryScalarFunction; -import org.elasticsearch.xpack.sql.expression.function.scalar.arithmetic.BinaryArithmeticProcessor.BinaryArithmeticOperation; +import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.BinaryArithmeticProcessor.BinaryArithmeticOperation; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; /** * Multiplication function ({@code a * b}). */ -public class Mul extends ArithmeticFunction { +public class Mul extends ArithmeticOperation { public Mul(Location location, Expression left, Expression right) { super(location, left, right, BinaryArithmeticOperation.MUL); @@ -26,7 +25,7 @@ protected NodeInfo info() { } @Override - protected BinaryScalarFunction replaceChildren(Expression newLeft, Expression newRight) { + protected Mul replaceChildren(Expression newLeft, Expression newRight) { return new Mul(location(), newLeft, newRight); } } diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/arithmetic/Neg.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/arithmetic/Neg.java similarity index 58% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/arithmetic/Neg.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/arithmetic/Neg.java index 44cd51522b10c..c5758b787f0ff 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/arithmetic/Neg.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/arithmetic/Neg.java @@ -3,16 +3,16 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression.function.scalar.arithmetic; +package org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic; import org.elasticsearch.xpack.sql.expression.Expression; import org.elasticsearch.xpack.sql.expression.Expressions; import org.elasticsearch.xpack.sql.expression.NamedExpression; import org.elasticsearch.xpack.sql.expression.function.scalar.UnaryScalarFunction; -import org.elasticsearch.xpack.sql.expression.function.scalar.arithmetic.UnaryArithmeticProcessor.UnaryArithmeticOperation; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinition; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinitions; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.UnaryProcessorDefinition; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.UnaryPipe; +import org.elasticsearch.xpack.sql.expression.gen.script.ScriptWeaver; +import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.UnaryArithmeticProcessor.UnaryArithmeticOperation; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; import org.elasticsearch.xpack.sql.type.DataType; @@ -20,7 +20,8 @@ /** * Negation function (@{code -x}). */ -public class Neg extends UnaryScalarFunction { +public class Neg extends UnaryScalarFunction implements ScriptWeaver { + public Neg(Location location, Expression field) { super(location, field); } @@ -31,7 +32,7 @@ protected NodeInfo info() { } @Override - protected UnaryScalarFunction replaceChild(Expression newChild) { + protected Neg replaceChild(Expression newChild) { return new Neg(location(), newChild); } @@ -56,14 +57,12 @@ public String name() { } @Override - protected String formatScript(String template) { - // Painless supports negating (and hopefully its corner cases) - return super.formatScript("-" + template); + public String processScript(String template) { + return super.processScript("-" + template); } @Override - protected ProcessorDefinition makeProcessorDefinition() { - return new UnaryProcessorDefinition(location(), this, ProcessorDefinitions.toProcessorDefinition(field()), - new UnaryArithmeticProcessor(UnaryArithmeticOperation.NEGATE)); + protected Pipe makePipe() { + return new UnaryPipe(location(), this, Expressions.pipe(field()), new UnaryArithmeticProcessor(UnaryArithmeticOperation.NEGATE)); } } diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/arithmetic/Sub.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/arithmetic/Sub.java similarity index 65% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/arithmetic/Sub.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/arithmetic/Sub.java index bd36a8dd8430f..25c66572d204c 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/arithmetic/Sub.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/arithmetic/Sub.java @@ -3,18 +3,17 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression.function.scalar.arithmetic; +package org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic; import org.elasticsearch.xpack.sql.expression.Expression; -import org.elasticsearch.xpack.sql.expression.function.scalar.BinaryScalarFunction; -import org.elasticsearch.xpack.sql.expression.function.scalar.arithmetic.BinaryArithmeticProcessor.BinaryArithmeticOperation; +import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.BinaryArithmeticProcessor.BinaryArithmeticOperation; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; /** * Subtraction function ({@code a - b}). */ -public class Sub extends ArithmeticFunction { +public class Sub extends ArithmeticOperation { public Sub(Location location, Expression left, Expression right) { super(location, left, right, BinaryArithmeticOperation.SUB); @@ -26,7 +25,7 @@ protected NodeInfo info() { } @Override - protected BinaryScalarFunction replaceChildren(Expression newLeft, Expression newRight) { + protected Sub replaceChildren(Expression newLeft, Expression newRight) { return new Sub(location(), newLeft, newRight); } } diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/arithmetic/UnaryArithmeticProcessor.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/arithmetic/UnaryArithmeticProcessor.java similarity index 92% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/arithmetic/UnaryArithmeticProcessor.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/arithmetic/UnaryArithmeticProcessor.java index d0da0f9e719ed..e75ca47b7f453 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/arithmetic/UnaryArithmeticProcessor.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/arithmetic/UnaryArithmeticProcessor.java @@ -3,12 +3,12 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression.function.scalar.arithmetic; +package org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.xpack.sql.SqlIllegalArgumentException; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.Processor; +import org.elasticsearch.xpack.sql.expression.gen.processor.Processor; import java.io.IOException; import java.util.function.Function; diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/comparison/BinaryComparison.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/comparison/BinaryComparison.java new file mode 100644 index 0000000000000..2ebfd57a4d29a --- /dev/null +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/comparison/BinaryComparison.java @@ -0,0 +1,80 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +package org.elasticsearch.xpack.sql.expression.predicate.operator.comparison; + +import org.elasticsearch.xpack.sql.expression.Expression; +import org.elasticsearch.xpack.sql.expression.Expressions; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; +import org.elasticsearch.xpack.sql.expression.gen.script.ScriptTemplate; +import org.elasticsearch.xpack.sql.expression.predicate.BinaryOperator; +import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.BinaryComparisonProcessor.BinaryComparisonOperation; +import org.elasticsearch.xpack.sql.tree.Location; +import org.elasticsearch.xpack.sql.type.DataType; + +import java.util.Locale; + +import static java.lang.String.format; +import static org.elasticsearch.xpack.sql.expression.gen.script.ParamsBuilder.paramsBuilder; + +// marker class to indicate operations that rely on values +public abstract class BinaryComparison extends BinaryOperator { + + private final BinaryComparisonOperation operation; + + public BinaryComparison(Location location, Expression left, Expression right, BinaryComparisonOperation operation) { + super(location, left, right, operation.symbol()); + this.operation = operation; + } + + @Override + protected TypeResolution resolveInputType(DataType inputType) { + return TypeResolution.TYPE_RESOLVED; + } + + @Override + protected ScriptTemplate asScriptFrom(ScriptTemplate leftScript, ScriptTemplate rightScript) { + String op = operation.symbol(); + return new ScriptTemplate(format(Locale.ROOT, "(%s) %s (%s)", leftScript.template(), op, rightScript.template()), + paramsBuilder() + .script(leftScript.params()).script(rightScript.params()) + .build(), dataType()); + } + + @Override + protected Pipe makePipe() { + return new BinaryComparisonPipe(location(), this, Expressions.pipe(left()), Expressions.pipe(right()), operation); + } + + @Override + public Object fold() { + return operation.apply(left().fold(), right().fold()); + } + + @Override + protected Expression canonicalize() { + return left().hashCode() > right().hashCode() ? swapLeftAndRight() : this; + } + + @Override + public DataType dataType() { + return DataType.BOOLEAN; + } + + public static Integer compare(Object left, Object right) { + return Comparisons.compare(left, right); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(left()); + sb.append(" "); + sb.append(symbol()); + sb.append(" "); + sb.append(right()); + return sb.toString(); + } +} diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/comparison/BinaryComparisonPipe.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/comparison/BinaryComparisonPipe.java new file mode 100644 index 0000000000000..a7ca4a2dea343 --- /dev/null +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/comparison/BinaryComparisonPipe.java @@ -0,0 +1,55 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +package org.elasticsearch.xpack.sql.expression.predicate.operator.comparison; + +import org.elasticsearch.xpack.sql.expression.Expression; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.BinaryPipe; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; +import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.BinaryComparisonProcessor.BinaryComparisonOperation; +import org.elasticsearch.xpack.sql.tree.Location; +import org.elasticsearch.xpack.sql.tree.NodeInfo; + +import java.util.Objects; + +public class BinaryComparisonPipe extends BinaryPipe { + + private final BinaryComparisonOperation operation; + + public BinaryComparisonPipe(Location location, Expression expression, Pipe left, + Pipe right, BinaryComparisonOperation operation) { + super(location, expression, left, right); + this.operation = operation; + } + + @Override + protected NodeInfo info() { + return NodeInfo.create(this, BinaryComparisonPipe::new, expression(), left(), right(), operation); + } + + @Override + protected BinaryPipe replaceChildren(Pipe left, Pipe right) { + return new BinaryComparisonPipe(location(), expression(), left, right, operation); + } + + @Override + public BinaryComparisonProcessor asProcessor() { + return new BinaryComparisonProcessor(left().asProcessor(), right().asProcessor(), operation); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), operation); + } + + @Override + public boolean equals(Object obj) { + if (super.equals(obj)) { + BinaryComparisonPipe other = (BinaryComparisonPipe) obj; + return Objects.equals(operation, other.operation); + } + return false; + } +} diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/comparison/BinaryComparisonProcessor.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/comparison/BinaryComparisonProcessor.java new file mode 100644 index 0000000000000..25856f914039c --- /dev/null +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/comparison/BinaryComparisonProcessor.java @@ -0,0 +1,68 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +package org.elasticsearch.xpack.sql.expression.predicate.operator.comparison; + +import org.elasticsearch.common.io.stream.StreamInput; +import org.elasticsearch.common.io.stream.StreamOutput; +import org.elasticsearch.xpack.sql.expression.gen.processor.Processor; +import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.BinaryComparisonProcessor.BinaryComparisonOperation; + +import java.io.IOException; +import java.util.function.BiFunction; + +public class BinaryComparisonProcessor extends BinaryOperatorProcessor { + + public enum BinaryComparisonOperation implements BiFunction { + + EQ(Comparisons::eq, "=="), + GT(Comparisons::gt, ">"), + GTE(Comparisons::gte, ">="), + LT(Comparisons::lt, "<"), + LTE(Comparisons::lte, "<="); + + private final BiFunction process; + private final String symbol; + + BinaryComparisonOperation(BiFunction process, String symbol) { + this.process = process; + this.symbol = symbol; + } + + public String symbol() { + return symbol; + } + + @Override + public final Boolean apply(Object left, Object right) { + return process.apply(left, right); + } + + @Override + public String toString() { + return symbol; + } + } + + public static final String NAME = "cb"; + + public BinaryComparisonProcessor(Processor left, Processor right, BinaryComparisonOperation operation) { + super(left, right, operation); + } + + public BinaryComparisonProcessor(StreamInput in) throws IOException { + super(in, i -> i.readEnum(BinaryComparisonOperation.class)); + } + + @Override + protected void doWrite(StreamOutput out) throws IOException { + out.writeEnum(operation()); + } + + @Override + public String getWriteableName() { + return NAME; + } +} \ No newline at end of file diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/comparison/BinaryOperatorProcessor.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/comparison/BinaryOperatorProcessor.java new file mode 100644 index 0000000000000..621154eb8d0ec --- /dev/null +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/comparison/BinaryOperatorProcessor.java @@ -0,0 +1,76 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +package org.elasticsearch.xpack.sql.expression.predicate.operator.comparison; + +import org.elasticsearch.common.io.stream.StreamInput; +import org.elasticsearch.xpack.sql.expression.gen.processor.BinaryProcessor; +import org.elasticsearch.xpack.sql.expression.gen.processor.Processor; + +import java.io.IOException; +import java.util.Locale; +import java.util.Objects; +import java.util.function.BiFunction; + +public abstract class BinaryOperatorProcessor & BiFunction> extends BinaryProcessor { + + private final O operation; + + protected BinaryOperatorProcessor(Processor left, Processor right, O operation) { + super(left, right); + this.operation = operation; + } + + protected BinaryOperatorProcessor(StreamInput in, Reader reader) throws IOException { + super(in); + operation = reader.read(in); + } + + protected O operation() { + return operation; + } + + @Override + protected Object doProcess(Object left, Object right) { + if (left == null || right == null) { + return null; + } + + checkParameter(left); + checkParameter(right); + + return operation.apply(left, right); + } + + protected void checkParameter(Object param) { + //no-op + } + + @Override + public int hashCode() { + return Objects.hash(operation); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + + if (obj == null || getClass() != obj.getClass()) { + return false; + } + + BinaryOperatorProcessor other = (BinaryOperatorProcessor) obj; + return Objects.equals(operation, other.operation) + && Objects.equals(left(), other.left()) + && Objects.equals(right(), other.right()); + } + + @Override + public String toString() { + return String.format(Locale.ROOT, "(%s %s %s)", left(), operation, right()); + } +} \ No newline at end of file diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/BinaryComparison.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/comparison/Comparisons.java similarity index 61% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/BinaryComparison.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/comparison/Comparisons.java index db1ba1d3cdf19..cdd293cb1afb1 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/BinaryComparison.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/comparison/Comparisons.java @@ -3,33 +3,36 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression.predicate; +package org.elasticsearch.xpack.sql.expression.predicate.operator.comparison; -import org.elasticsearch.xpack.sql.expression.BinaryOperator; -import org.elasticsearch.xpack.sql.expression.Expression; -import org.elasticsearch.xpack.sql.tree.Location; -import org.elasticsearch.xpack.sql.type.DataType; +/** + * Comparison utilities. + */ +abstract class Comparisons { -// marker class to indicate operations that rely on values -public abstract class BinaryComparison extends BinaryOperator { + static Boolean eq(Object l, Object r) { + Integer i = compare(l, r); + return i == null ? null : i.intValue() == 0; + } - public BinaryComparison(Location location, Expression left, Expression right) { - super(location, left, right); + static Boolean lt(Object l, Object r) { + Integer i = compare(l, r); + return i == null ? null : i.intValue() < 0; } - @Override - protected TypeResolution resolveInputType(DataType inputType) { - return TypeResolution.TYPE_RESOLVED; + static Boolean lte(Object l, Object r) { + Integer i = compare(l, r); + return i == null ? null : i.intValue() <= 0; } - @Override - protected Expression canonicalize() { - return left().hashCode() > right().hashCode() ? swapLeftAndRight() : this; + static Boolean gt(Object l, Object r) { + Integer i = compare(l, r); + return i == null ? null : i.intValue() > 0; } - @Override - public DataType dataType() { - return DataType.BOOLEAN; + static Boolean gte(Object l, Object r) { + Integer i = compare(l, r); + return i == null ? null : i.intValue() >= 0; } /** @@ -38,7 +41,7 @@ public DataType dataType() { * one of them is null). */ @SuppressWarnings({ "rawtypes", "unchecked" }) - public static Integer compare(Object l, Object r) { + static Integer compare(Object l, Object r) { // typical number comparison if (l instanceof Number && r instanceof Number) { return compare((Number) l, (Number) r); @@ -57,7 +60,7 @@ public static Integer compare(Object l, Object r) { return null; } - static Integer compare(Number l, Number r) { + private static Integer compare(Number l, Number r) { if (l instanceof Double || r instanceof Double) { return Double.compare(l.doubleValue(), r.doubleValue()); } @@ -70,4 +73,4 @@ static Integer compare(Number l, Number r) { return Integer.valueOf(Integer.compare(l.intValue(), r.intValue())); } -} +} \ No newline at end of file diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/Equals.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/comparison/Equals.java similarity index 75% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/Equals.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/comparison/Equals.java index a5b3272d7cc63..15dbacafc4add 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/Equals.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/comparison/Equals.java @@ -3,18 +3,17 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression.predicate; +package org.elasticsearch.xpack.sql.expression.predicate.operator.comparison; import org.elasticsearch.xpack.sql.expression.Expression; +import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.BinaryComparisonProcessor.BinaryComparisonOperation; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; -import java.util.Objects; - public class Equals extends BinaryComparison { public Equals(Location location, Expression left, Expression right) { - super(location, left, right); + super(location, left, right, BinaryComparisonOperation.EQ); } @Override @@ -27,18 +26,8 @@ protected Equals replaceChildren(Expression newLeft, Expression newRight) { return new Equals(location(), newLeft, newRight); } - @Override - public Object fold() { - return Objects.equals(left().fold(), right().fold()); - } - @Override public Equals swapLeftAndRight() { return new Equals(location(), right(), left()); } - - @Override - public String symbol() { - return "=="; - } } diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/GreaterThan.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/comparison/GreaterThan.java similarity index 73% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/GreaterThan.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/comparison/GreaterThan.java index 5fecc7c4f63e0..f643d873a1fa3 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/GreaterThan.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/comparison/GreaterThan.java @@ -3,9 +3,10 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression.predicate; +package org.elasticsearch.xpack.sql.expression.predicate.operator.comparison; -import org.elasticsearch.xpack.sql.expression.BinaryOperator.Negateable; +import org.elasticsearch.xpack.sql.expression.predicate.BinaryOperator.Negateable; +import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.BinaryComparisonProcessor.BinaryComparisonOperation; import org.elasticsearch.xpack.sql.expression.Expression; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; @@ -13,7 +14,7 @@ public class GreaterThan extends BinaryComparison implements Negateable { public GreaterThan(Location location, Expression left, Expression right) { - super(location, left, right); + super(location, left, right, BinaryComparisonOperation.GT); } @Override @@ -26,11 +27,6 @@ protected GreaterThan replaceChildren(Expression newLeft, Expression newRight) { return new GreaterThan(location(), newLeft, newRight); } - public Object fold() { - Integer compare = compare(left().fold(), right().fold()); - return compare != null && compare.intValue() > 0; - } - @Override public LessThan swapLeftAndRight() { return new LessThan(location(), right(), left()); @@ -40,9 +36,4 @@ public LessThan swapLeftAndRight() { public LessThanOrEqual negate() { return new LessThanOrEqual(location(), left(), right()); } - - @Override - public String symbol() { - return ">"; - } } diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/GreaterThanOrEqual.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/comparison/GreaterThanOrEqual.java similarity index 74% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/GreaterThanOrEqual.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/comparison/GreaterThanOrEqual.java index 837cfa1df9349..f91457216df2e 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/GreaterThanOrEqual.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/comparison/GreaterThanOrEqual.java @@ -3,9 +3,10 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression.predicate; +package org.elasticsearch.xpack.sql.expression.predicate.operator.comparison; -import org.elasticsearch.xpack.sql.expression.BinaryOperator.Negateable; +import org.elasticsearch.xpack.sql.expression.predicate.BinaryOperator.Negateable; +import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.BinaryComparisonProcessor.BinaryComparisonOperation; import org.elasticsearch.xpack.sql.expression.Expression; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; @@ -13,7 +14,7 @@ public class GreaterThanOrEqual extends BinaryComparison implements Negateable { public GreaterThanOrEqual(Location location, Expression left, Expression right) { - super(location, left, right); + super(location, left, right, BinaryComparisonOperation.GTE); } @Override @@ -26,11 +27,6 @@ protected GreaterThanOrEqual replaceChildren(Expression newLeft, Expression newR return new GreaterThanOrEqual(location(), newLeft, newRight); } - public Object fold() { - Integer compare = compare(left().fold(), right().fold()); - return compare != null && compare.intValue() >= 0; - } - @Override public LessThanOrEqual swapLeftAndRight() { return new LessThanOrEqual(location(), right(), left()); @@ -40,9 +36,4 @@ public LessThanOrEqual swapLeftAndRight() { public LessThan negate() { return new LessThan(location(), left(), right()); } - - @Override - public String symbol() { - return ">="; - } } diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/LessThan.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/comparison/LessThan.java similarity index 73% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/LessThan.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/comparison/LessThan.java index 151614b45dd84..5f7d8ffbda891 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/LessThan.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/comparison/LessThan.java @@ -3,9 +3,10 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression.predicate; +package org.elasticsearch.xpack.sql.expression.predicate.operator.comparison; -import org.elasticsearch.xpack.sql.expression.BinaryOperator.Negateable; +import org.elasticsearch.xpack.sql.expression.predicate.BinaryOperator.Negateable; +import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.BinaryComparisonProcessor.BinaryComparisonOperation; import org.elasticsearch.xpack.sql.expression.Expression; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; @@ -13,7 +14,7 @@ public class LessThan extends BinaryComparison implements Negateable { public LessThan(Location location, Expression left, Expression right) { - super(location, left, right); + super(location, left, right, BinaryComparisonOperation.LT); } @Override @@ -26,11 +27,6 @@ protected LessThan replaceChildren(Expression newLeft, Expression newRight) { return new LessThan(location(), newLeft, newRight); } - public Object fold() { - Integer compare = compare(left().fold(), right().fold()); - return compare != null && compare.intValue() < 0; - } - @Override public GreaterThan swapLeftAndRight() { return new GreaterThan(location(), right(), left()); @@ -40,9 +36,4 @@ public GreaterThan swapLeftAndRight() { public GreaterThanOrEqual negate() { return new GreaterThanOrEqual(location(), left(), right()); } - - @Override - public String symbol() { - return "<"; - } } diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/LessThanOrEqual.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/comparison/LessThanOrEqual.java similarity index 73% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/LessThanOrEqual.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/comparison/LessThanOrEqual.java index 3f5a1252691db..489cd52a4c606 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/LessThanOrEqual.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/comparison/LessThanOrEqual.java @@ -3,9 +3,10 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression.predicate; +package org.elasticsearch.xpack.sql.expression.predicate.operator.comparison; -import org.elasticsearch.xpack.sql.expression.BinaryOperator.Negateable; +import org.elasticsearch.xpack.sql.expression.predicate.BinaryOperator.Negateable; +import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.BinaryComparisonProcessor.BinaryComparisonOperation; import org.elasticsearch.xpack.sql.expression.Expression; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; @@ -13,7 +14,7 @@ public class LessThanOrEqual extends BinaryComparison implements Negateable { public LessThanOrEqual(Location location, Expression left, Expression right) { - super(location, left, right); + super(location, left, right, BinaryComparisonOperation.LTE); } @Override @@ -26,12 +27,6 @@ protected LessThanOrEqual replaceChildren(Expression newLeft, Expression newRigh return new LessThanOrEqual(location(), newLeft, newRight); } - @Override - public Object fold() { - Integer compare = compare(left().fold(), right().fold()); - return compare != null && compare.intValue() <= 0; - } - @Override public GreaterThanOrEqual swapLeftAndRight() { return new GreaterThanOrEqual(location(), right(), left()); @@ -41,9 +36,4 @@ public GreaterThanOrEqual swapLeftAndRight() { public GreaterThan negate() { return new GreaterThan(location(), left(), right()); } - - @Override - public String symbol() { - return "<="; - } } diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/regex/Like.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/regex/Like.java similarity index 62% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/regex/Like.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/regex/Like.java index 3716b92591139..9804214a28ac0 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/regex/Like.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/regex/Like.java @@ -3,20 +3,23 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression.regex; +package org.elasticsearch.xpack.sql.expression.predicate.regex; -import org.elasticsearch.xpack.sql.expression.BinaryExpression; +import org.elasticsearch.xpack.sql.SqlIllegalArgumentException; import org.elasticsearch.xpack.sql.expression.Expression; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; +import org.elasticsearch.xpack.sql.expression.gen.script.ScriptTemplate; +import org.elasticsearch.xpack.sql.expression.predicate.BinaryPredicate; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; import org.elasticsearch.xpack.sql.type.DataType; import java.util.regex.Pattern; -public class Like extends BinaryExpression { +public class Like extends BinaryPredicate { public Like(Location location, Expression left, LikePattern right) { - super(location, left, right); + super(location, left, right, "LIKE"); } @Override @@ -25,10 +28,11 @@ protected NodeInfo info() { } @Override - protected BinaryExpression replaceChildren(Expression newLeft, Expression newRight) { + protected BinaryPredicate replaceChildren(Expression newLeft, Expression newRight) { return new Like(location(), newLeft, (LikePattern) newRight); } + @Override public LikePattern right() { return (LikePattern) super.right(); } @@ -46,17 +50,17 @@ public Object fold() { } @Override - public Like swapLeftAndRight() { - return this; + public DataType dataType() { + return DataType.BOOLEAN; } @Override - public DataType dataType() { - return DataType.BOOLEAN; + protected ScriptTemplate asScriptFrom(ScriptTemplate leftScript, ScriptTemplate rightScript) { + throw new SqlIllegalArgumentException("Not supported yet"); } @Override - public String symbol() { - return "LIKE"; + protected Pipe makePipe() { + throw new SqlIllegalArgumentException("Not supported yet"); } } diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/regex/LikePattern.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/regex/LikePattern.java similarity index 97% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/regex/LikePattern.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/regex/LikePattern.java index 45f2fc0bd54ad..bde8129f8e72a 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/regex/LikePattern.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/regex/LikePattern.java @@ -3,7 +3,7 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression.regex; +package org.elasticsearch.xpack.sql.expression.predicate.regex; import org.elasticsearch.xpack.sql.expression.LeafExpression; import org.elasticsearch.xpack.sql.tree.Location; @@ -103,4 +103,4 @@ public boolean equals(Object obj) { return Objects.equals(pattern, other.pattern) && escape == other.escape; } -} +} \ No newline at end of file diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/regex/RLike.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/regex/RLike.java similarity index 60% rename from x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/regex/RLike.java rename to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/regex/RLike.java index 8d48c4d532e9b..f445b49cf31c9 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/regex/RLike.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/regex/RLike.java @@ -3,21 +3,24 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression.regex; +package org.elasticsearch.xpack.sql.expression.predicate.regex; -import org.elasticsearch.xpack.sql.expression.BinaryExpression; +import org.elasticsearch.xpack.sql.SqlIllegalArgumentException; import org.elasticsearch.xpack.sql.expression.Expression; import org.elasticsearch.xpack.sql.expression.Literal; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; +import org.elasticsearch.xpack.sql.expression.gen.script.ScriptTemplate; +import org.elasticsearch.xpack.sql.expression.predicate.BinaryPredicate; import org.elasticsearch.xpack.sql.tree.Location; import org.elasticsearch.xpack.sql.tree.NodeInfo; import org.elasticsearch.xpack.sql.type.DataType; import java.util.regex.Pattern; -public class RLike extends BinaryExpression { +public class RLike extends BinaryPredicate { public RLike(Location location, Expression left, Literal right) { - super(location, left, right); + super(location, left, right, "RLIKE"); } @Override @@ -26,10 +29,11 @@ protected NodeInfo info() { } @Override - protected BinaryExpression replaceChildren(Expression newLeft, Expression newRight) { + protected BinaryPredicate replaceChildren(Expression newLeft, Expression newRight) { return new RLike(location(), newLeft, (Literal) newRight); } + @Override public Literal right() { return (Literal) super.right(); } @@ -41,17 +45,17 @@ public Object fold() { } @Override - public RLike swapLeftAndRight() { - return this; + public DataType dataType() { + return DataType.BOOLEAN; } @Override - public DataType dataType() { - return DataType.BOOLEAN; + protected ScriptTemplate asScriptFrom(ScriptTemplate leftScript, ScriptTemplate rightScript) { + throw new SqlIllegalArgumentException("Not supported yet"); } @Override - public String symbol() { - return "RLIKE"; + protected Pipe makePipe() { + throw new SqlIllegalArgumentException("Not supported yet"); } } diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/optimizer/Optimizer.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/optimizer/Optimizer.java index 72105a2fae897..deb4ccb7da27f 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/optimizer/Optimizer.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/optimizer/Optimizer.java @@ -10,8 +10,6 @@ import org.elasticsearch.xpack.sql.expression.Attribute; import org.elasticsearch.xpack.sql.expression.AttributeMap; import org.elasticsearch.xpack.sql.expression.AttributeSet; -import org.elasticsearch.xpack.sql.expression.BinaryExpression; -import org.elasticsearch.xpack.sql.expression.BinaryOperator.Negateable; import org.elasticsearch.xpack.sql.expression.Expression; import org.elasticsearch.xpack.sql.expression.ExpressionId; import org.elasticsearch.xpack.sql.expression.ExpressionSet; @@ -39,16 +37,19 @@ import org.elasticsearch.xpack.sql.expression.function.scalar.ScalarFunction; import org.elasticsearch.xpack.sql.expression.function.scalar.ScalarFunctionAttribute; import org.elasticsearch.xpack.sql.expression.predicate.And; -import org.elasticsearch.xpack.sql.expression.predicate.BinaryComparison; -import org.elasticsearch.xpack.sql.expression.predicate.Equals; -import org.elasticsearch.xpack.sql.expression.predicate.GreaterThan; -import org.elasticsearch.xpack.sql.expression.predicate.GreaterThanOrEqual; -import org.elasticsearch.xpack.sql.expression.predicate.LessThan; -import org.elasticsearch.xpack.sql.expression.predicate.LessThanOrEqual; +import org.elasticsearch.xpack.sql.expression.predicate.BinaryOperator; +import org.elasticsearch.xpack.sql.expression.predicate.BinaryOperator.Negateable; +import org.elasticsearch.xpack.sql.expression.predicate.BinaryPredicate; import org.elasticsearch.xpack.sql.expression.predicate.Not; import org.elasticsearch.xpack.sql.expression.predicate.Or; import org.elasticsearch.xpack.sql.expression.predicate.Predicates; import org.elasticsearch.xpack.sql.expression.predicate.Range; +import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.BinaryComparison; +import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.Equals; +import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.GreaterThan; +import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.GreaterThanOrEqual; +import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.LessThan; +import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.LessThanOrEqual; import org.elasticsearch.xpack.sql.plan.logical.Aggregate; import org.elasticsearch.xpack.sql.plan.logical.Filter; import org.elasticsearch.xpack.sql.plan.logical.Limit; @@ -1135,8 +1136,8 @@ static class BooleanSimplification extends OptimizerExpressionRule { @Override protected Expression rule(Expression e) { - if (e instanceof BinaryExpression) { - return simplifyAndOr((BinaryExpression) e); + if (e instanceof BinaryPredicate) { + return simplifyAndOr((BinaryPredicate) e); } if (e instanceof Not) { return simplifyNot((Not) e); @@ -1145,7 +1146,7 @@ protected Expression rule(Expression e) { return e; } - private Expression simplifyAndOr(BinaryExpression bc) { + private Expression simplifyAndOr(BinaryPredicate bc) { Expression l = bc.left(); Expression r = bc.right(); @@ -1229,12 +1230,12 @@ private Expression simplifyAndOr(BinaryExpression bc) { } private Expression simplifyNot(Not n) { - Expression c = n.child(); + Expression c = n.field(); - if (TRUE.equals(c)) { + if (TRUE.semanticEquals(c)) { return FALSE; } - if (FALSE.equals(c)) { + if (FALSE.semanticEquals(c)) { return TRUE; } @@ -1243,7 +1244,7 @@ private Expression simplifyNot(Not n) { } if (c instanceof Not) { - return ((Not) c).child(); + return ((Not) c).field(); } return n; @@ -1291,10 +1292,10 @@ static class BooleanLiteralsOnTheRight extends OptimizerExpressionRule { @Override protected Expression rule(Expression e) { - return e instanceof BinaryExpression ? literalToTheRight((BinaryExpression) e) : e; + return e instanceof BinaryOperator ? literalToTheRight((BinaryOperator) e) : e; } - private Expression literalToTheRight(BinaryExpression be) { + private Expression literalToTheRight(BinaryOperator be) { return be.left() instanceof Literal && !(be.right() instanceof Literal) ? be.swapLeftAndRight() : be; } } diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/ExpressionBuilder.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/ExpressionBuilder.java index 22fdfd391c6a3..15ec3b01bd8f5 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/ExpressionBuilder.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/ExpressionBuilder.java @@ -23,29 +23,29 @@ import org.elasticsearch.xpack.sql.expression.function.Function; import org.elasticsearch.xpack.sql.expression.function.UnresolvedFunction; import org.elasticsearch.xpack.sql.expression.function.scalar.Cast; -import org.elasticsearch.xpack.sql.expression.function.scalar.arithmetic.Add; -import org.elasticsearch.xpack.sql.expression.function.scalar.arithmetic.Div; -import org.elasticsearch.xpack.sql.expression.function.scalar.arithmetic.Mod; -import org.elasticsearch.xpack.sql.expression.function.scalar.arithmetic.Mul; -import org.elasticsearch.xpack.sql.expression.function.scalar.arithmetic.Neg; -import org.elasticsearch.xpack.sql.expression.function.scalar.arithmetic.Sub; import org.elasticsearch.xpack.sql.expression.predicate.And; -import org.elasticsearch.xpack.sql.expression.predicate.Equals; -import org.elasticsearch.xpack.sql.expression.predicate.GreaterThan; -import org.elasticsearch.xpack.sql.expression.predicate.GreaterThanOrEqual; import org.elasticsearch.xpack.sql.expression.predicate.In; import org.elasticsearch.xpack.sql.expression.predicate.IsNotNull; -import org.elasticsearch.xpack.sql.expression.predicate.LessThan; -import org.elasticsearch.xpack.sql.expression.predicate.LessThanOrEqual; import org.elasticsearch.xpack.sql.expression.predicate.Not; import org.elasticsearch.xpack.sql.expression.predicate.Or; import org.elasticsearch.xpack.sql.expression.predicate.Range; import org.elasticsearch.xpack.sql.expression.predicate.fulltext.MatchQueryPredicate; import org.elasticsearch.xpack.sql.expression.predicate.fulltext.MultiMatchQueryPredicate; import org.elasticsearch.xpack.sql.expression.predicate.fulltext.StringQueryPredicate; -import org.elasticsearch.xpack.sql.expression.regex.Like; -import org.elasticsearch.xpack.sql.expression.regex.LikePattern; -import org.elasticsearch.xpack.sql.expression.regex.RLike; +import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.Add; +import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.Div; +import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.Mod; +import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.Mul; +import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.Neg; +import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.Sub; +import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.Equals; +import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.GreaterThan; +import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.GreaterThanOrEqual; +import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.LessThan; +import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.LessThanOrEqual; +import org.elasticsearch.xpack.sql.expression.predicate.regex.Like; +import org.elasticsearch.xpack.sql.expression.predicate.regex.LikePattern; +import org.elasticsearch.xpack.sql.expression.predicate.regex.RLike; import org.elasticsearch.xpack.sql.parser.SqlBaseParser.ArithmeticBinaryContext; import org.elasticsearch.xpack.sql.parser.SqlBaseParser.ArithmeticUnaryContext; import org.elasticsearch.xpack.sql.parser.SqlBaseParser.BooleanLiteralContext; diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/plan/logical/command/ShowColumns.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/plan/logical/command/ShowColumns.java index e2197d42608ee..aa2e784de3d28 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/plan/logical/command/ShowColumns.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/plan/logical/command/ShowColumns.java @@ -8,7 +8,7 @@ import org.elasticsearch.action.ActionListener; import org.elasticsearch.xpack.sql.expression.Attribute; import org.elasticsearch.xpack.sql.expression.FieldAttribute; -import org.elasticsearch.xpack.sql.expression.regex.LikePattern; +import org.elasticsearch.xpack.sql.expression.predicate.regex.LikePattern; import org.elasticsearch.xpack.sql.session.Rows; import org.elasticsearch.xpack.sql.session.SchemaRowSet; import org.elasticsearch.xpack.sql.session.SqlSession; diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/plan/logical/command/ShowFunctions.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/plan/logical/command/ShowFunctions.java index 9fdbab46eb894..c71d492fafff4 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/plan/logical/command/ShowFunctions.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/plan/logical/command/ShowFunctions.java @@ -10,7 +10,7 @@ import org.elasticsearch.xpack.sql.expression.FieldAttribute; import org.elasticsearch.xpack.sql.expression.function.FunctionDefinition; import org.elasticsearch.xpack.sql.expression.function.FunctionRegistry; -import org.elasticsearch.xpack.sql.expression.regex.LikePattern; +import org.elasticsearch.xpack.sql.expression.predicate.regex.LikePattern; import org.elasticsearch.xpack.sql.session.Rows; import org.elasticsearch.xpack.sql.session.SchemaRowSet; import org.elasticsearch.xpack.sql.session.SqlSession; diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/plan/logical/command/ShowTables.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/plan/logical/command/ShowTables.java index 0735f870545fb..7f6c0c355e37d 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/plan/logical/command/ShowTables.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/plan/logical/command/ShowTables.java @@ -7,7 +7,7 @@ import org.elasticsearch.action.ActionListener; import org.elasticsearch.xpack.sql.expression.Attribute; -import org.elasticsearch.xpack.sql.expression.regex.LikePattern; +import org.elasticsearch.xpack.sql.expression.predicate.regex.LikePattern; import org.elasticsearch.xpack.sql.session.Rows; import org.elasticsearch.xpack.sql.session.SchemaRowSet; import org.elasticsearch.xpack.sql.session.SqlSession; diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/plan/logical/command/sys/SysColumns.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/plan/logical/command/sys/SysColumns.java index 6337108b54bdb..40475f4fe57e6 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/plan/logical/command/sys/SysColumns.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/plan/logical/command/sys/SysColumns.java @@ -9,7 +9,7 @@ import org.elasticsearch.common.Strings; import org.elasticsearch.xpack.sql.analysis.index.EsIndex; import org.elasticsearch.xpack.sql.expression.Attribute; -import org.elasticsearch.xpack.sql.expression.regex.LikePattern; +import org.elasticsearch.xpack.sql.expression.predicate.regex.LikePattern; import org.elasticsearch.xpack.sql.plan.logical.command.Command; import org.elasticsearch.xpack.sql.session.Rows; import org.elasticsearch.xpack.sql.session.SchemaRowSet; diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/plan/logical/command/sys/SysTables.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/plan/logical/command/sys/SysTables.java index 69d0ad506486c..58b739cc00fbf 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/plan/logical/command/sys/SysTables.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/plan/logical/command/sys/SysTables.java @@ -9,7 +9,7 @@ import org.elasticsearch.xpack.sql.analysis.index.IndexResolver.IndexInfo; import org.elasticsearch.xpack.sql.analysis.index.IndexResolver.IndexType; import org.elasticsearch.xpack.sql.expression.Attribute; -import org.elasticsearch.xpack.sql.expression.regex.LikePattern; +import org.elasticsearch.xpack.sql.expression.predicate.regex.LikePattern; import org.elasticsearch.xpack.sql.plan.logical.command.Command; import org.elasticsearch.xpack.sql.session.Rows; import org.elasticsearch.xpack.sql.session.SchemaRowSet; diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/planner/QueryFolder.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/planner/QueryFolder.java index 2a31d69743190..8c81301933085 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/planner/QueryFolder.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/planner/QueryFolder.java @@ -25,11 +25,10 @@ import org.elasticsearch.xpack.sql.expression.function.scalar.ScalarFunctionAttribute; import org.elasticsearch.xpack.sql.expression.function.scalar.datetime.DateTimeFunction; import org.elasticsearch.xpack.sql.expression.function.scalar.datetime.DateTimeHistogramFunction; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.AggPathInput; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinition; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinitions; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.UnaryProcessorDefinition; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.Processor; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.AggPathInput; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.UnaryPipe; +import org.elasticsearch.xpack.sql.expression.gen.processor.Processor; import org.elasticsearch.xpack.sql.plan.physical.AggregateExec; import org.elasticsearch.xpack.sql.plan.physical.EsQueryExec; import org.elasticsearch.xpack.sql.plan.physical.FilterExec; @@ -112,7 +111,7 @@ protected PhysicalPlan rule(ProjectExec project) { QueryContainer queryC = exec.queryContainer(); Map aliases = new LinkedHashMap<>(queryC.aliases()); - Map processors = new LinkedHashMap<>(queryC.scalarFunctions()); + Map processors = new LinkedHashMap<>(queryC.scalarFunctions()); for (NamedExpression pj : project.projections()) { if (pj instanceof Alias) { @@ -124,10 +123,10 @@ protected PhysicalPlan rule(ProjectExec project) { aliases.put(aliasAttr, attr); // add placeholder for each scalar function if (e instanceof ScalarFunction) { - processors.put(attr, ProcessorDefinitions.toProcessorDefinition(e)); + processors.put(attr, Expressions.pipe(e)); } } else { - processors.put(aliasAttr, ProcessorDefinitions.toProcessorDefinition(e)); + processors.put(aliasAttr, Expressions.pipe(e)); } } else { @@ -137,7 +136,7 @@ protected PhysicalPlan rule(ProjectExec project) { if (pj instanceof ScalarFunction) { ScalarFunction f = (ScalarFunction) pj; - processors.put(f.toAttribute(), f.asProcessorDefinition()); + processors.put(f.toAttribute(), Expressions.pipe(f)); } } } @@ -249,7 +248,7 @@ protected PhysicalPlan rule(AggregateExec a) { // ) if (child instanceof ScalarFunction) { ScalarFunction f = (ScalarFunction) child; - ProcessorDefinition proc = f.asProcessorDefinition(); + Pipe proc = f.asPipe(); final AtomicReference qC = new AtomicReference<>(queryC); @@ -288,7 +287,7 @@ protected PhysicalPlan rule(AggregateExec a) { * as it already got access to the extraction action */ if (exp instanceof DateTimeHistogramFunction) { - action = ((UnaryProcessorDefinition) p).action(); + action = ((UnaryPipe) p).action(); tz = ((DateTimeFunction) exp).timeZone(); } return new AggPathInput(exp.location(), exp, new GroupByRef(matchingGroup.id(), null, tz), action); diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/planner/QueryTranslator.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/planner/QueryTranslator.java index e691aef8d3e61..12b68ceee3336 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/planner/QueryTranslator.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/planner/QueryTranslator.java @@ -7,7 +7,6 @@ import org.elasticsearch.xpack.sql.SqlIllegalArgumentException; import org.elasticsearch.xpack.sql.expression.Attribute; -import org.elasticsearch.xpack.sql.expression.BinaryExpression; import org.elasticsearch.xpack.sql.expression.Expression; import org.elasticsearch.xpack.sql.expression.ExpressionId; import org.elasticsearch.xpack.sql.expression.Expressions; @@ -18,7 +17,6 @@ import org.elasticsearch.xpack.sql.expression.function.Function; import org.elasticsearch.xpack.sql.expression.function.Functions; import org.elasticsearch.xpack.sql.expression.function.aggregate.AggregateFunction; -import org.elasticsearch.xpack.sql.expression.function.aggregate.AggregateFunctionAttribute; import org.elasticsearch.xpack.sql.expression.function.aggregate.Avg; import org.elasticsearch.xpack.sql.expression.function.aggregate.CompoundNumericAggregate; import org.elasticsearch.xpack.sql.expression.function.aggregate.Count; @@ -31,28 +29,27 @@ import org.elasticsearch.xpack.sql.expression.function.aggregate.Stats; import org.elasticsearch.xpack.sql.expression.function.aggregate.Sum; import org.elasticsearch.xpack.sql.expression.function.scalar.ScalarFunction; -import org.elasticsearch.xpack.sql.expression.function.scalar.ScalarFunctionAttribute; import org.elasticsearch.xpack.sql.expression.function.scalar.datetime.DateTimeFunction; import org.elasticsearch.xpack.sql.expression.function.scalar.datetime.DateTimeHistogramFunction; -import org.elasticsearch.xpack.sql.expression.function.scalar.script.Params; -import org.elasticsearch.xpack.sql.expression.function.scalar.script.ScriptTemplate; +import org.elasticsearch.xpack.sql.expression.gen.script.ScriptTemplate; import org.elasticsearch.xpack.sql.expression.predicate.And; -import org.elasticsearch.xpack.sql.expression.predicate.BinaryComparison; -import org.elasticsearch.xpack.sql.expression.predicate.Equals; -import org.elasticsearch.xpack.sql.expression.predicate.GreaterThan; -import org.elasticsearch.xpack.sql.expression.predicate.GreaterThanOrEqual; +import org.elasticsearch.xpack.sql.expression.predicate.BinaryPredicate; import org.elasticsearch.xpack.sql.expression.predicate.IsNotNull; -import org.elasticsearch.xpack.sql.expression.predicate.LessThan; -import org.elasticsearch.xpack.sql.expression.predicate.LessThanOrEqual; import org.elasticsearch.xpack.sql.expression.predicate.Not; import org.elasticsearch.xpack.sql.expression.predicate.Or; import org.elasticsearch.xpack.sql.expression.predicate.Range; import org.elasticsearch.xpack.sql.expression.predicate.fulltext.MatchQueryPredicate; import org.elasticsearch.xpack.sql.expression.predicate.fulltext.MultiMatchQueryPredicate; import org.elasticsearch.xpack.sql.expression.predicate.fulltext.StringQueryPredicate; -import org.elasticsearch.xpack.sql.expression.regex.Like; -import org.elasticsearch.xpack.sql.expression.regex.LikePattern; -import org.elasticsearch.xpack.sql.expression.regex.RLike; +import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.BinaryComparison; +import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.Equals; +import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.GreaterThan; +import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.GreaterThanOrEqual; +import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.LessThan; +import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.LessThanOrEqual; +import org.elasticsearch.xpack.sql.expression.predicate.regex.Like; +import org.elasticsearch.xpack.sql.expression.predicate.regex.LikePattern; +import org.elasticsearch.xpack.sql.expression.predicate.regex.RLike; import org.elasticsearch.xpack.sql.querydsl.agg.AggFilter; import org.elasticsearch.xpack.sql.querydsl.agg.AndAggFilter; import org.elasticsearch.xpack.sql.querydsl.agg.AvgAgg; @@ -85,24 +82,19 @@ import org.elasticsearch.xpack.sql.querydsl.query.TermQuery; import org.elasticsearch.xpack.sql.querydsl.query.WildcardQuery; import org.elasticsearch.xpack.sql.tree.Location; -import org.elasticsearch.xpack.sql.type.DataType; import org.elasticsearch.xpack.sql.util.Check; import org.elasticsearch.xpack.sql.util.ReflectionUtils; import java.util.Arrays; import java.util.LinkedHashMap; import java.util.List; -import java.util.Locale; import java.util.Map; import java.util.Map.Entry; -import static java.lang.String.format; import static java.util.Collections.singletonList; import static org.elasticsearch.xpack.sql.expression.Foldables.doubleValuesOf; import static org.elasticsearch.xpack.sql.expression.Foldables.stringValueOf; import static org.elasticsearch.xpack.sql.expression.Foldables.valueOf; -import static org.elasticsearch.xpack.sql.expression.function.scalar.script.ParamsBuilder.paramsBuilder; -import static org.elasticsearch.xpack.sql.expression.function.scalar.script.ScriptTemplate.formatTemplate; abstract class QueryTranslator { @@ -402,10 +394,10 @@ static String field(AggregateFunction af) { // TODO: need to optimize on ngram // TODO: see whether escaping is needed - static class Likes extends ExpressionTranslator { + static class Likes extends ExpressionTranslator { @Override - protected QueryTranslation asQuery(BinaryExpression e, boolean onAggs) { + protected QueryTranslation asQuery(BinaryPredicate e, boolean onAggs) { Query q = null; boolean inexact = true; String target = null; @@ -415,7 +407,7 @@ protected QueryTranslation asQuery(BinaryExpression e, boolean onAggs) { inexact = fa.isInexact(); target = nameOf(inexact ? fa : fa.exactAttribute()); } else { - throw new SqlIllegalArgumentException("Scalar function ({}) not allowed (yet) as arguments for LIKE", + throw new SqlIllegalArgumentException("Scalar function ({}) not allowed (yet) as arguments for LIKE", Expressions.name(e.left())); } @@ -467,10 +459,10 @@ protected QueryTranslation asQuery(MultiMatchQueryPredicate q, boolean onAggs) { } } - static class BinaryLogic extends ExpressionTranslator { + static class BinaryLogic extends ExpressionTranslator { @Override - protected QueryTranslation asQuery(BinaryExpression e, boolean onAggs) { + protected QueryTranslation asQuery(BinaryPredicate e, boolean onAggs) { if (e instanceof And) { return and(e.location(), toQuery(e.left(), onAggs), toQuery(e.right(), onAggs)); } @@ -486,7 +478,7 @@ static class Nots extends ExpressionTranslator { @Override protected QueryTranslation asQuery(Not not, boolean onAggs) { - QueryTranslation translation = toQuery(not.child(), onAggs); + QueryTranslation translation = toQuery(not.field(), onAggs); return new QueryTranslation(not(translation.query), translation.aggFilter); } } @@ -520,60 +512,26 @@ protected QueryTranslation asQuery(BinaryComparison bc, boolean onAggs) { AggFilter aggFilter = null; Attribute at = ne.toAttribute(); - - // scalar function can appear in both WHERE and HAVING so handle it first - // in both cases the function script is used - script-query/query for the former, bucket-selector/aggFilter for the latter - - if (at instanceof ScalarFunctionAttribute) { - ScalarFunctionAttribute sfa = (ScalarFunctionAttribute) at; - ScriptTemplate scriptTemplate = sfa.script(); - - String template = formatTemplate(format(Locale.ROOT, "%s %s {}", scriptTemplate.template(), bc.symbol())); - // no need to bind the wrapped/target agg - it is already available through the nested script - // (needed to create the script itself) - Params params = paramsBuilder().script(scriptTemplate.params()).variable(valueOf(bc.right())).build(); - ScriptTemplate script = new ScriptTemplate(template, params, DataType.BOOLEAN); - if (onAggs) { - aggFilter = new AggFilter(at.id().toString(), script); - } - else { - query = new ScriptQuery(at.location(), script); - } - } - // // Agg context means HAVING -> PipelineAggs // - else if (onAggs) { - String template = null; - Params params = null; - - // agg function - if (at instanceof AggregateFunctionAttribute) { - AggregateFunctionAttribute fa = (AggregateFunctionAttribute) at; - - // TODO: handle case where both sides of the comparison are functions - template = formatTemplate(format(Locale.ROOT, "{} %s {}", bc.symbol())); - - // bind the agg and the variable to the script - params = paramsBuilder().agg(fa).variable(valueOf(bc.right())).build(); - } - - aggFilter = new AggFilter(at.id().toString(), new ScriptTemplate(template, params, DataType.BOOLEAN)); + ScriptTemplate script = bc.asScript(); + if (onAggs) { + aggFilter = new AggFilter(at.id().toString(), script); } - - // - // No Agg context means WHERE clause - // else { + // query directly on the field if (at instanceof FieldAttribute) { query = wrapIfNested(translateQuery(bc), ne); + } else { + query = new ScriptQuery(at.location(), script); } } - return new QueryTranslation(query, aggFilter); } - + // + // if the code gets here it's a bug + // else { throw new UnsupportedOperationException("No idea how to translate " + bc.left()); } @@ -618,92 +576,34 @@ static class Ranges extends ExpressionTranslator { @Override protected QueryTranslation asQuery(Range r, boolean onAggs) { - Object lower = valueOf(r.lower()); - Object upper = valueOf(r.upper()); - Expression e = r.value(); - - + if (e instanceof NamedExpression) { - NamedExpression ne = (NamedExpression) e; - Query query = null; AggFilter aggFilter = null; - Attribute at = ne.toAttribute(); - - // scalar function can appear in both WHERE and HAVING so handle it first - // in both cases the function script is used - script-query/query for the former, bucket-selector/aggFilter - // for the latter - - if (at instanceof ScalarFunctionAttribute) { - ScalarFunctionAttribute sfa = (ScalarFunctionAttribute) at; - ScriptTemplate scriptTemplate = sfa.script(); - - String template = formatTemplate(format(Locale.ROOT, "({} %s %s) && (%s %s {})", - r.includeLower() ? "<=" : "<", - scriptTemplate.template(), - scriptTemplate.template(), - r.includeUpper() ? "<=" : "<")); - - // no need to bind the wrapped/target - it is already available through the nested script (needed to - // create the script itself) - Params params = paramsBuilder().variable(lower) - .script(scriptTemplate.params()) - .script(scriptTemplate.params()) - .variable(upper) - .build(); - - ScriptTemplate script = new ScriptTemplate(template, params, DataType.BOOLEAN); - - if (onAggs) { - aggFilter = new AggFilter(at.id().toString(), script); - } - else { - query = new ScriptQuery(at.location(), script); - } - } - // - // HAVING + // Agg context means HAVING -> PipelineAggs // - else if (onAggs) { - String template = null; - Params params = null; - - // agg function - if (at instanceof AggregateFunctionAttribute) { - AggregateFunctionAttribute fa = (AggregateFunctionAttribute) at; - - template = formatTemplate(format(Locale.ROOT, "{} %s {} && {} %s {}", - r.includeLower() ? "<=" : "<", - r.includeUpper() ? "<=" : "<")); + ScriptTemplate script = r.asScript(); + Attribute at = ((NamedExpression) e).toAttribute(); - params = paramsBuilder().variable(lower) - .agg(fa) - .agg(fa) - .variable(upper) - .build(); - - } - aggFilter = new AggFilter(((NamedExpression) r.value()).id().toString(), - new ScriptTemplate(template, params, DataType.BOOLEAN)); - } - // - // WHERE - // - else { - // typical range + if (onAggs) { + aggFilter = new AggFilter(at.id().toString(), script); + } else { + // typical range; no scripting involved if (at instanceof FieldAttribute) { - RangeQuery rangeQuery = new RangeQuery(r.location(), nameOf(r.value()), - valueOf(r.lower()), r.includeLower(), valueOf(r.upper()), r.includeUpper(), dateFormat(r.value())); + RangeQuery rangeQuery = new RangeQuery(r.location(), nameOf(r.value()), valueOf(r.lower()), r.includeLower(), + valueOf(r.upper()), r.includeUpper(), dateFormat(r.value())); query = wrapIfNested(rangeQuery, r.value()); } + // scripted query + else { + query = new ScriptQuery(at.location(), script); + } } - return new QueryTranslation(query, aggFilter); - } - else { + } else { throw new SqlIllegalArgumentException("No idea how to translate " + e); } } diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/querydsl/agg/AggFilter.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/querydsl/agg/AggFilter.java index 1b466c7852f16..38f7f81946dd7 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/querydsl/agg/AggFilter.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/querydsl/agg/AggFilter.java @@ -11,7 +11,7 @@ import org.elasticsearch.script.Script; import org.elasticsearch.search.aggregations.PipelineAggregationBuilder; -import org.elasticsearch.xpack.sql.expression.function.scalar.script.ScriptTemplate; +import org.elasticsearch.xpack.sql.expression.gen.script.ScriptTemplate; import org.elasticsearch.xpack.sql.util.Check; import static org.elasticsearch.search.aggregations.pipeline.PipelineAggregatorBuilders.bucketSelector; diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/querydsl/agg/AndAggFilter.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/querydsl/agg/AndAggFilter.java index 424b957db7acc..c2c980c856818 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/querydsl/agg/AndAggFilter.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/querydsl/agg/AndAggFilter.java @@ -5,9 +5,9 @@ */ package org.elasticsearch.xpack.sql.querydsl.agg; -import org.elasticsearch.xpack.sql.expression.function.scalar.script.Params; -import org.elasticsearch.xpack.sql.expression.function.scalar.script.ParamsBuilder; -import org.elasticsearch.xpack.sql.expression.function.scalar.script.ScriptTemplate; +import org.elasticsearch.xpack.sql.expression.gen.script.Params; +import org.elasticsearch.xpack.sql.expression.gen.script.ParamsBuilder; +import org.elasticsearch.xpack.sql.expression.gen.script.ScriptTemplate; import org.elasticsearch.xpack.sql.type.DataType; import java.util.Locale; diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/querydsl/agg/GroupByScriptKey.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/querydsl/agg/GroupByScriptKey.java index 0953517d5f9cc..99bd4e27671bf 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/querydsl/agg/GroupByScriptKey.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/querydsl/agg/GroupByScriptKey.java @@ -7,7 +7,7 @@ import org.elasticsearch.search.aggregations.bucket.composite.TermsValuesSourceBuilder; import org.elasticsearch.search.aggregations.support.ValueType; -import org.elasticsearch.xpack.sql.expression.function.scalar.script.ScriptTemplate; +import org.elasticsearch.xpack.sql.expression.gen.script.ScriptTemplate; import org.elasticsearch.xpack.sql.querydsl.container.Sort.Direction; import java.util.Objects; diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/querydsl/agg/OrAggFilter.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/querydsl/agg/OrAggFilter.java index 42500b9c60680..120f0a5848c7f 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/querydsl/agg/OrAggFilter.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/querydsl/agg/OrAggFilter.java @@ -5,9 +5,9 @@ */ package org.elasticsearch.xpack.sql.querydsl.agg; -import org.elasticsearch.xpack.sql.expression.function.scalar.script.Params; -import org.elasticsearch.xpack.sql.expression.function.scalar.script.ParamsBuilder; -import org.elasticsearch.xpack.sql.expression.function.scalar.script.ScriptTemplate; +import org.elasticsearch.xpack.sql.expression.gen.script.Params; +import org.elasticsearch.xpack.sql.expression.gen.script.ParamsBuilder; +import org.elasticsearch.xpack.sql.expression.gen.script.ScriptTemplate; import org.elasticsearch.xpack.sql.type.DataType; import java.util.Locale; diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/querydsl/container/ComputedRef.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/querydsl/container/ComputedRef.java index 8d1a55cfdd17b..e1aa6032c0501 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/querydsl/container/ComputedRef.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/querydsl/container/ComputedRef.java @@ -7,17 +7,17 @@ import org.elasticsearch.xpack.sql.execution.search.FieldExtraction; import org.elasticsearch.xpack.sql.execution.search.SqlSourceBuilder; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinition; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; public class ComputedRef implements FieldExtraction { - private final ProcessorDefinition processor; + private final Pipe processor; - public ComputedRef(ProcessorDefinition processor) { + public ComputedRef(Pipe processor) { this.processor = processor; } - public ProcessorDefinition processor() { + public Pipe processor() { return processor; } diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/querydsl/container/QueryContainer.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/querydsl/container/QueryContainer.java index 9f9c1bb21bb31..9048df4201793 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/querydsl/container/QueryContainer.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/querydsl/container/QueryContainer.java @@ -19,8 +19,7 @@ import org.elasticsearch.xpack.sql.expression.LiteralAttribute; import org.elasticsearch.xpack.sql.expression.function.ScoreAttribute; import org.elasticsearch.xpack.sql.expression.function.scalar.ScalarFunctionAttribute; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinition; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ScoreProcessorDefinition; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; import org.elasticsearch.xpack.sql.querydsl.agg.Aggs; import org.elasticsearch.xpack.sql.querydsl.agg.GroupByKey; import org.elasticsearch.xpack.sql.querydsl.agg.LeafAgg; @@ -64,7 +63,7 @@ public class QueryContainer { // scalar function processors - recorded as functions get folded; // at scrolling, their inputs (leaves) get updated - private final Map scalarFunctions; + private final Map scalarFunctions; private final Set sort; private final int limit; @@ -78,7 +77,7 @@ public QueryContainer() { public QueryContainer(Query query, Aggs aggs, List refs, Map aliases, Map pseudoFunctions, - Map scalarFunctions, + Map scalarFunctions, Set sort, int limit) { this.query = query; this.aggs = aggs == null ? new Aggs() : aggs; @@ -155,7 +154,7 @@ public QueryContainer withLimit(int l) { return l == limit ? this : new QueryContainer(query, aggs, columns, aliases, pseudoFunctions, scalarFunctions, sort, l); } - public QueryContainer withScalarProcessors(Map procs) { + public QueryContainer withScalarProcessors(Map procs) { return new QueryContainer(query, aggs, columns, aliases, pseudoFunctions, procs, sort, limit); } @@ -215,22 +214,22 @@ static Query rewriteToContainNestedField(@Nullable Query query, Location locatio return new BoolQuery(location, true, query, nested); } - // replace function's input with references - private Tuple computingRef(ScalarFunctionAttribute sfa) { - Attribute name = aliases.getOrDefault(sfa, sfa); - ProcessorDefinition proc = scalarFunctions.get(name); + // replace function/operators's input with references + private Tuple resolvedTreeComputingRef(ScalarFunctionAttribute ta) { + Attribute attribute = aliases.getOrDefault(ta, ta); + Pipe proc = scalarFunctions.get(attribute); // check the attribute itself if (proc == null) { - if (name instanceof ScalarFunctionAttribute) { - sfa = (ScalarFunctionAttribute) name; + if (attribute instanceof ScalarFunctionAttribute) { + ta = (ScalarFunctionAttribute) attribute; } - proc = sfa.processorDef(); + proc = ta.asPipe(); } // find the processor inputs (Attributes) and convert them into references // no need to promote them to the top since the container doesn't have to be aware - class QueryAttributeResolver implements ProcessorDefinition.AttributeResolver { + class QueryAttributeResolver implements Pipe.AttributeResolver { private QueryContainer container; private QueryAttributeResolver(QueryContainer container) { @@ -250,8 +249,8 @@ public FieldExtraction resolve(Attribute attribute) { QueryContainer qContainer = resolver.container; // update proc - Map procs = new LinkedHashMap<>(qContainer.scalarFunctions()); - procs.put(name, proc); + Map procs = new LinkedHashMap<>(qContainer.scalarFunctions()); + procs.put(attribute, proc); qContainer = qContainer.withScalarProcessors(procs); return new Tuple<>(qContainer, new ComputedRef(proc)); } @@ -271,13 +270,13 @@ private Tuple toReference(Attribute attr) { } } if (attr instanceof ScalarFunctionAttribute) { - return computingRef((ScalarFunctionAttribute) attr); + return resolvedTreeComputingRef((ScalarFunctionAttribute) attr); } if (attr instanceof LiteralAttribute) { - return new Tuple<>(this, new ComputedRef(((LiteralAttribute) attr).asProcessorDefinition())); + return new Tuple<>(this, new ComputedRef(((LiteralAttribute) attr).asPipe())); } if (attr instanceof ScoreAttribute) { - return new Tuple<>(this, new ComputedRef(new ScoreProcessorDefinition(attr.location(), attr))); + return new Tuple<>(this, new ComputedRef(((ScoreAttribute) attr).asPipe())); } throw new SqlIllegalArgumentException("Unknown output attribute {}", attr); @@ -287,7 +286,7 @@ public QueryContainer addColumn(FieldExtraction ref) { return with(combine(columns, ref)); } - public Map scalarFunctions() { + public Map scalarFunctions() { return scalarFunctions; } diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/querydsl/container/ScriptFieldRef.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/querydsl/container/ScriptFieldRef.java index 02767bdea9e7a..c89b986a4f2bf 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/querydsl/container/ScriptFieldRef.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/querydsl/container/ScriptFieldRef.java @@ -6,7 +6,7 @@ package org.elasticsearch.xpack.sql.querydsl.container; import org.elasticsearch.xpack.sql.execution.search.SqlSourceBuilder; -import org.elasticsearch.xpack.sql.expression.function.scalar.script.ScriptTemplate; +import org.elasticsearch.xpack.sql.expression.gen.script.ScriptTemplate; public class ScriptFieldRef extends FieldReference { diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/querydsl/container/ScriptSort.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/querydsl/container/ScriptSort.java index 62c3750f638e8..b7d7da7a9d0da 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/querydsl/container/ScriptSort.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/querydsl/container/ScriptSort.java @@ -5,9 +5,9 @@ */ package org.elasticsearch.xpack.sql.querydsl.container; -import java.util.Objects; +import org.elasticsearch.xpack.sql.expression.gen.script.ScriptTemplate; -import org.elasticsearch.xpack.sql.expression.function.scalar.script.ScriptTemplate; +import java.util.Objects; public class ScriptSort extends Sort { diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/querydsl/query/ScriptQuery.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/querydsl/query/ScriptQuery.java index b918fd71a5850..7c93f7cc95c43 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/querydsl/query/ScriptQuery.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/querydsl/query/ScriptQuery.java @@ -8,7 +8,7 @@ import java.util.Objects; import org.elasticsearch.index.query.QueryBuilder; -import org.elasticsearch.xpack.sql.expression.function.scalar.script.ScriptTemplate; +import org.elasticsearch.xpack.sql.expression.gen.script.ScriptTemplate; import org.elasticsearch.xpack.sql.tree.Location; import static org.elasticsearch.index.query.QueryBuilders.scriptQuery; diff --git a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/execution/search/extractor/ComputingExtractorTests.java b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/execution/search/extractor/ComputingExtractorTests.java index 375de112fe878..c628b090df2a6 100644 --- a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/execution/search/extractor/ComputingExtractorTests.java +++ b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/execution/search/extractor/ComputingExtractorTests.java @@ -16,10 +16,10 @@ import org.elasticsearch.xpack.sql.expression.function.scalar.math.MathFunctionProcessorTests; import org.elasticsearch.xpack.sql.expression.function.scalar.math.MathProcessor; import org.elasticsearch.xpack.sql.expression.function.scalar.math.MathProcessor.MathOperation; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.ChainingProcessor; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.ChainingProcessorTests; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.HitExtractorProcessor; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.Processor; +import org.elasticsearch.xpack.sql.expression.gen.processor.ChainingProcessor; +import org.elasticsearch.xpack.sql.expression.gen.processor.ChainingProcessorTests; +import org.elasticsearch.xpack.sql.expression.gen.processor.HitExtractorProcessor; +import org.elasticsearch.xpack.sql.expression.gen.processor.Processor; import java.io.IOException; import java.util.ArrayList; diff --git a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/ParameterTests.java b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/ParameterTests.java index 37ab5fb2b6ce3..33185df465e31 100644 --- a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/ParameterTests.java +++ b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/ParameterTests.java @@ -6,10 +6,10 @@ package org.elasticsearch.xpack.sql.expression; import org.elasticsearch.test.ESTestCase; -import org.elasticsearch.xpack.sql.expression.function.scalar.arithmetic.Add; -import org.elasticsearch.xpack.sql.expression.function.scalar.arithmetic.Mul; -import org.elasticsearch.xpack.sql.expression.function.scalar.arithmetic.Sub; -import org.elasticsearch.xpack.sql.expression.predicate.Equals; +import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.Add; +import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.Mul; +import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.Sub; +import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.Equals; import org.elasticsearch.xpack.sql.parser.ParsingException; import org.elasticsearch.xpack.sql.parser.SqlParser; import org.elasticsearch.xpack.sql.proto.SqlTypedParamValue; diff --git a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/FunctionRegistryTests.java b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/FunctionRegistryTests.java index 12581e9577cb9..bef75e3dc3225 100644 --- a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/FunctionRegistryTests.java +++ b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/FunctionRegistryTests.java @@ -12,8 +12,8 @@ import org.elasticsearch.xpack.sql.type.DataType; import org.elasticsearch.xpack.sql.expression.Expression; import org.elasticsearch.xpack.sql.expression.function.scalar.ScalarFunction; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinition; -import org.elasticsearch.xpack.sql.expression.function.scalar.script.ScriptTemplate; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; +import org.elasticsearch.xpack.sql.expression.gen.script.ScriptTemplate; import org.elasticsearch.xpack.sql.parser.ParsingException; import java.util.Arrays; import java.util.List; @@ -186,7 +186,7 @@ public ScriptTemplate asScript() { } @Override - protected ProcessorDefinition makeProcessorDefinition() { + protected Pipe makePipe() { return null; } } diff --git a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/NamedExpressionTests.java b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/NamedExpressionTests.java index 3692e5e4752af..791eef8752c42 100644 --- a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/NamedExpressionTests.java +++ b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/NamedExpressionTests.java @@ -8,12 +8,12 @@ import org.elasticsearch.test.ESTestCase; import org.elasticsearch.xpack.sql.expression.FieldAttribute; import org.elasticsearch.xpack.sql.expression.Literal; -import org.elasticsearch.xpack.sql.expression.function.scalar.arithmetic.Add; -import org.elasticsearch.xpack.sql.expression.function.scalar.arithmetic.Div; -import org.elasticsearch.xpack.sql.expression.function.scalar.arithmetic.Mod; -import org.elasticsearch.xpack.sql.expression.function.scalar.arithmetic.Mul; -import org.elasticsearch.xpack.sql.expression.function.scalar.arithmetic.Neg; -import org.elasticsearch.xpack.sql.expression.function.scalar.arithmetic.Sub; +import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.Add; +import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.Div; +import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.Mod; +import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.Mul; +import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.Neg; +import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.Sub; import org.elasticsearch.xpack.sql.type.DataType; import org.elasticsearch.xpack.sql.type.EsField; @@ -24,19 +24,19 @@ public class NamedExpressionTests extends ESTestCase { public void testArithmeticFunctionName() { Add add = new Add(EMPTY, l(5), l(2)); - assertEquals("(5 + 2)", add.name()); + assertEquals("5 + 2", add.name()); Div div = new Div(EMPTY, l(5), l(2)); - assertEquals("(5 / 2)", div.name()); + assertEquals("5 / 2", div.name()); Mod mod = new Mod(EMPTY, l(5), l(2)); - assertEquals("(5 % 2)", mod.name()); + assertEquals("5 % 2", mod.name()); Mul mul = new Mul(EMPTY, l(5), l(2)); - assertEquals("(5 * 2)", mul.name()); + assertEquals("5 * 2", mul.name()); Sub sub = new Sub(EMPTY, l(5), l(2)); - assertEquals("(5 - 2)", sub.name()); + assertEquals("5 - 2", sub.name()); Neg neg = new Neg(EMPTY, l(5)); assertEquals("-5", neg.name()); @@ -45,7 +45,7 @@ public void testArithmeticFunctionName() { public void testNameForArithmeticFunctionAppliedOnTableColumn() { FieldAttribute fa = new FieldAttribute(EMPTY, "myField", new EsField("myESField", DataType.INTEGER, emptyMap(), true)); Add add = new Add(EMPTY, fa, l(10)); - assertEquals("((myField) + 10)", add.name()); + assertEquals("(myField) + 10", add.name()); } private static Literal l(Object value) { diff --git a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/datetime/DayOfYearTests.java b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/datetime/DayOfYearTests.java index f866ee7292085..0bd54bd738239 100644 --- a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/datetime/DayOfYearTests.java +++ b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/datetime/DayOfYearTests.java @@ -27,7 +27,7 @@ private DateTime dateTime(long millisSinceEpoch) { } private Object extract(Object value, TimeZone timeZone) { - return build(value, timeZone).asProcessorDefinition().asProcessor().process(value); + return build(value, timeZone).asPipe().asProcessor().process(value); } private DayOfYear build(Object value, TimeZone timeZone) { diff --git a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/BinaryMathProcessorTests.java b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/BinaryMathProcessorTests.java index d42703987dfa4..84ca662bebac6 100644 --- a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/BinaryMathProcessorTests.java +++ b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/BinaryMathProcessorTests.java @@ -11,8 +11,8 @@ import org.elasticsearch.xpack.sql.SqlIllegalArgumentException; import org.elasticsearch.xpack.sql.expression.Literal; import org.elasticsearch.xpack.sql.expression.function.scalar.Processors; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.ConstantProcessor; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.Processor; +import org.elasticsearch.xpack.sql.expression.gen.processor.ConstantProcessor; +import org.elasticsearch.xpack.sql.expression.gen.processor.Processor; import static org.elasticsearch.xpack.sql.tree.Location.EMPTY; @@ -40,81 +40,81 @@ protected NamedWriteableRegistry getNamedWriteableRegistry() { } public void testAtan2() { - Processor ba = new ATan2(EMPTY, l(1), l(1)).makeProcessorDefinition().asProcessor(); + Processor ba = new ATan2(EMPTY, l(1), l(1)).makePipe().asProcessor(); assertEquals(0.7853981633974483d, ba.process(null)); } public void testPower() { - Processor ba = new Power(EMPTY, l(2), l(2)).makeProcessorDefinition().asProcessor(); + Processor ba = new Power(EMPTY, l(2), l(2)).makePipe().asProcessor(); assertEquals(4d, ba.process(null)); } public void testRoundWithValidInput() { - assertEquals(123.0, new Round(EMPTY, l(123), l(3)).makeProcessorDefinition().asProcessor().process(null)); - assertEquals(123.5, new Round(EMPTY, l(123.45), l(1)).makeProcessorDefinition().asProcessor().process(null)); - assertEquals(123.0, new Round(EMPTY, l(123.45), l(0)).makeProcessorDefinition().asProcessor().process(null)); - assertEquals(123.0, new Round(EMPTY, l(123.45), null).makeProcessorDefinition().asProcessor().process(null)); - assertEquals(-100.0, new Round(EMPTY, l(-123), l(-2)).makeProcessorDefinition().asProcessor().process(null)); - assertEquals(-120.0, new Round(EMPTY, l(-123.45), l(-1)).makeProcessorDefinition().asProcessor().process(null)); - assertEquals(-124.0, new Round(EMPTY, l(-123.5), l(0)).makeProcessorDefinition().asProcessor().process(null)); - assertEquals(-123.0, new Round(EMPTY, l(-123.45), null).makeProcessorDefinition().asProcessor().process(null)); + assertEquals(123.0, new Round(EMPTY, l(123), l(3)).makePipe().asProcessor().process(null)); + assertEquals(123.5, new Round(EMPTY, l(123.45), l(1)).makePipe().asProcessor().process(null)); + assertEquals(123.0, new Round(EMPTY, l(123.45), l(0)).makePipe().asProcessor().process(null)); + assertEquals(123.0, new Round(EMPTY, l(123.45), null).makePipe().asProcessor().process(null)); + assertEquals(-100.0, new Round(EMPTY, l(-123), l(-2)).makePipe().asProcessor().process(null)); + assertEquals(-120.0, new Round(EMPTY, l(-123.45), l(-1)).makePipe().asProcessor().process(null)); + assertEquals(-124.0, new Round(EMPTY, l(-123.5), l(0)).makePipe().asProcessor().process(null)); + assertEquals(-123.0, new Round(EMPTY, l(-123.45), null).makePipe().asProcessor().process(null)); } public void testRoundFunctionWithEdgeCasesInputs() { - assertNull(new Round(EMPTY, l(null), l(3)).makeProcessorDefinition().asProcessor().process(null)); - assertEquals(-0.0, new Round(EMPTY, l(0), l(0)).makeProcessorDefinition().asProcessor().process(null)); + assertNull(new Round(EMPTY, l(null), l(3)).makePipe().asProcessor().process(null)); + assertEquals(-0.0, new Round(EMPTY, l(0), l(0)).makePipe().asProcessor().process(null)); assertEquals((double) Long.MAX_VALUE, new Round(EMPTY, l(Long.MAX_VALUE), l(0)) - .makeProcessorDefinition().asProcessor().process(null)); - assertEquals(0.0, new Round(EMPTY, l(123.456), l(Integer.MAX_VALUE)).makeProcessorDefinition().asProcessor().process(null)); + .makePipe().asProcessor().process(null)); + assertEquals(0.0, new Round(EMPTY, l(123.456), l(Integer.MAX_VALUE)).makePipe().asProcessor().process(null)); } public void testRoundInputValidation() { SqlIllegalArgumentException siae = expectThrows(SqlIllegalArgumentException.class, - () -> new Round(EMPTY, l(5), l("foobarbar")).makeProcessorDefinition().asProcessor().process(null)); + () -> new Round(EMPTY, l(5), l("foobarbar")).makePipe().asProcessor().process(null)); assertEquals("A number is required; received foobarbar", siae.getMessage()); siae = expectThrows(SqlIllegalArgumentException.class, - () -> new Round(EMPTY, l("bla"), l(0)).makeProcessorDefinition().asProcessor().process(null)); + () -> new Round(EMPTY, l("bla"), l(0)).makePipe().asProcessor().process(null)); assertEquals("A number is required; received bla", siae.getMessage()); siae = expectThrows(SqlIllegalArgumentException.class, - () -> new Round(EMPTY, l(123.34), l(0.1)).makeProcessorDefinition().asProcessor().process(null)); + () -> new Round(EMPTY, l(123.34), l(0.1)).makePipe().asProcessor().process(null)); assertEquals("An integer number is required; received [0.1] as second parameter", siae.getMessage()); } public void testTruncateWithValidInput() { - assertEquals(123.0, new Truncate(EMPTY, l(123), l(3)).makeProcessorDefinition().asProcessor().process(null)); - assertEquals(123.4, new Truncate(EMPTY, l(123.45), l(1)).makeProcessorDefinition().asProcessor().process(null)); - assertEquals(123.0, new Truncate(EMPTY, l(123.45), l(0)).makeProcessorDefinition().asProcessor().process(null)); - assertEquals(123.0, new Truncate(EMPTY, l(123.45), null).makeProcessorDefinition().asProcessor().process(null)); - assertEquals(-100.0, new Truncate(EMPTY, l(-123), l(-2)).makeProcessorDefinition().asProcessor().process(null)); - assertEquals(-120.0, new Truncate(EMPTY, l(-123.45), l(-1)).makeProcessorDefinition().asProcessor().process(null)); - assertEquals(-123.0, new Truncate(EMPTY, l(-123.5), l(0)).makeProcessorDefinition().asProcessor().process(null)); - assertEquals(-123.0, new Truncate(EMPTY, l(-123.45), null).makeProcessorDefinition().asProcessor().process(null)); + assertEquals(123.0, new Truncate(EMPTY, l(123), l(3)).makePipe().asProcessor().process(null)); + assertEquals(123.4, new Truncate(EMPTY, l(123.45), l(1)).makePipe().asProcessor().process(null)); + assertEquals(123.0, new Truncate(EMPTY, l(123.45), l(0)).makePipe().asProcessor().process(null)); + assertEquals(123.0, new Truncate(EMPTY, l(123.45), null).makePipe().asProcessor().process(null)); + assertEquals(-100.0, new Truncate(EMPTY, l(-123), l(-2)).makePipe().asProcessor().process(null)); + assertEquals(-120.0, new Truncate(EMPTY, l(-123.45), l(-1)).makePipe().asProcessor().process(null)); + assertEquals(-123.0, new Truncate(EMPTY, l(-123.5), l(0)).makePipe().asProcessor().process(null)); + assertEquals(-123.0, new Truncate(EMPTY, l(-123.45), null).makePipe().asProcessor().process(null)); } public void testTruncateFunctionWithEdgeCasesInputs() { - assertNull(new Truncate(EMPTY, l(null), l(3)).makeProcessorDefinition().asProcessor().process(null)); - assertEquals(0.0, new Truncate(EMPTY, l(0), l(0)).makeProcessorDefinition().asProcessor().process(null)); + assertNull(new Truncate(EMPTY, l(null), l(3)).makePipe().asProcessor().process(null)); + assertEquals(0.0, new Truncate(EMPTY, l(0), l(0)).makePipe().asProcessor().process(null)); assertEquals((double) Long.MAX_VALUE, new Truncate(EMPTY, l(Long.MAX_VALUE), l(0)) - .makeProcessorDefinition().asProcessor().process(null)); + .makePipe().asProcessor().process(null)); assertEquals(Double.NaN, new Truncate(EMPTY, l(123.456), l(Integer.MAX_VALUE)) - .makeProcessorDefinition().asProcessor().process(null)); + .makePipe().asProcessor().process(null)); } public void testTruncateInputValidation() { SqlIllegalArgumentException siae = expectThrows(SqlIllegalArgumentException.class, - () -> new Truncate(EMPTY, l(5), l("foobarbar")).makeProcessorDefinition().asProcessor().process(null)); + () -> new Truncate(EMPTY, l(5), l("foobarbar")).makePipe().asProcessor().process(null)); assertEquals("A number is required; received foobarbar", siae.getMessage()); siae = expectThrows(SqlIllegalArgumentException.class, - () -> new Truncate(EMPTY, l("bla"), l(0)).makeProcessorDefinition().asProcessor().process(null)); + () -> new Truncate(EMPTY, l("bla"), l(0)).makePipe().asProcessor().process(null)); assertEquals("A number is required; received bla", siae.getMessage()); siae = expectThrows(SqlIllegalArgumentException.class, - () -> new Truncate(EMPTY, l(123.34), l(0.1)).makeProcessorDefinition().asProcessor().process(null)); + () -> new Truncate(EMPTY, l(123.34), l(0.1)).makePipe().asProcessor().process(null)); assertEquals("An integer number is required; received [0.1] as second parameter", siae.getMessage()); } public void testHandleNull() { - assertNull(new ATan2(EMPTY, l(null), l(3)).makeProcessorDefinition().asProcessor().process(null)); - assertNull(new Power(EMPTY, l(null), l(null)).makeProcessorDefinition().asProcessor().process(null)); + assertNull(new ATan2(EMPTY, l(null), l(3)).makePipe().asProcessor().process(null)); + assertNull(new Power(EMPTY, l(null), l(null)).makePipe().asProcessor().process(null)); } private static Literal l(Object value) { diff --git a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/BinaryProcessorDefinitionTests.java b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/BinaryProcessorDefinitionTests.java deleted file mode 100644 index 110c482916228..0000000000000 --- a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/BinaryProcessorDefinitionTests.java +++ /dev/null @@ -1,154 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -package org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition; - -import org.elasticsearch.search.builder.SearchSourceBuilder; -import org.elasticsearch.test.ESTestCase; -import org.elasticsearch.xpack.sql.execution.search.SqlSourceBuilder; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinition.AttributeResolver; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.Processor; -import org.elasticsearch.xpack.sql.tree.Location; -import org.elasticsearch.xpack.sql.tree.NodeInfo; - -import java.util.List; - -import static java.util.Collections.emptyList; - -public class BinaryProcessorDefinitionTests extends ESTestCase { - public void testSupportedByAggsOnlyQuery() { - ProcessorDefinition supported = new DummyProcessorDefinition(true); - ProcessorDefinition unsupported = new DummyProcessorDefinition(false); - - assertFalse(new DummyBinaryProcessorDefinition(unsupported, unsupported).supportedByAggsOnlyQuery()); - assertFalse(new DummyBinaryProcessorDefinition(unsupported, supported).supportedByAggsOnlyQuery()); - assertFalse(new DummyBinaryProcessorDefinition(supported, unsupported).supportedByAggsOnlyQuery()); - assertTrue(new DummyBinaryProcessorDefinition(supported, supported).supportedByAggsOnlyQuery()); - } - - public void testResolveAttributes() { - ProcessorDefinition needsNothing = new DummyProcessorDefinition(randomBoolean()); - ProcessorDefinition resolvesTo = new DummyProcessorDefinition(randomBoolean()); - ProcessorDefinition needsResolution = new DummyProcessorDefinition(randomBoolean()) { - @Override - public ProcessorDefinition resolveAttributes(AttributeResolver resolver) { - return resolvesTo; - } - }; - AttributeResolver resolver = a -> { - fail("not exepected"); - return null; - }; - - ProcessorDefinition d = new DummyBinaryProcessorDefinition(needsNothing, needsNothing); - assertSame(d, d.resolveAttributes(resolver)); - - d = new DummyBinaryProcessorDefinition(needsNothing, needsResolution); - ProcessorDefinition expected = new DummyBinaryProcessorDefinition(needsNothing, resolvesTo); - assertEquals(expected, d.resolveAttributes(resolver)); - - d = new DummyBinaryProcessorDefinition(needsResolution, needsNothing); - expected = new DummyBinaryProcessorDefinition(resolvesTo, needsNothing); - assertEquals(expected, d.resolveAttributes(resolver)); - } - - public void testCollectFields() { - DummyProcessorDefinition wantsScore = new DummyProcessorDefinition(randomBoolean()) { - @Override - public void collectFields(SqlSourceBuilder sourceBuilder) { - sourceBuilder.trackScores(); - } - }; - DummyProcessorDefinition wantsNothing = new DummyProcessorDefinition(randomBoolean()); - assertFalse(tracksScores(new DummyBinaryProcessorDefinition(wantsNothing, wantsNothing))); - assertTrue(tracksScores(new DummyBinaryProcessorDefinition(wantsScore, wantsNothing))); - assertTrue(tracksScores(new DummyBinaryProcessorDefinition(wantsNothing, wantsScore))); - } - - /** - * Returns {@code true} if the processor defintion builds a query that - * tracks scores, {@code false} otherwise. Used for testing - * {@link ProcessorDefinition#collectFields(SqlSourceBuilder)}. - */ - static boolean tracksScores(ProcessorDefinition d) { - SqlSourceBuilder b = new SqlSourceBuilder(); - d.collectFields(b); - SearchSourceBuilder source = new SearchSourceBuilder(); - b.build(source); - return source.trackScores(); - } - - public static final class DummyBinaryProcessorDefinition extends BinaryProcessorDefinition { - public DummyBinaryProcessorDefinition(ProcessorDefinition left, ProcessorDefinition right) { - this(Location.EMPTY, left, right); - } - - public DummyBinaryProcessorDefinition(Location location, ProcessorDefinition left, ProcessorDefinition right) { - super(location, null, left, right); - } - - @Override - protected NodeInfo info() { - return NodeInfo.create(this, DummyBinaryProcessorDefinition::new, left(), right()); - } - - @Override - public Processor asProcessor() { - return null; - } - - @Override - protected BinaryProcessorDefinition replaceChildren(ProcessorDefinition left, ProcessorDefinition right) { - return new DummyBinaryProcessorDefinition(location(), left, right); - } - } - - public static class DummyProcessorDefinition extends ProcessorDefinition { - private final boolean supportedByAggsOnlyQuery; - - public DummyProcessorDefinition(boolean supportedByAggsOnlyQuery) { - this(Location.EMPTY, supportedByAggsOnlyQuery); - } - - public DummyProcessorDefinition(Location location, boolean supportedByAggsOnlyQuery) { - super(location, null, emptyList()); - this.supportedByAggsOnlyQuery = supportedByAggsOnlyQuery; - } - - @Override - protected NodeInfo info() { - return NodeInfo.create(this, DummyProcessorDefinition::new, supportedByAggsOnlyQuery); - } - - @Override - public ProcessorDefinition replaceChildren(List newChildren) { - throw new UnsupportedOperationException("this type of node doesn't have any children to replace"); - } - - @Override - public boolean supportedByAggsOnlyQuery() { - return supportedByAggsOnlyQuery; - } - - @Override - public boolean resolved() { - return true; - } - - @Override - public Processor asProcessor() { - return null; - } - - @Override - public ProcessorDefinition resolveAttributes(AttributeResolver resolver) { - return this; - } - - @Override - public void collectFields(SqlSourceBuilder sourceBuilder) { - } - } -} \ No newline at end of file diff --git a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/UnaryProcessorDefinitionTests.java b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/UnaryProcessorDefinitionTests.java deleted file mode 100644 index 5a102403d30c1..0000000000000 --- a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/UnaryProcessorDefinitionTests.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -package org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition; - -import org.elasticsearch.test.ESTestCase; -import org.elasticsearch.xpack.sql.execution.search.SqlSourceBuilder; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.BinaryProcessorDefinitionTests.DummyProcessorDefinition; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinition.AttributeResolver; -import org.elasticsearch.xpack.sql.tree.Location; - -import static org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.BinaryProcessorDefinitionTests.tracksScores; - -public class UnaryProcessorDefinitionTests extends ESTestCase { - public void testSupportedByAggsOnlyQuery() { - ProcessorDefinition supported = new DummyProcessorDefinition(true); - ProcessorDefinition unsupported = new DummyProcessorDefinition(false); - - assertFalse(newUnaryProcessor(unsupported).supportedByAggsOnlyQuery()); - assertTrue(newUnaryProcessor(supported).supportedByAggsOnlyQuery()); - } - - public void testResolveAttributes() { - ProcessorDefinition needsNothing = new DummyProcessorDefinition(randomBoolean()); - ProcessorDefinition resolvesTo = new DummyProcessorDefinition(randomBoolean()); - ProcessorDefinition needsResolution = new DummyProcessorDefinition(randomBoolean()) { - @Override - public ProcessorDefinition resolveAttributes(AttributeResolver resolver) { - return resolvesTo; - } - }; - AttributeResolver resolver = a -> { - fail("not exepected"); - return null; - }; - - ProcessorDefinition d = newUnaryProcessor(needsNothing); - assertSame(d, d.resolveAttributes(resolver)); - - d = newUnaryProcessor(needsResolution); - ProcessorDefinition expected = newUnaryProcessor(resolvesTo); - assertEquals(expected, d.resolveAttributes(resolver)); - } - - public void testCollectFields() { - DummyProcessorDefinition wantsScore = new DummyProcessorDefinition(randomBoolean()) { - @Override - public void collectFields(SqlSourceBuilder sourceBuilder) { - sourceBuilder.trackScores(); - } - }; - DummyProcessorDefinition wantsNothing = new DummyProcessorDefinition(randomBoolean()); - assertFalse(tracksScores(newUnaryProcessor(wantsNothing))); - assertTrue(tracksScores(newUnaryProcessor(wantsScore))); - } - - private ProcessorDefinition newUnaryProcessor(ProcessorDefinition child) { - return new UnaryProcessorDefinition(Location.EMPTY, null, child, null); - } -} diff --git a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringNumericPipeTests.java b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringNumericPipeTests.java new file mode 100644 index 0000000000000..bed19063f0898 --- /dev/null +++ b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringNumericPipeTests.java @@ -0,0 +1,146 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +package org.elasticsearch.xpack.sql.expression.function.scalar.string; + +import org.elasticsearch.xpack.sql.expression.Expression; +import org.elasticsearch.xpack.sql.expression.function.scalar.string.BinaryStringNumericProcessor.BinaryStringNumericOperation; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.BinaryPipe; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; +import org.elasticsearch.xpack.sql.tree.AbstractNodeTestCase; +import org.elasticsearch.xpack.sql.tree.Location; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.function.Function; + +import static org.elasticsearch.xpack.sql.expression.Expressions.pipe; +import static org.elasticsearch.xpack.sql.expression.function.scalar.FunctionTestUtils.randomIntLiteral; +import static org.elasticsearch.xpack.sql.expression.function.scalar.FunctionTestUtils.randomStringLiteral; +import static org.elasticsearch.xpack.sql.tree.LocationTests.randomLocation; + +public class BinaryStringNumericPipeTests + extends AbstractNodeTestCase { + + @Override + protected BinaryStringNumericPipe randomInstance() { + return randomBinaryStringNumericPipe(); + } + + private Expression randomBinaryStringNumericExpression() { + return randomBinaryStringNumericPipe().expression(); + } + + private BinaryStringNumericOperation randomBinaryStringNumericOperation() { + return randomBinaryStringNumericPipe().operation(); + } + + public static BinaryStringNumericPipe randomBinaryStringNumericPipe() { + List functions = new ArrayList<>(); + functions.add(new Left(randomLocation(), randomStringLiteral(), randomIntLiteral()).makePipe()); + functions.add(new Right(randomLocation(), randomStringLiteral(), randomIntLiteral()).makePipe()); + functions.add(new Repeat(randomLocation(), randomStringLiteral(), randomIntLiteral()).makePipe()); + + return (BinaryStringNumericPipe) randomFrom(functions); + } + + @Override + public void testTransform() { + // test transforming only the properties (location, expression, operation), + // skipping the children (the two parameters of the binary function) which are tested separately + BinaryStringNumericPipe b1 = randomInstance(); + + Expression newExpression = randomValueOtherThan(b1.expression(), () -> randomBinaryStringNumericExpression()); + BinaryStringNumericPipe newB = new BinaryStringNumericPipe( + b1.location(), + newExpression, + b1.left(), + b1.right(), + b1.operation()); + assertEquals(newB, b1.transformPropertiesOnly(v -> Objects.equals(v, b1.expression()) ? newExpression : v, Expression.class)); + + BinaryStringNumericPipe b2 = randomInstance(); + BinaryStringNumericOperation newOp = randomValueOtherThan(b2.operation(), () -> randomBinaryStringNumericOperation()); + newB = new BinaryStringNumericPipe( + b2.location(), + b2.expression(), + b2.left(), + b2.right(), + newOp); + assertEquals(newB, + b2.transformPropertiesOnly(v -> Objects.equals(v, b2.operation()) ? newOp : v, BinaryStringNumericOperation.class)); + + BinaryStringNumericPipe b3 = randomInstance(); + Location newLoc = randomValueOtherThan(b3.location(), () -> randomLocation()); + newB = new BinaryStringNumericPipe( + newLoc, + b3.expression(), + b3.left(), + b3.right(), + b3.operation()); + assertEquals(newB, + b3.transformPropertiesOnly(v -> Objects.equals(v, b3.location()) ? newLoc : v, Location.class)); + } + + @Override + public void testReplaceChildren() { + BinaryStringNumericPipe b = randomInstance(); + Pipe newLeft = pipe(((Expression) randomValueOtherThan(b.left(), () -> randomStringLiteral()))); + Pipe newRight = pipe(((Expression) randomValueOtherThan(b.right(), () -> randomIntLiteral()))); + BinaryStringNumericPipe newB = + new BinaryStringNumericPipe(b.location(), b.expression(), b.left(), b.right(), b.operation()); + BinaryPipe transformed = newB.replaceChildren(newLeft, b.right()); + + assertEquals(transformed.left(), newLeft); + assertEquals(transformed.location(), b.location()); + assertEquals(transformed.expression(), b.expression()); + assertEquals(transformed.right(), b.right()); + + transformed = newB.replaceChildren(b.left(), newRight); + assertEquals(transformed.left(), b.left()); + assertEquals(transformed.location(), b.location()); + assertEquals(transformed.expression(), b.expression()); + assertEquals(transformed.right(), newRight); + + transformed = newB.replaceChildren(newLeft, newRight); + assertEquals(transformed.left(), newLeft); + assertEquals(transformed.location(), b.location()); + assertEquals(transformed.expression(), b.expression()); + assertEquals(transformed.right(), newRight); + } + + @Override + protected BinaryStringNumericPipe mutate(BinaryStringNumericPipe instance) { + List> randoms = new ArrayList<>(); + randoms.add(f -> new BinaryStringNumericPipe(f.location(), + f.expression(), + pipe(((Expression) randomValueOtherThan(f.left(), () -> randomStringLiteral()))), + f.right(), + f.operation())); + randoms.add(f -> new BinaryStringNumericPipe(f.location(), + f.expression(), + f.left(), + pipe(((Expression) randomValueOtherThan(f.right(), () -> randomIntLiteral()))), + f.operation())); + randoms.add(f -> new BinaryStringNumericPipe(f.location(), + f.expression(), + pipe(((Expression) randomValueOtherThan(f.left(), () -> randomStringLiteral()))), + pipe(((Expression) randomValueOtherThan(f.right(), () -> randomIntLiteral()))), + f.operation())); + + return randomFrom(randoms).apply(instance); + } + + @Override + protected BinaryStringNumericPipe copy(BinaryStringNumericPipe instance) { + return new BinaryStringNumericPipe(instance.location(), + instance.expression(), + instance.left(), + instance.right(), + instance.operation()); + } +} diff --git a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringNumericProcessorDefinitionTests.java b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringNumericProcessorDefinitionTests.java deleted file mode 100644 index 0b644995fc6b2..0000000000000 --- a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringNumericProcessorDefinitionTests.java +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -package org.elasticsearch.xpack.sql.expression.function.scalar.string; - -import org.elasticsearch.xpack.sql.expression.Expression; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.BinaryProcessorDefinition; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinition; -import org.elasticsearch.xpack.sql.expression.function.scalar.string.BinaryStringNumericProcessor.BinaryStringNumericOperation; -import org.elasticsearch.xpack.sql.tree.AbstractNodeTestCase; -import org.elasticsearch.xpack.sql.tree.Location; - -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.function.Function; - -import static org.elasticsearch.xpack.sql.expression.function.scalar.FunctionTestUtils.randomIntLiteral; -import static org.elasticsearch.xpack.sql.expression.function.scalar.FunctionTestUtils.randomStringLiteral; -import static org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinitions.toProcessorDefinition; -import static org.elasticsearch.xpack.sql.tree.LocationTests.randomLocation; - -public class BinaryStringNumericProcessorDefinitionTests - extends AbstractNodeTestCase { - - @Override - protected BinaryStringNumericProcessorDefinition randomInstance() { - return randomBinaryStringNumericProcessorDefinition(); - } - - private Expression randomBinaryStringNumericExpression() { - return randomBinaryStringNumericProcessorDefinition().expression(); - } - - private BinaryStringNumericOperation randomBinaryStringNumericOperation() { - return randomBinaryStringNumericProcessorDefinition().operation(); - } - - public static BinaryStringNumericProcessorDefinition randomBinaryStringNumericProcessorDefinition() { - List functions = new ArrayList<>(); - functions.add(new Left(randomLocation(), randomStringLiteral(), randomIntLiteral()).makeProcessorDefinition()); - functions.add(new Right(randomLocation(), randomStringLiteral(), randomIntLiteral()).makeProcessorDefinition()); - functions.add(new Repeat(randomLocation(), randomStringLiteral(), randomIntLiteral()).makeProcessorDefinition()); - - return (BinaryStringNumericProcessorDefinition) randomFrom(functions); - } - - @Override - public void testTransform() { - // test transforming only the properties (location, expression, operation), - // skipping the children (the two parameters of the binary function) which are tested separately - BinaryStringNumericProcessorDefinition b1 = randomInstance(); - - Expression newExpression = randomValueOtherThan(b1.expression(), () -> randomBinaryStringNumericExpression()); - BinaryStringNumericProcessorDefinition newB = new BinaryStringNumericProcessorDefinition( - b1.location(), - newExpression, - b1.left(), - b1.right(), - b1.operation()); - assertEquals(newB, b1.transformPropertiesOnly(v -> Objects.equals(v, b1.expression()) ? newExpression : v, Expression.class)); - - BinaryStringNumericProcessorDefinition b2 = randomInstance(); - BinaryStringNumericOperation newOp = randomValueOtherThan(b2.operation(), () -> randomBinaryStringNumericOperation()); - newB = new BinaryStringNumericProcessorDefinition( - b2.location(), - b2.expression(), - b2.left(), - b2.right(), - newOp); - assertEquals(newB, - b2.transformPropertiesOnly(v -> Objects.equals(v, b2.operation()) ? newOp : v, BinaryStringNumericOperation.class)); - - BinaryStringNumericProcessorDefinition b3 = randomInstance(); - Location newLoc = randomValueOtherThan(b3.location(), () -> randomLocation()); - newB = new BinaryStringNumericProcessorDefinition( - newLoc, - b3.expression(), - b3.left(), - b3.right(), - b3.operation()); - assertEquals(newB, - b3.transformPropertiesOnly(v -> Objects.equals(v, b3.location()) ? newLoc : v, Location.class)); - } - - @Override - public void testReplaceChildren() { - BinaryStringNumericProcessorDefinition b = randomInstance(); - ProcessorDefinition newLeft = toProcessorDefinition((Expression) randomValueOtherThan(b.left(), () -> randomStringLiteral())); - ProcessorDefinition newRight = toProcessorDefinition((Expression) randomValueOtherThan(b.right(), () -> randomIntLiteral())); - BinaryStringNumericProcessorDefinition newB = - new BinaryStringNumericProcessorDefinition(b.location(), b.expression(), b.left(), b.right(), b.operation()); - BinaryProcessorDefinition transformed = newB.replaceChildren(newLeft, b.right()); - - assertEquals(transformed.left(), newLeft); - assertEquals(transformed.location(), b.location()); - assertEquals(transformed.expression(), b.expression()); - assertEquals(transformed.right(), b.right()); - - transformed = newB.replaceChildren(b.left(), newRight); - assertEquals(transformed.left(), b.left()); - assertEquals(transformed.location(), b.location()); - assertEquals(transformed.expression(), b.expression()); - assertEquals(transformed.right(), newRight); - - transformed = newB.replaceChildren(newLeft, newRight); - assertEquals(transformed.left(), newLeft); - assertEquals(transformed.location(), b.location()); - assertEquals(transformed.expression(), b.expression()); - assertEquals(transformed.right(), newRight); - } - - @Override - protected BinaryStringNumericProcessorDefinition mutate(BinaryStringNumericProcessorDefinition instance) { - List> randoms = new ArrayList<>(); - randoms.add(f -> new BinaryStringNumericProcessorDefinition(f.location(), - f.expression(), - toProcessorDefinition((Expression) randomValueOtherThan(f.left(), () -> randomStringLiteral())), - f.right(), - f.operation())); - randoms.add(f -> new BinaryStringNumericProcessorDefinition(f.location(), - f.expression(), - f.left(), - toProcessorDefinition((Expression) randomValueOtherThan(f.right(), () -> randomIntLiteral())), - f.operation())); - randoms.add(f -> new BinaryStringNumericProcessorDefinition(f.location(), - f.expression(), - toProcessorDefinition((Expression) randomValueOtherThan(f.left(), () -> randomStringLiteral())), - toProcessorDefinition((Expression) randomValueOtherThan(f.right(), () -> randomIntLiteral())), - f.operation())); - - return randomFrom(randoms).apply(instance); - } - - @Override - protected BinaryStringNumericProcessorDefinition copy(BinaryStringNumericProcessorDefinition instance) { - return new BinaryStringNumericProcessorDefinition(instance.location(), - instance.expression(), - instance.left(), - instance.right(), - instance.operation()); - } -} diff --git a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringNumericProcessorTests.java b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringNumericProcessorTests.java index 4cfc43d50b166..6712df0c8f65c 100644 --- a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringNumericProcessorTests.java +++ b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringNumericProcessorTests.java @@ -11,8 +11,8 @@ import org.elasticsearch.test.AbstractWireSerializingTestCase; import org.elasticsearch.xpack.sql.SqlIllegalArgumentException; import org.elasticsearch.xpack.sql.expression.function.scalar.Processors; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.ConstantProcessor; import org.elasticsearch.xpack.sql.expression.function.scalar.string.BinaryStringNumericProcessor.BinaryStringNumericOperation; +import org.elasticsearch.xpack.sql.expression.gen.processor.ConstantProcessor; import static org.elasticsearch.xpack.sql.expression.function.scalar.FunctionTestUtils.l; import static org.elasticsearch.xpack.sql.tree.Location.EMPTY; @@ -38,75 +38,75 @@ protected NamedWriteableRegistry getNamedWriteableRegistry() { } public void testLeftFunctionWithValidInput() { - assertEquals("foo", new Left(EMPTY, l("foo bar"), l(3)).makeProcessorDefinition().asProcessor().process(null)); - assertEquals("foo bar", new Left(EMPTY, l("foo bar"), l(7)).makeProcessorDefinition().asProcessor().process(null)); - assertEquals("foo bar", new Left(EMPTY, l("foo bar"), l(123)).makeProcessorDefinition().asProcessor().process(null)); - assertEquals("f", new Left(EMPTY, l('f'), l(1)).makeProcessorDefinition().asProcessor().process(null)); + assertEquals("foo", new Left(EMPTY, l("foo bar"), l(3)).makePipe().asProcessor().process(null)); + assertEquals("foo bar", new Left(EMPTY, l("foo bar"), l(7)).makePipe().asProcessor().process(null)); + assertEquals("foo bar", new Left(EMPTY, l("foo bar"), l(123)).makePipe().asProcessor().process(null)); + assertEquals("f", new Left(EMPTY, l('f'), l(1)).makePipe().asProcessor().process(null)); } public void testLeftFunctionWithEdgeCases() { - assertNull(new Left(EMPTY, l("foo bar"), l(null)).makeProcessorDefinition().asProcessor().process(null)); - assertNull(new Left(EMPTY, l(null), l(3)).makeProcessorDefinition().asProcessor().process(null)); - assertNull(new Left(EMPTY, l(null), l(null)).makeProcessorDefinition().asProcessor().process(null)); - assertEquals("", new Left(EMPTY, l("foo bar"), l(-1)).makeProcessorDefinition().asProcessor().process(null)); - assertEquals("", new Left(EMPTY, l("foo bar"), l(0)).makeProcessorDefinition().asProcessor().process(null)); - assertEquals("", new Left(EMPTY, l('f'), l(0)).makeProcessorDefinition().asProcessor().process(null)); + assertNull(new Left(EMPTY, l("foo bar"), l(null)).makePipe().asProcessor().process(null)); + assertNull(new Left(EMPTY, l(null), l(3)).makePipe().asProcessor().process(null)); + assertNull(new Left(EMPTY, l(null), l(null)).makePipe().asProcessor().process(null)); + assertEquals("", new Left(EMPTY, l("foo bar"), l(-1)).makePipe().asProcessor().process(null)); + assertEquals("", new Left(EMPTY, l("foo bar"), l(0)).makePipe().asProcessor().process(null)); + assertEquals("", new Left(EMPTY, l('f'), l(0)).makePipe().asProcessor().process(null)); } public void testLeftFunctionInputValidation() { SqlIllegalArgumentException siae = expectThrows(SqlIllegalArgumentException.class, - () -> new Left(EMPTY, l(5), l(3)).makeProcessorDefinition().asProcessor().process(null)); + () -> new Left(EMPTY, l(5), l(3)).makePipe().asProcessor().process(null)); assertEquals("A string/char is required; received [5]", siae.getMessage()); siae = expectThrows(SqlIllegalArgumentException.class, - () -> new Left(EMPTY, l("foo bar"), l("baz")).makeProcessorDefinition().asProcessor().process(null)); + () -> new Left(EMPTY, l("foo bar"), l("baz")).makePipe().asProcessor().process(null)); assertEquals("A number is required; received [baz]", siae.getMessage()); } public void testRightFunctionWithValidInput() { - assertEquals("bar", new Right(EMPTY, l("foo bar"), l(3)).makeProcessorDefinition().asProcessor().process(null)); - assertEquals("foo bar", new Right(EMPTY, l("foo bar"), l(7)).makeProcessorDefinition().asProcessor().process(null)); - assertEquals("foo bar", new Right(EMPTY, l("foo bar"), l(123)).makeProcessorDefinition().asProcessor().process(null)); - assertEquals("f", new Right(EMPTY, l('f'), l(1)).makeProcessorDefinition().asProcessor().process(null)); + assertEquals("bar", new Right(EMPTY, l("foo bar"), l(3)).makePipe().asProcessor().process(null)); + assertEquals("foo bar", new Right(EMPTY, l("foo bar"), l(7)).makePipe().asProcessor().process(null)); + assertEquals("foo bar", new Right(EMPTY, l("foo bar"), l(123)).makePipe().asProcessor().process(null)); + assertEquals("f", new Right(EMPTY, l('f'), l(1)).makePipe().asProcessor().process(null)); } public void testRightFunctionWithEdgeCases() { - assertNull(new Right(EMPTY, l("foo bar"), l(null)).makeProcessorDefinition().asProcessor().process(null)); - assertNull(new Right(EMPTY, l(null), l(3)).makeProcessorDefinition().asProcessor().process(null)); - assertNull(new Right(EMPTY, l(null), l(null)).makeProcessorDefinition().asProcessor().process(null)); - assertEquals("", new Right(EMPTY, l("foo bar"), l(-1)).makeProcessorDefinition().asProcessor().process(null)); - assertEquals("", new Right(EMPTY, l("foo bar"), l(0)).makeProcessorDefinition().asProcessor().process(null)); - assertEquals("", new Right(EMPTY, l('f'), l(0)).makeProcessorDefinition().asProcessor().process(null)); + assertNull(new Right(EMPTY, l("foo bar"), l(null)).makePipe().asProcessor().process(null)); + assertNull(new Right(EMPTY, l(null), l(3)).makePipe().asProcessor().process(null)); + assertNull(new Right(EMPTY, l(null), l(null)).makePipe().asProcessor().process(null)); + assertEquals("", new Right(EMPTY, l("foo bar"), l(-1)).makePipe().asProcessor().process(null)); + assertEquals("", new Right(EMPTY, l("foo bar"), l(0)).makePipe().asProcessor().process(null)); + assertEquals("", new Right(EMPTY, l('f'), l(0)).makePipe().asProcessor().process(null)); } public void testRightFunctionInputValidation() { SqlIllegalArgumentException siae = expectThrows(SqlIllegalArgumentException.class, - () -> new Right(EMPTY, l(5), l(3)).makeProcessorDefinition().asProcessor().process(null)); + () -> new Right(EMPTY, l(5), l(3)).makePipe().asProcessor().process(null)); assertEquals("A string/char is required; received [5]", siae.getMessage()); siae = expectThrows(SqlIllegalArgumentException.class, - () -> new Right(EMPTY, l("foo bar"), l("baz")).makeProcessorDefinition().asProcessor().process(null)); + () -> new Right(EMPTY, l("foo bar"), l("baz")).makePipe().asProcessor().process(null)); assertEquals("A number is required; received [baz]", siae.getMessage()); } public void testRepeatFunctionWithValidInput() { - assertEquals("foofoofoo", new Repeat(EMPTY, l("foo"), l(3)).makeProcessorDefinition().asProcessor().process(null)); - assertEquals("foo", new Repeat(EMPTY, l("foo"), l(1)).makeProcessorDefinition().asProcessor().process(null)); - assertEquals("fff", new Repeat(EMPTY, l('f'), l(3)).makeProcessorDefinition().asProcessor().process(null)); + assertEquals("foofoofoo", new Repeat(EMPTY, l("foo"), l(3)).makePipe().asProcessor().process(null)); + assertEquals("foo", new Repeat(EMPTY, l("foo"), l(1)).makePipe().asProcessor().process(null)); + assertEquals("fff", new Repeat(EMPTY, l('f'), l(3)).makePipe().asProcessor().process(null)); } public void testRepeatFunctionWithEdgeCases() { - assertNull(new Repeat(EMPTY, l("foo"), l(null)).makeProcessorDefinition().asProcessor().process(null)); - assertNull(new Repeat(EMPTY, l(null), l(3)).makeProcessorDefinition().asProcessor().process(null)); - assertNull(new Repeat(EMPTY, l(null), l(null)).makeProcessorDefinition().asProcessor().process(null)); - assertNull(new Repeat(EMPTY, l("foo"), l(-1)).makeProcessorDefinition().asProcessor().process(null)); - assertNull(new Repeat(EMPTY, l("foo"), l(0)).makeProcessorDefinition().asProcessor().process(null)); + assertNull(new Repeat(EMPTY, l("foo"), l(null)).makePipe().asProcessor().process(null)); + assertNull(new Repeat(EMPTY, l(null), l(3)).makePipe().asProcessor().process(null)); + assertNull(new Repeat(EMPTY, l(null), l(null)).makePipe().asProcessor().process(null)); + assertNull(new Repeat(EMPTY, l("foo"), l(-1)).makePipe().asProcessor().process(null)); + assertNull(new Repeat(EMPTY, l("foo"), l(0)).makePipe().asProcessor().process(null)); } public void testRepeatFunctionInputsValidation() { SqlIllegalArgumentException siae = expectThrows(SqlIllegalArgumentException.class, - () -> new Repeat(EMPTY, l(5), l(3)).makeProcessorDefinition().asProcessor().process(null)); + () -> new Repeat(EMPTY, l(5), l(3)).makePipe().asProcessor().process(null)); assertEquals("A string/char is required; received [5]", siae.getMessage()); siae = expectThrows(SqlIllegalArgumentException.class, - () -> new Repeat(EMPTY, l("foo bar"), l("baz")).makeProcessorDefinition().asProcessor().process(null)); + () -> new Repeat(EMPTY, l("foo bar"), l("baz")).makePipe().asProcessor().process(null)); assertEquals("A number is required; received [baz]", siae.getMessage()); } } diff --git a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringStringPipeTests.java b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringStringPipeTests.java new file mode 100644 index 0000000000000..65a52b2ee0403 --- /dev/null +++ b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringStringPipeTests.java @@ -0,0 +1,130 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +package org.elasticsearch.xpack.sql.expression.function.scalar.string; + +import org.elasticsearch.xpack.sql.expression.Expression; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.BinaryPipe; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; +import org.elasticsearch.xpack.sql.tree.AbstractNodeTestCase; +import org.elasticsearch.xpack.sql.tree.Location; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.function.Function; + +import static org.elasticsearch.xpack.sql.expression.Expressions.pipe; +import static org.elasticsearch.xpack.sql.expression.function.scalar.FunctionTestUtils.randomStringLiteral; +import static org.elasticsearch.xpack.sql.tree.LocationTests.randomLocation; + +public class BinaryStringStringPipeTests + extends AbstractNodeTestCase { + + @Override + protected BinaryStringStringPipe randomInstance() { + return randomBinaryStringStringPipe(); + } + + private Expression randomBinaryStringStringExpression() { + return randomBinaryStringStringPipe().expression(); + } + + public static BinaryStringStringPipe randomBinaryStringStringPipe() { + List functions = new ArrayList<>(); + functions.add(new Position( + randomLocation(), + randomStringLiteral(), + randomStringLiteral() + ).makePipe()); + // if we decide to add DIFFERENCE(string,string) in the future, here we'd add it as well + return (BinaryStringStringPipe) randomFrom(functions); + } + + @Override + public void testTransform() { + // test transforming only the properties (location, expression), + // skipping the children (the two parameters of the binary function) which are tested separately + BinaryStringStringPipe b1 = randomInstance(); + Expression newExpression = randomValueOtherThan(b1.expression(), () -> randomBinaryStringStringExpression()); + BinaryStringStringPipe newB = new BinaryStringStringPipe( + b1.location(), + newExpression, + b1.left(), + b1.right(), + b1.operation()); + assertEquals(newB, b1.transformPropertiesOnly(v -> Objects.equals(v, b1.expression()) ? newExpression : v, Expression.class)); + + BinaryStringStringPipe b2 = randomInstance(); + Location newLoc = randomValueOtherThan(b2.location(), () -> randomLocation()); + newB = new BinaryStringStringPipe( + newLoc, + b2.expression(), + b2.left(), + b2.right(), + b2.operation()); + assertEquals(newB, + b2.transformPropertiesOnly(v -> Objects.equals(v, b2.location()) ? newLoc : v, Location.class)); + } + + @Override + public void testReplaceChildren() { + BinaryStringStringPipe b = randomInstance(); + Pipe newLeft = pipe(((Expression) randomValueOtherThan(b.left(), () -> randomStringLiteral()))); + Pipe newRight = pipe(((Expression) randomValueOtherThan(b.right(), () -> randomStringLiteral()))); + BinaryStringStringPipe newB = + new BinaryStringStringPipe(b.location(), b.expression(), b.left(), b.right(), b.operation()); + + BinaryPipe transformed = newB.replaceChildren(newLeft, b.right()); + assertEquals(transformed.left(), newLeft); + assertEquals(transformed.location(), b.location()); + assertEquals(transformed.expression(), b.expression()); + assertEquals(transformed.right(), b.right()); + + transformed = newB.replaceChildren(b.left(), newRight); + assertEquals(transformed.left(), b.left()); + assertEquals(transformed.location(), b.location()); + assertEquals(transformed.expression(), b.expression()); + assertEquals(transformed.right(), newRight); + + transformed = newB.replaceChildren(newLeft, newRight); + assertEquals(transformed.left(), newLeft); + assertEquals(transformed.location(), b.location()); + assertEquals(transformed.expression(), b.expression()); + assertEquals(transformed.right(), newRight); + } + + @Override + protected BinaryStringStringPipe mutate(BinaryStringStringPipe instance) { + List> randoms = new ArrayList<>(); + randoms.add(f -> new BinaryStringStringPipe(f.location(), + f.expression(), + pipe(((Expression) randomValueOtherThan(f.left(), () -> randomStringLiteral()))), + f.right(), + f.operation())); + randoms.add(f -> new BinaryStringStringPipe(f.location(), + f.expression(), + f.left(), + pipe(((Expression) randomValueOtherThan(f.right(), () -> randomStringLiteral()))), + f.operation())); + randoms.add(f -> new BinaryStringStringPipe(f.location(), + f.expression(), + pipe(((Expression) randomValueOtherThan(f.left(), () -> randomStringLiteral()))), + pipe(((Expression) randomValueOtherThan(f.right(), () -> randomStringLiteral()))), + f.operation())); + + return randomFrom(randoms).apply(instance); + } + + @Override + protected BinaryStringStringPipe copy(BinaryStringStringPipe instance) { + return new BinaryStringStringPipe(instance.location(), + instance.expression(), + instance.left(), + instance.right(), + instance.operation()); + } +} diff --git a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringStringProcessorDefinitionTests.java b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringStringProcessorDefinitionTests.java deleted file mode 100644 index 77b1329bdeaec..0000000000000 --- a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringStringProcessorDefinitionTests.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -package org.elasticsearch.xpack.sql.expression.function.scalar.string; - -import org.elasticsearch.xpack.sql.expression.Expression; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.BinaryProcessorDefinition; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinition; -import org.elasticsearch.xpack.sql.tree.AbstractNodeTestCase; -import org.elasticsearch.xpack.sql.tree.Location; - -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.function.Function; - -import static org.elasticsearch.xpack.sql.expression.function.scalar.FunctionTestUtils.randomStringLiteral; -import static org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinitions.toProcessorDefinition; -import static org.elasticsearch.xpack.sql.tree.LocationTests.randomLocation; - -public class BinaryStringStringProcessorDefinitionTests - extends AbstractNodeTestCase { - - @Override - protected BinaryStringStringProcessorDefinition randomInstance() { - return randomBinaryStringStringProcessorDefinition(); - } - - private Expression randomBinaryStringStringExpression() { - return randomBinaryStringStringProcessorDefinition().expression(); - } - - public static BinaryStringStringProcessorDefinition randomBinaryStringStringProcessorDefinition() { - List functions = new ArrayList<>(); - functions.add(new Position( - randomLocation(), - randomStringLiteral(), - randomStringLiteral() - ).makeProcessorDefinition()); - // if we decide to add DIFFERENCE(string,string) in the future, here we'd add it as well - return (BinaryStringStringProcessorDefinition) randomFrom(functions); - } - - @Override - public void testTransform() { - // test transforming only the properties (location, expression), - // skipping the children (the two parameters of the binary function) which are tested separately - BinaryStringStringProcessorDefinition b1 = randomInstance(); - Expression newExpression = randomValueOtherThan(b1.expression(), () -> randomBinaryStringStringExpression()); - BinaryStringStringProcessorDefinition newB = new BinaryStringStringProcessorDefinition( - b1.location(), - newExpression, - b1.left(), - b1.right(), - b1.operation()); - assertEquals(newB, b1.transformPropertiesOnly(v -> Objects.equals(v, b1.expression()) ? newExpression : v, Expression.class)); - - BinaryStringStringProcessorDefinition b2 = randomInstance(); - Location newLoc = randomValueOtherThan(b2.location(), () -> randomLocation()); - newB = new BinaryStringStringProcessorDefinition( - newLoc, - b2.expression(), - b2.left(), - b2.right(), - b2.operation()); - assertEquals(newB, - b2.transformPropertiesOnly(v -> Objects.equals(v, b2.location()) ? newLoc : v, Location.class)); - } - - @Override - public void testReplaceChildren() { - BinaryStringStringProcessorDefinition b = randomInstance(); - ProcessorDefinition newLeft = toProcessorDefinition((Expression) randomValueOtherThan(b.left(), () -> randomStringLiteral())); - ProcessorDefinition newRight = toProcessorDefinition((Expression) randomValueOtherThan(b.right(), () -> randomStringLiteral())); - BinaryStringStringProcessorDefinition newB = - new BinaryStringStringProcessorDefinition(b.location(), b.expression(), b.left(), b.right(), b.operation()); - - BinaryProcessorDefinition transformed = newB.replaceChildren(newLeft, b.right()); - assertEquals(transformed.left(), newLeft); - assertEquals(transformed.location(), b.location()); - assertEquals(transformed.expression(), b.expression()); - assertEquals(transformed.right(), b.right()); - - transformed = newB.replaceChildren(b.left(), newRight); - assertEquals(transformed.left(), b.left()); - assertEquals(transformed.location(), b.location()); - assertEquals(transformed.expression(), b.expression()); - assertEquals(transformed.right(), newRight); - - transformed = newB.replaceChildren(newLeft, newRight); - assertEquals(transformed.left(), newLeft); - assertEquals(transformed.location(), b.location()); - assertEquals(transformed.expression(), b.expression()); - assertEquals(transformed.right(), newRight); - } - - @Override - protected BinaryStringStringProcessorDefinition mutate(BinaryStringStringProcessorDefinition instance) { - List> randoms = new ArrayList<>(); - randoms.add(f -> new BinaryStringStringProcessorDefinition(f.location(), - f.expression(), - toProcessorDefinition((Expression) randomValueOtherThan(f.left(), () -> randomStringLiteral())), - f.right(), - f.operation())); - randoms.add(f -> new BinaryStringStringProcessorDefinition(f.location(), - f.expression(), - f.left(), - toProcessorDefinition((Expression) randomValueOtherThan(f.right(), () -> randomStringLiteral())), - f.operation())); - randoms.add(f -> new BinaryStringStringProcessorDefinition(f.location(), - f.expression(), - toProcessorDefinition((Expression) randomValueOtherThan(f.left(), () -> randomStringLiteral())), - toProcessorDefinition((Expression) randomValueOtherThan(f.right(), () -> randomStringLiteral())), - f.operation())); - - return randomFrom(randoms).apply(instance); - } - - @Override - protected BinaryStringStringProcessorDefinition copy(BinaryStringStringProcessorDefinition instance) { - return new BinaryStringStringProcessorDefinition(instance.location(), - instance.expression(), - instance.left(), - instance.right(), - instance.operation()); - } -} diff --git a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringStringProcessorTests.java b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringStringProcessorTests.java index 3d0a1ebb1abbb..bc5c2f57a7de4 100644 --- a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringStringProcessorTests.java +++ b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/BinaryStringStringProcessorTests.java @@ -11,8 +11,8 @@ import org.elasticsearch.test.AbstractWireSerializingTestCase; import org.elasticsearch.xpack.sql.SqlIllegalArgumentException; import org.elasticsearch.xpack.sql.expression.function.scalar.Processors; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.ConstantProcessor; import org.elasticsearch.xpack.sql.expression.function.scalar.string.BinaryStringStringProcessor.BinaryStringStringOperation; +import org.elasticsearch.xpack.sql.expression.gen.processor.ConstantProcessor; import static org.elasticsearch.xpack.sql.tree.Location.EMPTY; import static org.elasticsearch.xpack.sql.expression.function.scalar.FunctionTestUtils.l; @@ -38,26 +38,26 @@ protected NamedWriteableRegistry getNamedWriteableRegistry() { } public void testPositionFunctionWithValidInput() { - assertEquals(4, new Position(EMPTY, l("bar"), l("foobar")).makeProcessorDefinition().asProcessor().process(null)); - assertEquals(1, new Position(EMPTY, l("foo"), l("foobar")).makeProcessorDefinition().asProcessor().process(null)); - assertEquals(0, new Position(EMPTY, l("foo"), l("bar")).makeProcessorDefinition().asProcessor().process(null)); - assertEquals(3, new Position(EMPTY, l('r'), l("bar")).makeProcessorDefinition().asProcessor().process(null)); - assertEquals(0, new Position(EMPTY, l('z'), l("bar")).makeProcessorDefinition().asProcessor().process(null)); - assertEquals(1, new Position(EMPTY, l('b'), l('b')).makeProcessorDefinition().asProcessor().process(null)); + assertEquals(4, new Position(EMPTY, l("bar"), l("foobar")).makePipe().asProcessor().process(null)); + assertEquals(1, new Position(EMPTY, l("foo"), l("foobar")).makePipe().asProcessor().process(null)); + assertEquals(0, new Position(EMPTY, l("foo"), l("bar")).makePipe().asProcessor().process(null)); + assertEquals(3, new Position(EMPTY, l('r'), l("bar")).makePipe().asProcessor().process(null)); + assertEquals(0, new Position(EMPTY, l('z'), l("bar")).makePipe().asProcessor().process(null)); + assertEquals(1, new Position(EMPTY, l('b'), l('b')).makePipe().asProcessor().process(null)); } public void testPositionFunctionWithEdgeCases() { - assertNull(new Position(EMPTY, l("foo"), l(null)).makeProcessorDefinition().asProcessor().process(null)); - assertNull(new Position(EMPTY, l(null), l("foo")).makeProcessorDefinition().asProcessor().process(null)); - assertNull(new Position(EMPTY, l(null), l(null)).makeProcessorDefinition().asProcessor().process(null)); + assertNull(new Position(EMPTY, l("foo"), l(null)).makePipe().asProcessor().process(null)); + assertNull(new Position(EMPTY, l(null), l("foo")).makePipe().asProcessor().process(null)); + assertNull(new Position(EMPTY, l(null), l(null)).makePipe().asProcessor().process(null)); } public void testPositionFunctionInputsValidation() { SqlIllegalArgumentException siae = expectThrows(SqlIllegalArgumentException.class, - () -> new Position(EMPTY, l(5), l("foo")).makeProcessorDefinition().asProcessor().process(null)); + () -> new Position(EMPTY, l(5), l("foo")).makePipe().asProcessor().process(null)); assertEquals("A string/char is required; received [5]", siae.getMessage()); siae = expectThrows(SqlIllegalArgumentException.class, - () -> new Position(EMPTY, l("foo bar"), l(3)).makeProcessorDefinition().asProcessor().process(null)); + () -> new Position(EMPTY, l("foo bar"), l(3)).makePipe().asProcessor().process(null)); assertEquals("A string/char is required; received [3]", siae.getMessage()); } } diff --git a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/ConcatFunctionPipeTests.java b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/ConcatFunctionPipeTests.java new file mode 100644 index 0000000000000..b5e18f9f9f841 --- /dev/null +++ b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/ConcatFunctionPipeTests.java @@ -0,0 +1,121 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +package org.elasticsearch.xpack.sql.expression.function.scalar.string; + +import org.elasticsearch.xpack.sql.expression.Expression; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.BinaryPipe; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; +import org.elasticsearch.xpack.sql.tree.AbstractNodeTestCase; +import org.elasticsearch.xpack.sql.tree.Location; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.function.Function; + +import static org.elasticsearch.xpack.sql.expression.Expressions.pipe; +import static org.elasticsearch.xpack.sql.expression.function.scalar.FunctionTestUtils.randomStringLiteral; +import static org.elasticsearch.xpack.sql.tree.LocationTests.randomLocation; + +public class ConcatFunctionPipeTests extends AbstractNodeTestCase { + + @Override + protected ConcatFunctionPipe randomInstance() { + return randomConcatFunctionPipe(); + } + + private Expression randomConcatFunctionExpression() { + return randomConcatFunctionPipe().expression(); + } + + public static ConcatFunctionPipe randomConcatFunctionPipe() { + return (ConcatFunctionPipe) new Concat( + randomLocation(), + randomStringLiteral(), + randomStringLiteral()) + .makePipe(); + } + + @Override + public void testTransform() { + // test transforming only the properties (location, expression), + // skipping the children (the two parameters of the binary function) which are tested separately + ConcatFunctionPipe b1 = randomInstance(); + + Expression newExpression = randomValueOtherThan(b1.expression(), () -> randomConcatFunctionExpression()); + ConcatFunctionPipe newB = new ConcatFunctionPipe( + b1.location(), + newExpression, + b1.left(), + b1.right()); + assertEquals(newB, b1.transformPropertiesOnly(v -> Objects.equals(v, b1.expression()) ? newExpression : v, Expression.class)); + + ConcatFunctionPipe b2 = randomInstance(); + Location newLoc = randomValueOtherThan(b2.location(), () -> randomLocation()); + newB = new ConcatFunctionPipe( + newLoc, + b2.expression(), + b2.left(), + b2.right()); + assertEquals(newB, + b2.transformPropertiesOnly(v -> Objects.equals(v, b2.location()) ? newLoc : v, Location.class)); + } + + @Override + public void testReplaceChildren() { + ConcatFunctionPipe b = randomInstance(); + Pipe newLeft = pipe(((Expression) randomValueOtherThan(b.left(), () -> randomStringLiteral()))); + Pipe newRight = pipe(((Expression) randomValueOtherThan(b.right(), () -> randomStringLiteral()))); + ConcatFunctionPipe newB = + new ConcatFunctionPipe(b.location(), b.expression(), b.left(), b.right()); + BinaryPipe transformed = newB.replaceChildren(newLeft, b.right()); + + assertEquals(transformed.left(), newLeft); + assertEquals(transformed.location(), b.location()); + assertEquals(transformed.expression(), b.expression()); + assertEquals(transformed.right(), b.right()); + + transformed = newB.replaceChildren(b.left(), newRight); + assertEquals(transformed.left(), b.left()); + assertEquals(transformed.location(), b.location()); + assertEquals(transformed.expression(), b.expression()); + assertEquals(transformed.right(), newRight); + + transformed = newB.replaceChildren(newLeft, newRight); + assertEquals(transformed.left(), newLeft); + assertEquals(transformed.location(), b.location()); + assertEquals(transformed.expression(), b.expression()); + assertEquals(transformed.right(), newRight); + } + + @Override + protected ConcatFunctionPipe mutate(ConcatFunctionPipe instance) { + List> randoms = new ArrayList<>(); + randoms.add(f -> new ConcatFunctionPipe(f.location(), + f.expression(), + pipe(((Expression) randomValueOtherThan(f.left(), () -> randomStringLiteral()))), + f.right())); + randoms.add(f -> new ConcatFunctionPipe(f.location(), + f.expression(), + f.left(), + pipe(((Expression) randomValueOtherThan(f.right(), () -> randomStringLiteral()))))); + randoms.add(f -> new ConcatFunctionPipe(f.location(), + f.expression(), + pipe(((Expression) randomValueOtherThan(f.left(), () -> randomStringLiteral()))), + pipe(((Expression) randomValueOtherThan(f.right(), () -> randomStringLiteral()))))); + + return randomFrom(randoms).apply(instance); + } + + @Override + protected ConcatFunctionPipe copy(ConcatFunctionPipe instance) { + return new ConcatFunctionPipe(instance.location(), + instance.expression(), + instance.left(), + instance.right()); + } +} diff --git a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/ConcatFunctionProcessorDefinitionTests.java b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/ConcatFunctionProcessorDefinitionTests.java deleted file mode 100644 index 4e14e15c1953d..0000000000000 --- a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/ConcatFunctionProcessorDefinitionTests.java +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -package org.elasticsearch.xpack.sql.expression.function.scalar.string; - -import org.elasticsearch.xpack.sql.expression.Expression; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.BinaryProcessorDefinition; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinition; -import org.elasticsearch.xpack.sql.tree.AbstractNodeTestCase; -import org.elasticsearch.xpack.sql.tree.Location; - -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.function.Function; - -import static org.elasticsearch.xpack.sql.expression.function.scalar.FunctionTestUtils.randomStringLiteral; -import static org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinitions.toProcessorDefinition; -import static org.elasticsearch.xpack.sql.tree.LocationTests.randomLocation; - -public class ConcatFunctionProcessorDefinitionTests extends AbstractNodeTestCase { - - @Override - protected ConcatFunctionProcessorDefinition randomInstance() { - return randomConcatFunctionProcessorDefinition(); - } - - private Expression randomConcatFunctionExpression() { - return randomConcatFunctionProcessorDefinition().expression(); - } - - public static ConcatFunctionProcessorDefinition randomConcatFunctionProcessorDefinition() { - return (ConcatFunctionProcessorDefinition) new Concat( - randomLocation(), - randomStringLiteral(), - randomStringLiteral()) - .makeProcessorDefinition(); - } - - @Override - public void testTransform() { - // test transforming only the properties (location, expression), - // skipping the children (the two parameters of the binary function) which are tested separately - ConcatFunctionProcessorDefinition b1 = randomInstance(); - - Expression newExpression = randomValueOtherThan(b1.expression(), () -> randomConcatFunctionExpression()); - ConcatFunctionProcessorDefinition newB = new ConcatFunctionProcessorDefinition( - b1.location(), - newExpression, - b1.left(), - b1.right()); - assertEquals(newB, b1.transformPropertiesOnly(v -> Objects.equals(v, b1.expression()) ? newExpression : v, Expression.class)); - - ConcatFunctionProcessorDefinition b2 = randomInstance(); - Location newLoc = randomValueOtherThan(b2.location(), () -> randomLocation()); - newB = new ConcatFunctionProcessorDefinition( - newLoc, - b2.expression(), - b2.left(), - b2.right()); - assertEquals(newB, - b2.transformPropertiesOnly(v -> Objects.equals(v, b2.location()) ? newLoc : v, Location.class)); - } - - @Override - public void testReplaceChildren() { - ConcatFunctionProcessorDefinition b = randomInstance(); - ProcessorDefinition newLeft = toProcessorDefinition((Expression) randomValueOtherThan(b.left(), () -> randomStringLiteral())); - ProcessorDefinition newRight = toProcessorDefinition((Expression) randomValueOtherThan(b.right(), () -> randomStringLiteral())); - ConcatFunctionProcessorDefinition newB = - new ConcatFunctionProcessorDefinition(b.location(), b.expression(), b.left(), b.right()); - BinaryProcessorDefinition transformed = newB.replaceChildren(newLeft, b.right()); - - assertEquals(transformed.left(), newLeft); - assertEquals(transformed.location(), b.location()); - assertEquals(transformed.expression(), b.expression()); - assertEquals(transformed.right(), b.right()); - - transformed = newB.replaceChildren(b.left(), newRight); - assertEquals(transformed.left(), b.left()); - assertEquals(transformed.location(), b.location()); - assertEquals(transformed.expression(), b.expression()); - assertEquals(transformed.right(), newRight); - - transformed = newB.replaceChildren(newLeft, newRight); - assertEquals(transformed.left(), newLeft); - assertEquals(transformed.location(), b.location()); - assertEquals(transformed.expression(), b.expression()); - assertEquals(transformed.right(), newRight); - } - - @Override - protected ConcatFunctionProcessorDefinition mutate(ConcatFunctionProcessorDefinition instance) { - List> randoms = new ArrayList<>(); - randoms.add(f -> new ConcatFunctionProcessorDefinition(f.location(), - f.expression(), - toProcessorDefinition((Expression) randomValueOtherThan(f.left(), () -> randomStringLiteral())), - f.right())); - randoms.add(f -> new ConcatFunctionProcessorDefinition(f.location(), - f.expression(), - f.left(), - toProcessorDefinition((Expression) randomValueOtherThan(f.right(), () -> randomStringLiteral())))); - randoms.add(f -> new ConcatFunctionProcessorDefinition(f.location(), - f.expression(), - toProcessorDefinition((Expression) randomValueOtherThan(f.left(), () -> randomStringLiteral())), - toProcessorDefinition((Expression) randomValueOtherThan(f.right(), () -> randomStringLiteral())))); - - return randomFrom(randoms).apply(instance); - } - - @Override - protected ConcatFunctionProcessorDefinition copy(ConcatFunctionProcessorDefinition instance) { - return new ConcatFunctionProcessorDefinition(instance.location(), - instance.expression(), - instance.left(), - instance.right()); - } -} diff --git a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/ConcatProcessorTests.java b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/ConcatProcessorTests.java index 804f9a9d150b2..1a99d4ab27d89 100644 --- a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/ConcatProcessorTests.java +++ b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/ConcatProcessorTests.java @@ -11,7 +11,7 @@ import org.elasticsearch.test.AbstractWireSerializingTestCase; import org.elasticsearch.xpack.sql.SqlIllegalArgumentException; import org.elasticsearch.xpack.sql.expression.function.scalar.Processors; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.ConstantProcessor; +import org.elasticsearch.xpack.sql.expression.gen.processor.ConstantProcessor; import static org.elasticsearch.xpack.sql.tree.Location.EMPTY; import static org.elasticsearch.xpack.sql.expression.function.scalar.FunctionTestUtils.l; @@ -36,22 +36,22 @@ protected NamedWriteableRegistry getNamedWriteableRegistry() { } public void testConcatFunctionWithValidInput() { - assertEquals("foobar", new Concat(EMPTY, l("foo"), l("bar")).makeProcessorDefinition().asProcessor().process(null)); - assertEquals("fb", new Concat(EMPTY, l('f'), l('b')).makeProcessorDefinition().asProcessor().process(null)); + assertEquals("foobar", new Concat(EMPTY, l("foo"), l("bar")).makePipe().asProcessor().process(null)); + assertEquals("fb", new Concat(EMPTY, l('f'), l('b')).makePipe().asProcessor().process(null)); } public void testConcatFunctionWithEdgeCases() { - assertEquals("foo", new Concat(EMPTY, l("foo"), l(null)).makeProcessorDefinition().asProcessor().process(null)); - assertEquals("bar", new Concat(EMPTY, l(null), l("bar")).makeProcessorDefinition().asProcessor().process(null)); - assertNull(new Concat(EMPTY, l(null), l(null)).makeProcessorDefinition().asProcessor().process(null)); + assertEquals("foo", new Concat(EMPTY, l("foo"), l(null)).makePipe().asProcessor().process(null)); + assertEquals("bar", new Concat(EMPTY, l(null), l("bar")).makePipe().asProcessor().process(null)); + assertNull(new Concat(EMPTY, l(null), l(null)).makePipe().asProcessor().process(null)); } public void testConcatFunctionInputsValidation() { SqlIllegalArgumentException siae = expectThrows(SqlIllegalArgumentException.class, - () -> new Concat(EMPTY, l(5), l("foo")).makeProcessorDefinition().asProcessor().process(null)); + () -> new Concat(EMPTY, l(5), l("foo")).makePipe().asProcessor().process(null)); assertEquals("A string/char is required; received [5]", siae.getMessage()); siae = expectThrows(SqlIllegalArgumentException.class, - () -> new Concat(EMPTY, l("foo bar"), l(3)).makeProcessorDefinition().asProcessor().process(null)); + () -> new Concat(EMPTY, l("foo bar"), l(3)).makePipe().asProcessor().process(null)); assertEquals("A string/char is required; received [3]", siae.getMessage()); } } diff --git a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/InsertFunctionProcessorDefinitionTests.java b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/InsertFunctionPipeTests.java similarity index 50% rename from x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/InsertFunctionProcessorDefinitionTests.java rename to x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/InsertFunctionPipeTests.java index bf17962b0837c..c4ee5fd9ad764 100644 --- a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/InsertFunctionProcessorDefinitionTests.java +++ b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/InsertFunctionPipeTests.java @@ -8,7 +8,7 @@ import org.elasticsearch.xpack.sql.expression.Expression; import org.elasticsearch.xpack.sql.expression.function.scalar.FunctionTestUtils.Combinations; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinition; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; import org.elasticsearch.xpack.sql.tree.AbstractNodeTestCase; import org.elasticsearch.xpack.sql.tree.Location; @@ -18,74 +18,74 @@ import java.util.Objects; import java.util.function.Function; +import static org.elasticsearch.xpack.sql.expression.Expressions.pipe; import static org.elasticsearch.xpack.sql.expression.function.scalar.FunctionTestUtils.randomIntLiteral; import static org.elasticsearch.xpack.sql.expression.function.scalar.FunctionTestUtils.randomStringLiteral; -import static org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinitions.toProcessorDefinition; import static org.elasticsearch.xpack.sql.tree.LocationTests.randomLocation; -public class InsertFunctionProcessorDefinitionTests extends AbstractNodeTestCase { +public class InsertFunctionPipeTests extends AbstractNodeTestCase { @Override - protected InsertFunctionProcessorDefinition randomInstance() { - return randomInsertFunctionProcessorDefinition(); + protected InsertFunctionPipe randomInstance() { + return randomInsertFunctionPipe(); } - private Expression randomInsertFunctionExpression() { - return randomInsertFunctionProcessorDefinition().expression(); + private Expression randomInsertFunctionExpression() { + return randomInsertFunctionPipe().expression(); } - public static InsertFunctionProcessorDefinition randomInsertFunctionProcessorDefinition() { - return (InsertFunctionProcessorDefinition) (new Insert(randomLocation(), - randomStringLiteral(), + public static InsertFunctionPipe randomInsertFunctionPipe() { + return (InsertFunctionPipe) (new Insert(randomLocation(), + randomStringLiteral(), randomIntLiteral(), randomIntLiteral(), randomStringLiteral()) - .makeProcessorDefinition()); + .makePipe()); } @Override public void testTransform() { - // test transforming only the properties (location, expression), + // test transforming only the properties (location, expression), // skipping the children (the two parameters of the binary function) which are tested separately - InsertFunctionProcessorDefinition b1 = randomInstance(); + InsertFunctionPipe b1 = randomInstance(); Expression newExpression = randomValueOtherThan(b1.expression(), () -> randomInsertFunctionExpression()); - InsertFunctionProcessorDefinition newB = new InsertFunctionProcessorDefinition( - b1.location(), + InsertFunctionPipe newB = new InsertFunctionPipe( + b1.location(), newExpression, - b1.source(), + b1.source(), b1.start(), b1.length(), b1.replacement()); assertEquals(newB, b1.transformPropertiesOnly(v -> Objects.equals(v, b1.expression()) ? newExpression : v, Expression.class)); - InsertFunctionProcessorDefinition b2 = randomInstance(); + InsertFunctionPipe b2 = randomInstance(); Location newLoc = randomValueOtherThan(b2.location(), () -> randomLocation()); - newB = new InsertFunctionProcessorDefinition( - newLoc, + newB = new InsertFunctionPipe( + newLoc, b2.expression(), - b2.source(), + b2.source(), b2.start(), b2.length(), b2.replacement()); - assertEquals(newB, + assertEquals(newB, b2.transformPropertiesOnly(v -> Objects.equals(v, b2.location()) ? newLoc : v, Location.class)); } @Override public void testReplaceChildren() { - InsertFunctionProcessorDefinition b = randomInstance(); - ProcessorDefinition newSource = toProcessorDefinition((Expression) randomValueOtherThan(b.source(), () -> randomStringLiteral())); - ProcessorDefinition newStart = toProcessorDefinition((Expression) randomValueOtherThan(b.start(), () -> randomIntLiteral())); - ProcessorDefinition newLength = toProcessorDefinition((Expression) randomValueOtherThan(b.length(), () -> randomIntLiteral())); - ProcessorDefinition newR = toProcessorDefinition((Expression) randomValueOtherThan(b.replacement(), () -> randomStringLiteral())); - InsertFunctionProcessorDefinition newB = - new InsertFunctionProcessorDefinition(b.location(), b.expression(), b.source(), b.start(), b.length(), b.replacement()); - InsertFunctionProcessorDefinition transformed = null; + InsertFunctionPipe b = randomInstance(); + Pipe newSource = pipe(((Expression) randomValueOtherThan(b.source(), () -> randomStringLiteral()))); + Pipe newStart = pipe(((Expression) randomValueOtherThan(b.start(), () -> randomIntLiteral()))); + Pipe newLength = pipe(((Expression) randomValueOtherThan(b.length(), () -> randomIntLiteral()))); + Pipe newR = pipe(((Expression) randomValueOtherThan(b.replacement(), () -> randomStringLiteral()))); + InsertFunctionPipe newB = + new InsertFunctionPipe(b.location(), b.expression(), b.source(), b.start(), b.length(), b.replacement()); + InsertFunctionPipe transformed = null; // generate all the combinations of possible children modifications and test all of them for(int i = 1; i < 5; i++) { for(BitSet comb : new Combinations(4, i)) { - transformed = (InsertFunctionProcessorDefinition) newB.replaceChildren( + transformed = (InsertFunctionPipe) newB.replaceChildren( comb.get(0) ? newSource : b.source(), comb.get(1) ? newStart : b.start(), comb.get(2) ? newLength : b.length(), @@ -101,22 +101,22 @@ public void testReplaceChildren() { } @Override - protected InsertFunctionProcessorDefinition mutate(InsertFunctionProcessorDefinition instance) { - List> randoms = new ArrayList<>(); + protected InsertFunctionPipe mutate(InsertFunctionPipe instance) { + List> randoms = new ArrayList<>(); for(int i = 1; i < 5; i++) { for(BitSet comb : new Combinations(4, i)) { - randoms.add(f -> new InsertFunctionProcessorDefinition( + randoms.add(f -> new InsertFunctionPipe( f.location(), - f.expression(), - comb.get(0) ? toProcessorDefinition((Expression) randomValueOtherThan(f.source(), - () -> randomStringLiteral())) : f.source(), - comb.get(1) ? toProcessorDefinition((Expression) randomValueOtherThan(f.start(), - () -> randomIntLiteral())) : f.start(), - comb.get(2) ? toProcessorDefinition((Expression) randomValueOtherThan(f.length(), - () -> randomIntLiteral())): f.length(), - comb.get(3) ? toProcessorDefinition((Expression) randomValueOtherThan(f.replacement(), - () -> randomStringLiteral())) : f.replacement())); + f.expression(), + comb.get(0) ? pipe(((Expression) randomValueOtherThan(f.source(), + () -> randomStringLiteral()))) : f.source(), + comb.get(1) ? pipe(((Expression) randomValueOtherThan(f.start(), + () -> randomIntLiteral()))) : f.start(), + comb.get(2) ? pipe(((Expression) randomValueOtherThan(f.length(), + () -> randomIntLiteral()))): f.length(), + comb.get(3) ? pipe(((Expression) randomValueOtherThan(f.replacement(), + () -> randomStringLiteral()))) : f.replacement())); } } @@ -124,8 +124,8 @@ protected InsertFunctionProcessorDefinition mutate(InsertFunctionProcessorDefini } @Override - protected InsertFunctionProcessorDefinition copy(InsertFunctionProcessorDefinition instance) { - return new InsertFunctionProcessorDefinition(instance.location(), + protected InsertFunctionPipe copy(InsertFunctionPipe instance) { + return new InsertFunctionPipe(instance.location(), instance.expression(), instance.source(), instance.start(), diff --git a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/InsertProcessorTests.java b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/InsertProcessorTests.java index 851dc6f1aa8ef..1cafe1cfbd989 100644 --- a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/InsertProcessorTests.java +++ b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/InsertProcessorTests.java @@ -11,7 +11,7 @@ import org.elasticsearch.test.AbstractWireSerializingTestCase; import org.elasticsearch.xpack.sql.SqlIllegalArgumentException; import org.elasticsearch.xpack.sql.expression.function.scalar.Processors; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.ConstantProcessor; +import org.elasticsearch.xpack.sql.expression.gen.processor.ConstantProcessor; import static org.elasticsearch.xpack.sql.tree.Location.EMPTY; import static org.elasticsearch.xpack.sql.expression.function.scalar.FunctionTestUtils.l; @@ -38,47 +38,47 @@ protected NamedWriteableRegistry getNamedWriteableRegistry() { } public void testInsertWithValidInputs() { - assertEquals("bazbar", new Insert(EMPTY, l("foobar"), l(1), l(3), l("baz")).makeProcessorDefinition().asProcessor().process(null)); - assertEquals("foobaz", new Insert(EMPTY, l("foobar"), l(4), l(3), l("baz")).makeProcessorDefinition().asProcessor().process(null)); + assertEquals("bazbar", new Insert(EMPTY, l("foobar"), l(1), l(3), l("baz")).makePipe().asProcessor().process(null)); + assertEquals("foobaz", new Insert(EMPTY, l("foobar"), l(4), l(3), l("baz")).makePipe().asProcessor().process(null)); } public void testInsertWithEdgeCases() { - assertNull(new Insert(EMPTY, l(null), l(4), l(3), l("baz")).makeProcessorDefinition().asProcessor().process(null)); - assertEquals("foobar", new Insert(EMPTY, l("foobar"), l(4), l(3), l(null)).makeProcessorDefinition().asProcessor().process(null)); + assertNull(new Insert(EMPTY, l(null), l(4), l(3), l("baz")).makePipe().asProcessor().process(null)); + assertEquals("foobar", new Insert(EMPTY, l("foobar"), l(4), l(3), l(null)).makePipe().asProcessor().process(null)); assertEquals("foobar", - new Insert(EMPTY, l("foobar"), l(null), l(3), l("baz")).makeProcessorDefinition().asProcessor().process(null)); + new Insert(EMPTY, l("foobar"), l(null), l(3), l("baz")).makePipe().asProcessor().process(null)); assertEquals("foobar", - new Insert(EMPTY, l("foobar"), l(4), l(null), l("baz")).makeProcessorDefinition().asProcessor().process(null)); - assertEquals("bazbar", new Insert(EMPTY, l("foobar"), l(-1), l(3), l("baz")).makeProcessorDefinition().asProcessor().process(null)); - assertEquals("foobaz", new Insert(EMPTY, l("foobar"), l(4), l(30), l("baz")).makeProcessorDefinition().asProcessor().process(null)); - assertEquals("foobaz", new Insert(EMPTY, l("foobar"), l(6), l(1), l('z')).makeProcessorDefinition().asProcessor().process(null)); + new Insert(EMPTY, l("foobar"), l(4), l(null), l("baz")).makePipe().asProcessor().process(null)); + assertEquals("bazbar", new Insert(EMPTY, l("foobar"), l(-1), l(3), l("baz")).makePipe().asProcessor().process(null)); + assertEquals("foobaz", new Insert(EMPTY, l("foobar"), l(4), l(30), l("baz")).makePipe().asProcessor().process(null)); + assertEquals("foobaz", new Insert(EMPTY, l("foobar"), l(6), l(1), l('z')).makePipe().asProcessor().process(null)); assertEquals("foobarbaz", - new Insert(EMPTY, l("foobar"), l(7), l(1000), l("baz")).makeProcessorDefinition().asProcessor().process(null)); + new Insert(EMPTY, l("foobar"), l(7), l(1000), l("baz")).makePipe().asProcessor().process(null)); assertEquals("foobar", - new Insert(EMPTY, l("foobar"), l(8), l(1000), l("baz")).makeProcessorDefinition().asProcessor().process(null)); - assertEquals("fzr", new Insert(EMPTY, l("foobar"), l(2), l(4), l('z')).makeProcessorDefinition().asProcessor().process(null)); - assertEquals("CAR", new Insert(EMPTY, l("FOOBAR"), l(1), l(5), l("CA")).makeProcessorDefinition().asProcessor().process(null)); - assertEquals("z", new Insert(EMPTY, l('f'), l(1), l(10), l('z')).makeProcessorDefinition().asProcessor().process(null)); + new Insert(EMPTY, l("foobar"), l(8), l(1000), l("baz")).makePipe().asProcessor().process(null)); + assertEquals("fzr", new Insert(EMPTY, l("foobar"), l(2), l(4), l('z')).makePipe().asProcessor().process(null)); + assertEquals("CAR", new Insert(EMPTY, l("FOOBAR"), l(1), l(5), l("CA")).makePipe().asProcessor().process(null)); + assertEquals("z", new Insert(EMPTY, l('f'), l(1), l(10), l('z')).makePipe().asProcessor().process(null)); - assertEquals("bla", new Insert(EMPTY, l(""), l(1), l(10), l("bla")).makeProcessorDefinition().asProcessor().process(null)); - assertEquals("", new Insert(EMPTY, l(""), l(2), l(10), l("bla")).makeProcessorDefinition().asProcessor().process(null)); + assertEquals("bla", new Insert(EMPTY, l(""), l(1), l(10), l("bla")).makePipe().asProcessor().process(null)); + assertEquals("", new Insert(EMPTY, l(""), l(2), l(10), l("bla")).makePipe().asProcessor().process(null)); } public void testInsertInputsValidation() { SqlIllegalArgumentException siae = expectThrows(SqlIllegalArgumentException.class, - () -> new Insert(EMPTY, l(5), l(1), l(3), l("baz")).makeProcessorDefinition().asProcessor().process(null)); + () -> new Insert(EMPTY, l(5), l(1), l(3), l("baz")).makePipe().asProcessor().process(null)); assertEquals("A string/char is required; received [5]", siae.getMessage()); siae = expectThrows(SqlIllegalArgumentException.class, - () -> new Insert(EMPTY, l("foobar"), l(1), l(3), l(66)).makeProcessorDefinition().asProcessor().process(null)); + () -> new Insert(EMPTY, l("foobar"), l(1), l(3), l(66)).makePipe().asProcessor().process(null)); assertEquals("A string/char is required; received [66]", siae.getMessage()); siae = expectThrows(SqlIllegalArgumentException.class, - () -> new Insert(EMPTY, l("foobar"), l("c"), l(3), l("baz")).makeProcessorDefinition().asProcessor().process(null)); + () -> new Insert(EMPTY, l("foobar"), l("c"), l(3), l("baz")).makePipe().asProcessor().process(null)); assertEquals("A number is required; received [c]", siae.getMessage()); siae = expectThrows(SqlIllegalArgumentException.class, - () -> new Insert(EMPTY, l("foobar"), l(1), l('z'), l("baz")).makeProcessorDefinition().asProcessor().process(null)); + () -> new Insert(EMPTY, l("foobar"), l(1), l('z'), l("baz")).makePipe().asProcessor().process(null)); assertEquals("A number is required; received [z]", siae.getMessage()); siae = expectThrows(SqlIllegalArgumentException.class, - () -> new Insert(EMPTY, l("foobar"), l(1), l(-1), l("baz")).makeProcessorDefinition().asProcessor().process(null)); + () -> new Insert(EMPTY, l("foobar"), l(1), l(-1), l("baz")).makePipe().asProcessor().process(null)); assertEquals("A positive number is required for [length]; received [-1]", siae.getMessage()); } } diff --git a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/LocateFunctionProcessorDefinitionTests.java b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/LocateFunctionPipeTests.java similarity index 53% rename from x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/LocateFunctionProcessorDefinitionTests.java rename to x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/LocateFunctionPipeTests.java index 4815c9c9528b1..25b361ab3811f 100644 --- a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/LocateFunctionProcessorDefinitionTests.java +++ b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/LocateFunctionPipeTests.java @@ -8,7 +8,7 @@ import org.elasticsearch.xpack.sql.expression.Expression; import org.elasticsearch.xpack.sql.expression.function.scalar.FunctionTestUtils.Combinations; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinition; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; import org.elasticsearch.xpack.sql.tree.AbstractNodeTestCase; import org.elasticsearch.xpack.sql.tree.Location; @@ -18,74 +18,74 @@ import java.util.Objects; import java.util.function.Function; +import static org.elasticsearch.xpack.sql.expression.Expressions.pipe; import static org.elasticsearch.xpack.sql.expression.function.scalar.FunctionTestUtils.randomIntLiteral; import static org.elasticsearch.xpack.sql.expression.function.scalar.FunctionTestUtils.randomStringLiteral; -import static org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinitions.toProcessorDefinition; import static org.elasticsearch.xpack.sql.tree.LocationTests.randomLocation; -public class LocateFunctionProcessorDefinitionTests extends AbstractNodeTestCase { +public class LocateFunctionPipeTests extends AbstractNodeTestCase { @Override - protected LocateFunctionProcessorDefinition randomInstance() { - return randomLocateFunctionProcessorDefinition(); + protected LocateFunctionPipe randomInstance() { + return randomLocateFunctionPipe(); } - private Expression randomLocateFunctionExpression() { - return randomLocateFunctionProcessorDefinition().expression(); + private Expression randomLocateFunctionExpression() { + return randomLocateFunctionPipe().expression(); } - public static LocateFunctionProcessorDefinition randomLocateFunctionProcessorDefinition() { - return (LocateFunctionProcessorDefinition) (new Locate(randomLocation(), - randomStringLiteral(), + public static LocateFunctionPipe randomLocateFunctionPipe() { + return (LocateFunctionPipe) (new Locate(randomLocation(), + randomStringLiteral(), randomStringLiteral(), randomFrom(true, false) ? randomIntLiteral() : null) - .makeProcessorDefinition()); + .makePipe()); } @Override public void testTransform() { - // test transforming only the properties (location, expression), + // test transforming only the properties (location, expression), // skipping the children (the two parameters of the binary function) which are tested separately - LocateFunctionProcessorDefinition b1 = randomInstance(); + LocateFunctionPipe b1 = randomInstance(); Expression newExpression = randomValueOtherThan(b1.expression(), () -> randomLocateFunctionExpression()); - LocateFunctionProcessorDefinition newB = new LocateFunctionProcessorDefinition( - b1.location(), + LocateFunctionPipe newB = new LocateFunctionPipe( + b1.location(), newExpression, - b1.pattern(), + b1.pattern(), b1.source(), b1.start()); assertEquals(newB, b1.transformPropertiesOnly(v -> Objects.equals(v, b1.expression()) ? newExpression : v, Expression.class)); - LocateFunctionProcessorDefinition b2 = randomInstance(); + LocateFunctionPipe b2 = randomInstance(); Location newLoc = randomValueOtherThan(b2.location(), () -> randomLocation()); - newB = new LocateFunctionProcessorDefinition( - newLoc, + newB = new LocateFunctionPipe( + newLoc, b2.expression(), - b2.pattern(), + b2.pattern(), b2.source(), b2.start()); - assertEquals(newB, + assertEquals(newB, b2.transformPropertiesOnly(v -> Objects.equals(v, b2.location()) ? newLoc : v, Location.class)); } @Override public void testReplaceChildren() { - LocateFunctionProcessorDefinition b = randomInstance(); - ProcessorDefinition newPattern = toProcessorDefinition((Expression) randomValueOtherThan(b.pattern(), () -> randomStringLiteral())); - ProcessorDefinition newSource = toProcessorDefinition((Expression) randomValueOtherThan(b.source(), () -> randomStringLiteral())); - ProcessorDefinition newStart; + LocateFunctionPipe b = randomInstance(); + Pipe newPattern = pipe(((Expression) randomValueOtherThan(b.pattern(), () -> randomStringLiteral()))); + Pipe newSource = pipe(((Expression) randomValueOtherThan(b.source(), () -> randomStringLiteral()))); + Pipe newStart; - LocateFunctionProcessorDefinition newB = new LocateFunctionProcessorDefinition( + LocateFunctionPipe newB = new LocateFunctionPipe( b.location(), b.expression(), b.pattern(), b.source(), b.start()); - newStart = toProcessorDefinition((Expression) randomValueOtherThan(b.start(), () -> randomIntLiteral())); - LocateFunctionProcessorDefinition transformed = null; + newStart = pipe(((Expression) randomValueOtherThan(b.start(), () -> randomIntLiteral()))); + LocateFunctionPipe transformed = null; // generate all the combinations of possible children modifications and test all of them for(int i = 1; i < 4; i++) { for(BitSet comb : new Combinations(3, i)) { - transformed = (LocateFunctionProcessorDefinition) newB.replaceChildren( + transformed = (LocateFunctionPipe) newB.replaceChildren( comb.get(0) ? newPattern : b.pattern(), comb.get(1) ? newSource : b.source(), comb.get(2) ? newStart : b.start()); @@ -100,31 +100,31 @@ public void testReplaceChildren() { } @Override - protected LocateFunctionProcessorDefinition mutate(LocateFunctionProcessorDefinition instance) { - List> randoms = new ArrayList<>(); + protected LocateFunctionPipe mutate(LocateFunctionPipe instance) { + List> randoms = new ArrayList<>(); if (instance.start() == null) { for(int i = 1; i < 3; i++) { for(BitSet comb : new Combinations(2, i)) { - randoms.add(f -> new LocateFunctionProcessorDefinition(f.location(), - f.expression(), - comb.get(0) ? toProcessorDefinition((Expression) randomValueOtherThan(f.pattern(), - () -> randomStringLiteral())) : f.pattern(), - comb.get(1) ? toProcessorDefinition((Expression) randomValueOtherThan(f.source(), - () -> randomStringLiteral())) : f.source(), + randoms.add(f -> new LocateFunctionPipe(f.location(), + f.expression(), + comb.get(0) ? pipe(((Expression) randomValueOtherThan(f.pattern(), + () -> randomStringLiteral()))) : f.pattern(), + comb.get(1) ? pipe(((Expression) randomValueOtherThan(f.source(), + () -> randomStringLiteral()))) : f.source(), null)); } } } else { for(int i = 1; i < 4; i++) { for(BitSet comb : new Combinations(3, i)) { - randoms.add(f -> new LocateFunctionProcessorDefinition(f.location(), - f.expression(), - comb.get(0) ? toProcessorDefinition((Expression) randomValueOtherThan(f.pattern(), - () -> randomStringLiteral())) : f.pattern(), - comb.get(1) ? toProcessorDefinition((Expression) randomValueOtherThan(f.source(), - () -> randomStringLiteral())) : f.source(), - comb.get(2) ? toProcessorDefinition((Expression) randomValueOtherThan(f.start(), - () -> randomIntLiteral())) : f.start())); + randoms.add(f -> new LocateFunctionPipe(f.location(), + f.expression(), + comb.get(0) ? pipe(((Expression) randomValueOtherThan(f.pattern(), + () -> randomStringLiteral()))) : f.pattern(), + comb.get(1) ? pipe(((Expression) randomValueOtherThan(f.source(), + () -> randomStringLiteral()))) : f.source(), + comb.get(2) ? pipe(((Expression) randomValueOtherThan(f.start(), + () -> randomIntLiteral()))) : f.start())); } } } @@ -133,8 +133,8 @@ protected LocateFunctionProcessorDefinition mutate(LocateFunctionProcessorDefini } @Override - protected LocateFunctionProcessorDefinition copy(LocateFunctionProcessorDefinition instance) { - return new LocateFunctionProcessorDefinition(instance.location(), + protected LocateFunctionPipe copy(LocateFunctionPipe instance) { + return new LocateFunctionPipe(instance.location(), instance.expression(), instance.pattern(), instance.source(), diff --git a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/LocateProcessorTests.java b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/LocateProcessorTests.java index e03ef72b8b8ea..f000ab813ec95 100644 --- a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/LocateProcessorTests.java +++ b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/LocateProcessorTests.java @@ -11,7 +11,7 @@ import org.elasticsearch.test.AbstractWireSerializingTestCase; import org.elasticsearch.xpack.sql.SqlIllegalArgumentException; import org.elasticsearch.xpack.sql.expression.function.scalar.Processors; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.ConstantProcessor; +import org.elasticsearch.xpack.sql.expression.gen.processor.ConstantProcessor; import static org.elasticsearch.xpack.sql.tree.Location.EMPTY; import static org.elasticsearch.xpack.sql.expression.function.scalar.FunctionTestUtils.l; @@ -41,31 +41,31 @@ protected NamedWriteableRegistry getNamedWriteableRegistry() { } public void testLocateFunctionWithValidInput() { - assertEquals(4, new Locate(EMPTY, l("bar"), l("foobarbar"), l(null)).makeProcessorDefinition().asProcessor().process(null)); - assertEquals(7, new Locate(EMPTY, l("bar"), l("foobarbar"), l(5)).makeProcessorDefinition().asProcessor().process(null)); + assertEquals(4, new Locate(EMPTY, l("bar"), l("foobarbar"), l(null)).makePipe().asProcessor().process(null)); + assertEquals(7, new Locate(EMPTY, l("bar"), l("foobarbar"), l(5)).makePipe().asProcessor().process(null)); } public void testLocateFunctionWithEdgeCasesInputs() { - assertEquals(4, new Locate(EMPTY, l("bar"), l("foobarbar"), l(null)).makeProcessorDefinition().asProcessor().process(null)); - assertNull(new Locate(EMPTY, l("bar"), l(null), l(3)).makeProcessorDefinition().asProcessor().process(null)); - assertEquals(0, new Locate(EMPTY, l(null), l("foobarbar"), l(null)).makeProcessorDefinition().asProcessor().process(null)); - assertEquals(0, new Locate(EMPTY, l(null), l("foobarbar"), l(null)).makeProcessorDefinition().asProcessor().process(null)); + assertEquals(4, new Locate(EMPTY, l("bar"), l("foobarbar"), l(null)).makePipe().asProcessor().process(null)); + assertNull(new Locate(EMPTY, l("bar"), l(null), l(3)).makePipe().asProcessor().process(null)); + assertEquals(0, new Locate(EMPTY, l(null), l("foobarbar"), l(null)).makePipe().asProcessor().process(null)); + assertEquals(0, new Locate(EMPTY, l(null), l("foobarbar"), l(null)).makePipe().asProcessor().process(null)); - assertEquals(1, new Locate(EMPTY, l("foo"), l("foobarbar"), l(null)).makeProcessorDefinition().asProcessor().process(null)); - assertEquals(1, new Locate(EMPTY, l('o'), l('o'), l(null)).makeProcessorDefinition().asProcessor().process(null)); - assertEquals(9, new Locate(EMPTY, l('r'), l("foobarbar"), l(9)).makeProcessorDefinition().asProcessor().process(null)); - assertEquals(4, new Locate(EMPTY, l("bar"), l("foobarbar"), l(-3)).makeProcessorDefinition().asProcessor().process(null)); + assertEquals(1, new Locate(EMPTY, l("foo"), l("foobarbar"), l(null)).makePipe().asProcessor().process(null)); + assertEquals(1, new Locate(EMPTY, l('o'), l('o'), l(null)).makePipe().asProcessor().process(null)); + assertEquals(9, new Locate(EMPTY, l('r'), l("foobarbar"), l(9)).makePipe().asProcessor().process(null)); + assertEquals(4, new Locate(EMPTY, l("bar"), l("foobarbar"), l(-3)).makePipe().asProcessor().process(null)); } public void testLocateFunctionValidatingInputs() { SqlIllegalArgumentException siae = expectThrows(SqlIllegalArgumentException.class, - () -> new Locate(EMPTY, l(5), l("foobarbar"), l(3)).makeProcessorDefinition().asProcessor().process(null)); + () -> new Locate(EMPTY, l(5), l("foobarbar"), l(3)).makePipe().asProcessor().process(null)); assertEquals("A string/char is required; received [5]", siae.getMessage()); siae = expectThrows(SqlIllegalArgumentException.class, - () -> new Locate(EMPTY, l("foo"), l(1), l(3)).makeProcessorDefinition().asProcessor().process(null)); + () -> new Locate(EMPTY, l("foo"), l(1), l(3)).makePipe().asProcessor().process(null)); assertEquals("A string/char is required; received [1]", siae.getMessage()); siae = expectThrows(SqlIllegalArgumentException.class, - () -> new Locate(EMPTY, l("foobarbar"), l("bar"), l('c')).makeProcessorDefinition().asProcessor().process(null)); + () -> new Locate(EMPTY, l("foobarbar"), l("bar"), l('c')).makePipe().asProcessor().process(null)); assertEquals("A number is required; received [c]", siae.getMessage()); } } diff --git a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/ReplaceFunctionProcessorDefinitionTests.java b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/ReplaceFunctionPipeTests.java similarity index 54% rename from x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/ReplaceFunctionProcessorDefinitionTests.java rename to x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/ReplaceFunctionPipeTests.java index 14e9e51f47107..bdc45f50ed216 100644 --- a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/ReplaceFunctionProcessorDefinitionTests.java +++ b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/ReplaceFunctionPipeTests.java @@ -8,7 +8,7 @@ import org.elasticsearch.xpack.sql.expression.Expression; import org.elasticsearch.xpack.sql.expression.function.scalar.FunctionTestUtils.Combinations; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinition; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; import org.elasticsearch.xpack.sql.tree.AbstractNodeTestCase; import org.elasticsearch.xpack.sql.tree.Location; @@ -18,37 +18,37 @@ import java.util.Objects; import java.util.function.Function; +import static org.elasticsearch.xpack.sql.expression.Expressions.pipe; import static org.elasticsearch.xpack.sql.expression.function.scalar.FunctionTestUtils.randomStringLiteral; -import static org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinitions.toProcessorDefinition; import static org.elasticsearch.xpack.sql.tree.LocationTests.randomLocation; -public class ReplaceFunctionProcessorDefinitionTests extends AbstractNodeTestCase { +public class ReplaceFunctionPipeTests extends AbstractNodeTestCase { @Override - protected ReplaceFunctionProcessorDefinition randomInstance() { - return randomReplaceFunctionProcessorDefinition(); + protected ReplaceFunctionPipe randomInstance() { + return randomReplaceFunctionPipe(); } private Expression randomReplaceFunctionExpression() { - return randomReplaceFunctionProcessorDefinition().expression(); + return randomReplaceFunctionPipe().expression(); } - public static ReplaceFunctionProcessorDefinition randomReplaceFunctionProcessorDefinition() { - return (ReplaceFunctionProcessorDefinition) (new Replace(randomLocation(), + public static ReplaceFunctionPipe randomReplaceFunctionPipe() { + return (ReplaceFunctionPipe) (new Replace(randomLocation(), randomStringLiteral(), randomStringLiteral(), randomStringLiteral()) - .makeProcessorDefinition()); + .makePipe()); } @Override public void testTransform() { // test transforming only the properties (location, expression), // skipping the children (the two parameters of the binary function) which are tested separately - ReplaceFunctionProcessorDefinition b1 = randomInstance(); + ReplaceFunctionPipe b1 = randomInstance(); Expression newExpression = randomValueOtherThan(b1.expression(), () -> randomReplaceFunctionExpression()); - ReplaceFunctionProcessorDefinition newB = new ReplaceFunctionProcessorDefinition( + ReplaceFunctionPipe newB = new ReplaceFunctionPipe( b1.location(), newExpression, b1.source(), @@ -56,9 +56,9 @@ public void testTransform() { b1.replacement()); assertEquals(newB, b1.transformPropertiesOnly(v -> Objects.equals(v, b1.expression()) ? newExpression : v, Expression.class)); - ReplaceFunctionProcessorDefinition b2 = randomInstance(); + ReplaceFunctionPipe b2 = randomInstance(); Location newLoc = randomValueOtherThan(b2.location(), () -> randomLocation()); - newB = new ReplaceFunctionProcessorDefinition( + newB = new ReplaceFunctionPipe( newLoc, b2.expression(), b2.source(), @@ -70,18 +70,18 @@ public void testTransform() { @Override public void testReplaceChildren() { - ReplaceFunctionProcessorDefinition b = randomInstance(); - ProcessorDefinition newSource = toProcessorDefinition((Expression) randomValueOtherThan(b.source(), () -> randomStringLiteral())); - ProcessorDefinition newPattern = toProcessorDefinition((Expression) randomValueOtherThan(b.pattern(), () -> randomStringLiteral())); - ProcessorDefinition newR = toProcessorDefinition((Expression) randomValueOtherThan(b.replacement(), () -> randomStringLiteral())); - ReplaceFunctionProcessorDefinition newB = - new ReplaceFunctionProcessorDefinition(b.location(), b.expression(), b.source(), b.pattern(), b.replacement()); - ReplaceFunctionProcessorDefinition transformed = null; + ReplaceFunctionPipe b = randomInstance(); + Pipe newSource = pipe(((Expression) randomValueOtherThan(b.source(), () -> randomStringLiteral()))); + Pipe newPattern = pipe(((Expression) randomValueOtherThan(b.pattern(), () -> randomStringLiteral()))); + Pipe newR = pipe(((Expression) randomValueOtherThan(b.replacement(), () -> randomStringLiteral()))); + ReplaceFunctionPipe newB = + new ReplaceFunctionPipe(b.location(), b.expression(), b.source(), b.pattern(), b.replacement()); + ReplaceFunctionPipe transformed = null; // generate all the combinations of possible children modifications and test all of them for(int i = 1; i < 4; i++) { for(BitSet comb : new Combinations(3, i)) { - transformed = (ReplaceFunctionProcessorDefinition) newB.replaceChildren( + transformed = (ReplaceFunctionPipe) newB.replaceChildren( comb.get(0) ? newSource : b.source(), comb.get(1) ? newPattern : b.pattern(), comb.get(2) ? newR : b.replacement()); @@ -96,19 +96,19 @@ public void testReplaceChildren() { } @Override - protected ReplaceFunctionProcessorDefinition mutate(ReplaceFunctionProcessorDefinition instance) { - List> randoms = new ArrayList<>(); + protected ReplaceFunctionPipe mutate(ReplaceFunctionPipe instance) { + List> randoms = new ArrayList<>(); for(int i = 1; i < 4; i++) { for(BitSet comb : new Combinations(3, i)) { - randoms.add(f -> new ReplaceFunctionProcessorDefinition(f.location(), + randoms.add(f -> new ReplaceFunctionPipe(f.location(), f.expression(), - comb.get(0) ? toProcessorDefinition((Expression) randomValueOtherThan(f.source(), - () -> randomStringLiteral())) : f.source(), - comb.get(1) ? toProcessorDefinition((Expression) randomValueOtherThan(f.pattern(), - () -> randomStringLiteral())) : f.pattern(), - comb.get(2) ? toProcessorDefinition((Expression) randomValueOtherThan(f.replacement(), - () -> randomStringLiteral())) : f.replacement())); + comb.get(0) ? pipe(((Expression) randomValueOtherThan(f.source(), + () -> randomStringLiteral()))) : f.source(), + comb.get(1) ? pipe(((Expression) randomValueOtherThan(f.pattern(), + () -> randomStringLiteral()))) : f.pattern(), + comb.get(2) ? pipe(((Expression) randomValueOtherThan(f.replacement(), + () -> randomStringLiteral()))) : f.replacement())); } } @@ -116,8 +116,8 @@ protected ReplaceFunctionProcessorDefinition mutate(ReplaceFunctionProcessorDefi } @Override - protected ReplaceFunctionProcessorDefinition copy(ReplaceFunctionProcessorDefinition instance) { - return new ReplaceFunctionProcessorDefinition(instance.location(), + protected ReplaceFunctionPipe copy(ReplaceFunctionPipe instance) { + return new ReplaceFunctionPipe(instance.location(), instance.expression(), instance.source(), instance.pattern(), diff --git a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/ReplaceProcessorTests.java b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/ReplaceProcessorTests.java index 77c84d5e7f4a3..49a7dd78fee78 100644 --- a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/ReplaceProcessorTests.java +++ b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/ReplaceProcessorTests.java @@ -11,7 +11,7 @@ import org.elasticsearch.test.AbstractWireSerializingTestCase; import org.elasticsearch.xpack.sql.SqlIllegalArgumentException; import org.elasticsearch.xpack.sql.expression.function.scalar.Processors; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.ConstantProcessor; +import org.elasticsearch.xpack.sql.expression.gen.processor.ConstantProcessor; import static org.elasticsearch.xpack.sql.tree.Location.EMPTY; import static org.elasticsearch.xpack.sql.expression.function.scalar.FunctionTestUtils.l; @@ -38,29 +38,29 @@ protected NamedWriteableRegistry getNamedWriteableRegistry() { public void testReplaceFunctionWithValidInput() { assertEquals("foobazbaz", - new Replace(EMPTY, l("foobarbar"), l("bar"), l("baz")).makeProcessorDefinition().asProcessor().process(null)); - assertEquals("foobXrbXr", new Replace(EMPTY, l("foobarbar"), l('a'), l('X')).makeProcessorDefinition().asProcessor().process(null)); - assertEquals("z", new Replace(EMPTY, l('f'), l('f'), l('z')).makeProcessorDefinition().asProcessor().process(null)); + new Replace(EMPTY, l("foobarbar"), l("bar"), l("baz")).makePipe().asProcessor().process(null)); + assertEquals("foobXrbXr", new Replace(EMPTY, l("foobarbar"), l('a'), l('X')).makePipe().asProcessor().process(null)); + assertEquals("z", new Replace(EMPTY, l('f'), l('f'), l('z')).makePipe().asProcessor().process(null)); } public void testReplaceFunctionWithEdgeCases() { assertEquals("foobarbar", - new Replace(EMPTY, l("foobarbar"), l("bar"), l(null)).makeProcessorDefinition().asProcessor().process(null)); + new Replace(EMPTY, l("foobarbar"), l("bar"), l(null)).makePipe().asProcessor().process(null)); assertEquals("foobarbar", - new Replace(EMPTY, l("foobarbar"), l(null), l("baz")).makeProcessorDefinition().asProcessor().process(null)); - assertNull(new Replace(EMPTY, l(null), l("bar"), l("baz")).makeProcessorDefinition().asProcessor().process(null)); - assertNull(new Replace(EMPTY, l(null), l(null), l(null)).makeProcessorDefinition().asProcessor().process(null)); + new Replace(EMPTY, l("foobarbar"), l(null), l("baz")).makePipe().asProcessor().process(null)); + assertNull(new Replace(EMPTY, l(null), l("bar"), l("baz")).makePipe().asProcessor().process(null)); + assertNull(new Replace(EMPTY, l(null), l(null), l(null)).makePipe().asProcessor().process(null)); } public void testReplaceFunctionInputsValidation() { SqlIllegalArgumentException siae = expectThrows(SqlIllegalArgumentException.class, - () -> new Replace(EMPTY, l(5), l("bar"), l("baz")).makeProcessorDefinition().asProcessor().process(null)); + () -> new Replace(EMPTY, l(5), l("bar"), l("baz")).makePipe().asProcessor().process(null)); assertEquals("A string/char is required; received [5]", siae.getMessage()); siae = expectThrows(SqlIllegalArgumentException.class, - () -> new Replace(EMPTY, l("foobarbar"), l(4), l("baz")).makeProcessorDefinition().asProcessor().process(null)); + () -> new Replace(EMPTY, l("foobarbar"), l(4), l("baz")).makePipe().asProcessor().process(null)); assertEquals("A string/char is required; received [4]", siae.getMessage()); siae = expectThrows(SqlIllegalArgumentException.class, - () -> new Replace(EMPTY, l("foobarbar"), l("bar"), l(3)).makeProcessorDefinition().asProcessor().process(null)); + () -> new Replace(EMPTY, l("foobarbar"), l("bar"), l(3)).makePipe().asProcessor().process(null)); assertEquals("A string/char is required; received [3]", siae.getMessage()); } } diff --git a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/SubstringFunctionProcessorDefinitionTests.java b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/SubstringFunctionPipeTests.java similarity index 50% rename from x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/SubstringFunctionProcessorDefinitionTests.java rename to x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/SubstringFunctionPipeTests.java index 250949123a9b2..3218339484e78 100644 --- a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/SubstringFunctionProcessorDefinitionTests.java +++ b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/SubstringFunctionPipeTests.java @@ -8,7 +8,7 @@ import org.elasticsearch.xpack.sql.expression.Expression; import org.elasticsearch.xpack.sql.expression.function.scalar.FunctionTestUtils.Combinations; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinition; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; import org.elasticsearch.xpack.sql.tree.AbstractNodeTestCase; import org.elasticsearch.xpack.sql.tree.Location; @@ -18,71 +18,71 @@ import java.util.Objects; import java.util.function.Function; +import static org.elasticsearch.xpack.sql.expression.Expressions.pipe; import static org.elasticsearch.xpack.sql.expression.function.scalar.FunctionTestUtils.randomIntLiteral; import static org.elasticsearch.xpack.sql.expression.function.scalar.FunctionTestUtils.randomStringLiteral; -import static org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.ProcessorDefinitions.toProcessorDefinition; import static org.elasticsearch.xpack.sql.tree.LocationTests.randomLocation; -public class SubstringFunctionProcessorDefinitionTests - extends AbstractNodeTestCase { +public class SubstringFunctionPipeTests + extends AbstractNodeTestCase { @Override - protected SubstringFunctionProcessorDefinition randomInstance() { - return randomSubstringFunctionProcessorDefinition(); + protected SubstringFunctionPipe randomInstance() { + return randomSubstringFunctionPipe(); } - private Expression randomSubstringFunctionExpression() { - return randomSubstringFunctionProcessorDefinition().expression(); + private Expression randomSubstringFunctionExpression() { + return randomSubstringFunctionPipe().expression(); } - public static SubstringFunctionProcessorDefinition randomSubstringFunctionProcessorDefinition() { - return (SubstringFunctionProcessorDefinition) (new Substring(randomLocation(), - randomStringLiteral(), + public static SubstringFunctionPipe randomSubstringFunctionPipe() { + return (SubstringFunctionPipe) (new Substring(randomLocation(), + randomStringLiteral(), randomIntLiteral(), randomIntLiteral()) - .makeProcessorDefinition()); + .makePipe()); } @Override public void testTransform() { - // test transforming only the properties (location, expression), + // test transforming only the properties (location, expression), // skipping the children (the two parameters of the binary function) which are tested separately - SubstringFunctionProcessorDefinition b1 = randomInstance(); + SubstringFunctionPipe b1 = randomInstance(); Expression newExpression = randomValueOtherThan(b1.expression(), () -> randomSubstringFunctionExpression()); - SubstringFunctionProcessorDefinition newB = new SubstringFunctionProcessorDefinition( - b1.location(), + SubstringFunctionPipe newB = new SubstringFunctionPipe( + b1.location(), newExpression, - b1.source(), + b1.source(), b1.start(), b1.length()); assertEquals(newB, b1.transformPropertiesOnly(v -> Objects.equals(v, b1.expression()) ? newExpression : v, Expression.class)); - SubstringFunctionProcessorDefinition b2 = randomInstance(); + SubstringFunctionPipe b2 = randomInstance(); Location newLoc = randomValueOtherThan(b2.location(), () -> randomLocation()); - newB = new SubstringFunctionProcessorDefinition( - newLoc, + newB = new SubstringFunctionPipe( + newLoc, b2.expression(), - b2.source(), + b2.source(), b2.start(), b2.length()); - assertEquals(newB, + assertEquals(newB, b2.transformPropertiesOnly(v -> Objects.equals(v, b2.location()) ? newLoc : v, Location.class)); } @Override public void testReplaceChildren() { - SubstringFunctionProcessorDefinition b = randomInstance(); - ProcessorDefinition newSource = toProcessorDefinition((Expression) randomValueOtherThan(b.source(), () -> randomStringLiteral())); - ProcessorDefinition newStart = toProcessorDefinition((Expression) randomValueOtherThan(b.start(), () -> randomIntLiteral())); - ProcessorDefinition newLength = toProcessorDefinition((Expression) randomValueOtherThan(b.length(), () -> randomIntLiteral())); - SubstringFunctionProcessorDefinition newB = - new SubstringFunctionProcessorDefinition(b.location(), b.expression(), b.source(), b.start(), b.length()); - SubstringFunctionProcessorDefinition transformed = null; + SubstringFunctionPipe b = randomInstance(); + Pipe newSource = pipe(((Expression) randomValueOtherThan(b.source(), () -> randomStringLiteral()))); + Pipe newStart = pipe(((Expression) randomValueOtherThan(b.start(), () -> randomIntLiteral()))); + Pipe newLength = pipe(((Expression) randomValueOtherThan(b.length(), () -> randomIntLiteral()))); + SubstringFunctionPipe newB = + new SubstringFunctionPipe(b.location(), b.expression(), b.source(), b.start(), b.length()); + SubstringFunctionPipe transformed = null; // generate all the combinations of possible children modifications and test all of them for(int i = 1; i < 4; i++) { for(BitSet comb : new Combinations(3, i)) { - transformed = (SubstringFunctionProcessorDefinition) newB.replaceChildren( + transformed = (SubstringFunctionPipe) newB.replaceChildren( comb.get(0) ? newSource : b.source(), comb.get(1) ? newStart : b.start(), comb.get(2) ? newLength : b.length()); @@ -96,20 +96,20 @@ public void testReplaceChildren() { } @Override - protected SubstringFunctionProcessorDefinition mutate(SubstringFunctionProcessorDefinition instance) { - List> randoms = new ArrayList<>(); + protected SubstringFunctionPipe mutate(SubstringFunctionPipe instance) { + List> randoms = new ArrayList<>(); for(int i = 1; i < 4; i++) { for(BitSet comb : new Combinations(3, i)) { - randoms.add(f -> new SubstringFunctionProcessorDefinition( + randoms.add(f -> new SubstringFunctionPipe( f.location(), - f.expression(), - comb.get(0) ? toProcessorDefinition((Expression) randomValueOtherThan(f.source(), - () -> randomStringLiteral())) : f.source(), - comb.get(1) ? toProcessorDefinition((Expression) randomValueOtherThan(f.start(), - () -> randomIntLiteral())) : f.start(), - comb.get(2) ? toProcessorDefinition((Expression) randomValueOtherThan(f.length(), - () -> randomIntLiteral())): f.length())); + f.expression(), + comb.get(0) ? pipe(((Expression) randomValueOtherThan(f.source(), + () -> randomStringLiteral()))) : f.source(), + comb.get(1) ? pipe(((Expression) randomValueOtherThan(f.start(), + () -> randomIntLiteral()))) : f.start(), + comb.get(2) ? pipe(((Expression) randomValueOtherThan(f.length(), + () -> randomIntLiteral()))): f.length())); } } @@ -117,8 +117,8 @@ protected SubstringFunctionProcessorDefinition mutate(SubstringFunctionProcessor } @Override - protected SubstringFunctionProcessorDefinition copy(SubstringFunctionProcessorDefinition instance) { - return new SubstringFunctionProcessorDefinition(instance.location(), + protected SubstringFunctionPipe copy(SubstringFunctionPipe instance) { + return new SubstringFunctionPipe(instance.location(), instance.expression(), instance.source(), instance.start(), diff --git a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/SubstringProcessorTests.java b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/SubstringProcessorTests.java index 8afc63a05dac4..bb22f005fe799 100644 --- a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/SubstringProcessorTests.java +++ b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/SubstringProcessorTests.java @@ -11,7 +11,7 @@ import org.elasticsearch.test.AbstractWireSerializingTestCase; import org.elasticsearch.xpack.sql.SqlIllegalArgumentException; import org.elasticsearch.xpack.sql.expression.function.scalar.Processors; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.ConstantProcessor; +import org.elasticsearch.xpack.sql.expression.gen.processor.ConstantProcessor; import static org.elasticsearch.xpack.sql.tree.Location.EMPTY; import static org.elasticsearch.xpack.sql.expression.function.scalar.FunctionTestUtils.l; @@ -37,39 +37,39 @@ protected NamedWriteableRegistry getNamedWriteableRegistry() { } public void testSubstringFunctionWithValidInput() { - assertEquals("bar", new Substring(EMPTY, l("foobarbar"), l(4), l(3)).makeProcessorDefinition().asProcessor().process(null)); - assertEquals("foo", new Substring(EMPTY, l("foobarbar"), l(1), l(3)).makeProcessorDefinition().asProcessor().process(null)); - assertEquals("baz", new Substring(EMPTY, l("foobarbaz"), l(7), l(3)).makeProcessorDefinition().asProcessor().process(null)); - assertEquals("f", new Substring(EMPTY, l('f'), l(1), l(1)).makeProcessorDefinition().asProcessor().process(null)); + assertEquals("bar", new Substring(EMPTY, l("foobarbar"), l(4), l(3)).makePipe().asProcessor().process(null)); + assertEquals("foo", new Substring(EMPTY, l("foobarbar"), l(1), l(3)).makePipe().asProcessor().process(null)); + assertEquals("baz", new Substring(EMPTY, l("foobarbaz"), l(7), l(3)).makePipe().asProcessor().process(null)); + assertEquals("f", new Substring(EMPTY, l('f'), l(1), l(1)).makePipe().asProcessor().process(null)); } public void testSubstringFunctionWithEdgeCases() { assertEquals("foobarbar", - new Substring(EMPTY, l("foobarbar"), l(1), l(null)).makeProcessorDefinition().asProcessor().process(null)); + new Substring(EMPTY, l("foobarbar"), l(1), l(null)).makePipe().asProcessor().process(null)); assertEquals("foobarbar", - new Substring(EMPTY, l("foobarbar"), l(null), l(3)).makeProcessorDefinition().asProcessor().process(null)); - assertNull(new Substring(EMPTY, l(null), l(1), l(3)).makeProcessorDefinition().asProcessor().process(null)); - assertNull(new Substring(EMPTY, l(null), l(null), l(null)).makeProcessorDefinition().asProcessor().process(null)); + new Substring(EMPTY, l("foobarbar"), l(null), l(3)).makePipe().asProcessor().process(null)); + assertNull(new Substring(EMPTY, l(null), l(1), l(3)).makePipe().asProcessor().process(null)); + assertNull(new Substring(EMPTY, l(null), l(null), l(null)).makePipe().asProcessor().process(null)); - assertEquals("foo", new Substring(EMPTY, l("foobarbar"), l(-5), l(3)).makeProcessorDefinition().asProcessor().process(null)); - assertEquals("barbar", new Substring(EMPTY, l("foobarbar"), l(4), l(30)).makeProcessorDefinition().asProcessor().process(null)); - assertEquals("r", new Substring(EMPTY, l("foobarbar"), l(9), l(1)).makeProcessorDefinition().asProcessor().process(null)); - assertEquals("", new Substring(EMPTY, l("foobarbar"), l(10), l(1)).makeProcessorDefinition().asProcessor().process(null)); - assertEquals("", new Substring(EMPTY, l("foobarbar"), l(123), l(3)).makeProcessorDefinition().asProcessor().process(null)); + assertEquals("foo", new Substring(EMPTY, l("foobarbar"), l(-5), l(3)).makePipe().asProcessor().process(null)); + assertEquals("barbar", new Substring(EMPTY, l("foobarbar"), l(4), l(30)).makePipe().asProcessor().process(null)); + assertEquals("r", new Substring(EMPTY, l("foobarbar"), l(9), l(1)).makePipe().asProcessor().process(null)); + assertEquals("", new Substring(EMPTY, l("foobarbar"), l(10), l(1)).makePipe().asProcessor().process(null)); + assertEquals("", new Substring(EMPTY, l("foobarbar"), l(123), l(3)).makePipe().asProcessor().process(null)); } public void testSubstringFunctionInputsValidation() { SqlIllegalArgumentException siae = expectThrows(SqlIllegalArgumentException.class, - () -> new Substring(EMPTY, l(5), l(1), l(3)).makeProcessorDefinition().asProcessor().process(null)); + () -> new Substring(EMPTY, l(5), l(1), l(3)).makePipe().asProcessor().process(null)); assertEquals("A string/char is required; received [5]", siae.getMessage()); siae = expectThrows(SqlIllegalArgumentException.class, - () -> new Substring(EMPTY, l("foobarbar"), l(1), l("baz")).makeProcessorDefinition().asProcessor().process(null)); + () -> new Substring(EMPTY, l("foobarbar"), l(1), l("baz")).makePipe().asProcessor().process(null)); assertEquals("A number is required; received [baz]", siae.getMessage()); siae = expectThrows(SqlIllegalArgumentException.class, - () -> new Substring(EMPTY, l("foobarbar"), l("bar"), l(3)).makeProcessorDefinition().asProcessor().process(null)); + () -> new Substring(EMPTY, l("foobarbar"), l("bar"), l(3)).makePipe().asProcessor().process(null)); assertEquals("A number is required; received [bar]", siae.getMessage()); siae = expectThrows(SqlIllegalArgumentException.class, - () -> new Substring(EMPTY, l("foobarbar"), l(1), l(-3)).makeProcessorDefinition().asProcessor().process(null)); + () -> new Substring(EMPTY, l("foobarbar"), l(1), l(-3)).makePipe().asProcessor().process(null)); assertEquals("A positive number is required for [length]; received [-3]", siae.getMessage()); } } diff --git a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/AttributeInputTests.java b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/AttributeInputTests.java similarity index 83% rename from x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/AttributeInputTests.java rename to x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/AttributeInputTests.java index 7378675075dd9..6d3bcbbe25ac0 100644 --- a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/definition/AttributeInputTests.java +++ b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/AttributeInputTests.java @@ -3,12 +3,14 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition; +package org.elasticsearch.xpack.sql.expression.gen.pipeline; import org.elasticsearch.test.ESTestCase; import org.elasticsearch.xpack.sql.execution.search.FieldExtraction; import org.elasticsearch.xpack.sql.expression.Attribute; import org.elasticsearch.xpack.sql.expression.Expression; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.AttributeInput; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.ReferenceInput; import static org.mockito.Mockito.mock; diff --git a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/BinaryPipesTests.java b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/BinaryPipesTests.java new file mode 100644 index 0000000000000..e786b4345f8ff --- /dev/null +++ b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/BinaryPipesTests.java @@ -0,0 +1,163 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +package org.elasticsearch.xpack.sql.expression.gen.pipeline; + +import org.elasticsearch.search.builder.SearchSourceBuilder; +import org.elasticsearch.test.ESTestCase; +import org.elasticsearch.xpack.sql.execution.search.SqlSourceBuilder; +import org.elasticsearch.xpack.sql.expression.Literal; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe.AttributeResolver; +import org.elasticsearch.xpack.sql.expression.gen.processor.Processor; +import org.elasticsearch.xpack.sql.tree.Location; +import org.elasticsearch.xpack.sql.tree.NodeInfo; + +import java.util.List; + +import static java.util.Collections.emptyList; + +public class BinaryPipesTests extends ESTestCase { + public void testSupportedByAggsOnlyQuery() { + Pipe supported = new DummyPipe(true); + Pipe unsupported = new DummyPipe(false); + + assertFalse(new DummyBinaryPipe(unsupported, unsupported).supportedByAggsOnlyQuery()); + assertFalse(new DummyBinaryPipe(unsupported, supported).supportedByAggsOnlyQuery()); + assertFalse(new DummyBinaryPipe(supported, unsupported).supportedByAggsOnlyQuery()); + assertTrue(new DummyBinaryPipe(supported, supported).supportedByAggsOnlyQuery()); + } + + public void testResolveAttributes() { + Pipe needsNothing = new DummyPipe(randomBoolean()); + Pipe resolvesTo = new DummyPipe(randomBoolean()); + Pipe needsResolution = new DummyPipe(randomBoolean()) { + @Override + public Pipe resolveAttributes(AttributeResolver resolver) { + return resolvesTo; + } + }; + AttributeResolver resolver = a -> { + fail("not exepected"); + return null; + }; + + Pipe d = new DummyBinaryPipe(needsNothing, needsNothing); + assertSame(d, d.resolveAttributes(resolver)); + + d = new DummyBinaryPipe(needsNothing, needsResolution); + Pipe expected = new DummyBinaryPipe(needsNothing, resolvesTo); + assertEquals(expected, d.resolveAttributes(resolver)); + + d = new DummyBinaryPipe(needsResolution, needsNothing); + expected = new DummyBinaryPipe(resolvesTo, needsNothing); + assertEquals(expected, d.resolveAttributes(resolver)); + } + + public void testCollectFields() { + DummyPipe wantsScore = new DummyPipe(randomBoolean()) { + @Override + public void collectFields(SqlSourceBuilder sourceBuilder) { + sourceBuilder.trackScores(); + } + }; + DummyPipe wantsNothing = new DummyPipe(randomBoolean()); + assertFalse(tracksScores(new DummyBinaryPipe(wantsNothing, wantsNothing))); + assertTrue(tracksScores(new DummyBinaryPipe(wantsScore, wantsNothing))); + assertTrue(tracksScores(new DummyBinaryPipe(wantsNothing, wantsScore))); + } + + /** + * Returns {@code true} if the processor defintion builds a query that + * tracks scores, {@code false} otherwise. Used for testing + * {@link Pipe#collectFields(SqlSourceBuilder)}. + */ + static boolean tracksScores(Pipe d) { + SqlSourceBuilder b = new SqlSourceBuilder(); + d.collectFields(b); + SearchSourceBuilder source = new SearchSourceBuilder(); + b.build(source); + return source.trackScores(); + } + + public static BinaryPipe randomBinaryPipe() { + return new DummyBinaryPipe(randomUnaryPipe(), randomUnaryPipe()); + } + + public static Pipe randomUnaryPipe() { + return new ConstantInput(Location.EMPTY, Literal.of(Location.EMPTY, randomAlphaOfLength(16)), randomAlphaOfLength(16)); + } + + public static final class DummyBinaryPipe extends BinaryPipe { + public DummyBinaryPipe(Pipe left, Pipe right) { + this(Location.EMPTY, left, right); + } + + public DummyBinaryPipe(Location location, Pipe left, Pipe right) { + super(location, null, left, right); + } + + @Override + protected NodeInfo info() { + return NodeInfo.create(this, DummyBinaryPipe::new, left(), right()); + } + + @Override + public Processor asProcessor() { + return null; + } + + @Override + protected BinaryPipe replaceChildren(Pipe left, Pipe right) { + return new DummyBinaryPipe(location(), left, right); + } + } + + public static class DummyPipe extends Pipe { + private final boolean supportedByAggsOnlyQuery; + + public DummyPipe(boolean supportedByAggsOnlyQuery) { + this(Location.EMPTY, supportedByAggsOnlyQuery); + } + + public DummyPipe(Location location, boolean supportedByAggsOnlyQuery) { + super(location, null, emptyList()); + this.supportedByAggsOnlyQuery = supportedByAggsOnlyQuery; + } + + @Override + protected NodeInfo info() { + return NodeInfo.create(this, DummyPipe::new, supportedByAggsOnlyQuery); + } + + @Override + public Pipe replaceChildren(List newChildren) { + throw new UnsupportedOperationException("this type of node doesn't have any children to replace"); + } + + @Override + public boolean supportedByAggsOnlyQuery() { + return supportedByAggsOnlyQuery; + } + + @Override + public boolean resolved() { + return true; + } + + @Override + public Processor asProcessor() { + return null; + } + + @Override + public Pipe resolveAttributes(AttributeResolver resolver) { + return this; + } + + @Override + public void collectFields(SqlSourceBuilder sourceBuilder) { + } + } +} \ No newline at end of file diff --git a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/UnaryPipeTests.java b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/UnaryPipeTests.java new file mode 100644 index 0000000000000..f1c24ae2bd472 --- /dev/null +++ b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/UnaryPipeTests.java @@ -0,0 +1,64 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +package org.elasticsearch.xpack.sql.expression.gen.pipeline; + +import org.elasticsearch.test.ESTestCase; +import org.elasticsearch.xpack.sql.execution.search.SqlSourceBuilder; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.UnaryPipe; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.BinaryPipesTests.DummyPipe; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe.AttributeResolver; +import org.elasticsearch.xpack.sql.tree.Location; + +import static org.elasticsearch.xpack.sql.expression.gen.pipeline.BinaryPipesTests.tracksScores; + +public class UnaryPipeTests extends ESTestCase { + public void testSupportedByAggsOnlyQuery() { + Pipe supported = new DummyPipe(true); + Pipe unsupported = new DummyPipe(false); + + assertFalse(newUnaryProcessor(unsupported).supportedByAggsOnlyQuery()); + assertTrue(newUnaryProcessor(supported).supportedByAggsOnlyQuery()); + } + + public void testResolveAttributes() { + Pipe needsNothing = new DummyPipe(randomBoolean()); + Pipe resolvesTo = new DummyPipe(randomBoolean()); + Pipe needsResolution = new DummyPipe(randomBoolean()) { + @Override + public Pipe resolveAttributes(AttributeResolver resolver) { + return resolvesTo; + } + }; + AttributeResolver resolver = a -> { + fail("not exepected"); + return null; + }; + + Pipe d = newUnaryProcessor(needsNothing); + assertSame(d, d.resolveAttributes(resolver)); + + d = newUnaryProcessor(needsResolution); + Pipe expected = newUnaryProcessor(resolvesTo); + assertEquals(expected, d.resolveAttributes(resolver)); + } + + public void testCollectFields() { + DummyPipe wantsScore = new DummyPipe(randomBoolean()) { + @Override + public void collectFields(SqlSourceBuilder sourceBuilder) { + sourceBuilder.trackScores(); + } + }; + DummyPipe wantsNothing = new DummyPipe(randomBoolean()); + assertFalse(tracksScores(newUnaryProcessor(wantsNothing))); + assertTrue(tracksScores(newUnaryProcessor(wantsScore))); + } + + private Pipe newUnaryProcessor(Pipe child) { + return new UnaryPipe(Location.EMPTY, null, child, null); + } +} diff --git a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/runtime/ChainingProcessorTests.java b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/gen/processor/ChainingProcessorTests.java similarity index 92% rename from x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/runtime/ChainingProcessorTests.java rename to x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/gen/processor/ChainingProcessorTests.java index a7440ba53774d..98ad0daa82395 100644 --- a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/runtime/ChainingProcessorTests.java +++ b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/gen/processor/ChainingProcessorTests.java @@ -3,12 +3,13 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime; +package org.elasticsearch.xpack.sql.expression.gen.processor; import org.elasticsearch.common.io.stream.NamedWriteableRegistry; import org.elasticsearch.common.io.stream.Writeable.Reader; import org.elasticsearch.test.AbstractWireSerializingTestCase; import org.elasticsearch.xpack.sql.expression.function.scalar.Processors; +import org.elasticsearch.xpack.sql.expression.gen.processor.ChainingProcessor; import java.io.IOException; import java.util.function.Supplier; diff --git a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/runtime/ConstantProcessorTests.java b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/gen/processor/ConstantProcessorTests.java similarity index 90% rename from x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/runtime/ConstantProcessorTests.java rename to x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/gen/processor/ConstantProcessorTests.java index b26cf8edc1cb7..5354dbd9ed116 100644 --- a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/processor/runtime/ConstantProcessorTests.java +++ b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/gen/processor/ConstantProcessorTests.java @@ -3,10 +3,11 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime; +package org.elasticsearch.xpack.sql.expression.gen.processor; import org.elasticsearch.common.io.stream.Writeable.Reader; import org.elasticsearch.test.AbstractWireSerializingTestCase; +import org.elasticsearch.xpack.sql.expression.gen.processor.ConstantProcessor; import java.io.IOException; diff --git a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/predicate/fulltext/FullTextUtilsTests.java b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/predicate/fulltext/FullTextUtilsTests.java index 7dd08e9c34cef..058cfeabb2c34 100644 --- a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/predicate/fulltext/FullTextUtilsTests.java +++ b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/predicate/fulltext/FullTextUtilsTests.java @@ -6,6 +6,7 @@ package org.elasticsearch.xpack.sql.expression.predicate.fulltext; import org.elasticsearch.test.ESTestCase; +import org.elasticsearch.xpack.sql.expression.predicate.fulltext.FullTextUtils; import org.elasticsearch.xpack.sql.parser.ParsingException; import org.elasticsearch.xpack.sql.tree.Location; diff --git a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/arithmetic/BinaryArithmeticProcessorTests.java b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/predicate/operator/arithmetic/BinaryArithmeticProcessorTests.java similarity index 57% rename from x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/arithmetic/BinaryArithmeticProcessorTests.java rename to x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/predicate/operator/arithmetic/BinaryArithmeticProcessorTests.java index 7baba683d7432..ee021f056f829 100644 --- a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/arithmetic/BinaryArithmeticProcessorTests.java +++ b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/predicate/operator/arithmetic/BinaryArithmeticProcessorTests.java @@ -3,7 +3,7 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -package org.elasticsearch.xpack.sql.expression.function.scalar.arithmetic; +package org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic; import org.elasticsearch.common.io.stream.NamedWriteableRegistry; import org.elasticsearch.common.io.stream.Writeable.Reader; @@ -11,8 +11,15 @@ import org.elasticsearch.xpack.sql.expression.Expression; import org.elasticsearch.xpack.sql.expression.Literal; import org.elasticsearch.xpack.sql.expression.function.scalar.Processors; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.ConstantProcessor; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.Processor; +import org.elasticsearch.xpack.sql.expression.gen.processor.ConstantProcessor; +import org.elasticsearch.xpack.sql.expression.gen.processor.Processor; +import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.Add; +import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.BinaryArithmeticProcessor; +import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.Div; +import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.Mod; +import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.Mul; +import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.Neg; +import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.Sub; import static org.elasticsearch.xpack.sql.tree.Location.EMPTY; @@ -40,34 +47,34 @@ protected NamedWriteableRegistry getNamedWriteableRegistry() { } public void testAdd() { - Processor ba = new Add(EMPTY, l(7), l(3)).makeProcessorDefinition().asProcessor(); + Processor ba = new Add(EMPTY, l(7), l(3)).makePipe().asProcessor(); assertEquals(10, ba.process(null)); } public void testSub() { - Processor ba = new Sub(EMPTY, l(7), l(3)).makeProcessorDefinition().asProcessor(); + Processor ba = new Sub(EMPTY, l(7), l(3)).makePipe().asProcessor(); assertEquals(4, ba.process(null)); } public void testMul() { - Processor ba = new Mul(EMPTY, l(7), l(3)).makeProcessorDefinition().asProcessor(); + Processor ba = new Mul(EMPTY, l(7), l(3)).makePipe().asProcessor(); assertEquals(21, ba.process(null)); } public void testDiv() { - Processor ba = new Div(EMPTY, l(7), l(3)).makeProcessorDefinition().asProcessor(); + Processor ba = new Div(EMPTY, l(7), l(3)).makePipe().asProcessor(); assertEquals(2, ((Number) ba.process(null)).longValue()); - ba = new Div(EMPTY, l((double) 7), l(3)).makeProcessorDefinition().asProcessor(); + ba = new Div(EMPTY, l((double) 7), l(3)).makePipe().asProcessor(); assertEquals(2.33, ((Number) ba.process(null)).doubleValue(), 0.01d); } public void testMod() { - Processor ba = new Mod(EMPTY, l(7), l(3)).makeProcessorDefinition().asProcessor(); + Processor ba = new Mod(EMPTY, l(7), l(3)).makePipe().asProcessor(); assertEquals(1, ba.process(null)); } public void testNegate() { - Processor ba = new Neg(EMPTY, l(7)).asProcessorDefinition().asProcessor(); + Processor ba = new Neg(EMPTY, l(7)).asPipe().asProcessor(); assertEquals(-7, ba.process(null)); } @@ -79,17 +86,17 @@ public void testTree() { Expression sub = new Sub(EMPTY, div, l(2)); Mod mod = new Mod(EMPTY, sub, l(2)); - Processor proc = mod.makeProcessorDefinition().asProcessor(); + Processor proc = mod.makePipe().asProcessor(); assertEquals(1, proc.process(null)); } public void testHandleNull() { - assertNull(new Add(EMPTY, l(null), l(3)).makeProcessorDefinition().asProcessor().process(null)); - assertNull(new Sub(EMPTY, l(null), l(3)).makeProcessorDefinition().asProcessor().process(null)); - assertNull(new Mul(EMPTY, l(null), l(3)).makeProcessorDefinition().asProcessor().process(null)); - assertNull(new Div(EMPTY, l(null), l(3)).makeProcessorDefinition().asProcessor().process(null)); - assertNull(new Mod(EMPTY, l(null), l(3)).makeProcessorDefinition().asProcessor().process(null)); - assertNull(new Neg(EMPTY, l(null)).makeProcessorDefinition().asProcessor().process(null)); + assertNull(new Add(EMPTY, l(null), l(3)).makePipe().asProcessor().process(null)); + assertNull(new Sub(EMPTY, l(null), l(3)).makePipe().asProcessor().process(null)); + assertNull(new Mul(EMPTY, l(null), l(3)).makePipe().asProcessor().process(null)); + assertNull(new Div(EMPTY, l(null), l(3)).makePipe().asProcessor().process(null)); + assertNull(new Mod(EMPTY, l(null), l(3)).makePipe().asProcessor().process(null)); + assertNull(new Neg(EMPTY, l(null)).makePipe().asProcessor().process(null)); } private static Literal l(Object value) { diff --git a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/predicate/operator/comparison/BinaryComparisonProcessorTests.java b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/predicate/operator/comparison/BinaryComparisonProcessorTests.java new file mode 100644 index 0000000000000..0761ec5f2fa21 --- /dev/null +++ b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/predicate/operator/comparison/BinaryComparisonProcessorTests.java @@ -0,0 +1,86 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +package org.elasticsearch.xpack.sql.expression.predicate.operator.comparison; + +import org.elasticsearch.common.io.stream.NamedWriteableRegistry; +import org.elasticsearch.common.io.stream.Writeable.Reader; +import org.elasticsearch.test.AbstractWireSerializingTestCase; +import org.elasticsearch.xpack.sql.expression.Literal; +import org.elasticsearch.xpack.sql.expression.function.scalar.Processors; +import org.elasticsearch.xpack.sql.expression.gen.processor.ConstantProcessor; +import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.BinaryComparisonProcessor; +import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.Equals; +import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.GreaterThan; +import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.GreaterThanOrEqual; +import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.LessThan; +import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.LessThanOrEqual; + +import static org.elasticsearch.xpack.sql.tree.Location.EMPTY; + +public class BinaryComparisonProcessorTests extends AbstractWireSerializingTestCase { + public static BinaryComparisonProcessor randomProcessor() { + return new BinaryComparisonProcessor( + new ConstantProcessor(randomLong()), + new ConstantProcessor(randomLong()), + randomFrom(BinaryComparisonProcessor.BinaryComparisonOperation.values())); + } + + @Override + protected BinaryComparisonProcessor createTestInstance() { + return randomProcessor(); + } + + @Override + protected Reader instanceReader() { + return BinaryComparisonProcessor::new; + } + + @Override + protected NamedWriteableRegistry getNamedWriteableRegistry() { + return new NamedWriteableRegistry(Processors.getNamedWriteables()); + } + + public void testEq() { + assertEquals(true, new Equals(EMPTY, l(4), l(4)).makePipe().asProcessor().process(null)); + assertEquals(false, new Equals(EMPTY, l(3), l(4)).makePipe().asProcessor().process(null)); + } + + public void testGt() { + assertEquals(true, new GreaterThan(EMPTY, l(4), l(3)).makePipe().asProcessor().process(null)); + assertEquals(false, new GreaterThan(EMPTY, l(3), l(4)).makePipe().asProcessor().process(null)); + assertEquals(false, new GreaterThan(EMPTY, l(3), l(3)).makePipe().asProcessor().process(null)); + } + + public void testGte() { + assertEquals(true, new GreaterThanOrEqual(EMPTY, l(4), l(3)).makePipe().asProcessor().process(null)); + assertEquals(false, new GreaterThanOrEqual(EMPTY, l(3), l(4)).makePipe().asProcessor().process(null)); + assertEquals(true, new GreaterThanOrEqual(EMPTY, l(3), l(3)).makePipe().asProcessor().process(null)); + } + + public void testLt() { + assertEquals(false, new LessThan(EMPTY, l(4), l(3)).makePipe().asProcessor().process(null)); + assertEquals(true, new LessThan(EMPTY, l(3), l(4)).makePipe().asProcessor().process(null)); + assertEquals(false, new LessThan(EMPTY, l(3), l(3)).makePipe().asProcessor().process(null)); + } + + public void testLte() { + assertEquals(false, new LessThanOrEqual(EMPTY, l(4), l(3)).makePipe().asProcessor().process(null)); + assertEquals(true, new LessThanOrEqual(EMPTY, l(3), l(4)).makePipe().asProcessor().process(null)); + assertEquals(true, new LessThanOrEqual(EMPTY, l(3), l(3)).makePipe().asProcessor().process(null)); + } + + public void testHandleNull() { + assertNull(new Equals(EMPTY, l(null), l(3)).makePipe().asProcessor().process(null)); + assertNull(new GreaterThan(EMPTY, l(null), l(3)).makePipe().asProcessor().process(null)); + assertNull(new GreaterThanOrEqual(EMPTY, l(null), l(3)).makePipe().asProcessor().process(null)); + assertNull(new LessThan(EMPTY, l(null), l(3)).makePipe().asProcessor().process(null)); + assertNull(new LessThanOrEqual(EMPTY, l(null), l(3)).makePipe().asProcessor().process(null)); + } + + private static Literal l(Object value) { + return Literal.of(EMPTY, value); + } +} \ No newline at end of file diff --git a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/optimizer/OptimizerTests.java b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/optimizer/OptimizerTests.java index 07349008c077d..cf1f64bd583b2 100644 --- a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/optimizer/OptimizerTests.java +++ b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/optimizer/OptimizerTests.java @@ -18,11 +18,6 @@ import org.elasticsearch.xpack.sql.expression.function.aggregate.AggregateFunction; import org.elasticsearch.xpack.sql.expression.function.aggregate.Count; import org.elasticsearch.xpack.sql.expression.function.scalar.Cast; -import org.elasticsearch.xpack.sql.expression.function.scalar.arithmetic.Add; -import org.elasticsearch.xpack.sql.expression.function.scalar.arithmetic.Div; -import org.elasticsearch.xpack.sql.expression.function.scalar.arithmetic.Mod; -import org.elasticsearch.xpack.sql.expression.function.scalar.arithmetic.Mul; -import org.elasticsearch.xpack.sql.expression.function.scalar.arithmetic.Sub; import org.elasticsearch.xpack.sql.expression.function.scalar.datetime.DayOfMonth; import org.elasticsearch.xpack.sql.expression.function.scalar.datetime.DayOfYear; import org.elasticsearch.xpack.sql.expression.function.scalar.datetime.MonthOfYear; @@ -35,18 +30,24 @@ import org.elasticsearch.xpack.sql.expression.function.scalar.math.E; import org.elasticsearch.xpack.sql.expression.function.scalar.math.Floor; import org.elasticsearch.xpack.sql.expression.predicate.And; -import org.elasticsearch.xpack.sql.expression.predicate.Equals; -import org.elasticsearch.xpack.sql.expression.predicate.GreaterThan; -import org.elasticsearch.xpack.sql.expression.predicate.GreaterThanOrEqual; +import org.elasticsearch.xpack.sql.expression.predicate.BinaryOperator; import org.elasticsearch.xpack.sql.expression.predicate.IsNotNull; -import org.elasticsearch.xpack.sql.expression.predicate.LessThan; -import org.elasticsearch.xpack.sql.expression.predicate.LessThanOrEqual; import org.elasticsearch.xpack.sql.expression.predicate.Not; import org.elasticsearch.xpack.sql.expression.predicate.Or; import org.elasticsearch.xpack.sql.expression.predicate.Range; -import org.elasticsearch.xpack.sql.expression.regex.Like; -import org.elasticsearch.xpack.sql.expression.regex.LikePattern; -import org.elasticsearch.xpack.sql.expression.regex.RLike; +import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.Add; +import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.Div; +import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.Mod; +import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.Mul; +import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.Sub; +import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.Equals; +import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.GreaterThan; +import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.GreaterThanOrEqual; +import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.LessThan; +import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.LessThanOrEqual; +import org.elasticsearch.xpack.sql.expression.predicate.regex.Like; +import org.elasticsearch.xpack.sql.expression.predicate.regex.LikePattern; +import org.elasticsearch.xpack.sql.expression.predicate.regex.RLike; import org.elasticsearch.xpack.sql.optimizer.Optimizer.BinaryComparisonSimplification; import org.elasticsearch.xpack.sql.optimizer.Optimizer.BooleanLiteralsOnTheRight; import org.elasticsearch.xpack.sql.optimizer.Optimizer.BooleanSimplification; @@ -237,12 +238,8 @@ public void testConstantFolding() { Expression exp = new Add(EMPTY, TWO, THREE); assertTrue(exp.foldable()); - assertTrue(exp instanceof NamedExpression); - String n = Expressions.name(exp); - Expression result = new ConstantFolding().rule(exp); assertTrue(result instanceof Literal); - assertEquals(n, Expressions.name(result)); assertEquals(5, ((Literal) result).value()); // check now with an alias @@ -252,21 +249,23 @@ public void testConstantFolding() { } public void testConstantFoldingBinaryComparison() { - assertEquals(Literal.FALSE, new ConstantFolding().rule(new GreaterThan(EMPTY, TWO, THREE))); - assertEquals(Literal.FALSE, new ConstantFolding().rule(new GreaterThanOrEqual(EMPTY, TWO, THREE))); - assertEquals(Literal.FALSE, new ConstantFolding().rule(new Equals(EMPTY, TWO, THREE))); - assertEquals(Literal.TRUE, new ConstantFolding().rule(new LessThanOrEqual(EMPTY, TWO, THREE))); - assertEquals(Literal.TRUE, new ConstantFolding().rule(new LessThan(EMPTY, TWO, THREE))); + assertEquals(Literal.FALSE, new ConstantFolding().rule(new GreaterThan(EMPTY, TWO, THREE)).canonical()); + assertEquals(Literal.FALSE, new ConstantFolding().rule(new GreaterThanOrEqual(EMPTY, TWO, THREE)).canonical()); + assertEquals(Literal.FALSE, new ConstantFolding().rule(new Equals(EMPTY, TWO, THREE)).canonical()); + assertEquals(Literal.TRUE, new ConstantFolding().rule(new LessThanOrEqual(EMPTY, TWO, THREE)).canonical()); + assertEquals(Literal.TRUE, new ConstantFolding().rule(new LessThan(EMPTY, TWO, THREE)).canonical()); } public void testConstantFoldingBinaryLogic() { - assertEquals(Literal.FALSE, new ConstantFolding().rule(new And(EMPTY, new GreaterThan(EMPTY, TWO, THREE), Literal.TRUE))); - assertEquals(Literal.TRUE, new ConstantFolding().rule(new Or(EMPTY, new GreaterThanOrEqual(EMPTY, TWO, THREE), Literal.TRUE))); + assertEquals(Literal.FALSE, + new ConstantFolding().rule(new And(EMPTY, new GreaterThan(EMPTY, TWO, THREE), Literal.TRUE)).canonical()); + assertEquals(Literal.TRUE, + new ConstantFolding().rule(new Or(EMPTY, new GreaterThanOrEqual(EMPTY, TWO, THREE), Literal.TRUE)).canonical()); } public void testConstantFoldingRange() { - assertEquals(Literal.TRUE, new ConstantFolding().rule(new Range(EMPTY, FIVE, FIVE, true, L(10), false))); - assertEquals(Literal.FALSE, new ConstantFolding().rule(new Range(EMPTY, FIVE, FIVE, false, L(10), false))); + assertEquals(true, new ConstantFolding().rule(new Range(EMPTY, FIVE, FIVE, true, L(10), false)).fold()); + assertEquals(false, new ConstantFolding().rule(new Range(EMPTY, FIVE, FIVE, false, L(10), false)).fold()); } public void testConstantIsNotNull() { @@ -281,9 +280,10 @@ public void testConstantNot() { public void testConstantFoldingLikes() { assertEquals(Literal.TRUE, - new ConstantFolding().rule(new Like(EMPTY, Literal.of(EMPTY, "test_emp"), new LikePattern(EMPTY, "test%", (char) 0)))); + new ConstantFolding().rule(new Like(EMPTY, Literal.of(EMPTY, "test_emp"), new LikePattern(EMPTY, "test%", (char) 0))) + .canonical()); assertEquals(Literal.TRUE, - new ConstantFolding().rule(new RLike(EMPTY, Literal.of(EMPTY, "test_emp"), Literal.of(EMPTY, "test.emp")))); + new ConstantFolding().rule(new RLike(EMPTY, Literal.of(EMPTY, "test_emp"), Literal.of(EMPTY, "test.emp"))).canonical()); } public void testConstantFoldingDatetime() { @@ -299,11 +299,11 @@ public void testConstantFoldingDatetime() { } public void testArithmeticFolding() { - assertEquals(10, foldFunction(new Add(EMPTY, L(7), THREE))); - assertEquals(4, foldFunction(new Sub(EMPTY, L(7), THREE))); - assertEquals(21, foldFunction(new Mul(EMPTY, L(7), THREE))); - assertEquals(2, foldFunction(new Div(EMPTY, L(7), THREE))); - assertEquals(1, foldFunction(new Mod(EMPTY, L(7), THREE))); + assertEquals(10, foldOperator(new Add(EMPTY, L(7), THREE))); + assertEquals(4, foldOperator(new Sub(EMPTY, L(7), THREE))); + assertEquals(21, foldOperator(new Mul(EMPTY, L(7), THREE))); + assertEquals(2, foldOperator(new Div(EMPTY, L(7), THREE))); + assertEquals(1, foldOperator(new Mod(EMPTY, L(7), THREE))); } public void testMathFolding() { @@ -319,6 +319,10 @@ private static Object foldFunction(Function f) { return ((Literal) new ConstantFolding().rule(f)).value(); } + private static Object foldOperator(BinaryOperator b) { + return ((Literal) new ConstantFolding().rule(b)).value(); + } + // // Logical simplifications // diff --git a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/parser/EscapedFunctionsTests.java b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/parser/EscapedFunctionsTests.java index 11ad24582efb6..710689ca861ca 100644 --- a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/parser/EscapedFunctionsTests.java +++ b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/parser/EscapedFunctionsTests.java @@ -12,8 +12,8 @@ import org.elasticsearch.xpack.sql.expression.UnresolvedAttribute; import org.elasticsearch.xpack.sql.expression.function.Function; import org.elasticsearch.xpack.sql.expression.function.UnresolvedFunction; -import org.elasticsearch.xpack.sql.expression.regex.Like; -import org.elasticsearch.xpack.sql.expression.regex.LikePattern; +import org.elasticsearch.xpack.sql.expression.predicate.regex.Like; +import org.elasticsearch.xpack.sql.expression.predicate.regex.LikePattern; import org.elasticsearch.xpack.sql.plan.logical.Limit; import org.elasticsearch.xpack.sql.plan.logical.LogicalPlan; import org.elasticsearch.xpack.sql.plan.logical.With; diff --git a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/parser/LikeEscapingParsingTests.java b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/parser/LikeEscapingParsingTests.java index b2abf0b680054..890718737a4bd 100644 --- a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/parser/LikeEscapingParsingTests.java +++ b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/parser/LikeEscapingParsingTests.java @@ -7,8 +7,8 @@ import org.elasticsearch.test.ESTestCase; import org.elasticsearch.xpack.sql.expression.Expression; -import org.elasticsearch.xpack.sql.expression.regex.Like; -import org.elasticsearch.xpack.sql.expression.regex.LikePattern; +import org.elasticsearch.xpack.sql.expression.predicate.regex.Like; +import org.elasticsearch.xpack.sql.expression.predicate.regex.LikePattern; import org.elasticsearch.xpack.sql.proto.SqlTypedParamValue; import org.elasticsearch.xpack.sql.type.DataType; diff --git a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/tree/NodeSubclassTests.java b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/tree/NodeSubclassTests.java index 96c641d4fbbb2..fdc4f5db9908a 100644 --- a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/tree/NodeSubclassTests.java +++ b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/tree/NodeSubclassTests.java @@ -17,9 +17,13 @@ import org.elasticsearch.xpack.sql.expression.function.aggregate.AggregateFunction; import org.elasticsearch.xpack.sql.expression.function.aggregate.Avg; import org.elasticsearch.xpack.sql.expression.function.aggregate.InnerAggregate; -import org.elasticsearch.xpack.sql.expression.function.scalar.processor.definition.AggExtractorInput; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.AggExtractorInput; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.BinaryPipesTests; +import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe; +import org.elasticsearch.xpack.sql.expression.gen.processor.ConstantProcessor; +import org.elasticsearch.xpack.sql.expression.gen.processor.Processor; import org.elasticsearch.xpack.sql.expression.predicate.fulltext.FullTextPredicate; -import org.elasticsearch.xpack.sql.expression.regex.LikePattern; +import org.elasticsearch.xpack.sql.expression.predicate.regex.LikePattern; import org.elasticsearch.xpack.sql.tree.NodeTests.ChildrenAreAProperty; import org.elasticsearch.xpack.sql.tree.NodeTests.Dummy; import org.elasticsearch.xpack.sql.tree.NodeTests.NoChildren; @@ -454,6 +458,23 @@ public boolean equals(Object obj) { */ return UnresolvedAttributeTests.randomUnresolvedAttribute(); } + + if (Pipe.class == argClass) { + /* + * Similar to expressions, mock pipes to avoid + * stackoverflow errors while building the tree. + */ + return BinaryPipesTests.randomUnaryPipe(); + } + + if (Processor.class == argClass) { + /* + * Similar to expressions, mock pipes to avoid + * stackoverflow errors while building the tree. + */ + return new ConstantProcessor(randomAlphaOfLength(16)); + } + if (Node.class.isAssignableFrom(argClass)) { /* * Rather than attempting to mock subclasses of node diff --git a/x-pack/qa/sql/no-security/src/test/java/org/elasticsearch/xpack/qa/sql/nosecurity/JdbcDocCsvSpecIT.java b/x-pack/qa/sql/no-security/src/test/java/org/elasticsearch/xpack/qa/sql/nosecurity/JdbcDocCsvSpecIT.java index 017fc4b523818..aca0e37cd2d2b 100644 --- a/x-pack/qa/sql/no-security/src/test/java/org/elasticsearch/xpack/qa/sql/nosecurity/JdbcDocCsvSpecIT.java +++ b/x-pack/qa/sql/no-security/src/test/java/org/elasticsearch/xpack/qa/sql/nosecurity/JdbcDocCsvSpecIT.java @@ -74,7 +74,7 @@ protected void assertResults(ResultSet expected, ResultSet elastic) throws SQLEx @Override protected boolean logEsResultSet() { - return true; + return false; } @Override diff --git a/x-pack/qa/sql/src/main/java/org/elasticsearch/xpack/qa/sql/rest/RestSqlTestCase.java b/x-pack/qa/sql/src/main/java/org/elasticsearch/xpack/qa/sql/rest/RestSqlTestCase.java index 60605fb4a0d14..4c5141dc9f608 100644 --- a/x-pack/qa/sql/src/main/java/org/elasticsearch/xpack/qa/sql/rest/RestSqlTestCase.java +++ b/x-pack/qa/sql/src/main/java/org/elasticsearch/xpack/qa/sql/rest/RestSqlTestCase.java @@ -6,6 +6,7 @@ package org.elasticsearch.xpack.qa.sql.rest; import com.fasterxml.jackson.core.io.JsonStringEncoder; + import org.apache.http.HttpEntity; import org.apache.http.entity.ContentType; import org.apache.http.entity.StringEntity; @@ -512,7 +513,7 @@ public void testTranslateQueryWithGroupByAndHaving() throws IOException { @SuppressWarnings("unchecked") Map filterScript = (Map) bucketSelector.get("script"); assertEquals(3, filterScript.size()); - assertEquals("params.a0 > params.v0", filterScript.get("source")); + assertEquals("(params.a0) > (params.v0)", filterScript.get("source")); assertEquals("painless", filterScript.get("lang")); @SuppressWarnings("unchecked") Map filterScriptParams = (Map) filterScript.get("params"); diff --git a/x-pack/qa/sql/src/main/resources/docs.csv-spec b/x-pack/qa/sql/src/main/resources/docs.csv-spec index 481831b2ad8fb..570bbb052f0c1 100644 --- a/x-pack/qa/sql/src/main/resources/docs.csv-spec +++ b/x-pack/qa/sql/src/main/resources/docs.csv-spec @@ -358,8 +358,8 @@ selectInline // tag::selectInline SELECT 1 + 1; - (1 + 1) ---------------- + 1 + 1 +-------------- 2 // end::selectInline @@ -1236,9 +1236,9 @@ mathInlineDegrees // tag::mathInlineDegrees SELECT DEGREES(PI() * 2), DEGREES(PI()); -DEGREES(((PI) * 2))| DEGREES(PI) --------------------+--------------- -360.0 |180.0 +DEGREES((PI) * 2)| DEGREES(PI) +-----------------+--------------- +360.0 |180.0 // end::mathInlineDegrees ; @@ -1256,7 +1256,7 @@ mathExpInline // tag::mathExpInline SELECT EXP(1), E(), EXP(2), E() * E(); - EXP(1) | E | EXP(2) | ((E) * (E)) + EXP(1) | E | EXP(2) | (E) * (E) -----------------+-----------------+----------------+------------------ 2.718281828459045|2.718281828459045|7.38905609893065|7.3890560989306495 // end::mathExpInline @@ -1296,8 +1296,8 @@ mathInlineLog10 // tag::mathInlineLog10 SELECT LOG10(5), LOG(5)/LOG(10); - LOG10(5) |((LOG(5)) / (LOG(10))) -------------------+---------------------- + LOG10(5) |(LOG(5)) / (LOG(10)) +------------------+-------------------- 0.6989700043360189|0.6989700043360187 // end::mathInlineLog10 ; @@ -1336,7 +1336,7 @@ mathInlineRadians // tag::mathInlineRadians SELECT RADIANS(90), PI()/2; - RADIANS(90) | ((PI) / 2) + RADIANS(90) | (PI) / 2 ------------------+------------------ 1.5707963267948966|1.5707963267948966 // end::mathInlineRadians diff --git a/x-pack/qa/sql/src/main/resources/functions.csv-spec b/x-pack/qa/sql/src/main/resources/functions.csv-spec index 3622cfe043381..b5e98c2644099 100644 --- a/x-pack/qa/sql/src/main/resources/functions.csv-spec +++ b/x-pack/qa/sql/src/main/resources/functions.csv-spec @@ -412,14 +412,14 @@ AlejandRo |2 checkColumnNameWithNestedArithmeticFunctionCallsOnTableColumn SELECT CHAR(emp_no % 10000) FROM "test_emp" WHERE emp_no > 10064 ORDER BY emp_no LIMIT 1; -CHAR(((emp_no) % 10000)):s +CHAR((emp_no) % 10000):s A ; checkColumnNameWithComplexNestedArithmeticFunctionCallsOnTableColumn1 SELECT CHAR(emp_no % (7000 + 3000)) FROM "test_emp" WHERE emp_no > 10065 ORDER BY emp_no LIMIT 1; -CHAR(((emp_no) % ((7000 + 3000)))):s +CHAR((emp_no) % (7000 + 3000)):s B ; @@ -427,6 +427,6 @@ B checkColumnNameWithComplexNestedArithmeticFunctionCallsOnTableColumn2 SELECT CHAR((emp_no % (emp_no - 1 + 1)) + 67) FROM "test_emp" WHERE emp_no > 10066 ORDER BY emp_no LIMIT 1; -CHAR(((((emp_no) % (((((emp_no) - 1)) + 1)))) + 67)):s +CHAR(((emp_no) % (((emp_no) - 1) + 1)) + 67):s C ;