Browse Source

[ESQL] Remove is_nan, is_finite, and is_infinite (#104091)

A while ago we decided we weren't going to support NaN or infinite values in the language. Removing these functions is part of that effort.
Mark Tozzi 1 year ago
parent
commit
282f0f0a00
21 changed files with 17 additions and 845 deletions
  1. 11 0
      docs/changelog/104091.yaml
  2. 0 29
      docs/reference/esql/functions/is_finite.asciidoc
  3. 0 29
      docs/reference/esql/functions/is_infinite.asciidoc
  4. 0 29
      docs/reference/esql/functions/is_nan.asciidoc
  5. 0 6
      docs/reference/esql/functions/operators.asciidoc
  6. 0 1
      docs/reference/esql/functions/signature/is_finite.svg
  7. 0 1
      docs/reference/esql/functions/signature/is_infinite.svg
  8. 0 1
      docs/reference/esql/functions/signature/is_nan.svg
  9. 1 57
      x-pack/plugin/esql/qa/testFixtures/src/main/resources/math.csv-spec
  10. 5 12
      x-pack/plugin/esql/qa/testFixtures/src/main/resources/show.csv-spec
  11. 0 110
      x-pack/plugin/esql/src/main/java/generated/org/elasticsearch/xpack/esql/expression/function/scalar/math/IsFiniteEvaluator.java
  12. 0 110
      x-pack/plugin/esql/src/main/java/generated/org/elasticsearch/xpack/esql/expression/function/scalar/math/IsInfiniteEvaluator.java
  13. 0 110
      x-pack/plugin/esql/src/main/java/generated/org/elasticsearch/xpack/esql/expression/function/scalar/math/IsNaNEvaluator.java
  14. 0 6
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/EsqlFunctionRegistry.java
  15. 0 48
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/math/IsFinite.java
  16. 0 50
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/math/IsInfinite.java
  17. 0 47
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/math/IsNaN.java
  18. 0 9
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/io/stream/PlanNamedTypes.java
  19. 0 63
      x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/math/IsFiniteTests.java
  20. 0 63
      x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/math/IsInfiniteTests.java
  21. 0 64
      x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/math/IsNaNTests.java

+ 11 - 0
docs/changelog/104091.yaml

@@ -0,0 +1,11 @@
+pr: 104091
+summary: "[ESQL] Remove is_nan, is_finite, and `is_infinite`"
+area: ES|QL
+type: breaking
+issues: []
+breaking:
+  title: "[ESQL] Remove is_nan, is_finite, and `is_infinite`"
+  area: REST API
+  details: Removes the functions `is_nan`, `is_finite`, and `is_infinite`. 
+  impact: Attempting to use the above functions will now be a planner time error.  These functions are no longer supported.
+  notable: false

+ 0 - 29
docs/reference/esql/functions/is_finite.asciidoc

@@ -1,29 +0,0 @@
-[discrete]
-[[esql-is_finite]]
-=== `IS_FINITE`
-
-*Syntax*
-
-[.text-center]
-image::esql/functions/signature/is_finite.svg[Embedded,opts=inline]
-
-*Parameters*
-
-`n`::
-Numeric expression. If `null`, the function returns `null`.
-
-*Description*
-
-Returns a boolean that indicates whether its input is a finite number.
-
-*Supported types*
-
-include::types/is_finite.asciidoc[]
-
-*Example*
-
-[source,esql]
-----
-ROW d = 1.0
-| EVAL s = IS_FINITE(d/0)
-----

+ 0 - 29
docs/reference/esql/functions/is_infinite.asciidoc

@@ -1,29 +0,0 @@
-[discrete]
-[[esql-is_infinite]]
-=== `IS_INFINITE`
-
-*Syntax*
-
-[.text-center]
-image::esql/functions/signature/is_infinite.svg[Embedded,opts=inline]
-
-*Parameters*
-
-`n`::
-Numeric expression. If `null`, the function returns `null`.
-
-*Description*
-
-Returns a boolean that indicates whether its input is an infinite number.
-
-*Supported types*
-
-include::types/is_infinite.asciidoc[]
-
-*Example*
-
-[source,esql]
-----
-ROW d = 1.0
-| EVAL s = IS_INFINITE(d/0)
-----

+ 0 - 29
docs/reference/esql/functions/is_nan.asciidoc

@@ -1,29 +0,0 @@
-[discrete]
-[[esql-is_nan]]
-=== `IS_NAN`
-
-*Syntax*
-
-[.text-center]
-image::esql/functions/signature/is_nan.svg[Embedded,opts=inline]
-
-*Parameters*
-
-`n`::
-Numeric expression. If `null`, the function returns `null`.
-
-*Description*
-
-Returns a boolean that indicates whether its input is {wikipedia}/NaN[Not-a-Number] (NaN).
-
-*Supported types*
-
-include::types/is_nan.asciidoc[]
-
-*Example*
-
-[source,esql]
-----
-ROW d = 1.0
-| EVAL s = IS_NAN(d)
-----

+ 0 - 6
docs/reference/esql/functions/operators.asciidoc

@@ -15,9 +15,6 @@ Boolean operators for comparing against one or multiple expressions.
 * <<esql-cidr_match>>
 * <<esql-ends_with>>
 * <<esql-in-operator>>
-* <<esql-is_finite>>
-* <<esql-is_infinite>>
-* <<esql-is_nan>>
 * <<esql-like-operator>>
 * <<esql-rlike-operator>>
 * <<esql-starts_with>>
@@ -30,9 +27,6 @@ include::predicates.asciidoc[]
 include::cidr_match.asciidoc[]
 include::ends_with.asciidoc[]
 include::in.asciidoc[]
-include::is_finite.asciidoc[]
-include::is_infinite.asciidoc[]
-include::is_nan.asciidoc[]
 include::like.asciidoc[]
 include::rlike.asciidoc[]
 include::starts_with.asciidoc[]

+ 0 - 1
docs/reference/esql/functions/signature/is_finite.svg

@@ -1 +0,0 @@
-<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" width="264" height="46" viewbox="0 0 264 46"><defs><style type="text/css">#guide .c{fill:none;stroke:#222222;}#guide .k{fill:#000000;font-family:Roboto Mono,Sans-serif;font-size:20px;}#guide .s{fill:#e4f4ff;stroke:#222222;}#guide .syn{fill:#8D8D8D;font-family:Roboto Mono,Sans-serif;font-size:20px;}</style></defs><path class="c" d="M0 31h5m128 0h10m32 0h10m32 0h10m32 0h5"/><rect class="s" x="5" y="5" width="128" height="36"/><text class="k" x="15" y="31">IS_FINITE</text><rect class="s" x="143" y="5" width="32" height="36" rx="7"/><text class="syn" x="153" y="31">(</text><rect class="s" x="185" y="5" width="32" height="36" rx="7"/><text class="k" x="195" y="31">n</text><rect class="s" x="227" y="5" width="32" height="36" rx="7"/><text class="syn" x="237" y="31">)</text></svg>

+ 0 - 1
docs/reference/esql/functions/signature/is_infinite.svg

@@ -1 +0,0 @@
-<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" width="288" height="46" viewbox="0 0 288 46"><defs><style type="text/css">#guide .c{fill:none;stroke:#222222;}#guide .k{fill:#000000;font-family:Roboto Mono,Sans-serif;font-size:20px;}#guide .s{fill:#e4f4ff;stroke:#222222;}#guide .syn{fill:#8D8D8D;font-family:Roboto Mono,Sans-serif;font-size:20px;}</style></defs><path class="c" d="M0 31h5m152 0h10m32 0h10m32 0h10m32 0h5"/><rect class="s" x="5" y="5" width="152" height="36"/><text class="k" x="15" y="31">IS_INFINITE</text><rect class="s" x="167" y="5" width="32" height="36" rx="7"/><text class="syn" x="177" y="31">(</text><rect class="s" x="209" y="5" width="32" height="36" rx="7"/><text class="k" x="219" y="31">n</text><rect class="s" x="251" y="5" width="32" height="36" rx="7"/><text class="syn" x="261" y="31">)</text></svg>

+ 0 - 1
docs/reference/esql/functions/signature/is_nan.svg

@@ -1 +0,0 @@
-<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" width="228" height="46" viewbox="0 0 228 46"><defs><style type="text/css">#guide .c{fill:none;stroke:#222222;}#guide .k{fill:#000000;font-family:Roboto Mono,Sans-serif;font-size:20px;}#guide .s{fill:#e4f4ff;stroke:#222222;}#guide .syn{fill:#8D8D8D;font-family:Roboto Mono,Sans-serif;font-size:20px;}</style></defs><path class="c" d="M0 31h5m92 0h10m32 0h10m32 0h10m32 0h5"/><rect class="s" x="5" y="5" width="92" height="36"/><text class="k" x="15" y="31">IS_NAN</text><rect class="s" x="107" y="5" width="32" height="36" rx="7"/><text class="syn" x="117" y="31">(</text><rect class="s" x="149" y="5" width="32" height="36" rx="7"/><text class="k" x="159" y="31">n</text><rect class="s" x="191" y="5" width="32" height="36" rx="7"/><text class="syn" x="201" y="31">)</text></svg>

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

@@ -210,48 +210,6 @@ salary:integer | s:double
 73851          | 1330201
 ;
 
-isFiniteFalse
-row d = 1.0 | eval s = is_finite(d/0);
-
-d:double | s:boolean
-1.0      | false
-;
-
-isFiniteTrue
-row d = 1.0 | eval s = is_finite(d);
-
-d:double | s:boolean
-1.0      | true
-;
-
-isInfiniteFalse
-row d = 1.0 | eval s = is_infinite(d);
-
-d:double | s:boolean
-1.0      | false
-;
-
-isInfiniteTrue
-row d = 1.0/0 | eval s = is_infinite(d);
-
-d:double | s:boolean
-Infinity | true
-;
-
-isNaN
-row d = 1.0 | eval s = is_nan(d);
-
-d:double | s:boolean
-1.0      | false
-;
-
-isNaNTrue
-row d = 0.0/0.0 | eval s = is_nan(d);
-
-d:double | s:boolean
-NaN      | true
-;
-
 log10
 // tag::log10[]
 ROW d = 1000.0 
@@ -1013,13 +971,6 @@ d:double | s:double
 -1.0     | null
 ;
 
-sqrtOfNan
-row d = 0.0/0.0 | eval s = is_nan(sqrt(d));
-
-d:double | s:boolean
-NaN      | true
-;
-
 sqrtOfZero
 row d = 0.0 |eval s = sqrt(d);
 
@@ -1034,13 +985,6 @@ d:double | s:double
 -0.0     | -0.0
 ;
 
-sqrtOfInfinite
-row d = 1/0.0 | eval s = is_infinite(sqrt(d));
-
-d:double | s:boolean
-Infinity | true
-;
-
 least
 // tag::least[]
 ROW a = 10, b = 20
@@ -1148,4 +1092,4 @@ Alejandro      |McAlpine       |1.48           |1.48
 Amabile        |Gomatam        |2.09           |2.09           
 Anneke         |Preusig        |1.56           |1.56     
 //end::docsAbsEmployees-result[]
-;
+;

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

@@ -35,9 +35,6 @@ e                        |? e()
 ends_with                |? ends_with(arg1:?, arg2:?)                             |[arg1, arg2]             |[?, ?]            |["", ""]                                            |?                    | ""                      | [false, false]       | false
 floor                    |"? floor(n:integer|long|double|unsigned_long)"    |n                        |"integer|long|double|unsigned_long"    | ""                                                 |?                    | ""                      | false                | false
 greatest                 |"? greatest(first:integer|long|double|boolean|keyword|text|ip|version, rest...:integer|long|double|boolean|keyword|text|ip|version)"        |[first, rest]            |["integer|long|double|boolean|keyword|text|ip|version", "integer|long|double|boolean|keyword|text|ip|version"]            |["", ""]                                            |?                    | ""                      | [false, false]       | true
-is_finite                |boolean is_finite(n:double)                             |n                        |double            | "A floating-point value"                                                 |boolean              | "Returns true if the argument is a finite floating-point value."                      | false                | false
-is_infinite              |boolean is_infinite(n:double)                           |n                        |double            | "A floating-point value"                                                 |boolean             | "Returns true if the specified floating-point value is infinitely large in magnitude."                      | false                | false
-is_nan                   |boolean is_nan(n:double)                                |n                        |double            | "A floating-point value"                                                 |boolean              | "Returns true if the argument is a Not-a-Number (NaN) value."                      | false                | false
 least                    |"? least(first:integer|long|double|boolean|keyword|text|ip|version, rest...:integer|long|double|boolean|keyword|text|ip|version)"        |[first, rest]            |["integer|long|double|boolean|keyword|text|ip|version", "integer|long|double|boolean|keyword|text|ip|version"]            |["", ""]                                            |?                    | ""                      | [false, false]       | true
 left                     |"? left(string:keyword, length:integer)"                |[string, length]         |["keyword", "integer"]            |["", ""]                                            |?                    | ""                      | [false, false]       | false
 length                   |? length(arg1:?)                                        |arg1                     |?                 | ""                                                 |?                    | ""                      | false                | false
@@ -129,9 +126,6 @@ synopsis:keyword
 ? ends_with(arg1:?, arg2:?)
 "? floor(n:integer|long|double|unsigned_long)"
 "? greatest(first:integer|long|double|boolean|keyword|text|ip|version, rest...:integer|long|double|boolean|keyword|text|ip|version)"
-boolean is_finite(n:double)
-boolean is_infinite(n:double)
-boolean is_nan(n:double)
 "? least(first:integer|long|double|boolean|keyword|text|ip|version, rest...:integer|long|double|boolean|keyword|text|ip|version)"
 ? left(string:keyword, length:integer)
 ? length(arg1:?)
@@ -197,15 +191,14 @@ boolean is_nan(n:double)
 showFunctionsFiltered#[skip:-8.12.99]
 // tag::showFunctionsFiltered[]
 SHOW functions 
-| WHERE STARTS_WITH(name, "is_")
+| WHERE STARTS_WITH(name, "sin")
 // end::showFunctionsFiltered[]
 ;
 
 // tag::showFunctionsFiltered-result[]
-       name:keyword      |                        synopsis:keyword                |       argNames:keyword  | argTypes:keyword |             argDescriptions:keyword                |  returnType:keyword   |  description:keyword  |   optionalArgs:boolean |  variadic:boolean
-is_finite                |boolean is_finite(n:double)                             |n                        |double            |  "A floating-point value"                                                  |boolean        | "Returns true if the argument is a finite floating-point value."                      | false                | false
-is_infinite              |boolean is_infinite(n:double)                           |n                        |double            |  "A floating-point value"                                                  |boolean        | "Returns true if the specified floating-point value is infinitely large in magnitude."                      | false                | false
-is_nan                   |boolean is_nan(n:double)                                |n                        |double            |  "A floating-point value"                                                  |boolean        | "Returns true if the argument is a Not-a-Number (NaN) value."                      | false                | false
+       name:keyword      |                        synopsis:keyword                |       argNames:keyword  | argTypes:keyword |  argDescriptions:keyword | returnType:keyword |   description:keyword  |   optionalArgs:boolean |  variadic:boolean
+sin                      | "double sin(n:integer|long|double|unsigned_long)"      |n      |"integer|long|double|unsigned_long" | "An angle, in radians"   | double             | "Returns the trigonometric sine of an angle" | false | false
+sinh                     | "double sinh(n:integer|long|double|unsigned_long)"     |n      |"integer|long|double|unsigned_long" | "The number to return the hyperbolic sine of" | "double" | "Returns the hyperbolic sine of a number" | false | false
 // end::showFunctionsFiltered-result[]
 ;
 
@@ -215,5 +208,5 @@ countFunctions#[skip:-8.12.99]
 show functions |  stats  a = count(*), b = count(*), c = count(*) |  mv_expand c;
 
 a:long | b:long | c:long
-87     | 87     | 87
+84     | 84     | 84
 ;

+ 0 - 110
x-pack/plugin/esql/src/main/java/generated/org/elasticsearch/xpack/esql/expression/function/scalar/math/IsFiniteEvaluator.java

@@ -1,110 +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
-// 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.math;
-
-import java.lang.IllegalArgumentException;
-import java.lang.Override;
-import java.lang.String;
-import org.elasticsearch.compute.data.Block;
-import org.elasticsearch.compute.data.BooleanBlock;
-import org.elasticsearch.compute.data.BooleanVector;
-import org.elasticsearch.compute.data.DoubleBlock;
-import org.elasticsearch.compute.data.DoubleVector;
-import org.elasticsearch.compute.data.Page;
-import org.elasticsearch.compute.operator.DriverContext;
-import org.elasticsearch.compute.operator.EvalOperator;
-import org.elasticsearch.core.Releasables;
-import org.elasticsearch.xpack.esql.expression.function.Warnings;
-import org.elasticsearch.xpack.ql.tree.Source;
-
-/**
- * {@link EvalOperator.ExpressionEvaluator} implementation for {@link IsFinite}.
- * This class is generated. Do not edit it.
- */
-public final class IsFiniteEvaluator implements EvalOperator.ExpressionEvaluator {
-  private final Warnings warnings;
-
-  private final EvalOperator.ExpressionEvaluator val;
-
-  private final DriverContext driverContext;
-
-  public IsFiniteEvaluator(Source source, EvalOperator.ExpressionEvaluator val,
-      DriverContext driverContext) {
-    this.warnings = new Warnings(source);
-    this.val = val;
-    this.driverContext = driverContext;
-  }
-
-  @Override
-  public Block eval(Page page) {
-    try (DoubleBlock valBlock = (DoubleBlock) val.eval(page)) {
-      DoubleVector valVector = valBlock.asVector();
-      if (valVector == null) {
-        return eval(page.getPositionCount(), valBlock);
-      }
-      return eval(page.getPositionCount(), valVector).asBlock();
-    }
-  }
-
-  public BooleanBlock eval(int positionCount, DoubleBlock valBlock) {
-    try(BooleanBlock.Builder result = driverContext.blockFactory().newBooleanBlockBuilder(positionCount)) {
-      position: for (int p = 0; p < positionCount; p++) {
-        if (valBlock.isNull(p)) {
-          result.appendNull();
-          continue position;
-        }
-        if (valBlock.getValueCount(p) != 1) {
-          if (valBlock.getValueCount(p) > 1) {
-            warnings.registerException(new IllegalArgumentException("single-value function encountered multi-value"));
-          }
-          result.appendNull();
-          continue position;
-        }
-        result.appendBoolean(IsFinite.process(valBlock.getDouble(valBlock.getFirstValueIndex(p))));
-      }
-      return result.build();
-    }
-  }
-
-  public BooleanVector eval(int positionCount, DoubleVector valVector) {
-    try(BooleanVector.Builder result = driverContext.blockFactory().newBooleanVectorBuilder(positionCount)) {
-      position: for (int p = 0; p < positionCount; p++) {
-        result.appendBoolean(IsFinite.process(valVector.getDouble(p)));
-      }
-      return result.build();
-    }
-  }
-
-  @Override
-  public String toString() {
-    return "IsFiniteEvaluator[" + "val=" + val + "]";
-  }
-
-  @Override
-  public void close() {
-    Releasables.closeExpectNoException(val);
-  }
-
-  static class Factory implements EvalOperator.ExpressionEvaluator.Factory {
-    private final Source source;
-
-    private final EvalOperator.ExpressionEvaluator.Factory val;
-
-    public Factory(Source source, EvalOperator.ExpressionEvaluator.Factory val) {
-      this.source = source;
-      this.val = val;
-    }
-
-    @Override
-    public IsFiniteEvaluator get(DriverContext context) {
-      return new IsFiniteEvaluator(source, val.get(context), context);
-    }
-
-    @Override
-    public String toString() {
-      return "IsFiniteEvaluator[" + "val=" + val + "]";
-    }
-  }
-}

+ 0 - 110
x-pack/plugin/esql/src/main/java/generated/org/elasticsearch/xpack/esql/expression/function/scalar/math/IsInfiniteEvaluator.java

@@ -1,110 +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
-// 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.math;
-
-import java.lang.IllegalArgumentException;
-import java.lang.Override;
-import java.lang.String;
-import org.elasticsearch.compute.data.Block;
-import org.elasticsearch.compute.data.BooleanBlock;
-import org.elasticsearch.compute.data.BooleanVector;
-import org.elasticsearch.compute.data.DoubleBlock;
-import org.elasticsearch.compute.data.DoubleVector;
-import org.elasticsearch.compute.data.Page;
-import org.elasticsearch.compute.operator.DriverContext;
-import org.elasticsearch.compute.operator.EvalOperator;
-import org.elasticsearch.core.Releasables;
-import org.elasticsearch.xpack.esql.expression.function.Warnings;
-import org.elasticsearch.xpack.ql.tree.Source;
-
-/**
- * {@link EvalOperator.ExpressionEvaluator} implementation for {@link IsInfinite}.
- * This class is generated. Do not edit it.
- */
-public final class IsInfiniteEvaluator implements EvalOperator.ExpressionEvaluator {
-  private final Warnings warnings;
-
-  private final EvalOperator.ExpressionEvaluator val;
-
-  private final DriverContext driverContext;
-
-  public IsInfiniteEvaluator(Source source, EvalOperator.ExpressionEvaluator val,
-      DriverContext driverContext) {
-    this.warnings = new Warnings(source);
-    this.val = val;
-    this.driverContext = driverContext;
-  }
-
-  @Override
-  public Block eval(Page page) {
-    try (DoubleBlock valBlock = (DoubleBlock) val.eval(page)) {
-      DoubleVector valVector = valBlock.asVector();
-      if (valVector == null) {
-        return eval(page.getPositionCount(), valBlock);
-      }
-      return eval(page.getPositionCount(), valVector).asBlock();
-    }
-  }
-
-  public BooleanBlock eval(int positionCount, DoubleBlock valBlock) {
-    try(BooleanBlock.Builder result = driverContext.blockFactory().newBooleanBlockBuilder(positionCount)) {
-      position: for (int p = 0; p < positionCount; p++) {
-        if (valBlock.isNull(p)) {
-          result.appendNull();
-          continue position;
-        }
-        if (valBlock.getValueCount(p) != 1) {
-          if (valBlock.getValueCount(p) > 1) {
-            warnings.registerException(new IllegalArgumentException("single-value function encountered multi-value"));
-          }
-          result.appendNull();
-          continue position;
-        }
-        result.appendBoolean(IsInfinite.process(valBlock.getDouble(valBlock.getFirstValueIndex(p))));
-      }
-      return result.build();
-    }
-  }
-
-  public BooleanVector eval(int positionCount, DoubleVector valVector) {
-    try(BooleanVector.Builder result = driverContext.blockFactory().newBooleanVectorBuilder(positionCount)) {
-      position: for (int p = 0; p < positionCount; p++) {
-        result.appendBoolean(IsInfinite.process(valVector.getDouble(p)));
-      }
-      return result.build();
-    }
-  }
-
-  @Override
-  public String toString() {
-    return "IsInfiniteEvaluator[" + "val=" + val + "]";
-  }
-
-  @Override
-  public void close() {
-    Releasables.closeExpectNoException(val);
-  }
-
-  static class Factory implements EvalOperator.ExpressionEvaluator.Factory {
-    private final Source source;
-
-    private final EvalOperator.ExpressionEvaluator.Factory val;
-
-    public Factory(Source source, EvalOperator.ExpressionEvaluator.Factory val) {
-      this.source = source;
-      this.val = val;
-    }
-
-    @Override
-    public IsInfiniteEvaluator get(DriverContext context) {
-      return new IsInfiniteEvaluator(source, val.get(context), context);
-    }
-
-    @Override
-    public String toString() {
-      return "IsInfiniteEvaluator[" + "val=" + val + "]";
-    }
-  }
-}

+ 0 - 110
x-pack/plugin/esql/src/main/java/generated/org/elasticsearch/xpack/esql/expression/function/scalar/math/IsNaNEvaluator.java

@@ -1,110 +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
-// 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.math;
-
-import java.lang.IllegalArgumentException;
-import java.lang.Override;
-import java.lang.String;
-import org.elasticsearch.compute.data.Block;
-import org.elasticsearch.compute.data.BooleanBlock;
-import org.elasticsearch.compute.data.BooleanVector;
-import org.elasticsearch.compute.data.DoubleBlock;
-import org.elasticsearch.compute.data.DoubleVector;
-import org.elasticsearch.compute.data.Page;
-import org.elasticsearch.compute.operator.DriverContext;
-import org.elasticsearch.compute.operator.EvalOperator;
-import org.elasticsearch.core.Releasables;
-import org.elasticsearch.xpack.esql.expression.function.Warnings;
-import org.elasticsearch.xpack.ql.tree.Source;
-
-/**
- * {@link EvalOperator.ExpressionEvaluator} implementation for {@link IsNaN}.
- * This class is generated. Do not edit it.
- */
-public final class IsNaNEvaluator implements EvalOperator.ExpressionEvaluator {
-  private final Warnings warnings;
-
-  private final EvalOperator.ExpressionEvaluator val;
-
-  private final DriverContext driverContext;
-
-  public IsNaNEvaluator(Source source, EvalOperator.ExpressionEvaluator val,
-      DriverContext driverContext) {
-    this.warnings = new Warnings(source);
-    this.val = val;
-    this.driverContext = driverContext;
-  }
-
-  @Override
-  public Block eval(Page page) {
-    try (DoubleBlock valBlock = (DoubleBlock) val.eval(page)) {
-      DoubleVector valVector = valBlock.asVector();
-      if (valVector == null) {
-        return eval(page.getPositionCount(), valBlock);
-      }
-      return eval(page.getPositionCount(), valVector).asBlock();
-    }
-  }
-
-  public BooleanBlock eval(int positionCount, DoubleBlock valBlock) {
-    try(BooleanBlock.Builder result = driverContext.blockFactory().newBooleanBlockBuilder(positionCount)) {
-      position: for (int p = 0; p < positionCount; p++) {
-        if (valBlock.isNull(p)) {
-          result.appendNull();
-          continue position;
-        }
-        if (valBlock.getValueCount(p) != 1) {
-          if (valBlock.getValueCount(p) > 1) {
-            warnings.registerException(new IllegalArgumentException("single-value function encountered multi-value"));
-          }
-          result.appendNull();
-          continue position;
-        }
-        result.appendBoolean(IsNaN.process(valBlock.getDouble(valBlock.getFirstValueIndex(p))));
-      }
-      return result.build();
-    }
-  }
-
-  public BooleanVector eval(int positionCount, DoubleVector valVector) {
-    try(BooleanVector.Builder result = driverContext.blockFactory().newBooleanVectorBuilder(positionCount)) {
-      position: for (int p = 0; p < positionCount; p++) {
-        result.appendBoolean(IsNaN.process(valVector.getDouble(p)));
-      }
-      return result.build();
-    }
-  }
-
-  @Override
-  public String toString() {
-    return "IsNaNEvaluator[" + "val=" + val + "]";
-  }
-
-  @Override
-  public void close() {
-    Releasables.closeExpectNoException(val);
-  }
-
-  static class Factory implements EvalOperator.ExpressionEvaluator.Factory {
-    private final Source source;
-
-    private final EvalOperator.ExpressionEvaluator.Factory val;
-
-    public Factory(Source source, EvalOperator.ExpressionEvaluator.Factory val) {
-      this.source = source;
-      this.val = val;
-    }
-
-    @Override
-    public IsNaNEvaluator get(DriverContext context) {
-      return new IsNaNEvaluator(source, val.get(context), context);
-    }
-
-    @Override
-    public String toString() {
-      return "IsNaNEvaluator[" + "val=" + val + "]";
-    }
-  }
-}

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

@@ -50,9 +50,6 @@ import org.elasticsearch.xpack.esql.expression.function.scalar.math.Cos;
 import org.elasticsearch.xpack.esql.expression.function.scalar.math.Cosh;
 import org.elasticsearch.xpack.esql.expression.function.scalar.math.E;
 import org.elasticsearch.xpack.esql.expression.function.scalar.math.Floor;
-import org.elasticsearch.xpack.esql.expression.function.scalar.math.IsFinite;
-import org.elasticsearch.xpack.esql.expression.function.scalar.math.IsInfinite;
-import org.elasticsearch.xpack.esql.expression.function.scalar.math.IsNaN;
 import org.elasticsearch.xpack.esql.expression.function.scalar.math.Log10;
 import org.elasticsearch.xpack.esql.expression.function.scalar.math.Pi;
 import org.elasticsearch.xpack.esql.expression.function.scalar.math.Pow;
@@ -134,9 +131,6 @@ public final class EsqlFunctionRegistry extends FunctionRegistry {
                 def(E.class, E::new, "e"),
                 def(Floor.class, Floor::new, "floor"),
                 def(Greatest.class, Greatest::new, "greatest"),
-                def(IsFinite.class, IsFinite::new, "is_finite"),
-                def(IsInfinite.class, IsInfinite::new, "is_infinite"),
-                def(IsNaN.class, IsNaN::new, "is_nan"),
                 def(Log10.class, Log10::new, "log10"),
                 def(Least.class, Least::new, "least"),
                 def(Pi.class, Pi::new, "pi"),

+ 0 - 48
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/math/IsFinite.java

@@ -1,48 +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
- * 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.math;
-
-import org.elasticsearch.compute.ann.Evaluator;
-import org.elasticsearch.compute.operator.EvalOperator.ExpressionEvaluator;
-import org.elasticsearch.xpack.esql.expression.function.FunctionInfo;
-import org.elasticsearch.xpack.esql.expression.function.Param;
-import org.elasticsearch.xpack.ql.expression.Expression;
-import org.elasticsearch.xpack.ql.tree.NodeInfo;
-import org.elasticsearch.xpack.ql.tree.Source;
-
-import java.util.List;
-import java.util.function.Function;
-
-public class IsFinite extends RationalUnaryPredicate {
-
-    @FunctionInfo(returnType = "boolean", description = "Returns true if the argument is a finite floating-point value.")
-    public IsFinite(Source source, @Param(name = "n", type = { "double" }, description = "A floating-point value") Expression field) {
-        super(source, field);
-    }
-
-    @Override
-    public ExpressionEvaluator.Factory toEvaluator(Function<Expression, ExpressionEvaluator.Factory> toEvaluator) {
-        var field = toEvaluator.apply(field());
-        return new IsFiniteEvaluator.Factory(source(), field);
-    }
-
-    @Evaluator
-    static boolean process(double val) {
-        return Double.isFinite(val);
-    }
-
-    @Override
-    public final Expression replaceChildren(List<Expression> newChildren) {
-        return new IsFinite(source(), newChildren.get(0));
-    }
-
-    @Override
-    protected NodeInfo<? extends Expression> info() {
-        return NodeInfo.create(this, IsFinite::new, field());
-    }
-}

+ 0 - 50
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/math/IsInfinite.java

@@ -1,50 +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
- * 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.math;
-
-import org.elasticsearch.compute.ann.Evaluator;
-import org.elasticsearch.compute.operator.EvalOperator.ExpressionEvaluator;
-import org.elasticsearch.xpack.esql.expression.function.FunctionInfo;
-import org.elasticsearch.xpack.esql.expression.function.Param;
-import org.elasticsearch.xpack.ql.expression.Expression;
-import org.elasticsearch.xpack.ql.tree.NodeInfo;
-import org.elasticsearch.xpack.ql.tree.Source;
-
-import java.util.List;
-import java.util.function.Function;
-
-public class IsInfinite extends RationalUnaryPredicate {
-
-    @FunctionInfo(
-        returnType = "boolean",
-        description = "Returns true if the specified floating-point value is infinitely large in magnitude."
-    )
-    public IsInfinite(Source source, @Param(name = "n", type = { "double" }, description = "A floating-point value") Expression field) {
-        super(source, field);
-    }
-
-    @Override
-    public ExpressionEvaluator.Factory toEvaluator(Function<Expression, ExpressionEvaluator.Factory> toEvaluator) {
-        return new IsInfiniteEvaluator.Factory(source(), toEvaluator.apply(field()));
-    }
-
-    @Evaluator
-    static boolean process(double val) {
-        return Double.isInfinite(val);
-    }
-
-    @Override
-    public final Expression replaceChildren(List<Expression> newChildren) {
-        return new IsInfinite(source(), newChildren.get(0));
-    }
-
-    @Override
-    protected NodeInfo<? extends Expression> info() {
-        return NodeInfo.create(this, IsInfinite::new, field());
-    }
-}

+ 0 - 47
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/math/IsNaN.java

@@ -1,47 +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
- * 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.math;
-
-import org.elasticsearch.compute.ann.Evaluator;
-import org.elasticsearch.compute.operator.EvalOperator.ExpressionEvaluator;
-import org.elasticsearch.xpack.esql.expression.function.FunctionInfo;
-import org.elasticsearch.xpack.esql.expression.function.Param;
-import org.elasticsearch.xpack.ql.expression.Expression;
-import org.elasticsearch.xpack.ql.tree.NodeInfo;
-import org.elasticsearch.xpack.ql.tree.Source;
-
-import java.util.List;
-import java.util.function.Function;
-
-public class IsNaN extends RationalUnaryPredicate {
-
-    @FunctionInfo(returnType = "boolean", description = "Returns true if the argument is a Not-a-Number (NaN) value.")
-    public IsNaN(Source source, @Param(name = "n", type = { "double" }, description = "A floating-point value") Expression field) {
-        super(source, field);
-    }
-
-    @Override
-    public ExpressionEvaluator.Factory toEvaluator(Function<Expression, ExpressionEvaluator.Factory> toEvaluator) {
-        return new IsNaNEvaluator.Factory(source(), toEvaluator.apply(field()));
-    }
-
-    @Evaluator
-    static boolean process(double val) {
-        return Double.isNaN(val);
-    }
-
-    @Override
-    public final Expression replaceChildren(List<Expression> newChildren) {
-        return new IsNaN(source(), newChildren.get(0));
-    }
-
-    @Override
-    protected NodeInfo<? extends Expression> info() {
-        return NodeInfo.create(this, IsNaN::new, field());
-    }
-}

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

@@ -69,9 +69,6 @@ import org.elasticsearch.xpack.esql.expression.function.scalar.math.Cos;
 import org.elasticsearch.xpack.esql.expression.function.scalar.math.Cosh;
 import org.elasticsearch.xpack.esql.expression.function.scalar.math.E;
 import org.elasticsearch.xpack.esql.expression.function.scalar.math.Floor;
-import org.elasticsearch.xpack.esql.expression.function.scalar.math.IsFinite;
-import org.elasticsearch.xpack.esql.expression.function.scalar.math.IsInfinite;
-import org.elasticsearch.xpack.esql.expression.function.scalar.math.IsNaN;
 import org.elasticsearch.xpack.esql.expression.function.scalar.math.Log10;
 import org.elasticsearch.xpack.esql.expression.function.scalar.math.Pi;
 import org.elasticsearch.xpack.esql.expression.function.scalar.math.Pow;
@@ -320,9 +317,6 @@ public final class PlanNamedTypes {
             of(ESQL_UNARY_SCLR_CLS, Cos.class, PlanNamedTypes::writeESQLUnaryScalar, PlanNamedTypes::readESQLUnaryScalar),
             of(ESQL_UNARY_SCLR_CLS, Cosh.class, PlanNamedTypes::writeESQLUnaryScalar, PlanNamedTypes::readESQLUnaryScalar),
             of(ESQL_UNARY_SCLR_CLS, Floor.class, PlanNamedTypes::writeESQLUnaryScalar, PlanNamedTypes::readESQLUnaryScalar),
-            of(ESQL_UNARY_SCLR_CLS, IsFinite.class, PlanNamedTypes::writeESQLUnaryScalar, PlanNamedTypes::readESQLUnaryScalar),
-            of(ESQL_UNARY_SCLR_CLS, IsInfinite.class, PlanNamedTypes::writeESQLUnaryScalar, PlanNamedTypes::readESQLUnaryScalar),
-            of(ESQL_UNARY_SCLR_CLS, IsNaN.class, PlanNamedTypes::writeESQLUnaryScalar, PlanNamedTypes::readESQLUnaryScalar),
             of(ESQL_UNARY_SCLR_CLS, Length.class, PlanNamedTypes::writeESQLUnaryScalar, PlanNamedTypes::readESQLUnaryScalar),
             of(ESQL_UNARY_SCLR_CLS, Log10.class, PlanNamedTypes::writeESQLUnaryScalar, PlanNamedTypes::readESQLUnaryScalar),
             of(ESQL_UNARY_SCLR_CLS, LTrim.class, PlanNamedTypes::writeESQLUnaryScalar, PlanNamedTypes::readESQLUnaryScalar),
@@ -1158,9 +1152,6 @@ public final class PlanNamedTypes {
         entry(name(Cos.class), Cos::new),
         entry(name(Cosh.class), Cosh::new),
         entry(name(Floor.class), Floor::new),
-        entry(name(IsFinite.class), IsFinite::new),
-        entry(name(IsInfinite.class), IsInfinite::new),
-        entry(name(IsNaN.class), IsNaN::new),
         entry(name(Length.class), Length::new),
         entry(name(Log10.class), Log10::new),
         entry(name(LTrim.class), LTrim::new),

+ 0 - 63
x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/math/IsFiniteTests.java

@@ -1,63 +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
- * 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.math;
-
-import com.carrotsearch.randomizedtesting.annotations.Name;
-import com.carrotsearch.randomizedtesting.annotations.ParametersFactory;
-
-import org.elasticsearch.xpack.esql.expression.function.TestCaseSupplier;
-import org.elasticsearch.xpack.ql.expression.Expression;
-import org.elasticsearch.xpack.ql.tree.Source;
-import org.elasticsearch.xpack.ql.type.DataTypes;
-import org.hamcrest.Matcher;
-
-import java.util.List;
-import java.util.function.Supplier;
-
-import static org.hamcrest.Matchers.equalTo;
-
-public class IsFiniteTests extends AbstractRationalUnaryPredicateTests {
-    public IsFiniteTests(@Name("TestCase") Supplier<TestCaseSupplier.TestCase> testCaseSupplier) {
-        this.testCase = testCaseSupplier.get();
-    }
-
-    @ParametersFactory
-    public static Iterable<Object[]> parameters() {
-        return parameterSuppliersFromTypedData(
-            List.of(
-                new TestCaseSupplier("NaN", () -> makeTestCase(Double.NaN, false)),
-                new TestCaseSupplier("positive Infinity", () -> makeTestCase(Double.POSITIVE_INFINITY, false)),
-                new TestCaseSupplier("negative Infinity", () -> makeTestCase(Double.NEGATIVE_INFINITY, false)),
-                new TestCaseSupplier("positive small double", () -> makeTestCase(randomDouble(), true)),
-                new TestCaseSupplier("negative small double", () -> makeTestCase(-randomDouble(), true)),
-                new TestCaseSupplier("positive large double", () -> makeTestCase(1 / randomDouble(), true)),
-                new TestCaseSupplier("negative large double", () -> makeTestCase(-1 / randomDouble(), true))
-            )
-        );
-    }
-
-    private static TestCaseSupplier.TestCase makeTestCase(double val, boolean expected) {
-        return new TestCaseSupplier.TestCase(
-            List.of(new TestCaseSupplier.TypedData(val, DataTypes.DOUBLE, "arg")),
-            "IsFiniteEvaluator[val=Attribute[channel=0]]",
-            DataTypes.BOOLEAN,
-            equalTo(expected)
-        );
-    }
-
-    @Override
-    protected RationalUnaryPredicate build(Source source, Expression value) {
-        return new IsFinite(source, value);
-    }
-
-    @Override
-    protected Matcher<Object> resultMatcher(double d) {
-        return equalTo(Double.isNaN(d) == false && Double.isInfinite(d) == false);
-    }
-
-}

+ 0 - 63
x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/math/IsInfiniteTests.java

@@ -1,63 +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
- * 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.math;
-
-import com.carrotsearch.randomizedtesting.annotations.Name;
-import com.carrotsearch.randomizedtesting.annotations.ParametersFactory;
-
-import org.elasticsearch.xpack.esql.expression.function.TestCaseSupplier;
-import org.elasticsearch.xpack.ql.expression.Expression;
-import org.elasticsearch.xpack.ql.tree.Source;
-import org.elasticsearch.xpack.ql.type.DataTypes;
-import org.hamcrest.Matcher;
-
-import java.util.List;
-import java.util.function.Supplier;
-
-import static org.hamcrest.Matchers.equalTo;
-
-public class IsInfiniteTests extends AbstractRationalUnaryPredicateTests {
-    public IsInfiniteTests(@Name("TestCase") Supplier<TestCaseSupplier.TestCase> testCaseSupplier) {
-        this.testCase = testCaseSupplier.get();
-    }
-
-    @ParametersFactory
-    public static Iterable<Object[]> parameters() {
-        return parameterSuppliersFromTypedData(
-            List.of(
-                new TestCaseSupplier("NaN", () -> makeTestCase(Double.NaN, false)),
-                new TestCaseSupplier("positive Infinity", () -> makeTestCase(Double.POSITIVE_INFINITY, true)),
-                new TestCaseSupplier("negative Infinity", () -> makeTestCase(Double.NEGATIVE_INFINITY, true)),
-                new TestCaseSupplier("positive small double", () -> makeTestCase(randomDouble(), false)),
-                new TestCaseSupplier("negative small double", () -> makeTestCase(-randomDouble(), false)),
-                new TestCaseSupplier("positive large double", () -> makeTestCase(1 / randomDouble(), false)),
-                new TestCaseSupplier("negative large double", () -> makeTestCase(-1 / randomDouble(), false))
-            )
-        );
-    }
-
-    private static TestCaseSupplier.TestCase makeTestCase(double val, boolean expected) {
-        return new TestCaseSupplier.TestCase(
-            List.of(new TestCaseSupplier.TypedData(val, DataTypes.DOUBLE, "arg")),
-            "IsInfiniteEvaluator[val=Attribute[channel=0]]",
-            DataTypes.BOOLEAN,
-            equalTo(expected)
-        );
-    }
-
-    @Override
-    protected RationalUnaryPredicate build(Source source, Expression value) {
-        return new IsInfinite(source, value);
-    }
-
-    @Override
-    protected Matcher<Object> resultMatcher(double d) {
-        return equalTo(Double.isInfinite(d));
-    }
-
-}

+ 0 - 64
x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/math/IsNaNTests.java

@@ -1,64 +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
- * 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.math;
-
-import com.carrotsearch.randomizedtesting.annotations.Name;
-import com.carrotsearch.randomizedtesting.annotations.ParametersFactory;
-
-import org.elasticsearch.xpack.esql.expression.function.TestCaseSupplier;
-import org.elasticsearch.xpack.ql.expression.Expression;
-import org.elasticsearch.xpack.ql.tree.Source;
-import org.elasticsearch.xpack.ql.type.DataTypes;
-import org.hamcrest.Matcher;
-
-import java.util.List;
-import java.util.function.Supplier;
-
-import static org.hamcrest.Matchers.equalTo;
-
-public class IsNaNTests extends AbstractRationalUnaryPredicateTests {
-    public IsNaNTests(@Name("TestCase") Supplier<TestCaseSupplier.TestCase> testCaseSupplier) {
-        this.testCase = testCaseSupplier.get();
-    }
-
-    @ParametersFactory
-    public static Iterable<Object[]> parameters() {
-        return parameterSuppliersFromTypedData(
-            List.of(
-                new TestCaseSupplier("NaN", () -> makeTestCase(Double.NaN, true)),
-                new TestCaseSupplier("positive Infinity", () -> makeTestCase(Double.POSITIVE_INFINITY, false)),
-                new TestCaseSupplier("negative Infinity", () -> makeTestCase(Double.NEGATIVE_INFINITY, false)),
-                new TestCaseSupplier("positive small double", () -> makeTestCase(randomDouble(), false)),
-                new TestCaseSupplier("negative small double", () -> makeTestCase(-randomDouble(), false)),
-                new TestCaseSupplier("positive large double", () -> makeTestCase(1 / randomDouble(), false)),
-                new TestCaseSupplier("negative large double", () -> makeTestCase(-1 / randomDouble(), false))
-
-            )
-        );
-    }
-
-    private static TestCaseSupplier.TestCase makeTestCase(double val, boolean expected) {
-        return new TestCaseSupplier.TestCase(
-            List.of(new TestCaseSupplier.TypedData(val, DataTypes.DOUBLE, "arg")),
-            "IsNaNEvaluator[val=Attribute[channel=0]]",
-            DataTypes.BOOLEAN,
-            equalTo(expected)
-        );
-    }
-
-    @Override
-    protected RationalUnaryPredicate build(Source source, Expression value) {
-        return new IsNaN(source, value);
-    }
-
-    @Override
-    protected Matcher<Object> resultMatcher(double d) {
-        return equalTo(Double.isNaN(d));
-    }
-
-}