diff --git a/docs/reference/mapping/types/unsigned_long.asciidoc b/docs/reference/mapping/types/unsigned_long.asciidoc index 96c04148011ec..6e7ace01b6333 100644 --- a/docs/reference/mapping/types/unsigned_long.asciidoc +++ b/docs/reference/mapping/types/unsigned_long.asciidoc @@ -102,13 +102,18 @@ GET /my_index/_search -------------------------------- //TEST[continued] -Similarly to sort values, script values of an `unsigned_long` field -return a `Number` representing a `Long` or `BigInteger`. -The same values: `Long` or `BigInteger` are used for `terms` aggregations. + +==== Unsigned long in scripts +Currently unsigned_long is not supported in scripts. ==== Stored fields A stored field of `unsigned_long` is stored and returned as `String`. +==== Aggregations +For `terms` aggregations, similarly to sort values, `Long` or +`BigInteger` values are used. For other aggregations, +values are converted to the `double` type. + ==== Queries with mixed numeric types Searches with mixed numeric types one of which is `unsigned_long` are diff --git a/modules/lang-painless/src/main/java/org/elasticsearch/painless/Def.java b/modules/lang-painless/src/main/java/org/elasticsearch/painless/Def.java index 4e2ff07b5b22f..a473d1e5d19a3 100644 --- a/modules/lang-painless/src/main/java/org/elasticsearch/painless/Def.java +++ b/modules/lang-painless/src/main/java/org/elasticsearch/painless/Def.java @@ -29,7 +29,6 @@ import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; -import java.math.BigInteger; import java.time.ZonedDateTime; import java.util.BitSet; import java.util.Collections; @@ -761,8 +760,6 @@ public static double defTodoubleImplicit(final Object value) { return (float)value; } else if (value instanceof Double) { return (double)value; - } else if (value instanceof BigInteger) { - return ((BigInteger)value).doubleValue(); } else { throw new ClassCastException("cannot implicitly cast " + "def [" + PainlessLookupUtility.typeToUnboxedType(value.getClass()).getCanonicalName() + "] to " + @@ -895,8 +892,7 @@ public static double defTodoubleExplicit(final Object value) { value instanceof Integer || value instanceof Long || value instanceof Float || - value instanceof Double || - value instanceof BigInteger + value instanceof Double ) { return ((Number)value).doubleValue(); } else { @@ -1035,8 +1031,6 @@ public static Double defToDoubleImplicit(final Object value) { return (double)(float)value; } else if (value instanceof Double) { return (Double) value; - } else if (value instanceof BigInteger) { - return ((BigInteger)value).doubleValue(); } else { throw new ClassCastException("cannot implicitly cast " + "def [" + PainlessLookupUtility.typeToUnboxedType(value.getClass()).getCanonicalName() + "] to " + @@ -1183,8 +1177,7 @@ public static Double defToDoubleExplicit(final Object value) { value instanceof Integer || value instanceof Long || value instanceof Float || - value instanceof Double || - value instanceof BigInteger + value instanceof Double ) { return ((Number)value).doubleValue(); } else { diff --git a/modules/lang-painless/src/test/java/org/elasticsearch/painless/DefCastTests.java b/modules/lang-painless/src/test/java/org/elasticsearch/painless/DefCastTests.java index 0a132444f52dc..3067e387c9a8e 100644 --- a/modules/lang-painless/src/test/java/org/elasticsearch/painless/DefCastTests.java +++ b/modules/lang-painless/src/test/java/org/elasticsearch/painless/DefCastTests.java @@ -166,7 +166,6 @@ public void testdefTodoubleImplicit() { assertEquals((double)0, exec("def d = Long.valueOf(0); double b = d; b")); assertEquals((double)0, exec("def d = Float.valueOf(0); double b = d; b")); assertEquals((double)0, exec("def d = Double.valueOf(0); double b = d; b")); - assertEquals((double)0, exec("def d = BigInteger.valueOf(0); double b = d; b")); expectScriptThrows(ClassCastException.class, () -> exec("def d = new ArrayList(); double b = d;")); } diff --git a/x-pack/plugin/mapper-unsigned-long/src/main/java/org/elasticsearch/xpack/unsignedlong/DocValuesWhitelistExtension.java b/x-pack/plugin/mapper-unsigned-long/src/main/java/org/elasticsearch/xpack/unsignedlong/DocValuesWhitelistExtension.java index e596b2735fe7b..d76426f94f3f7 100644 --- a/x-pack/plugin/mapper-unsigned-long/src/main/java/org/elasticsearch/xpack/unsignedlong/DocValuesWhitelistExtension.java +++ b/x-pack/plugin/mapper-unsigned-long/src/main/java/org/elasticsearch/xpack/unsignedlong/DocValuesWhitelistExtension.java @@ -8,44 +8,17 @@ import org.elasticsearch.painless.spi.PainlessExtension; import org.elasticsearch.painless.spi.Whitelist; -import org.elasticsearch.painless.spi.WhitelistLoader; -import org.elasticsearch.script.AggregationScript; -import org.elasticsearch.script.BucketAggregationSelectorScript; -import org.elasticsearch.script.FieldScript; -import org.elasticsearch.script.FilterScript; -import org.elasticsearch.script.NumberSortScript; -import org.elasticsearch.script.ScoreScript; import org.elasticsearch.script.ScriptContext; -import org.elasticsearch.script.StringSortScript; +import java.util.Collections; import java.util.List; import java.util.Map; -import static java.util.Collections.singletonList; - public class DocValuesWhitelistExtension implements PainlessExtension { - private static final Whitelist WHITELIST = WhitelistLoader.loadFromResourceFiles(DocValuesWhitelistExtension.class, "whitelist.txt"); - @Override public Map, List> getContextWhitelists() { - List whitelist = singletonList(WHITELIST); - Map, List> contexts = Map.of( - FieldScript.CONTEXT, - whitelist, - ScoreScript.CONTEXT, - whitelist, - FilterScript.CONTEXT, - whitelist, - AggregationScript.CONTEXT, - whitelist, - NumberSortScript.CONTEXT, - whitelist, - StringSortScript.CONTEXT, - whitelist, - BucketAggregationSelectorScript.CONTEXT, - whitelist - ); - return contexts; + // TODO: support unsigned_long in scripts + return Collections.emptyMap(); } } diff --git a/x-pack/plugin/mapper-unsigned-long/src/main/java/org/elasticsearch/xpack/unsignedlong/UnsignedLongLeafFieldData.java b/x-pack/plugin/mapper-unsigned-long/src/main/java/org/elasticsearch/xpack/unsignedlong/UnsignedLongLeafFieldData.java index d1729f937931e..44449b6ed2913 100644 --- a/x-pack/plugin/mapper-unsigned-long/src/main/java/org/elasticsearch/xpack/unsignedlong/UnsignedLongLeafFieldData.java +++ b/x-pack/plugin/mapper-unsigned-long/src/main/java/org/elasticsearch/xpack/unsignedlong/UnsignedLongLeafFieldData.java @@ -73,7 +73,8 @@ public int docValueCount() { @Override public ScriptDocValues getScriptValues() { - return new UnsignedLongScriptDocValues(getLongValues()); + // TODO: add support for scripts + throw new UnsupportedOperationException("Using unsigned_long in scripts is currently not supported!"); } @Override diff --git a/x-pack/plugin/src/test/resources/rest-api-spec/test/unsigned_long/50_script_values.yml b/x-pack/plugin/src/test/resources/rest-api-spec/test/unsigned_long/50_script_values.yml index f858105dc6050..56929f56f4742 100644 --- a/x-pack/plugin/src/test/resources/rest-api-spec/test/unsigned_long/50_script_values.yml +++ b/x-pack/plugin/src/test/resources/rest-api-spec/test/unsigned_long/50_script_values.yml @@ -1,8 +1,8 @@ setup: - skip: - version: " - 7.9.99" - reason: "unsigned_long was added in 7.10" + version: "all" + reason: "AwaitsFix https://github.com/elastic/elasticsearch/issues/64361" - do: indices.create: