Browse Source

Add `to_degrees` and `to_radians` functions (ESQL-1496)

This adds the `to_degrees` and `to_radians` functions. It uses the
"convert" function framework because that just felt right - these
convert between radians and degrees after all.
Nik Everett 2 years ago
parent
commit
24b2d16f95

+ 4 - 0
docs/reference/esql/esql-functions.asciidoc

@@ -53,10 +53,12 @@ these functions:
 * <<esql-tau>>
 * <<esql-to_boolean>>
 * <<esql-to_datetime>>
+* <<esql-to_degrees>>
 * <<esql-to_double>>
 * <<esql-to_integer>>
 * <<esql-to_ip>>
 * <<esql-to_long>>
+* <<esql-to_radians>>
 * <<esql-to_string>>
 * <<esql-to_unsigned_long>>
 * <<esql-to_version>>
@@ -107,10 +109,12 @@ include::functions/tanh.asciidoc[]
 include::functions/tau.asciidoc[]
 include::functions/to_boolean.asciidoc[]
 include::functions/to_datetime.asciidoc[]
+include::functions/to_degrees.asciidoc[]
 include::functions/to_double.asciidoc[]
 include::functions/to_integer.asciidoc[]
 include::functions/to_ip.asciidoc[]
 include::functions/to_long.asciidoc[]
+include::functions/to_radians.asciidoc[]
 include::functions/to_string.asciidoc[]
 include::functions/to_unsigned_long.asciidoc[]
 include::functions/to_version.asciidoc[]

+ 18 - 0
docs/reference/esql/functions/to_degrees.asciidoc

@@ -0,0 +1,18 @@
+[[esql-to_degrees]]
+=== `TO_DEGREES`
+Converts a number in https://en.wikipedia.org/wiki/Radian[radians]
+to https://en.wikipedia.org/wiki/Degree_(angle)[degrees].
+
+The input can be a single- or multi-valued field or an expression. The input
+type must be of a numeric type and result is always `double`.
+
+Example:
+
+[source.merge.styled,esql]
+----
+include::{esql-specs}/floats.csv-spec[tag=to_degrees]
+----
+[%header.monospaced.styled,format=dsv,separator=|]
+|===
+include::{esql-specs}/floats.csv-spec[tag=to_degrees-result]
+|===

+ 18 - 0
docs/reference/esql/functions/to_radians.asciidoc

@@ -0,0 +1,18 @@
+[[esql-to_radians]]
+=== `TO_RADIANS`
+Converts a number in https://en.wikipedia.org/wiki/Degree_(angle)[degrees] to
+https://en.wikipedia.org/wiki/Radian[radians].
+
+The input can be a single- or multi-valued field or an expression. The input
+type must be of a numeric type and result is always `double`.
+
+Example:
+
+[source.merge.styled,esql]
+----
+include::{esql-specs}/floats.csv-spec[tag=to_radians]
+----
+[%header.monospaced.styled,format=dsv,separator=|]
+|===
+include::{esql-specs}/floats.csv-spec[tag=to_radians-result]
+|===

+ 26 - 1
x-pack/plugin/esql/qa/testFixtures/src/main/resources/floats.csv-spec

@@ -208,7 +208,6 @@ row a = [1.1, 2.1, 2.1] | eval da = mv_dedupe(a);
 [1.1, 2.1, 2.1] | [1.1, 2.1]
 ;
 
-
 autoBucket
 FROM employees
 | WHERE hire_date >= "1985-01-01T00:00:00Z" AND hire_date < "1986-01-01T00:00:00Z"
@@ -378,3 +377,29 @@ y:double | x:double | atan2:double
     12.9 |      0.6 | 1.5243181954438936
 // end::atan2-result[]
 ;
