This is an automated email from the ASF dual-hosted git repository. xiazcy pushed a commit to branch type-enum-poc in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit 13a51e9dfb61b8856230899edae39b80e51b1ad8 Author: xiazcy <xia...@gmail.com> AuthorDate: Mon Jul 28 19:38:29 2025 -0700 handled overflow edge cases in bigint conversion and refactored coerceTo and castTo to use the same conversion logic in NumberHelper. Removed `n` from N enum value in Grammar, and used `_` suffix for keyword collisions in Java/Groovy/JS. --- docs/src/reference/the-traversal.asciidoc | 19 +- docs/src/upgrade/release-3.8.x.asciidoc | 14 +- .../language/grammar/GenericLiteralVisitor.java | 5 + .../language/grammar/TraversalEnumParser.java | 11 + .../language/grammar/TraversalMethodVisitor.java | 2 +- .../translator/GroovyTranslateVisitor.java | 9 + .../language/translator/JavaTranslateVisitor.java | 11 + .../translator/JavascriptTranslateVisitor.java | 9 + .../tinkerpop/gremlin/process/traversal/N.java | 26 +-- .../io/binary/TypeSerializerRegistry.java | 49 +---- .../structure/io/binary/types/EnumSerializer.java | 1 - .../structure/io/binary/types/NSerializer.java | 46 ++++ .../structure/io/graphson/GraphSONModule.java | 8 +- .../io/graphson/TraversalSerializersV2.java | 40 +++- .../io/graphson/TraversalSerializersV3.java | 40 +++- .../tinkerpop/gremlin/util/NumberHelper.java | 88 ++++---- .../grammar/GeneralLiteralVisitorTest.java | 38 +++- .../language/translator/GremlinTranslatorTest.java | 18 ++ .../traversal/step/map/AsNumberStepTest.java | 236 +++++++++++---------- .../tinkerpop/gremlin/util/NumberHelperTest.java | 30 +-- .../src/Gremlin.Net/Process/Traversal/N.cs | 32 +-- .../Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs | 24 +-- gremlin-go/driver/cucumber/gremlin.go | 24 +-- gremlin-go/driver/serializer.go | 2 +- gremlin-go/driver/traversal.go | 32 +-- .../gremlin-javascript/lib/process/traversal.js | 10 +- .../gremlin-javascript/test/cucumber/gremlin.js | 24 +-- .../test/unit/graphbinary/AnySerializer-test.js | 6 +- .../test/unit/graphbinary/EnumSerializer-test.js | 1 + gremlin-language/src/main/antlr4/Gremlin.g4 | 16 +- .../language/corpus/DocumentationReader.java | 4 +- .../python/gremlin_python/process/traversal.py | 21 +- gremlin-python/src/main/python/radish/gremlin.py | 24 +-- .../tests/driver/test_driver_remote_connection.py | 2 +- .../gremlin/test/features/map/AsNumber.feature | 46 ++-- 35 files changed, 577 insertions(+), 391 deletions(-) diff --git a/docs/src/reference/the-traversal.asciidoc b/docs/src/reference/the-traversal.asciidoc index 550a1af3d3..6b587212f3 100644 --- a/docs/src/reference/the-traversal.asciidoc +++ b/docs/src/reference/the-traversal.asciidoc @@ -844,9 +844,9 @@ All other input types will result in `IllegalArgumentException`. ---- g.inject(1234).asNumber() <1> g.inject(1.76).asNumber() <2> -g.inject(1.76).asNumber(N.nint) <3> +g.inject(1.76).asNumber(N.int_) <3> g.inject("1b").asNumber() <4> -g.inject(33550336).asNumber(N.nbyte) <5> +g.inject(33550336).asNumber(N.byte_) <5> ---- <1> An int will be passed through. @@ -855,6 +855,21 @@ g.inject(33550336).asNumber(N.nbyte) <5> <4> String containing any character other than numerical ones will result in `NumberFormatException`. <5> Narrowing of int to byte that overflows will throw `ArithmeticException`. +[NOTE, caption=Java] +==== +The enums values `byte`, `short`, `int`, `long`, `float`, `double` are reserved word in Java, and therefore must be referred to in Gremlin with an underscore appended as a suffix: `byte_`, `short_`, `int_`, `long_`, `float_`, `double_`. +==== + +[NOTE, caption=Groovy & Gremlin Console] +==== +The enums values `byte`, `short`, `int`, `long`, `float`, `double` are reserved word in Groovy, therefore as the Gremlin Console is Groovy-based, they must be referred to in Gremlin with an underscore appended as a suffix: `byte_`, `short_`, `int_`, `long_`, `float_`, `double_`. +==== + +[NOTE, caption=JavaScript] +==== +The enums values `byte`, `short`, `int`, `long`, `float`, `double` are reserved word in Javascript, and therefore must be referred to in Gremlin with an underscore appended as a suffix: `byte_`, `short_`, `int_`, `long_`, `float_`, `double_`. +==== + *Additional References* link:++https://tinkerpop.apache.org/javadocs/x.y.z/core/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.html#asNumber()++[`asNumber()`] diff --git a/docs/src/upgrade/release-3.8.x.asciidoc b/docs/src/upgrade/release-3.8.x.asciidoc index 31e9738afc..2ca45e6322 100644 --- a/docs/src/upgrade/release-3.8.x.asciidoc +++ b/docs/src/upgrade/release-3.8.x.asciidoc @@ -51,7 +51,7 @@ gremlin> g.inject(1.0, 2l, 3, "4", "0x5").asNumber().sum() ==>15.0 // given sum() step returned a double, one can use asNumber() to further cast the result into desired type -gremlin> g.inject(1.0, 2l, 3, "4", "0x5").asNumber().sum().asNumber(N.nint) +gremlin> g.inject(1.0, 2l, 3, "4", "0x5").asNumber().sum().asNumber(N.int_) ==>15 ---- @@ -61,11 +61,11 @@ Numerical input will pass through unless a type is specified by the number token [source,text] ---- -gremlin> g.inject(5.0).asNumber(N.nint) +gremlin> g.inject(5.0).asNumber(N.int_) ==> 5 // casts double to int -gremlin> g.inject(12).asNumber(N.nbyte) +gremlin> g.inject(12).asNumber(N.byte_) ==> 12 -gremlin> g.inject(128).asNumber(N.nbyte) +gremlin> g.inject(128).asNumber(N.byte_) ==> ArithmeticException ---- @@ -75,11 +75,11 @@ String input will be parsed. By default, the smalled unit of number to be parsed ---- gremlin> g.inject("5").asNumber() ==> 5 -gremlin> g.inject("5.7").asNumber(N.nint) +gremlin> g.inject("5.7").asNumber(N.int_) ==> 5 -gremlin> g.inject("1,000").asNumber(N.nint) +gremlin> g.inject("1,000").asNumber(N.int_) ==> NumberFormatException -gremlin> g.inject("128").asNumber(N.nbyte) +gremlin> g.inject("128").asNumber(N.byte_) ==> ArithmeticException ---- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/GenericLiteralVisitor.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/GenericLiteralVisitor.java index 2556f6ee87..eb0b9dc343 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/GenericLiteralVisitor.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/GenericLiteralVisitor.java @@ -601,6 +601,11 @@ public class GenericLiteralVisitor extends DefaultGremlinBaseVisitor<Object> { return TraversalEnumParser.parseTraversalEnumFromContext(Pick.class, ctx); } + @Override + public Object visitTraversalN(final GremlinParser.TraversalNContext ctx) { + return TraversalEnumParser.parseTraversalNFromContext(ctx); + } + @Override public Object visitTraversalStrategy(final GremlinParser.TraversalStrategyContext ctx) { return antlr.traversalStrategyVisitor.visitTraversalStrategy(ctx); diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalEnumParser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalEnumParser.java index 0c43f9ba49..e894f8bf24 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalEnumParser.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalEnumParser.java @@ -19,6 +19,7 @@ package org.apache.tinkerpop.gremlin.language.grammar; import org.antlr.v4.runtime.tree.ParseTree; +import org.apache.tinkerpop.gremlin.process.traversal.N; import org.apache.tinkerpop.gremlin.process.traversal.Scope; import org.apache.tinkerpop.gremlin.structure.Direction; @@ -65,4 +66,14 @@ public class TraversalEnumParser { text = text.substring(Direction.class.getSimpleName().length() + 1); return Direction.directionValueOf(text); } + + /** + * Parsing of {@link N} requires some special handling because of java keyword collision. + */ + public static N parseTraversalNFromContext(final GremlinParser.TraversalNContext context) { + String text = context.getText(); + if (text.startsWith(N.class.getSimpleName())) + text = text.substring(N.class.getSimpleName().length() + 1); + return text.startsWith("big") ? N.valueOf(text) : N.valueOf(text + "_"); + } } diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalMethodVisitor.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalMethodVisitor.java index 06044ef9dc..2fc4434d3d 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalMethodVisitor.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalMethodVisitor.java @@ -2117,7 +2117,7 @@ public class TraversalMethodVisitor extends TraversalRootVisitor<GraphTraversal> @Override public GraphTraversal visitTraversalMethod_asNumber_traversalN(final GremlinParser.TraversalMethod_asNumber_traversalNContext ctx) { return graphTraversal.asNumber( - TraversalEnumParser.parseTraversalEnumFromContext(N.class, ctx.traversalN())); + TraversalEnumParser.parseTraversalNFromContext(ctx.traversalN())); } public GraphTraversal[] getNestedTraversalList(final GremlinParser.NestedTraversalListContext ctx) { diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/GroovyTranslateVisitor.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/GroovyTranslateVisitor.java index 97e76358ea..c5d83388d5 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/GroovyTranslateVisitor.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/GroovyTranslateVisitor.java @@ -45,6 +45,15 @@ public class GroovyTranslateVisitor extends TranslateVisitor { super(graphTraversalSourceName); } + @Override + public Void visitTraversalN(GremlinParser.TraversalNContext ctx) { + final String[] split = ctx.getText().split("\\."); + sb.append(processGremlinSymbol(split[0])).append("."); + sb.append(processGremlinSymbol(split[1])); + if (!split[1].startsWith("big")) sb.append("_"); + return null; + } + @Override public Void visitIntegerLiteral(final GremlinParser.IntegerLiteralContext ctx) { final String integerLiteral = ctx.getText().toLowerCase(); diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/JavaTranslateVisitor.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/JavaTranslateVisitor.java index 81b6b25b84..18ae1bd05c 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/JavaTranslateVisitor.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/JavaTranslateVisitor.java @@ -21,7 +21,9 @@ package org.apache.tinkerpop.gremlin.language.translator; import org.antlr.v4.runtime.tree.ParseTree; import org.antlr.v4.runtime.tree.TerminalNode; import org.apache.tinkerpop.gremlin.language.grammar.GremlinParser; +import org.apache.tinkerpop.gremlin.process.traversal.N; import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.OptionsStrategy; +import org.apache.tinkerpop.gremlin.structure.Direction; import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceVertex; import org.apache.tinkerpop.gremlin.util.DatetimeHelper; @@ -106,6 +108,15 @@ public class JavaTranslateVisitor extends AbstractTranslateVisitor { return null; } + @Override + public Void visitTraversalN(GremlinParser.TraversalNContext ctx) { + final String[] split = ctx.getText().split("\\."); + sb.append(processGremlinSymbol(split[0])).append("."); + sb.append(processGremlinSymbol(split[1])); + if (!split[1].startsWith("big")) sb.append("_"); + return null; + } + @Override public Void visitGenericMapLiteral(final GremlinParser.GenericMapLiteralContext ctx) { sb.append("new LinkedHashMap<Object, Object>() {{ "); diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/JavascriptTranslateVisitor.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/JavascriptTranslateVisitor.java index 23d2bf7d80..bd86a8ca43 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/JavascriptTranslateVisitor.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/JavascriptTranslateVisitor.java @@ -87,6 +87,15 @@ public class JavascriptTranslateVisitor extends AbstractTranslateVisitor { return null; } + @Override + public Void visitTraversalN(GremlinParser.TraversalNContext ctx) { + final String[] split = ctx.getText().split("\\."); + sb.append(processGremlinSymbol(split[0])).append("."); + sb.append(processGremlinSymbol(split[1])); + if (!split[1].startsWith("big")) sb.append("_"); + return null; + } + @Override public Void visitGenericMapLiteral(final GremlinParser.GenericMapLiteralContext ctx) { sb.append("new Map(["); diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/N.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/N.java index 4a8d56b48b..7ac673b4c1 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/N.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/N.java @@ -28,25 +28,21 @@ import java.math.BigInteger; * Used with {@link AsNumberStep} step. */ public enum N { - nbyte(Byte.class), - nshort(Short.class), - nint(Integer.class), - nlong(Long.class), - nfloat(Float.class), - ndouble(Double.class), - nbigInt(BigInteger.class), - nbigDecimal(BigDecimal.class),; + byte_(Byte.class), + short_(Short.class), + int_(Integer.class), + long_(Long.class), + float_(Float.class), + double_(Double.class), + bigInt(BigInteger.class), + bigDecimal(BigDecimal.class),; - private final Class<?> type; + private final Class<? extends Number> type; - N(Class<?> type) {this.type = type;} + N(Class<? extends Number> type) {this.type = type;} - public Class<?> getType() { + public Class<? extends Number> getType() { return this.type; } - @Override - public String toString() { - return this.type.getSimpleName(); - } } \ No newline at end of file diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/binary/TypeSerializerRegistry.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/binary/TypeSerializerRegistry.java index 4b48d8d211..62597d16d9 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/binary/TypeSerializerRegistry.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/binary/TypeSerializerRegistry.java @@ -49,52 +49,7 @@ import org.apache.tinkerpop.gremlin.structure.T; import org.apache.tinkerpop.gremlin.structure.Vertex; import org.apache.tinkerpop.gremlin.structure.VertexProperty; import org.apache.tinkerpop.gremlin.structure.io.IoRegistry; -import org.apache.tinkerpop.gremlin.structure.io.binary.types.BigDecimalSerializer; -import org.apache.tinkerpop.gremlin.structure.io.binary.types.BigIntegerSerializer; -import org.apache.tinkerpop.gremlin.structure.io.binary.types.BindingSerializer; -import org.apache.tinkerpop.gremlin.structure.io.binary.types.BulkSetSerializer; -import org.apache.tinkerpop.gremlin.structure.io.binary.types.ByteBufferSerializer; -import org.apache.tinkerpop.gremlin.structure.io.binary.types.ByteCodeSerializer; -import org.apache.tinkerpop.gremlin.structure.io.binary.types.CharSerializer; -import org.apache.tinkerpop.gremlin.structure.io.binary.types.ClassSerializer; -import org.apache.tinkerpop.gremlin.structure.io.binary.types.CustomTypeSerializer; -import org.apache.tinkerpop.gremlin.structure.io.binary.types.DateSerializer; -import org.apache.tinkerpop.gremlin.structure.io.binary.types.DurationSerializer; -import org.apache.tinkerpop.gremlin.structure.io.binary.types.EdgeSerializer; -import org.apache.tinkerpop.gremlin.structure.io.binary.types.EnumSerializer; -import org.apache.tinkerpop.gremlin.structure.io.binary.types.GraphSerializer; -import org.apache.tinkerpop.gremlin.structure.io.binary.types.InetAddressSerializer; -import org.apache.tinkerpop.gremlin.structure.io.binary.types.InstantSerializer; -import org.apache.tinkerpop.gremlin.structure.io.binary.types.LambdaSerializer; -import org.apache.tinkerpop.gremlin.structure.io.binary.types.ListSerializer; -import org.apache.tinkerpop.gremlin.structure.io.binary.types.LocalDateSerializer; -import org.apache.tinkerpop.gremlin.structure.io.binary.types.LocalDateTimeSerializer; -import org.apache.tinkerpop.gremlin.structure.io.binary.types.LocalTimeSerializer; -import org.apache.tinkerpop.gremlin.structure.io.binary.types.MapEntrySerializer; -import org.apache.tinkerpop.gremlin.structure.io.binary.types.MapSerializer; -import org.apache.tinkerpop.gremlin.structure.io.binary.types.MetricsSerializer; -import org.apache.tinkerpop.gremlin.structure.io.binary.types.MonthDaySerializer; -import org.apache.tinkerpop.gremlin.structure.io.binary.types.OffsetDateTimeSerializer; -import org.apache.tinkerpop.gremlin.structure.io.binary.types.OffsetTimeSerializer; -import org.apache.tinkerpop.gremlin.structure.io.binary.types.PSerializer; -import org.apache.tinkerpop.gremlin.structure.io.binary.types.PathSerializer; -import org.apache.tinkerpop.gremlin.structure.io.binary.types.PeriodSerializer; -import org.apache.tinkerpop.gremlin.structure.io.binary.types.PropertySerializer; -import org.apache.tinkerpop.gremlin.structure.io.binary.types.SetSerializer; -import org.apache.tinkerpop.gremlin.structure.io.binary.types.SingleTypeSerializer; -import org.apache.tinkerpop.gremlin.structure.io.binary.types.StringSerializer; -import org.apache.tinkerpop.gremlin.structure.io.binary.types.TransformSerializer; -import org.apache.tinkerpop.gremlin.structure.io.binary.types.TraversalExplanationSerializer; -import org.apache.tinkerpop.gremlin.structure.io.binary.types.TraversalMetricsSerializer; -import org.apache.tinkerpop.gremlin.structure.io.binary.types.TraversalStrategySerializer; -import org.apache.tinkerpop.gremlin.structure.io.binary.types.TraverserSerializer; -import org.apache.tinkerpop.gremlin.structure.io.binary.types.TreeSerializer; -import org.apache.tinkerpop.gremlin.structure.io.binary.types.UUIDSerializer; -import org.apache.tinkerpop.gremlin.structure.io.binary.types.VertexPropertySerializer; -import org.apache.tinkerpop.gremlin.structure.io.binary.types.VertexSerializer; -import org.apache.tinkerpop.gremlin.structure.io.binary.types.YearMonthSerializer; -import org.apache.tinkerpop.gremlin.structure.io.binary.types.ZoneOffsetSerializer; -import org.apache.tinkerpop.gremlin.structure.io.binary.types.ZonedDateTimeSerializer; +import org.apache.tinkerpop.gremlin.structure.io.binary.types.*; import org.apache.tinkerpop.gremlin.util.function.Lambda; import org.javatuples.Pair; @@ -167,7 +122,7 @@ public class TypeSerializerRegistry { new RegistryEntry<>(Direction.class, EnumSerializer.DirectionSerializer), new RegistryEntry<>(DT.class, EnumSerializer.DTSerializer), new RegistryEntry<>(Merge.class, EnumSerializer.MergeSerializer), - new RegistryEntry<>(N.class, EnumSerializer.NSerializer), + new RegistryEntry<>(N.class, new NSerializer()), new RegistryEntry<>(Operator.class, EnumSerializer.OperatorSerializer), new RegistryEntry<>(Order.class, EnumSerializer.OrderSerializer), new RegistryEntry<>(Pick.class, EnumSerializer.PickSerializer), diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/binary/types/EnumSerializer.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/binary/types/EnumSerializer.java index 730ffab1c9..7ee0dd0406 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/binary/types/EnumSerializer.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/binary/types/EnumSerializer.java @@ -52,7 +52,6 @@ public class EnumSerializer<E extends Enum> extends SimpleTypeSerializer<E> { public static final EnumSerializer<Direction> DirectionSerializer = new EnumSerializer<>(DataType.DIRECTION, Direction::valueOf); public static final EnumSerializer<DT> DTSerializer = new EnumSerializer<>(DataType.DT, DT::valueOf); public static final EnumSerializer<Merge> MergeSerializer = new EnumSerializer<>(DataType.MERGE, Merge::valueOf); - public static final EnumSerializer<N> NSerializer = new EnumSerializer<>(DataType.N, N::valueOf); public static final EnumSerializer<Operator> OperatorSerializer = new EnumSerializer<>(DataType.OPERATOR, Operator::valueOf); public static final EnumSerializer<Order> OrderSerializer = new EnumSerializer<>(DataType.ORDER, Order::valueOf); public static final EnumSerializer<Pick> PickSerializer = new EnumSerializer<>(DataType.PICK, Pick::valueOf); diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/binary/types/NSerializer.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/binary/types/NSerializer.java new file mode 100644 index 0000000000..b70388ab6f --- /dev/null +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/binary/types/NSerializer.java @@ -0,0 +1,46 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.tinkerpop.gremlin.structure.io.binary.types; + +import org.apache.tinkerpop.gremlin.process.traversal.N; +import org.apache.tinkerpop.gremlin.structure.io.Buffer; +import org.apache.tinkerpop.gremlin.structure.io.binary.DataType; +import org.apache.tinkerpop.gremlin.structure.io.binary.GraphBinaryReader; +import org.apache.tinkerpop.gremlin.structure.io.binary.GraphBinaryWriter; + +import java.io.IOException; +import java.time.MonthDay; + +public class NSerializer extends SimpleTypeSerializer<N> { + public NSerializer() { + super(DataType.N); + } + + @Override + protected N readValue(final Buffer buffer, final GraphBinaryReader context) throws IOException { + String name = context.read(buffer); + return name.startsWith("big") ? N.valueOf(name) : N.valueOf(name + "_"); + } + + @Override + protected void writeValue(final N value, final Buffer buffer, final GraphBinaryWriter context) throws IOException { + String name = value.name().replace("_", ""); + context.write(name, buffer); + } +} diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONModule.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONModule.java index 1869f3d3b1..b40d029a98 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONModule.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONModule.java @@ -279,7 +279,6 @@ abstract class GraphSONModule extends TinkerPopJacksonModule { Direction.class, DT.class, Merge.class, - N.class, Operator.class, Order.class, Pop.class, @@ -287,6 +286,7 @@ abstract class GraphSONModule extends TinkerPopJacksonModule { Scope.class, Pick.class, T.class).forEach(e -> addSerializer(e, new TraversalSerializersV3.EnumJacksonSerializer())); + addSerializer(N.class, new TraversalSerializersV3.NJacksonSerializer()); addSerializer(P.class, new TraversalSerializersV3.PJacksonSerializer()); addSerializer(Lambda.class, new TraversalSerializersV3.LambdaJacksonSerializer()); addSerializer(Bytecode.Binding.class, new TraversalSerializersV3.BindingJacksonSerializer()); @@ -327,7 +327,6 @@ abstract class GraphSONModule extends TinkerPopJacksonModule { Direction.values(), DT.values(), Merge.values(), - N.values(), Operator.values(), Order.values(), Pop.values(), @@ -335,6 +334,7 @@ abstract class GraphSONModule extends TinkerPopJacksonModule { Scope.values(), Pick.values(), T.values()).flatMap(Stream::of).forEach(e -> addDeserializer(e.getClass(), new TraversalSerializersV3.EnumJacksonDeserializer(e.getDeclaringClass()))); + addDeserializer(N.class, new TraversalSerializersV3.NJacksonDeserializer()); addDeserializer(P.class, new TraversalSerializersV3.PJacksonDeserializer()); addDeserializer(TextP.class, new TraversalSerializersV3.TextPJacksonDeserializer()); addDeserializer(Lambda.class, new TraversalSerializersV3.LambdaJacksonDeserializer()); @@ -536,7 +536,6 @@ abstract class GraphSONModule extends TinkerPopJacksonModule { Direction.class, DT.class, Merge.class, - N.class, Operator.class, Order.class, Pop.class, @@ -544,6 +543,7 @@ abstract class GraphSONModule extends TinkerPopJacksonModule { Scope.class, Pick.class, T.class).forEach(e -> addSerializer(e, new TraversalSerializersV2.EnumJacksonSerializer())); + addSerializer(N.class, new TraversalSerializersV2.NJacksonSerializer()); addSerializer(P.class, new TraversalSerializersV2.PJacksonSerializer()); addSerializer(Lambda.class, new TraversalSerializersV2.LambdaJacksonSerializer()); addSerializer(Bytecode.Binding.class, new TraversalSerializersV2.BindingJacksonSerializer()); @@ -576,7 +576,6 @@ abstract class GraphSONModule extends TinkerPopJacksonModule { Direction.values(), DT.values(), Merge.values(), - N.values(), Operator.values(), Order.values(), Pop.values(), @@ -584,6 +583,7 @@ abstract class GraphSONModule extends TinkerPopJacksonModule { Scope.values(), Pick.values(), T.values()).flatMap(Stream::of).forEach(e -> addDeserializer(e.getClass(), new TraversalSerializersV2.EnumJacksonDeserializer(e.getDeclaringClass()))); + addDeserializer(N.class, new TraversalSerializersV2.NJacksonDeserializer()); addDeserializer(P.class, new TraversalSerializersV2.PJacksonDeserializer()); addDeserializer(TextP.class, new TraversalSerializersV2.TextPJacksonDeserializer()); addDeserializer(Lambda.class, new TraversalSerializersV2.LambdaJacksonDeserializer()); diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/TraversalSerializersV2.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/TraversalSerializersV2.java index 2ef49eaa33..4a234098b6 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/TraversalSerializersV2.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/TraversalSerializersV2.java @@ -22,12 +22,7 @@ package org.apache.tinkerpop.gremlin.structure.io.graphson; import org.apache.commons.configuration2.BaseConfiguration; import org.apache.commons.configuration2.ConfigurationConverter; import org.apache.tinkerpop.gremlin.process.remote.traversal.DefaultRemoteTraverser; -import org.apache.tinkerpop.gremlin.process.traversal.Bytecode; -import org.apache.tinkerpop.gremlin.process.traversal.P; -import org.apache.tinkerpop.gremlin.process.traversal.TextP; -import org.apache.tinkerpop.gremlin.process.traversal.Traversal; -import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy; -import org.apache.tinkerpop.gremlin.process.traversal.Traverser; +import org.apache.tinkerpop.gremlin.process.traversal.*; import org.apache.tinkerpop.gremlin.process.traversal.strategy.TraversalStrategyProxy; import org.apache.tinkerpop.gremlin.process.traversal.util.AndP; import org.apache.tinkerpop.gremlin.process.traversal.util.ConnectiveP; @@ -136,6 +131,21 @@ final class TraversalSerializersV2 { } + static class NJacksonSerializer extends StdScalarSerializer<N> { + + public NJacksonSerializer() { + super(N.class); + } + + @Override + public void serialize(final N enumInstance, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider) + throws IOException { + String name = enumInstance.name(); + jsonGenerator.writeString(name.replace("_", "")); + } + + } + final static class PJacksonSerializer extends StdScalarSerializer<P> { public PJacksonSerializer() { @@ -316,6 +326,24 @@ final class TraversalSerializersV2 { } } + final static class NJacksonDeserializer extends StdDeserializer<N> { + + public NJacksonDeserializer() { + super(N.class); + } + + @Override + public N deserialize(final JsonParser jsonParser, final DeserializationContext deserializationContext) throws IOException, JsonProcessingException { + final String enumName = jsonParser.getText(); + return N.valueOf(enumName.startsWith("big") ? enumName : enumName + "_"); + } + + @Override + public boolean isCachable() { + return true; + } + } + final static class PJacksonDeserializer extends StdDeserializer<P> { public PJacksonDeserializer() { diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/TraversalSerializersV3.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/TraversalSerializersV3.java index 9bd1002ac7..3b234de375 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/TraversalSerializersV3.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/TraversalSerializersV3.java @@ -22,12 +22,7 @@ package org.apache.tinkerpop.gremlin.structure.io.graphson; import org.apache.commons.configuration2.BaseConfiguration; import org.apache.commons.configuration2.ConfigurationConverter; import org.apache.tinkerpop.gremlin.process.remote.traversal.DefaultRemoteTraverser; -import org.apache.tinkerpop.gremlin.process.traversal.Bytecode; -import org.apache.tinkerpop.gremlin.process.traversal.P; -import org.apache.tinkerpop.gremlin.process.traversal.TextP; -import org.apache.tinkerpop.gremlin.process.traversal.Traversal; -import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy; -import org.apache.tinkerpop.gremlin.process.traversal.Traverser; +import org.apache.tinkerpop.gremlin.process.traversal.*; import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet; import org.apache.tinkerpop.gremlin.process.traversal.strategy.TraversalStrategyProxy; import org.apache.tinkerpop.gremlin.process.traversal.util.AndP; @@ -143,6 +138,21 @@ final class TraversalSerializersV3 { } + static class NJacksonSerializer extends StdScalarSerializer<N> { + + public NJacksonSerializer() { + super(N.class); + } + + @Override + public void serialize(final N enumInstance, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider) + throws IOException { + String name = enumInstance.name(); + jsonGenerator.writeString(name.replace("_", "")); + } + + } + final static class PJacksonSerializer extends StdScalarSerializer<P> { public PJacksonSerializer() { @@ -336,6 +346,24 @@ final class TraversalSerializersV3 { } } + final static class NJacksonDeserializer extends StdDeserializer<N> { + + public NJacksonDeserializer() { + super(N.class); + } + + @Override + public N deserialize(final JsonParser jsonParser, final DeserializationContext deserializationContext) throws IOException, JsonProcessingException { + final String enumName = jsonParser.getText(); + return N.valueOf(enumName.startsWith("big") ? enumName : enumName + "_"); + } + + @Override + public boolean isCachable() { + return true; + } + } + final static class PJacksonDeserializer extends AbstractReflectJacksonDeserializer<P> { public PJacksonDeserializer() { diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/NumberHelper.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/NumberHelper.java index b9e6f8b7c5..41beeaa392 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/NumberHelper.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/NumberHelper.java @@ -689,38 +689,12 @@ public final class NumberHelper { * @throws IllegalArgumentException if the specified numeric type is unsupported */ public static Number coerceTo(final Number a, final Class<? extends Number> clazz) { - if (a.getClass().equals(clazz)) { + try { + return performConversion(a, clazz); + } catch (ArithmeticException e) { + // return as-is since it didn't fit the type we wanted to coerce to return a; - } else if (clazz.equals(Integer.class)) { - if (a.longValue() >= Integer.MIN_VALUE && a.longValue() <= Integer.MAX_VALUE) { - return a.intValue(); - } - } else if (clazz.equals(Long.class)) { - return a.longValue(); - } else if (clazz.equals(Float.class)) { - if (a.doubleValue() >= -Float.MAX_VALUE && a.doubleValue() <= Float.MAX_VALUE) { - return a.floatValue(); - } - } else if (clazz.equals(Double.class)) { - return a.doubleValue(); - } else if (clazz.equals(Byte.class)) { - if (a.longValue() >= Byte.MIN_VALUE && a.longValue() <= Byte.MAX_VALUE) { - return a.byteValue(); - } - } else if (clazz.equals(Short.class)) { - if (a.longValue() >= Short.MIN_VALUE && a.longValue() <= Short.MAX_VALUE) { - return a.shortValue(); - } - } else if (clazz.equals(BigInteger.class)) { - return NumberHelper.bigIntegerValue(a); - } else if (clazz.equals(BigDecimal.class)) { - return NumberHelper.bigDecimalValue(a); - } else { - throw new IllegalArgumentException("Unsupported numeric type: " + clazz); } - - // return as-is since it didn't fit the type we wanted to coerce to - return a; } /** @@ -734,27 +708,36 @@ public final class NumberHelper { * @throws ArithmeticException if the number overflows */ public static Number castTo(final Number a, final N numberToken) { - Class<?> clazz = numberToken.getType(); + Class<? extends Number> clazz = numberToken.getType(); + return performConversion(a, clazz); + } + + /** + * Core conversion logic. + * Throws ArithmeticException when conversion would overflow. + */ + private static Number performConversion(final Number a, final Class<? extends Number> clazz) { if (a.getClass().equals(clazz)) { return a; - } else if (clazz.equals(Integer.class)) { - Long val = getLong(a, numberToken); + } + if (clazz.equals(Integer.class)) { + Long val = getLong(a, clazz); if (val >= Integer.MIN_VALUE && val <= Integer.MAX_VALUE) { return a.intValue(); } } else if (clazz.equals(Long.class)) { - return getLong(a, numberToken); + return getLong(a, clazz); } else if (clazz.equals(Float.class)) { - // BigDecimal to double will overflow into Infinity, we want to throw instead of passing through + // BigDecimal to double will overflow into Infinity, we want to handle this if (!a.getClass().equals(BigDecimal.class) && - (Double.isInfinite(a.doubleValue()) || Double.isNaN(a.doubleValue()))) { + (Double.isInfinite(a.doubleValue()) || Double.isNaN(a.doubleValue()))) { return a.floatValue(); } if (a.doubleValue() >= -Float.MAX_VALUE && a.doubleValue() <= Float.MAX_VALUE) { return a.floatValue(); } } else if (clazz.equals(Double.class)) { - // BigDecimal to double will overflow into Infinity, we want to throw instead of passing through + // BigDecimal to double will overflow into Infinity, we want to handle this if (!a.getClass().equals(BigDecimal.class) && (Double.isInfinite(a.doubleValue()) || Double.isNaN(a.doubleValue()))) { return a.doubleValue(); @@ -764,41 +747,45 @@ public final class NumberHelper { return a.getClass().equals(Float.class) ? Double.parseDouble(a.toString()) : a.doubleValue(); } } else if (clazz.equals(Byte.class)) { - Long val = getLong(a, numberToken); + Long val = getLong(a, clazz); if (val >= Byte.MIN_VALUE && val <= Byte.MAX_VALUE) { return a.byteValue(); } } else if (clazz.equals(Short.class)) { - Long val = getLong(a, numberToken); + Long val = getLong(a, clazz); if (val >= Short.MIN_VALUE && val <= Short.MAX_VALUE) { return a.shortValue(); } } else if (clazz.equals(BigInteger.class)) { return NumberHelper.bigIntegerValue(a); } else if (clazz.equals(BigDecimal.class)) { - // float losses precision, use string intermediate - return a.getClass().equals(Float.class) ? new BigDecimal(a.toString()) : NumberHelper.bigDecimalValue(a); + return NumberHelper.bigDecimalValue(a); } else { - throw new IllegalArgumentException("Unsupported number type token: " + numberToken); + throw new IllegalArgumentException("Unsupported numeric type: " + clazz); } throw new ArithmeticException(String.format("Can't convert number of type %s to %s due to overflow.", - a.getClass().getSimpleName(), numberToken)); + a.getClass().getSimpleName(), clazz.getSimpleName())); } - private static Long getLong(final Number num, final N numberToken) { + private static Long getLong(final Number num, final Class<? extends Number> clazz) { // Explicitly throw when converting floating point infinity and NaN to whole numbers if (Double.isNaN(num.doubleValue())) { - throw new ArithmeticException(String.format("Can't convert NaN to %s.", numberToken)); + throw new ArithmeticException(String.format("Can't convert NaN to %s.", clazz.getSimpleName())); } if (Double.isInfinite(num.doubleValue())) { - throw new ArithmeticException(String.format("Can't convert floating point infinity to %s.", numberToken)); + throw new ArithmeticException(String.format("Can't convert floating point infinity to %s.", clazz.getSimpleName())); + } + String msg = String.format("Can't convert number of type %s to %s due to overflow.", + num.getClass().getSimpleName(), clazz.getSimpleName()); + if ((num.getClass().equals(Double.class) || num.getClass().equals(Float.class)) && (num.doubleValue()) > Long.MAX_VALUE) { + throw new ArithmeticException(msg); } try { + if (num.getClass().equals(BigDecimal.class)) return ((BigDecimal) num).longValueExact(); return num.getClass().equals(BigInteger.class) ? ((BigInteger) num).longValueExact() : num.longValue(); } catch (ArithmeticException ae) { - throw new ArithmeticException(String.format("Can't convert number of type %s to %s due to overflow.", - num.getClass().getSimpleName(), numberToken)); + throw new ArithmeticException(msg); } } @@ -834,6 +821,8 @@ public final class NumberHelper { private static BigInteger bigIntegerValue(final Number number) { if (number == null) return null; if (number instanceof BigInteger) return (BigInteger) number; + if (number instanceof BigDecimal) return ((BigDecimal) number).toBigInteger(); + if (number instanceof Double) return BigDecimal.valueOf(number.doubleValue()).toBigInteger(); return BigInteger.valueOf(number.longValue()); } @@ -841,7 +830,8 @@ public final class NumberHelper { if (number == null) return null; if (number instanceof BigDecimal) return (BigDecimal) number; if (number instanceof BigInteger) return new BigDecimal((BigInteger) number); - return (number instanceof Double || number instanceof Float) + if (number instanceof Float) return new BigDecimal(number.toString()); // float losses precision, use string intermediate + return (number instanceof Double) ? BigDecimal.valueOf(number.doubleValue()) : BigDecimal.valueOf(number.longValue()); } diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/language/grammar/GeneralLiteralVisitorTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/language/grammar/GeneralLiteralVisitorTest.java index 2409663e47..03165106a9 100644 --- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/language/grammar/GeneralLiteralVisitorTest.java +++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/language/grammar/GeneralLiteralVisitorTest.java @@ -20,6 +20,7 @@ package org.apache.tinkerpop.gremlin.language.grammar; import org.antlr.v4.runtime.CharStreams; import org.antlr.v4.runtime.CommonTokenStream; +import org.apache.tinkerpop.gremlin.process.traversal.N; import org.apache.tinkerpop.gremlin.structure.Direction; import org.apache.tinkerpop.gremlin.structure.T; import org.apache.tinkerpop.gremlin.structure.VertexProperty; @@ -31,15 +32,12 @@ import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import java.lang.reflect.Constructor; -import java.math.BigDecimal; import java.math.BigInteger; import java.time.LocalDateTime; import java.time.OffsetDateTime; import java.time.ZoneOffset; -import java.time.ZonedDateTime; import java.util.ArrayList; import java.util.Arrays; -import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -459,6 +457,40 @@ public class GeneralLiteralVisitorTest { } } + @RunWith(Parameterized.class) + public static class ValidEnumNLiteralTest { + + @Parameterized.Parameter(value = 0) + public String script; + + @Parameterized.Parameter(value = 1) + public N expected; + + @Parameterized.Parameters(name = "{0}") + public static Iterable<Object[]> generateTestParameters() { + return Arrays.asList(new Object[][]{ + {"byte", N.byte_}, + {"short", N.short_}, + {"int", N.int_}, + {"long", N.long_}, + {"float", N.float_}, + {"double", N.double_}, + {"bigInt", N.bigInt}, + {"bigDecimal", N.bigDecimal}, + }); + } + + @Test + public void shouldParse() { + final GremlinLexer lexer = new GremlinLexer(CharStreams.fromString(script)); + final GremlinParser parser = new GremlinParser(new CommonTokenStream(lexer)); + final GremlinParser.TraversalNContext ctx = parser.traversalN(); + + final N n = (N) new GenericLiteralVisitor(new GremlinAntlrToJava()).visitTraversalN(ctx); + assertEquals(expected, n); + } + } + @RunWith(Parameterized.class) public static class ValidDatetimeLiteralTest { diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/language/translator/GremlinTranslatorTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/language/translator/GremlinTranslatorTest.java index 746a0cd711..0b47507c46 100644 --- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/language/translator/GremlinTranslatorTest.java +++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/language/translator/GremlinTranslatorTest.java @@ -740,6 +740,24 @@ public class GremlinTranslatorTest { null, null, "g.inject(long(1694017707000)).as_date()"}, + {"g.inject(\"123.4\").asNumber(N.int)", + null, + "g.inject(string0).asNumber(N.int)", + "g.Inject<object>(\"123.4\").AsNumber(N.Int)", + "g.Inject(\"123.4\").AsNumber(gremlingo.N.Int)", + "g.inject(\"123.4\").asNumber(N.int_)", + "g.inject(\"123.4\").asNumber(N.int_)", + "g.inject(\"123.4\").asNumber(N.int_)", + "g.inject('123.4').as_number(N.int)"}, + {"g.inject(\"123.4\").asNumber(N.bigInt)", + null, + "g.inject(string0).asNumber(N.bigInt)", + "g.Inject<object>(\"123.4\").AsNumber(N.BigInt)", + "g.Inject(\"123.4\").AsNumber(gremlingo.N.BigInt)", + "g.inject(\"123.4\").asNumber(N.bigInt)", + "g.inject(\"123.4\").asNumber(N.bigInt)", + "g.inject(\"123.4\").asNumber(N.bigInt)", + "g.inject('123.4').as_number(N.big_int)"}, {"g.V().hasLabel(null)", null, "g.V().hasLabel(string0)", diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AsNumberStepTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AsNumberStepTest.java index 1eef3b829b..ec98bd0285 100644 --- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AsNumberStepTest.java +++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AsNumberStepTest.java @@ -43,18 +43,18 @@ public class AsNumberStepTest extends StepTest { @Test public void testReturnTypes() { assertEquals(1, __.__(1).asNumber().next()); - assertEquals((byte) 1, __.__(1).asNumber(N.nbyte).next()); - assertEquals(1, __.__(1.8).asNumber(N.nint).next()); - assertEquals(1, __.__(1L).asNumber(N.nint).next()); + assertEquals((byte) 1, __.__(1).asNumber(N.byte_).next()); + assertEquals(1, __.__(1.8).asNumber(N.int_).next()); + assertEquals(1, __.__(1L).asNumber(N.int_).next()); assertEquals(1L, __.__(1L).asNumber().next()); - assertEquals(3.14f, __.__(3.14).asNumber(N.nfloat).next()); - assertEquals(3.14, __.__(3.14f).asNumber(N.ndouble).next()); - assertEquals(1, __.__("1").asNumber(N.nint).next()); + assertEquals(3.14f, __.__(3.14).asNumber(N.float_).next()); + assertEquals(3.14, __.__(3.14f).asNumber(N.double_).next()); + assertEquals(1, __.__("1").asNumber(N.int_).next()); assertEquals(1, __.__("1").asNumber().next()); - assertEquals((byte) 1, __.__("1").asNumber(N.nbyte).next()); - assertEquals((short) 1, __.__("1").asNumber(N.nshort).next()); - assertEquals(1L, __.__("1").asNumber(N.nlong).next()); - assertEquals(3.14, __.__("3.14").asNumber(N.ndouble).next()); //float to double + assertEquals((byte) 1, __.__("1").asNumber(N.byte_).next()); + assertEquals((short) 1, __.__("1").asNumber(N.short_).next()); + assertEquals(1L, __.__("1").asNumber(N.long_).next()); + assertEquals(3.14, __.__("3.14").asNumber(N.double_).next()); //float to double // NumberUtils allows additional string processing assertEquals(123.0f, __.__("123.").asNumber().next()); assertEquals(291, __.__("0x123").asNumber().next()); @@ -83,215 +83,231 @@ public class AsNumberStepTest extends StepTest { @Test(expected = ArithmeticException.class) public void shouldThrowOverflowExceptionWhenParsedNumberOverflows() { - __.__("128").asNumber(N.nbyte).next(); + __.__("128").asNumber(N.byte_).next(); } @Test(expected = ArithmeticException.class) public void shouldThrowOverflowExceptionWhenCastNumberOverflows() { - __.__(128).asNumber(N.nbyte).next(); + __.__(128).asNumber(N.byte_).next(); } @Test public void testStringToByte() { - assertEquals((byte) 0, __.__("0").asNumber(N.nbyte).next()); - assertEquals((byte) 127, __.__("127").asNumber(N.nbyte).next()); - assertEquals((byte) -128, __.__("-128").asNumber(N.nbyte).next()); - assertEquals((byte) 42, __.__("42").asNumber(N.nbyte).next()); - assertEquals((byte) -42, __.__("-42").asNumber(N.nbyte).next()); - assertEquals((byte) 1, __.__("1").asNumber(N.nbyte).next()); + assertEquals((byte) 0, __.__("0").asNumber(N.byte_).next()); + assertEquals((byte) 127, __.__("127").asNumber(N.byte_).next()); + assertEquals((byte) -128, __.__("-128").asNumber(N.byte_).next()); + assertEquals((byte) 42, __.__("42").asNumber(N.byte_).next()); + assertEquals((byte) -42, __.__("-42").asNumber(N.byte_).next()); + assertEquals((byte) 1, __.__("1").asNumber(N.byte_).next()); } @Test public void testStringToShort() { - assertEquals((short) 0, __.__("0").asNumber(N.nshort).next()); - assertEquals((short) 32767, __.__("32767").asNumber(N.nshort).next()); - assertEquals((short) -32768, __.__("-32768").asNumber(N.nshort).next()); - assertEquals((short) 1000, __.__("1000").asNumber(N.nshort).next()); - assertEquals((short) -1000, __.__("-1000").asNumber(N.nshort).next()); - assertEquals((short) 255, __.__("255").asNumber(N.nshort).next()); + assertEquals((short) 0, __.__("0").asNumber(N.short_).next()); + assertEquals((short) 32767, __.__("32767").asNumber(N.short_).next()); + assertEquals((short) -32768, __.__("-32768").asNumber(N.short_).next()); + assertEquals((short) 1000, __.__("1000").asNumber(N.short_).next()); + assertEquals((short) -1000, __.__("-1000").asNumber(N.short_).next()); + assertEquals((short) 255, __.__("255").asNumber(N.short_).next()); } @Test public void testStringToInt() { - assertEquals(0, __.__("0").asNumber(N.nint).next()); - assertEquals(2147483647, __.__("2147483647").asNumber(N.nint).next()); - assertEquals(-2147483648, __.__("-2147483648").asNumber(N.nint).next()); - assertEquals(123456, __.__("123456").asNumber(N.nint).next()); - assertEquals(-123456, __.__("-123456").asNumber(N.nint).next()); - assertEquals(65536, __.__("65536").asNumber(N.nint).next()); + assertEquals(0, __.__("0").asNumber(N.int_).next()); + assertEquals(2147483647, __.__("2147483647").asNumber(N.int_).next()); + assertEquals(-2147483648, __.__("-2147483648").asNumber(N.int_).next()); + assertEquals(123456, __.__("123456").asNumber(N.int_).next()); + assertEquals(-123456, __.__("-123456").asNumber(N.int_).next()); + assertEquals(65536, __.__("65536").asNumber(N.int_).next()); } @Test public void testStringToLong() { - assertEquals(0L, __.__("0").asNumber(N.nlong).next()); - assertEquals(9223372036854775807L, __.__("9223372036854775807").asNumber(N.nlong).next()); - assertEquals(-9223372036854775808L, __.__("-9223372036854775808").asNumber(N.nlong).next()); - assertEquals(123456789L, __.__("123456789").asNumber(N.nlong).next()); - assertEquals(-123456789L, __.__("-123456789").asNumber(N.nlong).next()); - assertEquals(4294967296L, __.__("4294967296").asNumber(N.nlong).next()); + assertEquals(0L, __.__("0").asNumber(N.long_).next()); + assertEquals(9223372036854775807L, __.__("9223372036854775807").asNumber(N.long_).next()); + assertEquals(-9223372036854775808L, __.__("-9223372036854775808").asNumber(N.long_).next()); + assertEquals(123456789L, __.__("123456789").asNumber(N.long_).next()); + assertEquals(-123456789L, __.__("-123456789").asNumber(N.long_).next()); + assertEquals(4294967296L, __.__("4294967296").asNumber(N.long_).next()); } @Test public void testStringToFloat() { - assertEquals(0.0f, __.__("0.0").asNumber(N.nfloat).next()); - assertEquals(3.14f, __.__("3.14").asNumber(N.nfloat).next()); - assertEquals(-3.14f, __.__("-3.14").asNumber(N.nfloat).next()); - assertEquals(1.23e10f, __.__("1.23e10").asNumber(N.nfloat).next()); - assertEquals(-1.23e-10f, __.__("-1.23e-10").asNumber(N.nfloat).next()); - assertEquals(Float.MAX_VALUE, __.__("3.4028235E38").asNumber(N.nfloat).next()); - assertEquals(Float.MIN_VALUE, __.__("1.4E-45").asNumber(N.nfloat).next()); + assertEquals(0.0f, __.__("0.0").asNumber(N.float_).next()); + assertEquals(3.14f, __.__("3.14").asNumber(N.float_).next()); + assertEquals(-3.14f, __.__("-3.14").asNumber(N.float_).next()); + assertEquals(1.23e10f, __.__("1.23e10").asNumber(N.float_).next()); + assertEquals(-1.23e-10f, __.__("-1.23e-10").asNumber(N.float_).next()); + assertEquals(Float.MAX_VALUE, __.__("3.4028235E38").asNumber(N.float_).next()); + assertEquals(Float.MIN_VALUE, __.__("1.4E-45").asNumber(N.float_).next()); } @Test public void testStringToDouble() { - assertEquals(0.0, __.__("0.0").asNumber(N.ndouble).next()); - assertEquals(3.141592653589793, __.__("3.141592653589793").asNumber(N.ndouble).next()); - assertEquals(-3.141592653589793, __.__("-3.141592653589793").asNumber(N.ndouble).next()); - assertEquals(1.23e100, __.__("1.23e100").asNumber(N.ndouble).next()); - assertEquals(-1.23e-100, __.__("-1.23e-100").asNumber(N.ndouble).next()); - assertEquals(Double.MAX_VALUE, __.__("1.7976931348623157E308").asNumber(N.ndouble).next()); - assertEquals(Double.MIN_VALUE, __.__("4.9E-324").asNumber(N.ndouble).next()); + assertEquals(0.0, __.__("0.0").asNumber(N.double_).next()); + assertEquals(3.141592653589793, __.__("3.141592653589793").asNumber(N.double_).next()); + assertEquals(-3.141592653589793, __.__("-3.141592653589793").asNumber(N.double_).next()); + assertEquals(1.23e100, __.__("1.23e100").asNumber(N.double_).next()); + assertEquals(-1.23e-100, __.__("-1.23e-100").asNumber(N.double_).next()); + assertEquals(Double.MAX_VALUE, __.__("1.7976931348623157E308").asNumber(N.double_).next()); + assertEquals(Double.MIN_VALUE, __.__("4.9E-324").asNumber(N.double_).next()); } @Test public void testStringToBigInteger() { - assertEquals(new BigInteger("0"), __.__("0").asNumber(N.nbigInt).next()); + assertEquals(new BigInteger("0"), __.__("0").asNumber(N.bigInt).next()); assertEquals(new BigInteger("123456789012345678901234567890"), - __.__("123456789012345678901234567890").asNumber(N.nbigInt).next()); + __.__("123456789012345678901234567890").asNumber(N.bigInt).next()); assertEquals(new BigInteger("-123456789012345678901234567890"), - __.__("-123456789012345678901234567890").asNumber(N.nbigInt).next()); + __.__("-123456789012345678901234567890").asNumber(N.bigInt).next()); assertEquals(new BigInteger("999999999999999999999999999999999999999999999999999"), - __.__("999999999999999999999999999999999999999999999999999").asNumber(N.nbigInt).next()); - assertEquals(new BigInteger("1"), __.__("1").asNumber(N.nbigInt).next()); + __.__("999999999999999999999999999999999999999999999999999").asNumber(N.bigInt).next()); + assertEquals(new BigInteger("1"), __.__("1").asNumber(N.bigInt).next()); + assertEquals(new BigInteger("1000000000000000000000"), __.__(new Double("1000000000000000000000")).asNumber(N.bigInt).next()); } @Test public void testStringToBigDecimal() { - assertEquals(new BigDecimal("0.0"), __.__("0.0").asNumber(N.nbigDecimal).next()); + assertEquals(new BigDecimal("0.0"), __.__("0.0").asNumber(N.bigDecimal).next()); assertEquals(new BigDecimal("123456789012345678901234567890.123456789"), - __.__("123456789012345678901234567890.123456789").asNumber(N.nbigDecimal).next()); + __.__("123456789012345678901234567890.123456789").asNumber(N.bigDecimal).next()); assertEquals(new BigDecimal("-123456789012345678901234567890.123456789"), - __.__("-123456789012345678901234567890.123456789").asNumber(N.nbigDecimal).next()); + __.__("-123456789012345678901234567890.123456789").asNumber(N.bigDecimal).next()); // Note directly constructing BigDecimal returns 1E-39, but parsing then converting from double results in 1.0E-39 assertEquals(BigDecimal.valueOf(Double.parseDouble("0.000000000000000000000000000000000000001")), - __.__("0.000000000000000000000000000000000000001").asNumber(N.nbigDecimal).next()); - assertEquals(new BigDecimal("1.0"), __.__("1.0").asNumber(N.nbigDecimal).next()); + __.__("0.000000000000000000000000000000000000001").asNumber(N.bigDecimal).next()); + assertEquals(new BigDecimal("1.0"), __.__("1.0").asNumber(N.bigDecimal).next()); } // ===== EDGE CASE TESTS ===== @Test public void testCastInfinityAndNaN() { - assertEquals(Double.POSITIVE_INFINITY, __.__(Float.POSITIVE_INFINITY).asNumber(N.ndouble).next()); - assertEquals(Double.NEGATIVE_INFINITY, __.__(Float.NEGATIVE_INFINITY).asNumber(N.ndouble).next()); - assertEquals(Double.NaN, __.__(Float.NaN).asNumber(N.ndouble).next()); - assertEquals(Float.POSITIVE_INFINITY, __.__(Double.POSITIVE_INFINITY).asNumber(N.nfloat).next()); - assertEquals(Float.NEGATIVE_INFINITY, __.__(Double.NEGATIVE_INFINITY).asNumber(N.nfloat).next()); - assertEquals(Float.NaN, __.__(Double.NaN).asNumber(N.nfloat).next()); + assertEquals(Double.POSITIVE_INFINITY, __.__(Float.POSITIVE_INFINITY).asNumber(N.double_).next()); + assertEquals(Double.NEGATIVE_INFINITY, __.__(Float.NEGATIVE_INFINITY).asNumber(N.double_).next()); + assertEquals(Double.NaN, __.__(Float.NaN).asNumber(N.double_).next()); + assertEquals(Float.POSITIVE_INFINITY, __.__(Double.POSITIVE_INFINITY).asNumber(N.float_).next()); + assertEquals(Float.NEGATIVE_INFINITY, __.__(Double.NEGATIVE_INFINITY).asNumber(N.float_).next()); + assertEquals(Float.NaN, __.__(Double.NaN).asNumber(N.float_).next()); } @Test public void testStringWithWhitespace() { - assertEquals(42, __.__(" 42 ").asNumber(N.nint).next()); - assertEquals(42, __.__("\t42\n").asNumber(N.nint).next()); - assertEquals(3.14, __.__(" 3.14 ").asNumber(N.ndouble).next()); - assertEquals((byte) 127, __.__(" 127 ").asNumber(N.nbyte).next()); + assertEquals(42, __.__(" 42 ").asNumber(N.int_).next()); + assertEquals(42, __.__("\t42\n").asNumber(N.int_).next()); + assertEquals(3.14, __.__(" 3.14 ").asNumber(N.double_).next()); + assertEquals((byte) 127, __.__(" 127 ").asNumber(N.byte_).next()); } @Test public void testStringWithPlusSign() { - assertEquals(42, __.__("+42").asNumber(N.nint).next()); - assertEquals(3.14, __.__("+3.14").asNumber(N.ndouble).next()); - assertEquals((byte) 42, __.__("+42").asNumber(N.nbyte).next()); - assertEquals(new BigInteger("42"), __.__("+42").asNumber(N.nbigInt).next()); + assertEquals(42, __.__("+42").asNumber(N.int_).next()); + assertEquals(3.14, __.__("+3.14").asNumber(N.double_).next()); + assertEquals((byte) 42, __.__("+42").asNumber(N.byte_).next()); + assertEquals(new BigInteger("42"), __.__("+42").asNumber(N.bigInt).next()); } @Test public void testZeroValues() { - assertEquals((byte) 0, __.__("0").asNumber(N.nbyte).next()); - assertEquals((short) 0, __.__("0").asNumber(N.nshort).next()); - assertEquals(0, __.__("0").asNumber(N.nint).next()); - assertEquals(0L, __.__("0").asNumber(N.nlong).next()); - assertEquals(0.0f, __.__("0.0").asNumber(N.nfloat).next()); - assertEquals(0.0, __.__("0.0").asNumber(N.ndouble).next()); - assertEquals(new BigInteger("0"), __.__("0").asNumber(N.nbigInt).next()); - assertEquals(new BigDecimal("0.0"), __.__("0.0").asNumber(N.nbigDecimal).next()); + assertEquals((byte) 0, __.__("0").asNumber(N.byte_).next()); + assertEquals((short) 0, __.__("0").asNumber(N.short_).next()); + assertEquals(0, __.__("0").asNumber(N.int_).next()); + assertEquals(0L, __.__("0").asNumber(N.long_).next()); + assertEquals(0.0f, __.__("0.0").asNumber(N.float_).next()); + assertEquals(0.0, __.__("0.0").asNumber(N.double_).next()); + assertEquals(new BigInteger("0"), __.__("0").asNumber(N.bigInt).next()); + assertEquals(new BigDecimal("0.0"), __.__("0.0").asNumber(N.bigDecimal).next()); } @Test public void testScientificNotation() { - assertEquals(1.23e10f, __.__("1.23e10").asNumber(N.nfloat).next()); - assertEquals(1.23e10, __.__("1.23e10").asNumber(N.ndouble).next()); - assertEquals(1.23e-10f, __.__("1.23e-10").asNumber(N.nfloat).next()); - assertEquals(1.23e-10, __.__("1.23e-10").asNumber(N.ndouble).next()); - assertEquals(new BigDecimal("1.23E10"), __.__("1.23e10").asNumber(N.nbigDecimal).next()); + assertEquals(1.23e10f, __.__("1.23e10").asNumber(N.float_).next()); + assertEquals(1.23e10, __.__("1.23e10").asNumber(N.double_).next()); + assertEquals(1.23e-10f, __.__("1.23e-10").asNumber(N.float_).next()); + assertEquals(1.23e-10, __.__("1.23e-10").asNumber(N.double_).next()); + assertEquals(new BigDecimal("1.23E10"), __.__("1.23e10").asNumber(N.bigDecimal).next()); } // ===== OVERFLOW EXCEPTION TESTS ===== @Test(expected = ArithmeticException.class) public void shouldThrowCastExceptionConvertingInfinityToWholeNumber() { - __.__(Double.POSITIVE_INFINITY).asNumber(N.nlong).next(); + __.__(Double.POSITIVE_INFINITY).asNumber(N.long_).next(); } @Test(expected = ArithmeticException.class) public void shouldThrowCastExceptionConvertingNaNToWholeNumber() { - __.__(Double.NaN).asNumber(N.nint).next(); + __.__(Double.NaN).asNumber(N.int_).next(); } @Test(expected = ArithmeticException.class) public void shouldThrowOverflowExceptionWhenStringByteOverflowsPositive() { - __.__("128").asNumber(N.nbyte).next(); + __.__("128").asNumber(N.byte_).next(); } @Test(expected = ArithmeticException.class) public void shouldThrowOverflowExceptionWhenStringByteOverflowsNegative() { - __.__("-129").asNumber(N.nbyte).next(); + __.__("-129").asNumber(N.byte_).next(); } @Test(expected = ArithmeticException.class) public void shouldThrowOverflowExceptionWhenStringShortOverflowsPositive() { - __.__("32768").asNumber(N.nshort).next(); + __.__("32768").asNumber(N.short_).next(); } @Test(expected = ArithmeticException.class) public void shouldThrowOverflowExceptionWhenStringShortOverflowsNegative() { - __.__("-32769").asNumber(N.nshort).next(); + __.__("-32769").asNumber(N.short_).next(); + } + + @Test(expected = ArithmeticException.class) + public void shouldThrowOverflowExceptionWhenBigDecimalToShortOverflows() { + __.__(new BigDecimal(Long.MAX_VALUE+"1")).asNumber(N.short_).next(); + } + + @Test(expected = ArithmeticException.class) + public void shouldThrowOverflowExceptionWhenFloatToLongOverflows() { + __.__(new Float(Long.MAX_VALUE+"1")).asNumber(N.long_).next(); + } + + @Test(expected = ArithmeticException.class) + public void shouldThrowOverflowExceptionWhenDoubleToLongOverflows() { + __.__(new Double(Long.MAX_VALUE+"1")).asNumber(N.long_).next(); } @Test(expected = ArithmeticException.class) public void shouldThrowOverflowExceptionWhenStringIntOverflowsPositive() { - __.__("2147483648").asNumber(N.nint).next(); + __.__("2147483648").asNumber(N.int_).next(); } @Test(expected = ArithmeticException.class) public void shouldThrowOverflowExceptionWhenStringIntOverflowsNegative() { - __.__("-2147483649").asNumber(N.nint).next(); + __.__("-2147483649").asNumber(N.int_).next(); } @Test(expected = ArithmeticException.class) public void shouldThrowOverflowExceptionWhenStringLongOverflowsPositive() { - __.__("9223372036854775809").asNumber(N.nlong).next(); + __.__("9223372036854775809").asNumber(N.long_).next(); } @Test(expected = ArithmeticException.class) public void shouldThrowOverflowExceptionWhenStringLongOverflowsNegative() { - __.__("-9223372036854775809").asNumber(N.nlong).next(); + __.__("-9223372036854775809").asNumber(N.long_).next(); } @Test(expected = ArithmeticException.class) public void shouldThrowOverflowExceptionWhenDoubleStringToFloatOverflows() { - __.__("3.5E38").asNumber(N.nfloat).next(); + __.__("3.5E38").asNumber(N.float_).next(); } @Test(expected = ArithmeticException.class) public void shouldThrowOverflowExceptionWhenBigDecimalStringToDoubleOverflows() { - __.__("1.8E308").asNumber(N.ndouble).next(); + __.__("1.8E308").asNumber(N.double_).next(); } @Test(expected = ArithmeticException.class) public void shouldThrowOverflowExceptionWhenBigDecimalStringToFloatOverflows() { - __.__("1.8E308").asNumber(N.nfloat).next(); + __.__("1.8E308").asNumber(N.float_).next(); } // ===== INVALID FORMAT EXCEPTION TESTS ===== @@ -355,26 +371,26 @@ public class AsNumberStepTest extends StepTest { @Test public void testBoundaryValues() { - assertEquals(Byte.MAX_VALUE, __.__("127").asNumber(N.nbyte).next()); - assertEquals(Byte.MIN_VALUE, __.__("-128").asNumber(N.nbyte).next()); - assertEquals(Short.MAX_VALUE, __.__("32767").asNumber(N.nshort).next()); - assertEquals(Short.MIN_VALUE, __.__("-32768").asNumber(N.nshort).next()); - assertEquals(Integer.MAX_VALUE, __.__("2147483647").asNumber(N.nint).next()); - assertEquals(Integer.MIN_VALUE, __.__("-2147483648").asNumber(N.nint).next()); - assertEquals(Long.MAX_VALUE, __.__("9223372036854775807").asNumber(N.nlong).next()); - assertEquals(Long.MIN_VALUE, __.__("-9223372036854775808").asNumber(N.nlong).next()); + assertEquals(Byte.MAX_VALUE, __.__("127").asNumber(N.byte_).next()); + assertEquals(Byte.MIN_VALUE, __.__("-128").asNumber(N.byte_).next()); + assertEquals(Short.MAX_VALUE, __.__("32767").asNumber(N.short_).next()); + assertEquals(Short.MIN_VALUE, __.__("-32768").asNumber(N.short_).next()); + assertEquals(Integer.MAX_VALUE, __.__("2147483647").asNumber(N.int_).next()); + assertEquals(Integer.MIN_VALUE, __.__("-2147483648").asNumber(N.int_).next()); + assertEquals(Long.MAX_VALUE, __.__("9223372036854775807").asNumber(N.long_).next()); + assertEquals(Long.MIN_VALUE, __.__("-9223372036854775808").asNumber(N.long_).next()); } @Test public void testHighPrecisionDecimals() { assertEquals(new BigDecimal("3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067"), - __.__("3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067").asNumber(N.nbigDecimal).next()); + __.__("3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067").asNumber(N.bigDecimal).next()); } @Test public void testVeryLargeNumbers() { String largeNumber = "12345678901234567890123456789012345678901234567890123456789012345678901234567890"; - assertEquals(new BigInteger(largeNumber), __.__(largeNumber).asNumber(N.nbigInt).next()); + assertEquals(new BigInteger(largeNumber), __.__(largeNumber).asNumber(N.bigInt).next()); } } diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/NumberHelperTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/NumberHelperTest.java index 20772da0c9..ac848f6025 100644 --- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/NumberHelperTest.java +++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/NumberHelperTest.java @@ -715,73 +715,79 @@ public class NumberHelperTest { @Test public void shouldCastToReturnSameInstanceForSameClass() { final Integer value = 42; - assertEquals(value, NumberHelper.castTo(value, N.nint)); + assertEquals(value, NumberHelper.castTo(value, N.int_)); } @Test public void shouldCastToConvertToByte() { final Integer value = 42; - assertEquals(Byte.valueOf((byte) 42), NumberHelper.castTo(value, N.nbyte)); + assertEquals(Byte.valueOf((byte) 42), NumberHelper.castTo(value, N.byte_)); } @Test public void shouldCastToConvertToShort() { final Integer value = 42; - assertEquals(Short.valueOf((short) 42), NumberHelper.castTo(value, N.nshort)); + assertEquals(Short.valueOf((short) 42), NumberHelper.castTo(value, N.short_)); } @Test public void shouldCastToConvertToLong() { final Integer value = 42; - assertEquals(Long.valueOf(42L), NumberHelper.castTo(value, N.nlong)); + assertEquals(Long.valueOf(42L), NumberHelper.castTo(value, N.long_)); } @Test public void shouldCastToConvertToFloat() { final Integer value = 42; - assertEquals(Float.valueOf(42.0f), NumberHelper.castTo(value, N.nfloat)); + assertEquals(Float.valueOf(42.0f), NumberHelper.castTo(value, N.float_)); } @Test public void shouldCastToConvertToDouble() { final Integer value = 42; - assertEquals(Double.valueOf(42.0), NumberHelper.castTo(value, N.ndouble)); + assertEquals(Double.valueOf(42.0), NumberHelper.castTo(value, N.double_)); } @Test public void shouldCastToConvertToBigInteger() { final Integer value = 42; - assertEquals(BigInteger.valueOf(42), NumberHelper.castTo(value, N.nbigInt)); + assertEquals(BigInteger.valueOf(42), NumberHelper.castTo(value, N.bigInt)); + } + + @Test + public void shouldCastToConvertDoubleToBigInteger() { + final Double value = new Double("1000000000000000000000"); + assertEquals(new BigInteger("1000000000000000000000"), NumberHelper.castTo(value, N.bigInt)); } @Test public void shouldCastToConvertToBigDecimal() { final Integer value = 42; - assertEquals(BigDecimal.valueOf(42), NumberHelper.castTo(value, N.nbigDecimal)); + assertEquals(BigDecimal.valueOf(42), NumberHelper.castTo(value, N.bigDecimal)); } @Test(expected = ArithmeticException.class) public void shouldOverflowIfCannotFitInByte() { final Integer value = 128; - NumberHelper.castTo(value, N.nbyte); + NumberHelper.castTo(value, N.byte_); } @Test(expected = ArithmeticException.class) public void shouldOverflowIfCannotFitInShort() { final Integer value = 32768; - NumberHelper.castTo(value, N.nshort); + NumberHelper.castTo(value, N.short_); } @Test(expected = ArithmeticException.class) public void shouldOverflowIfCannotFitInInteger() { final Long value = 2147483648L; - NumberHelper.castTo(value, N.nint); + NumberHelper.castTo(value, N.int_); } @Test(expected = ArithmeticException.class) public void shouldOverflowIfCannotFitInFloat() { final Double value = Double.MAX_VALUE; - NumberHelper.castTo(value, N.nfloat); + NumberHelper.castTo(value, N.float_); } } diff --git a/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/N.cs b/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/N.cs index 8996957b30..b0081ba3d0 100644 --- a/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/N.cs +++ b/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/N.cs @@ -35,25 +35,25 @@ namespace Gremlin.Net.Process.Traversal { } - public static N NByte => new N("nbyte"); - public static N NShort => new N("nshort"); - public static N NInt => new N("nint"); - public static N NLong => new N("nlong"); - public static N NFloat => new N("nfloat"); - public static N NDouble => new N("ndouble"); - public static N NBigInt => new N("nbigInt"); - public static N NBigDecimal => new N("nbigDecimal"); + public static N Byte => new N("byte"); + public static N Short => new N("short"); + public static N Int => new N("int"); + public static N Long => new N("long"); + public static N Float => new N("float"); + public static N Double => new N("double"); + public static N BigInt => new N("bigInt"); + public static N BigDecimal => new N("bigDecimal"); private static readonly Dictionary<string, N> Properties = new() { - { "nbyte", NByte }, - { "nshort", NShort }, - { "nint", NInt }, - { "nlong", NLong }, - { "nfloat", NFloat }, - { "ndouble", NDouble }, - { "nbigInt", NBigInt }, - { "nbigDecimal", NBigDecimal }, + { "byte", Byte }, + { "short", Short }, + { "int", Int }, + { "long", Long }, + { "float", Float }, + { "double", Double }, + { "bigInt", BigInt }, + { "bigDecimal", BigDecimal }, }; /// <summary> diff --git a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs index 466499259a..776bf8d651 100644 --- a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs +++ b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs @@ -629,23 +629,23 @@ namespace Gremlin.Net.IntegrationTest.Gherkin {"g_injectX5nX_asNumber", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(new BigInteger(5)).AsNumber()}}, {"g_injectX5_0X_asNumber", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(5.0).AsNumber()}}, {"g_injectX5_75fX_asNumber", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(5.75f).AsNumber()}}, - {"g_injectX5_43X_asNumberXN_nintX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(5.43).AsNumber(N.Nint)}}, - {"g_injectX5_67X_asNumberXN_nintX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(5.67).AsNumber(N.Nint)}}, - {"g_injectX5X_asNumberXN_nlongX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(5).AsNumber(N.Nlong)}}, - {"g_injectX12X_asNumberXN_nbyteX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(12).AsNumber(N.Nbyte)}}, - {"g_injectX32768X_asNumberXN_nshortX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(32768).AsNumber(N.Nshort)}}, - {"g_injectX300X_asNumberXN_nbyteX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(300).AsNumber(N.Nbyte)}}, + {"g_injectX5_43X_asNumberXN_intX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(5.43).AsNumber(N.Int)}}, + {"g_injectX5_67X_asNumberXN_intX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(5.67).AsNumber(N.Int)}}, + {"g_injectX5X_asNumberXN_longX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(5).AsNumber(N.Long)}}, + {"g_injectX12X_asNumberXN_byteX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(12).AsNumber(N.Byte)}}, + {"g_injectX32768X_asNumberXN_shortX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(32768).AsNumber(N.Short)}}, + {"g_injectX300X_asNumberXN_byteX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(300).AsNumber(N.Byte)}}, {"g_injectX5X_asNumber", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>("5").AsNumber()}}, - {"g_injectX5X_asNumberXN_byteX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>("5").AsNumber(N.Nbyte)}}, - {"g_injectX1_000X_asNumberXN_nintX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>("1,000").AsNumber(N.Nint)}}, + {"g_injectX5X_asNumberXN_byteX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>("5").AsNumber(N.Byte)}}, + {"g_injectX1_000X_asNumberXN_bigIntX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>("1,000").AsNumber(N.BigInt)}}, {"g_injectXtestX_asNumber", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>("test").AsNumber()}}, {"g_injectX_1_2_3_4X_asNumber", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(new List<object> { 1, 2, 3, 4 }).AsNumber()}}, {"g_injectX1_2_3_4X_unfold_asNumber", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(new List<object> { 1, 2, 3, 4 }).Unfold<object>().AsNumber()}}, {"g_injectX_1__2__3__4_X_asNumberXX_foldXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>("1", 2, "3", 4).AsNumber().Fold()}}, - {"g_injectX1_2_3_4_0x5X_asNumber_sum_asNumberXnbyteX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(p["xx1"], p["xx2"], p["xx3"], "4", "0x5").AsNumber().Sum<object>().AsNumber(N.Nbyte)}}, - {"g_VX1X_asNumberXN_nintX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(null).AsNumber(N.Nint)}}, - {"g_V_asXaX_outXknowsX_asXbX_mathXa_plus_bX_byXageX_asNumberXnintX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().As("a").Out("knows").As("b").Math("a + b").By("age").AsNumber(N.Nint)}}, - {"g_withSideEffectXx_100X_V_age_mathX__plus_xX_asNumberXnlongX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithSideEffect("x", p["xx1"]).V().Values<object>("age").Math("_ + x").AsNumber(N.Nlong)}}, + {"g_injectX1_2_3_4_0x5X_asNumber_sum_asNumberXbyteX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(p["xx1"], p["xx2"], p["xx3"], "4", "0x5").AsNumber().Sum<object>().AsNumber(N.Byte)}}, + {"g_VX1X_asNumberXN_intX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(null).AsNumber(N.Int)}}, + {"g_V_asXaX_outXknowsX_asXbX_mathXa_plus_bX_byXageX_asNumberXintX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().As("a").Out("knows").As("b").Math("a + b").By("age").AsNumber(N.Int)}}, + {"g_withSideEffectXx_100X_V_age_mathX__plus_xX_asNumberXlongX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithSideEffect("x", p["xx1"]).V().Values<object>("age").Math("_ + x").AsNumber(N.Long)}}, {"g_injectX1_2X_asString", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(p["xx1"], p["xx2"]).AsString()}}, {"g_injectX1_2X_asStringXlocalX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(p["xx1"], p["xx2"]).AsString<object>(Scope.Local)}}, {"g_injectXlist_1_2X_asStringXlocalX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(p["xx1"]).AsString<object>(Scope.Local)}}, diff --git a/gremlin-go/driver/cucumber/gremlin.go b/gremlin-go/driver/cucumber/gremlin.go index 9beb85fe5f..21ca5e9065 100644 --- a/gremlin-go/driver/cucumber/gremlin.go +++ b/gremlin-go/driver/cucumber/gremlin.go @@ -599,23 +599,23 @@ var translationMap = map[string][]func(g *gremlingo.GraphTraversalSource, p map[ "g_injectX5nX_asNumber": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject(5).AsNumber()}}, "g_injectX5_0X_asNumber": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject(5.0).AsNumber()}}, "g_injectX5_75fX_asNumber": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject(5.75).AsNumber()}}, - "g_injectX5_43X_asNumberXN_nintX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject(5.43).AsNumber(gremlingo.N.Nint)}}, - "g_injectX5_67X_asNumberXN_nintX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject(5.67).AsNumber(gremlingo.N.Nint)}}, - "g_injectX5X_asNumberXN_nlongX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject(5).AsNumber(gremlingo.N.Nlong)}}, - "g_injectX12X_asNumberXN_nbyteX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject(12).AsNumber(gremlingo.N.Nbyte)}}, - "g_injectX32768X_asNumberXN_nshortX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject(32768).AsNumber(gremlingo.N.Nshort)}}, - "g_injectX300X_asNumberXN_nbyteX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject(300).AsNumber(gremlingo.N.Nbyte)}}, + "g_injectX5_43X_asNumberXN_intX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject(5.43).AsNumber(gremlingo.N.Int)}}, + "g_injectX5_67X_asNumberXN_intX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject(5.67).AsNumber(gremlingo.N.Int)}}, + "g_injectX5X_asNumberXN_longX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject(5).AsNumber(gremlingo.N.Long)}}, + "g_injectX12X_asNumberXN_byteX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject(12).AsNumber(gremlingo.N.Byte)}}, + "g_injectX32768X_asNumberXN_shortX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject(32768).AsNumber(gremlingo.N.Short)}}, + "g_injectX300X_asNumberXN_byteX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject(300).AsNumber(gremlingo.N.Byte)}}, "g_injectX5X_asNumber": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject("5").AsNumber()}}, - "g_injectX5X_asNumberXN_byteX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject("5").AsNumber(gremlingo.N.Nbyte)}}, - "g_injectX1_000X_asNumberXN_nintX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject("1,000").AsNumber(gremlingo.N.Nint)}}, + "g_injectX5X_asNumberXN_byteX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject("5").AsNumber(gremlingo.N.Byte)}}, + "g_injectX1_000X_asNumberXN_bigIntX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject("1,000").AsNumber(gremlingo.N.BigInt)}}, "g_injectXtestX_asNumber": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject("test").AsNumber()}}, "g_injectX_1_2_3_4X_asNumber": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject([]interface{}{1, 2, 3, 4}).AsNumber()}}, "g_injectX1_2_3_4X_unfold_asNumber": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject([]interface{}{1, 2, 3, 4}).Unfold().AsNumber()}}, "g_injectX_1__2__3__4_X_asNumberXX_foldXX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject("1", 2, "3", 4).AsNumber().Fold()}}, - "g_injectX1_2_3_4_0x5X_asNumber_sum_asNumberXnbyteX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject(p["xx1"], p["xx2"], p["xx3"], "4", "0x5").AsNumber().Sum().AsNumber(gremlingo.N.Nbyte)}}, - "g_VX1X_asNumberXN_nintX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject(nil).AsNumber(gremlingo.N.Nint)}}, - "g_V_asXaX_outXknowsX_asXbX_mathXa_plus_bX_byXageX_asNumberXnintX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().As("a").Out("knows").As("b").Math("a + b").By("age").AsNumber(gremlingo.N.Nint)}}, - "g_withSideEffectXx_100X_V_age_mathX__plus_xX_asNumberXnlongX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.WithSideEffect("x", p["xx1"]).V().Values("age").Math("_ + x").AsNumber(gremlingo.N.Nlong)}}, + "g_injectX1_2_3_4_0x5X_asNumber_sum_asNumberXbyteX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject(p["xx1"], p["xx2"], p["xx3"], "4", "0x5").AsNumber().Sum().AsNumber(gremlingo.N.Byte)}}, + "g_VX1X_asNumberXN_intX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject(nil).AsNumber(gremlingo.N.Int)}}, + "g_V_asXaX_outXknowsX_asXbX_mathXa_plus_bX_byXageX_asNumberXintX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().As("a").Out("knows").As("b").Math("a + b").By("age").AsNumber(gremlingo.N.Int)}}, + "g_withSideEffectXx_100X_V_age_mathX__plus_xX_asNumberXlongX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.WithSideEffect("x", p["xx1"]).V().Values("age").Math("_ + x").AsNumber(gremlingo.N.Long)}}, "g_injectX1_2X_asString": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject(p["xx1"], p["xx2"]).AsString()}}, "g_injectX1_2X_asStringXlocalX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject(p["xx1"], p["xx2"]).AsString(gremlingo.Scope.Local)}}, "g_injectXlist_1_2X_asStringXlocalX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject(p["xx1"]).AsString(gremlingo.Scope.Local)}}, diff --git a/gremlin-go/driver/serializer.go b/gremlin-go/driver/serializer.go index 8a2dec9d56..314d2767f9 100644 --- a/gremlin-go/driver/serializer.go +++ b/gremlin-go/driver/serializer.go @@ -328,7 +328,7 @@ func initDeserializers() { tType: enumReader, directionType: enumReader, dtType: enumReader, - nType: enumReader, + nType: enumReader, bindingType: bindingReader, // Metrics diff --git a/gremlin-go/driver/traversal.go b/gremlin-go/driver/traversal.go index bd21fb6a06..811ff971e1 100644 --- a/gremlin-go/driver/traversal.go +++ b/gremlin-go/driver/traversal.go @@ -364,33 +364,33 @@ type n string type ns struct { // number type byte - Nbyte n + Byte n // number type short - Nshort n + Short n // number type int - Nint n + Int n // number type long - Nlong n + Long n // number type float - Nfloat n + Float n // number type double - Ndouble n + Double n // number type bigInt - NbigInt n + BigInt n // number type bigDecimal - NbigDecimal n + BigDecimal n } // N is a set of operations for denoting number types during conversion. var N = ns{ - Nbyte: "nbyte", - Nshort: "nshort", - Nint: "nint", - Nlong: "nlong", - Nfloat: "nfloat", - Ndouble: "ndouble", - NbigInt: "nbigInt", - NbigDecimal: "nbigDecimal", + Byte: "byte", + Short: "short", + Int: "int", + Long: "long", + Float: "float", + Double: "double", + BigInt: "bigInt", + BigDecimal: "bigDecimal", } type operator string diff --git a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/process/traversal.js b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/process/traversal.js index 84c8482f8f..2bc9705fe9 100644 --- a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/process/traversal.js +++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/process/traversal.js @@ -487,6 +487,14 @@ function toDirectionEnum(typeName, keys) { return result; } +function toNEnum(typeName, keys) { + const result = {}; + keys.split(' ').forEach((k) => { + result[k] = new EnumValue(typeName, k.replace('_', '')); + }); + return result; +} + class EnumValue { constructor(typeName, elementName) { this.typeName = typeName; @@ -512,7 +520,7 @@ module.exports = { column: toEnum('Column', 'keys values'), direction: toDirectionEnum('Direction', 'BOTH IN OUT from_ to'), dt: toEnum('DT', 'second minute hour day'), - n: toEnum('N', 'nbyte nshort nint nlong nfloat ndouble nbigint nbigdecimal'), + n: toNEnum('N', 'byte_ short_ int_ long_ float_ double_ bigInt bigDecimal'), graphSONVersion: toEnum('GraphSONVersion', 'V1_0 V2_0 V3_0'), gryoVersion: toEnum('GryoVersion', 'V1_0 V3_0'), merge: toEnum('Merge', 'onCreate onMatch outV inV'), diff --git a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/gremlin.js b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/gremlin.js index 9ad1b33b8e..aab5f6a21e 100644 --- a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/gremlin.js +++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/gremlin.js @@ -630,23 +630,23 @@ const gremlins = { g_injectX5nX_asNumber: [function({g}) { return g.inject(5).asNumber() }], g_injectX5_0X_asNumber: [function({g}) { return g.inject(5.0).asNumber() }], g_injectX5_75fX_asNumber: [function({g}) { return g.inject(5.75).asNumber() }], - g_injectX5_43X_asNumberXN_nintX: [function({g}) { return g.inject(5.43).asNumber(N.nint) }], - g_injectX5_67X_asNumberXN_nintX: [function({g}) { return g.inject(5.67).asNumber(N.nint) }], - g_injectX5X_asNumberXN_nlongX: [function({g}) { return g.inject(5).asNumber(N.nlong) }], - g_injectX12X_asNumberXN_nbyteX: [function({g}) { return g.inject(12).asNumber(N.nbyte) }], - g_injectX32768X_asNumberXN_nshortX: [function({g}) { return g.inject(32768).asNumber(N.nshort) }], - g_injectX300X_asNumberXN_nbyteX: [function({g}) { return g.inject(300).asNumber(N.nbyte) }], + g_injectX5_43X_asNumberXN_intX: [function({g}) { return g.inject(5.43).asNumber(N.int_) }], + g_injectX5_67X_asNumberXN_intX: [function({g}) { return g.inject(5.67).asNumber(N.int_) }], + g_injectX5X_asNumberXN_longX: [function({g}) { return g.inject(5).asNumber(N.long_) }], + g_injectX12X_asNumberXN_byteX: [function({g}) { return g.inject(12).asNumber(N.byte_) }], + g_injectX32768X_asNumberXN_shortX: [function({g}) { return g.inject(32768).asNumber(N.short_) }], + g_injectX300X_asNumberXN_byteX: [function({g}) { return g.inject(300).asNumber(N.byte_) }], g_injectX5X_asNumber: [function({g}) { return g.inject("5").asNumber() }], - g_injectX5X_asNumberXN_byteX: [function({g}) { return g.inject("5").asNumber(N.nbyte) }], - g_injectX1_000X_asNumberXN_nintX: [function({g}) { return g.inject("1,000").asNumber(N.nint) }], + g_injectX5X_asNumberXN_byteX: [function({g}) { return g.inject("5").asNumber(N.byte_) }], + g_injectX1_000X_asNumberXN_bigIntX: [function({g}) { return g.inject("1,000").asNumber(N.bigInt) }], g_injectXtestX_asNumber: [function({g}) { return g.inject("test").asNumber() }], g_injectX_1_2_3_4X_asNumber: [function({g}) { return g.inject([1, 2, 3, 4]).asNumber() }], g_injectX1_2_3_4X_unfold_asNumber: [function({g}) { return g.inject([1, 2, 3, 4]).unfold().asNumber() }], g_injectX_1__2__3__4_X_asNumberXX_foldXX: [function({g}) { return g.inject("1", 2, "3", 4).asNumber().fold() }], - g_injectX1_2_3_4_0x5X_asNumber_sum_asNumberXnbyteX: [function({g, xx1, xx3, xx2}) { return g.inject(xx1, xx2, xx3, "4", "0x5").asNumber().sum().asNumber(N.nbyte) }], - g_VX1X_asNumberXN_nintX: [function({g}) { return g.inject(null).asNumber(N.nint) }], - g_V_asXaX_outXknowsX_asXbX_mathXa_plus_bX_byXageX_asNumberXnintX: [function({g}) { return g.V().as("a").out("knows").as("b").math("a + b").by("age").asNumber(N.nint) }], - g_withSideEffectXx_100X_V_age_mathX__plus_xX_asNumberXnlongX: [function({g, xx1}) { return g.withSideEffect("x", xx1).V().values("age").math("_ + x").asNumber(N.nlong) }], + g_injectX1_2_3_4_0x5X_asNumber_sum_asNumberXbyteX: [function({g, xx1, xx3, xx2}) { return g.inject(xx1, xx2, xx3, "4", "0x5").asNumber().sum().asNumber(N.byte_) }], + g_VX1X_asNumberXN_intX: [function({g}) { return g.inject(null).asNumber(N.int_) }], + g_V_asXaX_outXknowsX_asXbX_mathXa_plus_bX_byXageX_asNumberXintX: [function({g}) { return g.V().as("a").out("knows").as("b").math("a + b").by("age").asNumber(N.int_) }], + g_withSideEffectXx_100X_V_age_mathX__plus_xX_asNumberXlongX: [function({g, xx1}) { return g.withSideEffect("x", xx1).V().values("age").math("_ + x").asNumber(N.long_) }], g_injectX1_2X_asString: [function({g, xx1, xx2}) { return g.inject(xx1, xx2).asString() }], g_injectX1_2X_asStringXlocalX: [function({g, xx1, xx2}) { return g.inject(xx1, xx2).asString(Scope.local) }], g_injectXlist_1_2X_asStringXlocalX: [function({g, xx1}) { return g.inject(xx1).asString(Scope.local) }], diff --git a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/unit/graphbinary/AnySerializer-test.js b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/unit/graphbinary/AnySerializer-test.js index b9399a6fff..d723c85cd9 100644 --- a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/unit/graphbinary/AnySerializer-test.js +++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/unit/graphbinary/AnySerializer-test.js @@ -176,8 +176,8 @@ describe('GraphBinary.AnySerializer', () => { { v: new t.EnumValue('Merge', 'onMatch'), b: [ DataType.MERGE,0x00, DataType.STRING,0x00, 0x00,0x00,0x00,0x07, ...from('onMatch') ] }, - { v: new t.EnumValue('N', 'nbyte'), - b: [ DataType.N,0x00, DataType.STRING,0x00, 0x00,0x00,0x00,0x05, ...from('nbyte') ] + { v: new t.EnumValue('N', 'byte'), + b: [ DataType.N,0x00, DataType.STRING,0x00, 0x00,0x00,0x00,0x04, ...from('byte') ] }, { v: new t.EnumValue('Operator', 'addAll'), b: [ DataType.OPERATOR,0x00, DataType.STRING,0x00, 0x00,0x00,0x00,0x06, ...from('addAll') ] @@ -522,7 +522,7 @@ describe('GraphBinary.AnySerializer', () => { // N { v:null, b:[0x30,0x01] }, - { v:new t.EnumValue('N','nbyte'), b:[0x30,0x00, 0x03,0x00, 0x00,0x00,0x00,0x05, ...from('nbyte')] }, + { v:new t.EnumValue('N','byte'), b:[0x30,0x00, 0x03,0x00, 0x00,0x00,0x00,0x04, ...from('byte')] }, // OPERATOR { v:null, b:[0x19,0x01] }, diff --git a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/unit/graphbinary/EnumSerializer-test.js b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/unit/graphbinary/EnumSerializer-test.js index a5765995da..4dc0abd616 100644 --- a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/unit/graphbinary/EnumSerializer-test.js +++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/unit/graphbinary/EnumSerializer-test.js @@ -36,6 +36,7 @@ describe('GraphBinary.EnumSerializer', () => { { name: 'Cardinality', code: from([0x16]), enum: t.cardinality }, { name: 'Column', code: from([0x17]), enum: t.column }, { name: 'Direction', code: from([0x18]), enum: t.direction }, + { name: 'N', code: from([0x30]), enum: t.n }, { name: 'Operator', code: from([0x19]), enum: t.operator }, { name: 'Order', code: from([0x1A]), enum: t.order }, { name: 'Pick', code: from([0x1B]), enum: t.pick }, diff --git a/gremlin-language/src/main/antlr4/Gremlin.g4 b/gremlin-language/src/main/antlr4/Gremlin.g4 index d7037a4fff..00031355f6 100644 --- a/gremlin-language/src/main/antlr4/Gremlin.g4 +++ b/gremlin-language/src/main/antlr4/Gremlin.g4 @@ -1963,15 +1963,15 @@ K_BARRIER: 'barrier'; K_BARRIERU: 'Barrier'; K_BEGIN: 'begin'; K_BETWEEN: 'between'; -K_BIGDECIMAL: 'nbigDecimal'; -K_BIGINT: 'nbigInt'; +K_BIGDECIMAL: 'bigDecimal'; +K_BIGINT: 'bigInt'; K_BOTH: 'both'; K_BOTHU: 'BOTH'; K_BOTHE: 'bothE'; K_BOTHV: 'bothV'; K_BRANCH: 'branch'; K_BY: 'by'; -K_BYTE: 'nbyte'; +K_BYTE: 'byte'; K_CALL: 'call'; K_CAP: 'cap'; K_CARDINALITY: 'Cardinality'; @@ -2003,7 +2003,7 @@ K_DIRECTION: 'Direction'; K_DISJUNCT: 'disjunct'; K_DISTANCE: 'distance'; K_DIV: 'div'; -K_DOUBLE: 'ndouble'; +K_DOUBLE: 'double'; K_DROP: 'drop'; K_DT: 'DT'; K_E: 'E'; @@ -2019,7 +2019,7 @@ K_FALSE: 'false'; K_FILTER: 'filter'; K_FIRST: 'first'; K_FLATMAP: 'flatMap'; -K_FLOAT: 'nfloat'; +K_FLOAT: 'float'; K_FOLD: 'fold'; K_FORMAT: 'format'; K_FROM: 'from'; @@ -2052,7 +2052,7 @@ K_INDEX: 'index'; K_INFINITY: 'Infinity'; K_INJECT: 'inject'; K_INSIDE: 'inside'; -K_INT: 'nint'; +K_INT: 'int'; K_INTERSECT: 'intersect'; K_INV: 'inV'; K_IOU: 'IO'; @@ -2068,7 +2068,7 @@ K_LENGTH: 'length'; K_LIMIT: 'limit'; K_LIST: 'list'; K_LOCAL: 'local'; -K_LONG: 'nlong'; +K_LONG: 'long'; K_LOOPS: 'loops'; K_LT: 'lt'; K_LTE: 'lte'; @@ -2149,7 +2149,7 @@ K_SET: 'set'; K_SHORTESTPATHU: 'ShortestPath'; K_SHORTESTPATH: 'shortestPath'; K_SHUFFLE: 'shuffle'; -K_SHORT: 'nshort'; +K_SHORT: 'short'; K_SIDEEFFECT: 'sideEffect'; K_SIMPLEPATH: 'simplePath'; K_SINGLE: 'single'; diff --git a/gremlin-language/src/main/java/org/apache/tinkerpop/gremlin/language/corpus/DocumentationReader.java b/gremlin-language/src/main/java/org/apache/tinkerpop/gremlin/language/corpus/DocumentationReader.java index d68af03fc7..d25f59d98e 100644 --- a/gremlin-language/src/main/java/org/apache/tinkerpop/gremlin/language/corpus/DocumentationReader.java +++ b/gremlin-language/src/main/java/org/apache/tinkerpop/gremlin/language/corpus/DocumentationReader.java @@ -122,6 +122,8 @@ public class DocumentationReader { replace(".getClass()", ""). replace("result.toArray()", "4"). replace("vA.value('amount')", "0.0"). - replace("vA", "\"vA\""); + replace("vA", "\"vA\""). + replace("N.int_", "N.int"). + replace("N.byte_", "N.byte"); } } diff --git a/gremlin-python/src/main/python/gremlin_python/process/traversal.py b/gremlin-python/src/main/python/gremlin_python/process/traversal.py index 4f93bf97ad..70b4902da8 100644 --- a/gremlin-python/src/main/python/gremlin_python/process/traversal.py +++ b/gremlin-python/src/main/python/gremlin_python/process/traversal.py @@ -208,15 +208,16 @@ statics.add_static('on_match', Merge.on_match) statics.add_static('in_v', Merge.in_v) statics.add_static('out_v', Merge.out_v) -N = Enum('N', ' nbyte nshort nint nlong nfloat ndouble nbigInt nbigDecimal') -statics.add_static('nbyte', N.nbyte) -statics.add_static('nshort', N.nshort) -statics.add_static('nint', N.nint) -statics.add_static('nlong', N.nlong) -statics.add_static('nfloat', N.nfloat) -statics.add_static('ndouble', N.ndouble) -statics.add_static('nbigInt', N.nbigInt) -statics.add_static('nbigDecimal', N.nbigDecimal) +N = Enum('N', ' byte short int long float double big_int big_decimal') +# no keyword collision so enum is defined as lang, but has collision with type aliases defined in statics +statics.add_static('byte_', N.byte) +statics.add_static('short_', N.short) +statics.add_static('int_', N.int) +statics.add_static('long_', N.long) +statics.add_static('float_', N.float) +statics.add_static('double_', N.double) +statics.add_static('big_int', N.big_int) +statics.add_static('big_decimal', N.big_decimal) Order = Enum('Order', ' asc desc shuffle') @@ -326,7 +327,7 @@ class P(object): return P("within", list(args[0])) else: return P("within", list(args)) - + @staticmethod def without(*args): if len(args) == 1 and type(args[0]) == list: diff --git a/gremlin-python/src/main/python/radish/gremlin.py b/gremlin-python/src/main/python/radish/gremlin.py index f33c343d58..38a2fdaa4f 100644 --- a/gremlin-python/src/main/python/radish/gremlin.py +++ b/gremlin-python/src/main/python/radish/gremlin.py @@ -602,23 +602,23 @@ world.gremlins = { 'g_injectX5nX_asNumber': [(lambda g:g.inject(bigint(5)).as_number())], 'g_injectX5_0X_asNumber': [(lambda g:g.inject(5.0).as_number())], 'g_injectX5_75fX_asNumber': [(lambda g:g.inject(5.75).as_number())], - 'g_injectX5_43X_asNumberXN_nintX': [(lambda g:g.inject(5.43).as_number(N.nint))], - 'g_injectX5_67X_asNumberXN_nintX': [(lambda g:g.inject(5.67).as_number(N.nint))], - 'g_injectX5X_asNumberXN_nlongX': [(lambda g:g.inject(5).as_number(N.nlong))], - 'g_injectX12X_asNumberXN_nbyteX': [(lambda g:g.inject(12).as_number(N.nbyte))], - 'g_injectX32768X_asNumberXN_nshortX': [(lambda g:g.inject(32768).as_number(N.nshort))], - 'g_injectX300X_asNumberXN_nbyteX': [(lambda g:g.inject(300).as_number(N.nbyte))], + 'g_injectX5_43X_asNumberXN_intX': [(lambda g:g.inject(5.43).as_number(N.int))], + 'g_injectX5_67X_asNumberXN_intX': [(lambda g:g.inject(5.67).as_number(N.int))], + 'g_injectX5X_asNumberXN_longX': [(lambda g:g.inject(5).as_number(N.long))], + 'g_injectX12X_asNumberXN_byteX': [(lambda g:g.inject(12).as_number(N.byte))], + 'g_injectX32768X_asNumberXN_shortX': [(lambda g:g.inject(32768).as_number(N.short))], + 'g_injectX300X_asNumberXN_byteX': [(lambda g:g.inject(300).as_number(N.byte))], 'g_injectX5X_asNumber': [(lambda g:g.inject('5').as_number())], - 'g_injectX5X_asNumberXN_byteX': [(lambda g:g.inject('5').as_number(N.nbyte))], - 'g_injectX1_000X_asNumberXN_nintX': [(lambda g:g.inject('1,000').as_number(N.nint))], + 'g_injectX5X_asNumberXN_byteX': [(lambda g:g.inject('5').as_number(N.byte))], + 'g_injectX1_000X_asNumberXN_bigIntX': [(lambda g:g.inject('1,000').as_number(N.big_int))], 'g_injectXtestX_asNumber': [(lambda g:g.inject('test').as_number())], 'g_injectX_1_2_3_4X_asNumber': [(lambda g:g.inject([1, 2, 3, 4]).as_number())], 'g_injectX1_2_3_4X_unfold_asNumber': [(lambda g:g.inject([1, 2, 3, 4]).unfold().as_number())], 'g_injectX_1__2__3__4_X_asNumberXX_foldXX': [(lambda g:g.inject('1', 2, '3', 4).as_number().fold())], - 'g_injectX1_2_3_4_0x5X_asNumber_sum_asNumberXnbyteX': [(lambda g, xx1=None,xx3=None,xx2=None:g.inject(xx1, xx2, xx3, '4', '0x5').as_number().sum_().as_number(N.nbyte))], - 'g_VX1X_asNumberXN_nintX': [(lambda g:g.inject(None).as_number(N.nint))], - 'g_V_asXaX_outXknowsX_asXbX_mathXa_plus_bX_byXageX_asNumberXnintX': [(lambda g:g.V().as_('a').out('knows').as_('b').math('a + b').by('age').as_number(N.nint))], - 'g_withSideEffectXx_100X_V_age_mathX__plus_xX_asNumberXnlongX': [(lambda g, xx1=None:g.with_side_effect('x', xx1).V().values('age').math('_ + x').as_number(N.nlong))], + 'g_injectX1_2_3_4_0x5X_asNumber_sum_asNumberXbyteX': [(lambda g, xx1=None,xx3=None,xx2=None:g.inject(xx1, xx2, xx3, '4', '0x5').as_number().sum_().as_number(N.byte))], + 'g_VX1X_asNumberXN_intX': [(lambda g:g.inject(None).as_number(N.int))], + 'g_V_asXaX_outXknowsX_asXbX_mathXa_plus_bX_byXageX_asNumberXintX': [(lambda g:g.V().as_('a').out('knows').as_('b').math('a + b').by('age').as_number(N.int))], + 'g_withSideEffectXx_100X_V_age_mathX__plus_xX_asNumberXlongX': [(lambda g, xx1=None:g.with_side_effect('x', xx1).V().values('age').math('_ + x').as_number(N.long))], 'g_injectX1_2X_asString': [(lambda g, xx1=None,xx2=None:g.inject(xx1, xx2).as_string())], 'g_injectX1_2X_asStringXlocalX': [(lambda g, xx1=None,xx2=None:g.inject(xx1, xx2).as_string(Scope.local))], 'g_injectXlist_1_2X_asStringXlocalX': [(lambda g, xx1=None:g.inject(xx1).as_string(Scope.local))], diff --git a/gremlin-python/src/main/python/tests/driver/test_driver_remote_connection.py b/gremlin-python/src/main/python/tests/driver/test_driver_remote_connection.py index fe402a1091..eb6beee5c6 100644 --- a/gremlin-python/src/main/python/tests/driver/test_driver_remote_connection.py +++ b/gremlin-python/src/main/python/tests/driver/test_driver_remote_connection.py @@ -25,7 +25,7 @@ from gremlin_python.statics import long from gremlin_python.process.traversal import Traverser from gremlin_python.process.traversal import TraversalStrategy from gremlin_python.process.traversal import Bindings -from gremlin_python.process.traversal import P, Order, T, N +from gremlin_python.process.traversal import P, Order, T from gremlin_python.process.graph_traversal import __ from gremlin_python.process.anonymous_traversal import traversal from gremlin_python.structure.graph import Vertex diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/map/AsNumber.feature b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/map/AsNumber.feature index cb36ba87b6..1777cfb785 100644 --- a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/map/AsNumber.feature +++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/map/AsNumber.feature @@ -103,11 +103,11 @@ Feature: Step - asNumber() | d[5.75].f | @GraphComputerVerificationInjectionNotSupported - Scenario: g_injectX5_43X_asNumberXN_nintX + Scenario: g_injectX5_43X_asNumberXN_intX Given the empty graph And the traversal of """ - g.inject(5.43).asNumber(N.nint) + g.inject(5.43).asNumber(N.int) """ When iterated to list Then the result should be unordered @@ -115,11 +115,11 @@ Feature: Step - asNumber() | d[5].i | @GraphComputerVerificationInjectionNotSupported - Scenario: g_injectX5_67X_asNumberXN_nintX + Scenario: g_injectX5_67X_asNumberXN_intX Given the empty graph And the traversal of """ - g.inject(5.67).asNumber(N.nint) + g.inject(5.67).asNumber(N.int) """ When iterated to list Then the result should be unordered @@ -127,11 +127,11 @@ Feature: Step - asNumber() | d[5].i | @GraphComputerVerificationInjectionNotSupported - Scenario: g_injectX5X_asNumberXN_nlongX + Scenario: g_injectX5X_asNumberXN_longX Given the empty graph And the traversal of """ - g.inject(5).asNumber(N.nlong) + g.inject(5).asNumber(N.long) """ When iterated to list Then the result should be unordered @@ -139,11 +139,11 @@ Feature: Step - asNumber() | d[5].l | @GraphComputerVerificationInjectionNotSupported - Scenario: g_injectX12X_asNumberXN_nbyteX + Scenario: g_injectX12X_asNumberXN_byteX Given the empty graph And the traversal of """ - g.inject(12).asNumber(N.nbyte) + g.inject(12).asNumber(N.byte) """ When iterated to list Then the result should be unordered @@ -151,21 +151,21 @@ Feature: Step - asNumber() | d[12].b | @GraphComputerVerificationInjectionNotSupported - Scenario: g_injectX32768X_asNumberXN_nshortX + Scenario: g_injectX32768X_asNumberXN_shortX Given the empty graph And the traversal of """ - g.inject(32768).asNumber(N.nshort) + g.inject(32768).asNumber(N.short) """ When iterated to list Then the traversal will raise an error with message containing text of "Can't convert number of type Integer to Short due to overflow." @GraphComputerVerificationInjectionNotSupported - Scenario: g_injectX300X_asNumberXN_nbyteX + Scenario: g_injectX300X_asNumberXN_byteX Given the empty graph And the traversal of """ - g.inject(300).asNumber(N.nbyte) + g.inject(300).asNumber(N.byte) """ When iterated to list Then the traversal will raise an error with message containing text of "Can't convert number of type Integer to Byte due to overflow." @@ -187,7 +187,7 @@ Feature: Step - asNumber() Given the empty graph And the traversal of """ - g.inject("5").asNumber(N.nbyte) + g.inject("5").asNumber(N.byte) """ When iterated to list Then the result should be unordered @@ -195,11 +195,11 @@ Feature: Step - asNumber() | d[5].b | @GraphComputerVerificationInjectionNotSupported - Scenario: g_injectX1_000X_asNumberXN_nintX + Scenario: g_injectX1_000X_asNumberXN_bigIntX Given the empty graph And the traversal of """ - g.inject("1,000").asNumber(N.nint) + g.inject("1,000").asNumber(N.bigInt) """ When iterated to list Then the traversal will raise an error with message containing text of "Can't parse string '1,000' as number." @@ -252,14 +252,14 @@ Feature: Step - asNumber() | l[d[1].i,d[2].i,d[3].i,d[4].i] | @GraphComputerVerificationInjectionNotSupported - Scenario: g_injectX1_2_3_4_0x5X_asNumber_sum_asNumberXnbyteX + Scenario: g_injectX1_2_3_4_0x5X_asNumber_sum_asNumberXbyteX Given the empty graph And using the parameter xx1 defined as "d[1.0].d" And using the parameter xx2 defined as "d[2].i" And using the parameter xx3 defined as "d[3].l" And the traversal of """ - g.inject(xx1, xx2, xx3, "4", "0x5").asNumber().sum().asNumber(N.nbyte) + g.inject(xx1, xx2, xx3, "4", "0x5").asNumber().sum().asNumber(N.byte) """ When iterated to list Then the result should be unordered @@ -267,21 +267,21 @@ Feature: Step - asNumber() | d[15].b | @GraphComputerVerificationInjectionNotSupported - Scenario: g_VX1X_asNumberXN_nintX + Scenario: g_VX1X_asNumberXN_intX Given the empty graph And the traversal of """ - g.inject(null).asNumber(N.nint) + g.inject(null).asNumber(N.int) """ When iterated to list Then the traversal will raise an error with message containing text of "Can't parse type null as number." @GraphComputerVerificationReferenceOnly - Scenario: g_V_asXaX_outXknowsX_asXbX_mathXa_plus_bX_byXageX_asNumberXnintX + Scenario: g_V_asXaX_outXknowsX_asXbX_mathXa_plus_bX_byXageX_asNumberXintX Given the modern graph And the traversal of """ - g.V().as("a").out("knows").as("b").math("a + b").by("age").asNumber(N.nint) + g.V().as("a").out("knows").as("b").math("a + b").by("age").asNumber(N.int) """ When iterated to list Then the result should be unordered @@ -289,12 +289,12 @@ Feature: Step - asNumber() | d[56].i | | d[61].i | - Scenario: g_withSideEffectXx_100X_V_age_mathX__plus_xX_asNumberXnlongX + Scenario: g_withSideEffectXx_100X_V_age_mathX__plus_xX_asNumberXlongX Given the modern graph And using the parameter xx1 defined as "d[100].i" And the traversal of """ - g.withSideEffect("x", xx1).V().values("age").math("_ + x").asNumber(N.nlong) + g.withSideEffect("x", xx1).V().values("age").math("_ + x").asNumber(N.long) """ When iterated to list Then the result should be unordered