Explorar o código

SQL: Add BinaryMathProcessor to named writeables list (#30127)

BinaryMathProcessor was missing from the list of register  named
writeables causing deserialization errors

Fix #30014
Costin Leau %!s(int64=7) %!d(string=hai) anos
pai
achega
804c38303f

+ 2 - 0
x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/Processors.java

@@ -10,6 +10,7 @@ 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.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;
@@ -40,6 +41,7 @@ public final class Processors {
         // arithmetic
         entries.add(new Entry(Processor.class, BinaryArithmeticProcessor.NAME, BinaryArithmeticProcessor::new));
         entries.add(new Entry(Processor.class, UnaryArithmeticProcessor.NAME, UnaryArithmeticProcessor::new));
+        entries.add(new Entry(Processor.class, BinaryMathProcessor.NAME, BinaryMathProcessor::new));
         // datetime
         entries.add(new Entry(Processor.class, DateTimeProcessor.NAME, DateTimeProcessor::new));
         // math

+ 59 - 0
x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/BinaryMathProcessorTests.java

@@ -0,0 +1,59 @@
+/*
+ * 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.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.function.scalar.processor.runtime.ConstantProcessor;
+import org.elasticsearch.xpack.sql.expression.function.scalar.processor.runtime.Processor;
+
+import static org.elasticsearch.xpack.sql.tree.Location.EMPTY;
+
+public class BinaryMathProcessorTests extends AbstractWireSerializingTestCase<BinaryMathProcessor> {
+    public static BinaryMathProcessor randomProcessor() {
+        return new BinaryMathProcessor(
+                new ConstantProcessor(randomLong()),
+                new ConstantProcessor(randomLong()),
+                randomFrom(BinaryMathProcessor.BinaryMathOperation.values()));
+    }
+
+    @Override
+    protected BinaryMathProcessor createTestInstance() {
+        return randomProcessor();
+    }
+
+    @Override
+    protected Reader<BinaryMathProcessor> instanceReader() {
+        return BinaryMathProcessor::new;
+    }
+
+    @Override
+    protected NamedWriteableRegistry getNamedWriteableRegistry() {
+        return new NamedWriteableRegistry(Processors.getNamedWriteables());
+    }
+
+    public void testAtan2() {
+        Processor ba = new ATan2(EMPTY, l(1), l(1)).makeProcessorDefinition().asProcessor();
+        assertEquals(0.7853981633974483d, ba.process(null));
+    }
+
+    public void testPower() {
+        Processor ba = new Power(EMPTY, l(2), l(2)).makeProcessorDefinition().asProcessor();
+        assertEquals(4d, ba.process(null));
+    }
+
+    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));
+    }
+    
+    private static Literal l(Object value) {
+        return Literal.of(EMPTY, value);
+    }
+}