+
+toDegrees
+// tag::to_degrees[]
+ROW rad = [1.57, 3.14, 4.71]
+| EVAL deg = TO_DEGREES(rad)
+// end::to_degrees[]
+;
+
+// tag::to_degrees-result[]
+        rad:double | deg:double
+[1.57, 3.14, 4.71] | [89.95437383553924, 179.9087476710785, 269.86312150661774]
+// end::to_degrees-result[]
+;
+
+toRadians
+// tag::to_radians[]
+ROW deg = [90.0, 180.0, 270.0]
+| EVAL rad = TO_RADIANS(deg)
+// end::to_radians[]
+;
+
+// tag::to_radians-result[]
+          deg:double | rad:double
+[90.0, 180.0, 270.0] | [1.5707963267948966, 3.141592653589793, 4.71238898038469]
+// end::to_radians-result[]
+;

+ 18 - 0
x-pack/plugin/esql/qa/testFixtures/src/main/resources/ints.csv-spec

@@ -451,3 +451,21 @@ ROW y=2, x=12 | EVAL atan2=ATAN2(y, x);
 y:integer | x:integer | atan2:double
         2 |        12 | 0.16514867741462683
 ;
+
+toDegrees
+ROW rad = [1, 2, 3, 4]
+| EVAL deg = TO_DEGREES(rad)
+;
+
+   rad:integer | deg:double
+  [1, 2, 3, 4] | [57.29577951308232, 114.59155902616465, 171.88733853924697, 229.1831180523293]
+;
+
+toRadians
+ROW deg = [90, 180, 270]
+| EVAL rad = TO_RADIANS(deg)
+;
+
+   deg:integer | rad:double
+[90, 180, 270] | [1.5707963267948966, 3.141592653589793, 4.71238898038469]
+;

+ 2 - 0
x-pack/plugin/esql/qa/testFixtures/src/main/resources/show.csv-spec

@@ -65,12 +65,14 @@ to_bool                  |to_bool(arg1)
 to_boolean               |to_boolean(arg1)
 to_datetime              |to_datetime(arg1)
 to_dbl                   |to_dbl(arg1)
+to_degrees               |to_degrees(arg1)
 to_double                |to_double(arg1)
 to_dt                    |to_dt(arg1)
 to_int                   |to_int(arg1)
 to_integer               |to_integer(arg1)
 to_ip                    |to_ip(arg1)
 to_long                  |to_long(arg1)
+to_radians               |to_radians(arg1)
 to_str                   |to_str(arg1)
 to_string                |to_string(arg1)
 to_ul                    |to_ul(arg1)

+ 17 - 0
x-pack/plugin/esql/qa/testFixtures/src/main/resources/unsigned_long.csv-spec

@@ -138,3 +138,20 @@ FROM ul_logs
 2017-11-10T20:33:06.000Z |  5480608687137202404 | 5.0E18
 2017-11-10T20:34:43.000Z | 17764691215469285192 | 1.75E19
 ;
+
+toDegrees
+FROM ul_logs | WHERE bytes_in == bytes_out | EVAL deg = TO_DEGREES(bytes_in) | KEEP bytes_in, deg
+;
+
+         bytes_in:ul | deg:double
+16002960716282089759 | 9.169021087566165E20
+;
+
+
+toRadians
+FROM ul_logs | WHERE bytes_in == bytes_out | EVAL rad = TO_RADIANS(bytes_in) | KEEP bytes_in, rad
+;
+
+         bytes_in:ul | rad:double
+16002960716282089759 | 2.79304354566432608E17
+;

+ 107 - 0
x-pack/plugin/esql/src/main/java/generated/org/elasticsearch/xpack/esql/expression/function/scalar/convert/ToDegreesEvaluator.java

@@ -0,0 +1,107 @@
+// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+// or more contributor license agreements. Licensed under the Elastic License
+// 2.0; you may not use this file except in compliance with the Elastic License
+// 2.0.
+package org.elasticsearch.xpack.esql.expression.function.scalar.convert;
+
+import java.lang.Override;
+import java.lang.String;
+import java.util.BitSet;
+import org.elasticsearch.compute.data.Block;
+import org.elasticsearch.compute.data.ConstantDoubleVector;
+import org.elasticsearch.compute.data.DoubleArrayBlock;
+import org.elasticsearch.compute.data.DoubleArrayVector;
+import org.elasticsearch.compute.data.DoubleBlock;
+import org.elasticsearch.compute.data.DoubleVector;
+import org.elasticsearch.compute.data.Vector;
+import org.elasticsearch.compute.operator.EvalOperator;
+import org.elasticsearch.xpack.ql.tree.Source;
+
+/**
+ * {@link EvalOperator.ExpressionEvaluator} implementation for {@link ToDegrees}.
+ * This class is generated. Do not edit it.
+ */
+public final class ToDegreesEvaluator extends AbstractConvertFunction.AbstractEvaluator {
+  public ToDegreesEvaluator(EvalOperator.ExpressionEvaluator field, Source source) {
+    super(field, source);
+  }
+
+  @Override
+  public String name() {
+    return "ToDegrees";
+  }
+
+  @Override
+  public Block evalVector(Vector v) {
+    DoubleVector vector = (DoubleVector) v;
+    int positionCount = v.getPositionCount();
+    if (vector.isConstant()) {
+      try {
+        return new ConstantDoubleVector(evalValue(vector, 0), positionCount).asBlock();
+      } catch (Exception e) {
+        registerException(e);
+        return Block.constantNullBlock(positionCount);
+      }
+    }
+    BitSet nullsMask = null;
+    double[] values = new double[positionCount];
+    for (int p = 0; p < positionCount; p++) {
+      try {
+        values[p] = evalValue(vector, p);
+      } catch (Exception e) {
+        registerException(e);
+        if (nullsMask == null) {
+          nullsMask = new BitSet(positionCount);
+        }
+        nullsMask.set(p);
+      }
+    }
+    return nullsMask == null
+          ? new DoubleArrayVector(values, positionCount).asBlock()
+          // UNORDERED, since whatever ordering there is, it isn't necessarily preserved
+          : new DoubleArrayBlock(values, positionCount, null, nullsMask, Block.MvOrdering.UNORDERED);
+  }
+
+  private static double evalValue(DoubleVector container, int index) {
+    double value = container.getDouble(index);
+    return ToDegrees.process(value);
+  }
+
+  @Override
+  public Block evalBlock(Block b) {
+    DoubleBlock block = (DoubleBlock) b;
+    int positionCount = block.getPositionCount();
+    DoubleBlock.Builder builder = DoubleBlock.newBlockBuilder(positionCount);
+    for (int p = 0; p < positionCount; p++) {
+      int valueCount = block.getValueCount(p);
+      int start = block.getFirstValueIndex(p);
+      int end = start + valueCount;
+      boolean positionOpened = false;
+      boolean valuesAppended = false;
+      for (int i = start; i < end; i++) {
+        try {
+          double value = evalValue(block, i);
+          if (positionOpened == false && valueCount > 1) {
+            builder.beginPositionEntry();
+            positionOpened = true;
+          }
+          builder.appendDouble(value);
+          valuesAppended = true;
+        } catch (Exception e) {
+          registerException(e);
+        }
+      }
+      if (valuesAppended == false) {
+        builder.appendNull();
+      } else if (positionOpened) {
+        builder.endPositionEntry();
+      }
+    }
+    return builder.build();
+  }
+
+  private static double evalValue(DoubleBlock container, int index) {
+    double value = container.getDouble(index);
+    return ToDegrees.process(value);
+  }
+}

+ 107 - 0
x-pack/plugin/esql/src/main/java/generated/org/elasticsearch/xpack/esql/expression/function/scalar/convert/ToRadiansEvaluator.java

@@ -0,0 +1,107 @@
+// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+// or more contributor license agreements. Licensed under the Elastic License
+// 2.0; you may not use this file except in compliance with the Elastic License
+// 2.0.
+package org.elasticsearch.xpack.esql.expression.function.scalar.convert;
+
+import java.lang.Override;
+import java.lang.String;
+import java.util.BitSet;
+import org.elasticsearch.compute.data.Block;
+import org.elasticsearch.compute.data.ConstantDoubleVector;
+import org.elasticsearch.compute.data.DoubleArrayBlock;
+import org.elasticsearch.compute.data.DoubleArrayVector;
+import org.elasticsearch.compute.data.DoubleBlock;
+import org.elasticsearch.compute.data.DoubleVector;
+import org.elasticsearch.compute.data.Vector;
+import org.elasticsearch.compute.operator.EvalOperator;
+import org.elasticsearch.xpack.ql.tree.Source;
+
+/**
+ * {@link EvalOperator.ExpressionEvaluator} implementation for {@link ToRadians}.
+ * This class is generated. Do not edit it.
+ */
+public final class ToRadiansEvaluator extends AbstractConvertFunction.AbstractEvaluator {
+  public ToRadiansEvaluator(EvalOperator.ExpressionEvaluator field, Source source) {
+    super(field, source);
+  }
+
+  @Override
+  public String name() {
+    return "ToRadians";
+  }
+
+  @Override
+  public Block evalVector(Vector v) {
+    DoubleVector vector = (DoubleVector) v;
+    int positionCount = v.getPositionCount();
+    if (vector.isConstant()) {
+      try {
+        return new ConstantDoubleVector(evalValue(vector, 0), positionCount).asBlock();
+      } catch (Exception e) {
+        registerException(e);
+        return Block.constantNullBlock(positionCount);
+      }
+    }
+    BitSet nullsMask = null;
+    double[] values = new double[positionCount];
+    for (int p = 0; p < positionCount; p++) {
+      try {
+        values[p] = evalValue(vector, p);
+      } catch (Exception e) {
+        registerException(e);
+        if (nullsMask == null) {
+          nullsMask = new BitSet(positionCount);
+        }
+        nullsMask.set(p);
+      }
+    }
+    return nullsMask == null
+          ? new DoubleArrayVector(values, positionCount).asBlock()
+          // UNORDERED, since whatever ordering there is, it isn't necessarily preserved
+          : new DoubleArrayBlock(values, positionCount, null, nullsMask, Block.MvOrdering.UNORDERED);
+  }
+
+  private static double evalValue(DoubleVector container, int index) {
+    double value = container.getDouble(index);
+    return ToRadians.process(value);
+  }
+
+  @Override
+  public Block evalBlock(Block b) {
+    DoubleBlock block = (DoubleBlock) b;
+    int positionCount = block.getPositionCount();
+    DoubleBlock.Builder builder = DoubleBlock.newBlockBuilder(positionCount);
+    for (int p = 0; p < positionCount; p++) {
+      int valueCount = block.getValueCount(p);
+      int start = block.getFirstValueIndex(p);
+      int end = start + valueCount;
+      boolean positionOpened = false;
+      boolean valuesAppended = false;
+      for (int i = start; i < end; i++) {
+        try {
+          double value = evalValue(block, i);
+          if (positionOpened == false && valueCount > 1) {
+            builder.beginPositionEntry();
+            positionOpened = true;
+          }
+          builder.appendDouble(value);
+          valuesAppended = true;
+        } catch (Exception e) {
+          registerException(e);
+        }
+      }
+      if (valuesAppended == false) {
+        builder.appendNull();
+      } else if (positionOpened) {
+        builder.endPositionEntry();
+      }
+    }
+    return builder.build();
+  }
+
+  private static double evalValue(DoubleBlock container, int index) {
+    double value = container.getDouble(index);
+    return ToRadians.process(value);
+  }
+}

+ 4 - 0
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/EsqlFunctionRegistry.java

@@ -19,10 +19,12 @@ import org.elasticsearch.xpack.esql.expression.function.aggregate.Sum;
 import org.elasticsearch.xpack.esql.expression.function.scalar.conditional.Case;
 import org.elasticsearch.xpack.esql.expression.function.scalar.convert.ToBoolean;
 import org.elasticsearch.xpack.esql.expression.function.scalar.convert.ToDatetime;
+import org.elasticsearch.xpack.esql.expression.function.scalar.convert.ToDegrees;
 import org.elasticsearch.xpack.esql.expression.function.scalar.convert.ToDouble;
 import org.elasticsearch.xpack.esql.expression.function.scalar.convert.ToIP;
 import org.elasticsearch.xpack.esql.expression.function.scalar.convert.ToInteger;
 import org.elasticsearch.xpack.esql.expression.function.scalar.convert.ToLong;
+import org.elasticsearch.xpack.esql.expression.function.scalar.convert.ToRadians;
 import org.elasticsearch.xpack.esql.expression.function.scalar.convert.ToString;
 import org.elasticsearch.xpack.esql.expression.function.scalar.convert.ToUnsignedLong;
 import org.elasticsearch.xpack.esql.expression.function.scalar.convert.ToVersion;
@@ -143,10 +145,12 @@ public class EsqlFunctionRegistry extends FunctionRegistry {
             new FunctionDefinition[] {
                 def(ToBoolean.class, ToBoolean::new, "to_boolean", "to_bool"),
                 def(ToDatetime.class, ToDatetime::new, "to_datetime", "to_dt"),
+                def(ToDegrees.class, ToDegrees::new, "to_degrees"),
                 def(ToDouble.class, ToDouble::new, "to_double", "to_dbl"),
                 def(ToIP.class, ToIP::new, "to_ip"),
                 def(ToInteger.class, ToInteger::new, "to_integer", "to_int"),
                 def(ToLong.class, ToLong::new, "to_long"),
+                def(ToRadians.class, ToRadians::new, "to_radians"),
                 def(ToString.class, ToString::new, "to_string", "to_str"),
                 def(ToUnsignedLong.class, ToUnsignedLong::new, "to_unsigned_long", "to_ulong", "to_ul"),
                 def(ToVersion.class, ToVersion::new, "to_version", "to_ver"), },

+ 72 - 0
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/convert/ToDegrees.java

@@ -0,0 +1,72 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+
+package org.elasticsearch.xpack.esql.expression.function.scalar.convert;
+
+import org.elasticsearch.compute.ann.ConvertEvaluator;
+import org.elasticsearch.compute.operator.EvalOperator;
+import org.elasticsearch.xpack.esql.planner.Mappable;
+import org.elasticsearch.xpack.ql.expression.Expression;
+import org.elasticsearch.xpack.ql.tree.NodeInfo;
+import org.elasticsearch.xpack.ql.tree.Source;
+import org.elasticsearch.xpack.ql.type.DataType;
+
+import java.util.List;
+import java.util.Map;
+import java.util.function.BiFunction;
+
+import static org.elasticsearch.xpack.ql.type.DataTypes.DOUBLE;
+import static org.elasticsearch.xpack.ql.type.DataTypes.INTEGER;
+import static org.elasticsearch.xpack.ql.type.DataTypes.LONG;
+import static org.elasticsearch.xpack.ql.type.DataTypes.UNSIGNED_LONG;
+
+/**
+ * Converts from <a href="https://en.wikipedia.org/wiki/Radian">radians</a>
+ * to <a href="https://en.wikipedia.org/wiki/Degree_(angle)">degrees</a>.
+ */
+public class ToDegrees extends AbstractConvertFunction implements Mappable {
+    private static final Map<DataType, BiFunction<EvalOperator.ExpressionEvaluator, Source, EvalOperator.ExpressionEvaluator>> EVALUATORS =
+        Map.of(
+            DOUBLE,
+            ToDegreesEvaluator::new,
+            INTEGER,
+            (field, source) -> new ToDegreesEvaluator(new ToDoubleFromIntEvaluator(field, source), source),
+            LONG,
+            (field, source) -> new ToDegreesEvaluator(new ToDoubleFromLongEvaluator(field, source), source),
+            UNSIGNED_LONG,
+            (field, source) -> new ToDegreesEvaluator(new ToDoubleFromUnsignedLongEvaluator(field, source), source)
+        );
+
+    public ToDegrees(Source source, Expression field) {
+        super(source, field);
+    }
+
+    @Override
+    protected Map<DataType, BiFunction<EvalOperator.ExpressionEvaluator, Source, EvalOperator.ExpressionEvaluator>> evaluators() {
+        return EVALUATORS;
+    }
+
+    @Override
+    public Expression replaceChildren(List<Expression> newChildren) {
+        return new ToDegrees(source(), newChildren.get(0));
+    }
+
+    @Override
+    protected NodeInfo<? extends Expression> info() {
+        return NodeInfo.create(this, ToDegrees::new, field());
+    }
+
+    @Override
+    public DataType dataType() {
+        return DOUBLE;
+    }
+
+    @ConvertEvaluator
+    static double process(double deg) {
+        return Math.toDegrees(deg);
+    }
+}

+ 72 - 0
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/convert/ToRadians.java

@@ -0,0 +1,72 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+
+package org.elasticsearch.xpack.esql.expression.function.scalar.convert;
+
+import org.elasticsearch.compute.ann.ConvertEvaluator;
+import org.elasticsearch.compute.operator.EvalOperator;
+import org.elasticsearch.xpack.esql.planner.Mappable;
+import org.elasticsearch.xpack.ql.expression.Expression;
+import org.elasticsearch.xpack.ql.tree.NodeInfo;
+import org.elasticsearch.xpack.ql.tree.Source;
+import org.elasticsearch.xpack.ql.type.DataType;
+
+import java.util.List;
+import java.util.Map;
+import java.util.function.BiFunction;
+
+import static org.elasticsearch.xpack.ql.type.DataTypes.DOUBLE;
+import static org.elasticsearch.xpack.ql.type.DataTypes.INTEGER;
+import static org.elasticsearch.xpack.ql.type.DataTypes.LONG;
+import static org.elasticsearch.xpack.ql.type.DataTypes.UNSIGNED_LONG;
+
+/**
+ * Converts from <a href="https://en.wikipedia.org/wiki/Degree_(angle)">degrees</a>
+ * to <a href="https://en.wikipedia.org/wiki/Radian">radians</a>.
+ */
+public class ToRadians extends AbstractConvertFunction implements Mappable {
+    private static final Map<DataType, BiFunction<EvalOperator.ExpressionEvaluator, Source, EvalOperator.ExpressionEvaluator>> EVALUATORS =
+        Map.of(
+            DOUBLE,
+            ToRadiansEvaluator::new,
+            INTEGER,
+            (field, source) -> new ToRadiansEvaluator(new ToDoubleFromIntEvaluator(field, source), source),
+            LONG,
+            (field, source) -> new ToRadiansEvaluator(new ToDoubleFromLongEvaluator(field, source), source),
+            UNSIGNED_LONG,
+            (field, source) -> new ToRadiansEvaluator(new ToDoubleFromUnsignedLongEvaluator(field, source), source)
+        );
+
+    public ToRadians(Source source, Expression field) {
+        super(source, field);
+    }
+
+    @Override
+    protected Map<DataType, BiFunction<EvalOperator.ExpressionEvaluator, Source, EvalOperator.ExpressionEvaluator>> evaluators() {
+        return EVALUATORS;
+    }
+
+    @Override
+    public Expression replaceChildren(List<Expression> newChildren) {
+        return new ToRadians(source(), newChildren.get(0));
+    }
+
+    @Override
+    protected NodeInfo<? extends Expression> info() {
+        return NodeInfo.create(this, ToRadians::new, field());
+    }
+
+    @Override
+    public DataType dataType() {
+        return DOUBLE;
+    }
+
+    @ConvertEvaluator
+    static double process(double deg) {
+        return Math.toRadians(deg);
+    }
+}

+ 6 - 0
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/io/stream/PlanNamedTypes.java

@@ -30,10 +30,12 @@ import org.elasticsearch.xpack.esql.expression.function.scalar.UnaryScalarFuncti
 import org.elasticsearch.xpack.esql.expression.function.scalar.conditional.Case;
 import org.elasticsearch.xpack.esql.expression.function.scalar.convert.ToBoolean;
 import org.elasticsearch.xpack.esql.expression.function.scalar.convert.ToDatetime;
+import org.elasticsearch.xpack.esql.expression.function.scalar.convert.ToDegrees;
 import org.elasticsearch.xpack.esql.expression.function.scalar.convert.ToDouble;
 import org.elasticsearch.xpack.esql.expression.function.scalar.convert.ToIP;
 import org.elasticsearch.xpack.esql.expression.function.scalar.convert.ToInteger;
 import org.elasticsearch.xpack.esql.expression.function.scalar.convert.ToLong;
+import org.elasticsearch.xpack.esql.expression.function.scalar.convert.ToRadians;
 import org.elasticsearch.xpack.esql.expression.function.scalar.convert.ToString;
 import org.elasticsearch.xpack.esql.expression.function.scalar.convert.ToUnsignedLong;
 import org.elasticsearch.xpack.esql.expression.function.scalar.convert.ToVersion;
@@ -300,10 +302,12 @@ public final class PlanNamedTypes {
             of(ESQL_UNARY_SCLR_CLS, Tanh.class, PlanNamedTypes::writeESQLUnaryScalar, PlanNamedTypes::readESQLUnaryScalar),
             of(ESQL_UNARY_SCLR_CLS, ToBoolean.class, PlanNamedTypes::writeESQLUnaryScalar, PlanNamedTypes::readESQLUnaryScalar),
             of(ESQL_UNARY_SCLR_CLS, ToDatetime.class, PlanNamedTypes::writeESQLUnaryScalar, PlanNamedTypes::readESQLUnaryScalar),
+            of(ESQL_UNARY_SCLR_CLS, ToDegrees.class, PlanNamedTypes::writeESQLUnaryScalar, PlanNamedTypes::readESQLUnaryScalar),
             of(ESQL_UNARY_SCLR_CLS, ToDouble.class, PlanNamedTypes::writeESQLUnaryScalar, PlanNamedTypes::readESQLUnaryScalar),
             of(ESQL_UNARY_SCLR_CLS, ToIP.class, PlanNamedTypes::writeESQLUnaryScalar, PlanNamedTypes::readESQLUnaryScalar),
             of(ESQL_UNARY_SCLR_CLS, ToInteger.class, PlanNamedTypes::writeESQLUnaryScalar, PlanNamedTypes::readESQLUnaryScalar),
             of(ESQL_UNARY_SCLR_CLS, ToLong.class, PlanNamedTypes::writeESQLUnaryScalar, PlanNamedTypes::readESQLUnaryScalar),
+            of(ESQL_UNARY_SCLR_CLS, ToRadians.class, PlanNamedTypes::writeESQLUnaryScalar, PlanNamedTypes::readESQLUnaryScalar),
             of(ESQL_UNARY_SCLR_CLS, ToString.class, PlanNamedTypes::writeESQLUnaryScalar, PlanNamedTypes::readESQLUnaryScalar),
             of(ESQL_UNARY_SCLR_CLS, ToUnsignedLong.class, PlanNamedTypes::writeESQLUnaryScalar, PlanNamedTypes::readESQLUnaryScalar),
             of(ESQL_UNARY_SCLR_CLS, ToVersion.class, PlanNamedTypes::writeESQLUnaryScalar, PlanNamedTypes::readESQLUnaryScalar),
@@ -1023,10 +1027,12 @@ public final class PlanNamedTypes {
         entry(name(Tanh.class), Tanh::new),
         entry(name(ToBoolean.class), ToBoolean::new),
         entry(name(ToDatetime.class), ToDatetime::new),
+        entry(name(ToDegrees.class), ToDegrees::new),
         entry(name(ToDouble.class), ToDouble::new),
         entry(name(ToIP.class), ToIP::new),
         entry(name(ToInteger.class), ToInteger::new),
         entry(name(ToLong.class), ToLong::new),
+        entry(name(ToRadians.class), ToRadians::new),
         entry(name(ToString.class), ToString::new),
         entry(name(ToUnsignedLong.class), ToUnsignedLong::new),
         entry(name(ToVersion.class), ToVersion::new),