This is an automated email from the ASF dual-hosted git repository. xiazcy pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit 3bd2bbef440f46fa5978d23a6bc45d844ea9f2ae Merge: 2c3f31fdab e515cc5bb0 Author: xiazcy <[email protected]> AuthorDate: Fri Oct 24 15:23:31 2025 -0700 Merge branch '3.8-dev' CHANGELOG.asciidoc | 2 + docs/src/dev/provider/gremlin-semantics.asciidoc | 34 ++- docs/src/reference/gremlin-variants.asciidoc | 36 +++ docs/src/reference/the-traversal.asciidoc | 83 +++++- docs/src/upgrade/release-3.8.x.asciidoc | 84 ++++-- .../tinkerpop/gremlin/jsr223/CoreImports.java | 6 +- .../gremlin/language/grammar/ArgumentVisitor.java | 1 - .../grammar/DefaultGremlinBaseVisitor.java | 8 +- .../language/grammar/GenericLiteralVisitor.java | 4 +- .../language/grammar/TraversalEnumParser.java | 13 +- .../language/grammar/TraversalMethodVisitor.java | 6 +- .../grammar/TraversalPredicateVisitor.java | 19 +- .../translator/DotNetTranslateVisitor.java | 13 + .../language/translator/GoTranslateVisitor.java | 15 ++ .../translator/GroovyTranslateVisitor.java | 9 - .../language/translator/JavaTranslateVisitor.java | 10 - .../translator/JavascriptTranslateVisitor.java | 7 +- .../language/translator/TranslateVisitor.java | 14 +- .../gremlin/process/traversal/CompareType.java | 116 +++++++++ .../tinkerpop/gremlin/process/traversal/GType.java | 106 ++++++++ .../gremlin/process/traversal/GremlinLang.java | 5 +- .../tinkerpop/gremlin/process/traversal/N.java | 48 ---- .../tinkerpop/gremlin/process/traversal/P.java | 28 ++ .../traversal/dsl/graph/GraphTraversal.java | 8 +- .../gremlin/process/traversal/dsl/graph/__.java | 8 +- .../gremlin/process/traversal/step/GType.java | 105 -------- .../process/traversal/step/map/AsNumberStep.java | 23 +- .../gremlin/structure/io/binary/DataType.java | 2 +- .../io/binary/TypeSerializerRegistry.java | 4 +- .../structure/io/binary/types/EnumSerializer.java | 3 +- .../structure/io/binary/types/NSerializer.java | 46 ---- .../structure/io/binary/types/PSerializer.java | 5 +- .../structure/io/graphson/GraphSONModule.java | 14 +- .../io/graphson/TraversalSerializersV2.java | 42 +-- .../io/graphson/TraversalSerializersV3.java | 42 +-- .../gremlin/structure/io/gryo/GryoVersion.java | 9 +- .../tinkerpop/gremlin/util/NumberHelper.java | 16 +- .../grammar/GeneralLiteralVisitorTest.java | 49 ++-- .../language/translator/GremlinTranslatorTest.java | 63 +++-- .../tinkerpop/gremlin/process/traversal/PTest.java | 18 ++ .../gremlin/process/traversal/step/GTypeTest.java | 91 ------- .../traversal/step/map/AsNumberStepTest.java | 236 ++++++++--------- .../tinkerpop/gremlin/util/NumberHelperTest.java | 50 ++-- .../src/Gremlin.Net/Process/Traversal/GType.cs | 112 ++++++++ .../Process/Traversal/GraphTraversal.cs | 4 +- .../src/Gremlin.Net/Process/Traversal/N.cs | 74 ------ .../src/Gremlin.Net/Process/Traversal/P.cs | 6 + .../src/Gremlin.Net/Process/Traversal/__.cs | 4 +- .../Structure/IO/GraphBinary/DataType.cs | 2 +- .../IO/GraphBinary/TypeSerializerRegistry.cs | 4 +- .../IO/GraphBinary/Types/EnumSerializer.cs | 8 +- .../{NDeserializer.cs => GTypeDeserializer.cs} | 6 +- .../Structure/IO/GraphSON/GraphSONReader.cs | 2 +- .../Gherkin/GherkinTestRunner.cs | 2 + .../Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs | 175 ++++++++++++- .../Structure/IO/GraphBinary/GraphBinaryTests.cs | 6 +- .../Structure/IO/GraphSON/GraphSONReaderTests.cs | 8 +- .../Structure/IO/GraphSON/GraphSONWriterTests.cs | 8 +- gremlin-go/driver/anonymousTraversal.go | 14 +- gremlin-go/driver/cucumber/gremlin.go | 175 ++++++++++++- gremlin-go/driver/graphBinary.go | 8 +- gremlin-go/driver/serializer.go | 10 +- gremlin-go/driver/traversal.go | 104 +++++--- gremlin-javascript/build/generate.groovy | 2 +- .../gremlin-javascript/docker-compose.yml | 1 + .../gremlin-javascript/lib/process/traversal.ts | 14 + .../lib/structure/io/binary/internals/DataType.js | 2 +- .../io/binary/internals/EnumSerializer.js | 2 +- .../javascript/gremlin-javascript/package.json | 8 +- .../gremlin-javascript/test/cucumber/gremlin.js | 177 +++++++++++-- .../test/unit/graphbinary/AnySerializer-test.js | 12 +- .../test/unit/graphbinary/EnumSerializer-test.js | 22 +- gremlin-language/src/main/antlr4/Gremlin.g4 | 160 ++++++++++-- gremlin-python/build/generate.groovy | 2 +- gremlin-python/docker-compose.yml | 10 +- .../python/gremlin_python/process/traversal.py | 52 +++- .../gremlin_python/structure/io/graphbinaryV4.py | 10 +- gremlin-python/src/main/python/radish/gremlin.py | 177 +++++++++++-- .../tests/driver/test_driver_remote_connection.py | 1 + .../gremlin/test/features/data/BigDecimal.feature | 151 +++++++++++ .../gremlin/test/features/data/BigInt.feature | 151 +++++++++++ .../gremlin/test/features/data/Byte.feature | 132 ++++++++++ .../gremlin/test/features/data/DateTime.feature | 133 ++++++++++ .../gremlin/test/features/data/Double.feature | 189 ++++++++++++++ .../gremlin/test/features/data/Float.feature | 148 +++++++++++ .../gremlin/test/features/data/Int.feature | 144 +++++++++++ .../gremlin/test/features/data/List.feature | 160 ++++++++++++ .../gremlin/test/features/data/Long.feature | 111 ++++++++ .../gremlin/test/features/data/Map.feature | 144 +++++++++++ .../gremlin/test/features/data/Set.feature | 159 ++++++++++++ .../gremlin/test/features/data/Short.feature | 119 +++++++++ .../gremlin/test/features/data/UUID.feature | 158 ++++++++++++ .../gremlin/test/features/filter/Or.feature | 3 +- .../gremlin/test/features/filter/TypeOf.feature | 281 +++++++++++++++++++++ .../test/features/filter/TypeOfGraph.feature | 143 +++++++++++ .../gremlin/test/features/map/AsNumber.feature | 116 +++++---- .../test/features/sideEffect/Subgraph.feature | 2 +- .../gremlin/test/features/sideEffect/Uuid.feature | 41 --- .../gremlin/neo4j/Neo4jGraphFeatureTest.java | 1 + .../tinkergraph/structure/TinkerGraphPlayTest.java | 9 + 100 files changed, 4360 insertions(+), 1020 deletions(-) diff --cc docs/src/reference/gremlin-variants.asciidoc index 604c3a36c0,90840f7672..fc336c417b --- a/docs/src/reference/gremlin-variants.asciidoc +++ b/docs/src/reference/gremlin-variants.asciidoc @@@ -1378,10 -1369,44 +1378,46 @@@ java -cp target/run-examples-shaded.ja java -cp target/run-examples-shaded.jar examples.ModernTraversals ---- + [[gremlin-java-differences]] + === Differences + + Gremlin-Java provides additional syntactic sugar that leverages Java's type system for the `P.typeOf()` predicate, + which accepts Java `Class` objects directly, providing a more natural way to perform type checking: + + [gremlin-groovy,modern] + ---- + // Java-specific syntax using Class objects + g.V().values("age").is(P.typeOf(Integer.class)) + g.V().values("name").is(P.typeOf(String.class)) + + // Further simplification with Groovy sugar syntax + g.E().has("weight", P.typeOf(Double)) + ---- + + This is equivalent to using `GType` enums. Other Gremlin language variants must use the canonical `GType` enum approach: + + [gremlin-groovy,modern] + ---- + // Canonical syntax available in all languages + g.V().values("age").is(P.typeOf(GType.INT)) + g.V().values("name").is(P.typeOf(GType.STRING)) + ---- + + Any valid Java class accepted in the Console and with embedded Java is also accepted by `P.typeOf()`, as they are not + restricted by the grammar or serialization. + [gremlin-groovy,modern] + ---- + // Using java.awt.Color for example + gremlin> g.inject(java.awt.Color.red) + ==>java.awt.Color[r=255,g=0,b=0] + gremlin> g.inject(java.awt.Color.red, "hi", 123).is(P.typeOf(java.awt.Color)) + ==>java.awt.Color[r=255,g=0,b=0] + ---- + [[gremlin-javascript]] == Gremlin-JavaScript +IMPORTANT: 4.0.0-beta.1 Release - Gremlin-JavaScript is not available in this beta, please consider testing with +Java or Python. image:gremlin-js.png[width=130,float=right] Apache TinkerPop's Gremlin-JavaScript implements Gremlin within the JavaScript language. It targets Node.js runtime and can be used on different operating systems on any Node.js 6 or diff --cc gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/CoreImports.java index d6b61add60,df48440801..03706b3bac --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/CoreImports.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/CoreImports.java @@@ -58,10 -56,11 +58,10 @@@ import org.apache.tinkerpop.gremlin.pro import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.verification.VertexProgramRestrictionStrategy; import org.apache.tinkerpop.gremlin.process.remote.RemoteConnection; import org.apache.tinkerpop.gremlin.process.traversal.AnonymousTraversalSource; -import org.apache.tinkerpop.gremlin.process.traversal.Bindings; import org.apache.tinkerpop.gremlin.process.traversal.DT; + import org.apache.tinkerpop.gremlin.process.traversal.GType; import org.apache.tinkerpop.gremlin.process.traversal.IO; import org.apache.tinkerpop.gremlin.process.traversal.Merge; - import org.apache.tinkerpop.gremlin.process.traversal.N; import org.apache.tinkerpop.gremlin.process.traversal.Operator; import org.apache.tinkerpop.gremlin.process.traversal.Order; import org.apache.tinkerpop.gremlin.process.traversal.P; diff --cc gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalEnumParser.java index 0ce7a44cba,03b6a5cc4c..9cc9e5863a --- 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,13 -19,9 +19,13 @@@ 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.GType; import org.apache.tinkerpop.gremlin.process.traversal.Scope; +import org.apache.tinkerpop.gremlin.structure.Column; import org.apache.tinkerpop.gremlin.structure.Direction; +import org.apache.tinkerpop.gremlin.structure.T; + +import java.util.function.Function; /** * Traversal enum parser parses all the enums like (e.g. {@link Scope} in graph traversal. @@@ -71,23 -67,14 +71,24 @@@ public class TraversalEnumParser return Direction.directionValueOf(text); } + public static Function parseTraversalFunctionFromContext(final GremlinParser.TraversalFunctionContext context) { + if (context.traversalT() != null) { + return TraversalEnumParser.parseTraversalEnumFromContext(T.class, context.traversalT()); + } else if (context.traversalColumn() != null) + return TraversalEnumParser.parseTraversalEnumFromContext(Column.class, context.traversalColumn()); + else { + throw new GremlinParserException("Unrecognized enum for traversal function"); + } + } + /** - * Parsing of {@link N} requires some special handling because of java keyword collision. + * Parsing of {@link GType} requires some special handling as grammar allows lowercase for tokens. */ - public static N parseTraversalNFromContext(final GremlinParser.TraversalNContext context) { + public static GType parseTraversalGTypeFromContext(final GremlinParser.TraversalGTypeContext 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 + "_"); + if (text.startsWith(GType.class.getSimpleName())) { + text = text.substring(GType.class.getSimpleName().length() + 1); + } + return GType.valueOf(text.toUpperCase()); } } diff --cc gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/CompareType.java index 0000000000,c3854d2de2..072b416469 mode 000000,100644..100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/CompareType.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/CompareType.java @@@ -1,0 -1,115 +1,116 @@@ + /* + * 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.process.traversal; + ++import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet; ++ + import java.util.Map; + import java.util.Optional; + import java.util.concurrent.ConcurrentHashMap; + + /** + * {@code CompareType} is a {@code BiPredicate} that determines whether the first argument is a type of the second argument. + * + */ + public enum CompareType implements PBiPredicate<Object, Object> { + + /** + * Evaluates if the first object is an instance of the second class. + * + * @since 3.8.0 + */ + typeOf { + @Override + public boolean test(final Object first, final Object second) { - Class<?> valueClass; + if (first == null) { - return second == null; ++ return second == null || (second instanceof GType && ((GType) second).getType() == null); + } ++ ++ Class<?> valueClass; + if (second instanceof String) { - // need to assess the string token at run time on server - final Optional<Class<?>> opt = CompareType.GlobalTypeCache.getRegisteredType((String) second); - if (opt.isEmpty()) { - throw new IllegalArgumentException(second + " is not a registered type"); - } - else - valueClass = opt.get(); ++ valueClass = CompareType.GlobalTypeCache.getRegisteredType((String) second) ++ .orElseThrow(() -> new IllegalArgumentException(second + " is not a registered type")); ++ } else if (second instanceof GType) { ++ valueClass = ((GType) second).getType(); + } else { + valueClass = (Class<?>) second; + } - return second != null && valueClass.isAssignableFrom(first.getClass()); ++ ++ return valueClass != null && valueClass.isAssignableFrom(first.getClass()); + } + + }; + + public static final class GlobalTypeCache { + + private GlobalTypeCache() { + throw new IllegalStateException("Utility class"); + } + + /** + * A register of enum names for all types. + */ + private static final Map<String, Class<?>> GLOBAL_TYPE_REGISTRY = new ConcurrentHashMap<>(); + + // register the GType classes for convenience use of simple class names in grammar + static { + for (GType value : GType.values()) { + if (value == GType.NULL) { + // skip the null type + continue; + } + registerDataType(value.getType()); + } + } + + /** + * Register a type with a custom name. Convention is to use PascalCase with simple type names. + * If the type is not in the registry then type comparison fails with an exception + */ + public static void registerDataType(final String name, final Class<?> type) { + GLOBAL_TYPE_REGISTRY.put(name, type); + } + + /** + * Register a type by its simple name. + * If the type is not in the registry then type comparison fails with an exception + */ + public static void registerDataType(final Class<?> type) { + GLOBAL_TYPE_REGISTRY.put(type.getSimpleName(), type); + } + + /** + * Unregisters a type by its name. + * If the type is not in the registry then type comparison fails with an exception + */ + public static void unregisterDataType(final String name) { + GLOBAL_TYPE_REGISTRY.remove(name); + } + + /** + * Looks up a Gremlin DataType by its simple name. + */ + public static Optional<Class<?>> getRegisteredType(final String typeName) { + if (GLOBAL_TYPE_REGISTRY.containsKey(typeName)) + return Optional.of(GLOBAL_TYPE_REGISTRY.get(typeName)); + + return Optional.empty(); + } + } + } diff --cc gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/GremlinLang.java index 8bc86906f6,0000000000..72a13df299 mode 100644,000000..100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/GremlinLang.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/GremlinLang.java @@@ -1,527 -1,0 +1,526 @@@ +/* + * 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.process.traversal; + +import org.apache.commons.configuration2.Configuration; +import org.apache.commons.text.StringEscapeUtils; +import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal; +import org.apache.tinkerpop.gremlin.process.traversal.step.GValue; +import org.apache.tinkerpop.gremlin.process.traversal.strategy.TraversalStrategyProxy; +import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.OptionsStrategy; +import org.apache.tinkerpop.gremlin.process.traversal.util.ConnectiveP; +import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal; +import org.apache.tinkerpop.gremlin.structure.Column; +import org.apache.tinkerpop.gremlin.structure.T; +import org.apache.tinkerpop.gremlin.structure.Vertex; +import org.apache.tinkerpop.gremlin.util.NumberHelper; + +import javax.lang.model.SourceVersion; +import java.io.Serializable; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.time.OffsetDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.UUID; +import java.util.concurrent.atomic.AtomicInteger; + +import static org.apache.tinkerpop.gremlin.util.DatetimeHelper.format; +import static org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils.asIterator; + +/** + * This class helps to build a gremlin-lang compatible string representation based on a {@link TraversalSource} + * and then a {@link Traversal}. + */ +public class GremlinLang implements Cloneable, Serializable { + + private static final Object[] EMPTY_ARRAY = new Object[]{}; + + private StringBuilder gremlin = new StringBuilder(); + private Map<String, Object> parameters = new HashMap<>(); + private static final AtomicInteger paramCount = new AtomicInteger(0); + private List<OptionsStrategy> optionsStrategies = new ArrayList<>(); + + public GremlinLang() { + } + + public GremlinLang(final String sourceName, final Object... arguments) { + addToGremlin(sourceName, arguments); + } + + private void addToGremlin(final String name, final Object... arguments) { + final Object[] flattenedArguments = flattenArguments(arguments); + + // todo: figure out solution for AbstractLambdaTraversal + if ("CardinalityValueTraversal".equals(name)) { + gremlin.append("Cardinality.").append(flattenedArguments[0]) + .append("(").append(flattenedArguments[1]).append(")"); + return; + } + + gremlin.append(".").append(name).append('('); + + for (int i = 0; i < flattenedArguments.length; i++) { + if (i != 0) { + gremlin.append(','); + } + gremlin.append(argAsString(flattenedArguments[i])); + } + + gremlin.append(')'); + } + + private String argAsString(final Object arg) { + if (arg == null) + return "null"; + + if (arg instanceof String) + return String.format("\"%s\"", StringEscapeUtils.escapeJava((String) arg)); + if (arg instanceof Boolean) + return arg.toString(); + + if (arg instanceof Byte) + return String.format("%sB", arg); + if (arg instanceof Short) + return String.format("%sS", arg); + if (arg instanceof Integer) + return arg.toString(); + if (arg instanceof Long) + return String.format("%sL", arg); + + if (arg instanceof BigInteger) + return String.format("%sN", arg); + if (arg instanceof Float) { + if (NumberHelper.isNaN(arg)) + return "NaN"; + if (NumberHelper.isPositiveInfinity(arg)) + return "+Infinity"; + if (NumberHelper.isNegativeInfinity(arg)) + return "-Infinity"; + + return String.format("%sF", arg); + } + if (arg instanceof Double) { + if (NumberHelper.isNaN(arg)) + return "NaN"; + if (NumberHelper.isPositiveInfinity(arg)) + return "+Infinity"; + if (NumberHelper.isNegativeInfinity(arg)) + return "-Infinity"; + return String.format("%sD", arg); + } + if (arg instanceof BigDecimal) + return String.format("%sM", arg); + + if (arg instanceof OffsetDateTime) + return String.format("datetime(\"%s\")", format(((OffsetDateTime) arg).toInstant())); + + if (arg instanceof UUID) { + return String.format("UUID(\"%s\")", arg); + } + + if (arg instanceof Enum) { + // special handling for enums with additional interfaces + if (arg instanceof T) + return String.format("T.%s", arg); - if (arg instanceof N) { - return String.format("N.%s", arg).replace("_",""); - } ++ if (arg instanceof GType) ++ return String.format("GType.%s", arg); + if (arg instanceof Order) + return String.format("Order.%s", arg); + if (arg instanceof Column) + return String.format("Column.%s", arg); + if (arg instanceof Operator) + return String.format("Operator.%s", arg); + if (arg instanceof SackFunctions.Barrier) + return String.format("Barrier.%s", arg); + + return String.format("%s.%s", arg.getClass().getSimpleName(), arg); + } + + if (arg instanceof Vertex) + return argAsString(((Vertex) arg).id()); + + if (arg instanceof P) { + return asString((P<?>) arg); + } + + if (arg instanceof GremlinLang || arg instanceof DefaultTraversal) { + final GremlinLang gremlinLang = arg instanceof GremlinLang ? (GremlinLang) arg : ((DefaultTraversal) arg).getGremlinLang(); + parameters.putAll(gremlinLang.getParameters()); + return gremlinLang.getGremlin("__"); + } + + if (arg instanceof GValue) { + final GValue gValue = (GValue) arg; + String key = gValue.getName(); + + if (key == null) { + return argAsString(((GValue<?>) arg).get()); + } + + if (!SourceVersion.isIdentifier(key)) { + throw new IllegalArgumentException(String.format("Invalid parameter name [%s].", key)); + } + + if (parameters.containsKey(key)) { + if (!Objects.equals(parameters.get(key), gValue.get())) { + throw new IllegalArgumentException(String.format("Parameter with name [%s] already defined.", key)); + } + } else { + parameters.put(key, gValue.get()); + } + return key; + } + + if (arg instanceof Map) { + return asString((Map) arg); + } + + if (arg instanceof Set) { + return asString((Set) arg); + } + + // handle all iterables in similar way + if (arg instanceof List || arg instanceof Object[] || arg.getClass().isArray()) { + return asString(asIterator(arg)); + } + + if (arg instanceof Class) { + return ((Class) arg).getSimpleName(); + } + + return asParameter(arg); + } + + private String asParameter(final Object arg) { + final String paramName = String.format("_%d", paramCount.getAndIncrement()); + // todo: consider resetting paramCount when it's larger then 1_000_000 + parameters.put(paramName, arg); + return paramName; + } + + private String asString(final Iterator itty) { + final StringBuilder sb = new StringBuilder().append("["); + + while (itty.hasNext()) { + sb.append(argAsString(itty.next())); + if (itty.hasNext()) + sb.append(","); + } + + return sb.append("]").toString(); + } + + private String asString(final Set<?> set) { + final StringBuilder sb = new StringBuilder().append("{"); + + final Iterator itty = asIterator(set); + + while (itty.hasNext()) { + sb.append(argAsString(itty.next())); + if (itty.hasNext()) + sb.append(","); + } + + return sb.append("}").toString(); + } + + // borrowed from Groovy translator + private String asString(final P<?> p) { + final StringBuilder sb = new StringBuilder(); + if (p instanceof TextP) { + sb.append("TextP.").append(p.getPredicateName()).append("("); + sb.append(argAsString(p.getValue())); + } else if (p instanceof ConnectiveP) { + // ConnectiveP gets some special handling because it's reduced to and(P, P, P) and we want it + // generated the way it was written which was P.and(P).and(P) + final List<P<?>> list = ((ConnectiveP) p).getPredicates(); + final String connector = p.getPredicateName(); + for (int i = 0; i < list.size(); i++) { + sb.append(argAsString(list.get(i))); + + // for the first/last P there is no parent to close + if (i > 0 && i < list.size() - 1) sb.append(")"); + + // add the connector for all but last P + if (i < list.size() - 1) { + sb.append(".").append(connector).append("("); + } + } + } else if (p instanceof NotP) { + sb.append("P.not("); + sb.append(argAsString(p.negate())); // Wrap internal P in `P.not(%s)` + } else { + sb.append("P.").append(p.getPredicateName()).append("("); + sb.append(argAsString(p.getValue())); + } + sb.append(")"); + return sb.toString(); + } + + private String asString(final Map<?, ?> map) { + final StringBuilder sb = new StringBuilder("["); + int size = map.size(); + + if (size == 0) { + sb.append(":"); + } else { + for (Map.Entry<?, ?> entry : map.entrySet()) { + String key = argAsString(entry.getKey()); + // special handling for non-string keys + if (entry.getKey() instanceof Enum && key.contains(".")) { + key = String.format("(%s)", key); + } + + sb.append(key).append(":").append(argAsString(entry.getValue())); + if (--size > 0) { + sb.append(','); + } + } + } + + sb.append("]"); + return sb.toString(); + } + + /** + * Get gremlin-lang compatible representation of Traversal + * @return gremlin-lang compatible String + */ + public String getGremlin() { + return getGremlin("g"); + } + + /** + * Get gremlin-lang compatible representation of Traversal. + * "g" is expected for gremlin-lang. + * "__" can be used for an anonymous {@link GraphTraversal}. + * + * @param g GraphTraversalSource name + * @return gremlin-lang compatible String + */ + public String getGremlin(final String g) { + // special handling for CardinalityValueTraversal + if (gremlin.length() != 0 && gremlin.charAt(0) != '.') { + return gremlin.toString(); + } + return g + gremlin; + } + + /** + * Get parameters used in Traversal. + * + * @return parameters Map + */ + public Map<String, Object> getParameters() { + return parameters; + } + + /** + * The alias to set. + */ + public void addG(final String g) { + parameters.put("g", g); + } + + /** + * Reset parameter naming counter. Mainly intended to make testing easier + */ + public void reset() { + paramCount.set(0); + } + + /** + * Add a {@link TraversalSource} instruction to the GremlinLang. + * + * @param sourceName the traversal source method name (e.g. withSack()) + * @param arguments the traversal source method arguments + */ + public void addSource(final String sourceName, final Object... arguments) { + if (sourceName.equals(TraversalSource.Symbols.withStrategies) && arguments.length != 0) { + final String args = buildStrategyArgs(arguments); + + // possible to have empty strategies list to send + if (!args.isEmpty()) { + gremlin.append('.').append(TraversalSource.Symbols.withStrategies).append('(').append(args).append(')'); + } + return; + } + + addToGremlin(sourceName, arguments); + } + + private String buildStrategyArgs(final Object[] arguments) { + final StringBuilder sb = new StringBuilder(); + for (int i = 0; i < arguments.length; i++) { + // special handling for OptionsStrategy + if (arguments[i] instanceof OptionsStrategy) { + optionsStrategies.add((OptionsStrategy) arguments[i]); + break; + } + + Configuration configuration; + String strategyName; + + // special handling for TraversalStrategyProxy + if (arguments[i] instanceof TraversalStrategyProxy) { + configuration = ((TraversalStrategy) arguments[i]).getConfiguration(); + strategyName = ((TraversalStrategyProxy) arguments[i]).getStrategyName(); + } else { + configuration = ((TraversalStrategy) arguments[i]).getConfiguration(); + strategyName = arguments[i].getClass().getSimpleName(); + } + + if (configuration.isEmpty()) { + sb.append(strategyName); + } else { + sb.append("new ") + .append(strategyName) + .append("("); + + configuration.getKeys().forEachRemaining(key -> { + if (!key.equals("strategy")) { + sb.append(key).append(":").append(argAsString(configuration.getProperty(key))).append(","); + } + }); + // remove last comma + if (sb.lastIndexOf(",") == sb.length() - 1) { + sb.setLength(sb.length() - 1); + } + + sb.append(')'); + } + + if (i != arguments.length - 1) + sb.append(','); + } + + return sb.toString(); + } + + /** + * Add a {@link Traversal} instruction to the GremlinLang. + * + * @param stepName the traversal method name (e.g. out()) + * @param arguments the traversal method arguments + */ + public void addStep(final String stepName, final Object... arguments) { + addToGremlin(stepName, arguments); + } + + /** + * Provides a way to get configuration of a Traversal. + * + * @return list of OptionsStrategy + */ + public List<OptionsStrategy> getOptionsStrategies() { + return optionsStrategies; + } + + public boolean isEmpty() { + return this.gremlin.length() == 0; + } + + @Override + public String toString() { + return gremlin.toString(); + } + + // todo: clarify equality with parameters + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + final GremlinLang gremlinLang = (GremlinLang) o; + return Objects.equals(gremlin.toString(), gremlinLang.gremlin.toString()) && + Objects.equals(parameters, gremlinLang.parameters); + } + + @Override + public int hashCode() { + return Objects.hash(gremlin, parameters); + } + + @Override + public GremlinLang clone() { + try { + final GremlinLang clone = (GremlinLang) super.clone(); + clone.parameters = new HashMap<>(parameters); + clone.gremlin = new StringBuilder(gremlin.length()); + clone.gremlin.append(gremlin); + clone.optionsStrategies = new ArrayList<>(this.optionsStrategies); + return clone; + } catch (final CloneNotSupportedException e) { + throw new IllegalStateException(e.getMessage(), e); + } + } + + private Object[] flattenArguments(final Object... arguments) { + if (arguments == null || arguments.length == 0) + return EMPTY_ARRAY; + final List<Object> flatArguments = new ArrayList<>(arguments.length); + for (final Object object : arguments) { + if (object instanceof Object[]) { + for (final Object nestObject : (Object[]) object) { + flatArguments.add(convertArgument(nestObject)); + } + } else + flatArguments.add(convertArgument(object)); + } + return flatArguments.toArray(); + } + + private Object convertArgument(final Object argument) { + if (argument instanceof Traversal) { + // prevent use of "g" to spawn child traversals + if (((Traversal) argument).asAdmin().getTraversalSource().isPresent()) + throw new IllegalStateException(String.format( + "The child traversal of %s was not spawned anonymously - use the __ class rather than a TraversalSource to construct the child traversal", argument)); + + return ((Traversal) argument).asAdmin().getGremlinLang(); + } else if (argument instanceof Map) { + final Map<Object, Object> map = new LinkedHashMap<>(((Map) argument).size()); + for (final Map.Entry<?, ?> entry : ((Map<?, ?>) argument).entrySet()) { + map.put(convertArgument(entry.getKey()), convertArgument(entry.getValue())); + } + return map; + } else if (argument instanceof List) { + final List<Object> list = new ArrayList<>(((List) argument).size()); + for (final Object item : (List) argument) { + list.add(convertArgument(item)); + } + return list; + } else if (argument instanceof Set) { + final Set<Object> set = new LinkedHashSet<>(((Set) argument).size()); + for (final Object item : (Set) argument) { + set.add(convertArgument(item)); + } + return set; + } else + return argument; + } +} diff --cc gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/P.java index 776981dc68,cea7a9258f..559682a56e --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/P.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/P.java @@@ -437,6 -438,33 +438,33 @@@ public class P<V> implements Predicate< return new P(Contains.without, value); } + /** + * Determines if a value is of a type denoted by {@code GType}. + * + * @since 3.8.0 + */ + public static <V> P<V> typeOf(final GType value) { - return new P(CompareType.typeOf, value.getType()); ++ return new P(CompareType.typeOf, value); + } + + /** + * Determines if a value is of a type denoted by String key of GlobalTypeCache. + * + * @since 3.8.0 + */ + public static <V> P<V> typeOf(final String value) { + return new P(CompareType.typeOf, value); + } + + /** + * Sugar method for Java/Groovy embedded cases only, determines if a value is of a type denoted by class. + * + * @since 3.8.0 + */ + public static <V> P<V> typeOf(final Class<?> value) { + return new P(CompareType.typeOf, value); + } + /** * Construct an instance of {@code P} from a {@code BiPredicate}. * diff --cc gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java index fa36d7c307,d27c62fe3f..9d86079fbf --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java @@@ -2337,9 -2323,9 +2337,9 @@@ public interface GraphTraversal<S, E> e * @see <a href="http://tinkerpop.apache.org/docs/${project.version}/reference/#AsNumberStep-step" target="_blank">Reference Documentation - AsNumberStep Step</a> * @since 3.8.0 */ - public default GraphTraversal<S, Number> asNumber(final N numberToken) { - this.asAdmin().getGremlinLang().addStep(Symbols.asNumber, numberToken); - return this.asAdmin().addStep(new AsNumberStep<>(this.asAdmin(), numberToken)); + public default GraphTraversal<S, Number> asNumber(final GType typeToken) { - this.asAdmin().getBytecode().addStep(Symbols.asNumber, typeToken); ++ this.asAdmin().getGremlinLang().addStep(Symbols.asNumber, typeToken); + return this.asAdmin().addStep(new AsNumberStep<>(this.asAdmin(), typeToken)); } /** diff --cc gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/binary/DataType.java index e2522c03c3,1abdb90fcf..0e62220ac5 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/binary/DataType.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/binary/DataType.java @@@ -51,9 -64,15 +51,9 @@@ public enum DataType BYTEBUFFER(0X25), SHORT(0X26), BOOLEAN(0x27), - TEXTP(0x28), - TRAVERSALSTRATEGY(0X29), - BULKSET(0X2A), + BULKSET(0X2A), // todo: TREE(0X2B), - N(0x30), - METRICS(0x2C), - TRAVERSALMETRICS(0x2D), - MERGE(0x2E), - DT(0x2F), + GTYPE(0x30), CHAR(0X80), DURATION(0X81), diff --cc gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/binary/TypeSerializerRegistry.java index 8b1499465a,b9309878c7..6cc390ae66 --- 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 @@@ -18,14 -18,32 +18,14 @@@ */ package org.apache.tinkerpop.gremlin.structure.io.binary; -import org.apache.tinkerpop.gremlin.process.traversal.Bytecode; -import org.apache.tinkerpop.gremlin.process.traversal.DT; import org.apache.tinkerpop.gremlin.process.traversal.Merge; -import org.apache.tinkerpop.gremlin.process.traversal.NotP; -import org.apache.tinkerpop.gremlin.process.traversal.Operator; -import org.apache.tinkerpop.gremlin.process.traversal.Order; -import org.apache.tinkerpop.gremlin.process.traversal.P; import org.apache.tinkerpop.gremlin.process.traversal.Path; - import org.apache.tinkerpop.gremlin.process.traversal.N; -import org.apache.tinkerpop.gremlin.process.traversal.Pick; -import org.apache.tinkerpop.gremlin.process.traversal.Pop; -import org.apache.tinkerpop.gremlin.process.traversal.SackFunctions; -import org.apache.tinkerpop.gremlin.process.traversal.Scope; -import org.apache.tinkerpop.gremlin.process.traversal.TextP; -import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy; -import org.apache.tinkerpop.gremlin.process.traversal.Traverser; ++import org.apache.tinkerpop.gremlin.process.traversal.GType; import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet; import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree; -import org.apache.tinkerpop.gremlin.process.traversal.util.AndP; -import org.apache.tinkerpop.gremlin.process.traversal.util.Metrics; -import org.apache.tinkerpop.gremlin.process.traversal.util.OrP; import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalExplanation; -import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalMetrics; -import org.apache.tinkerpop.gremlin.structure.Column; import org.apache.tinkerpop.gremlin.structure.Direction; import org.apache.tinkerpop.gremlin.structure.Edge; -import org.apache.tinkerpop.gremlin.process.traversal.GType; import org.apache.tinkerpop.gremlin.structure.Graph; import org.apache.tinkerpop.gremlin.structure.Property; import org.apache.tinkerpop.gremlin.structure.T; @@@ -42,12 -64,22 +42,11 @@@ import org.apache.tinkerpop.gremlin.str 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.DateTimeSerializer; - import org.apache.tinkerpop.gremlin.structure.io.binary.types.NSerializer; 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; @@@ -103,10 -160,29 +102,9 @@@ public class TypeSerializerRegistry new RegistryEntry<>(Property.class, new PropertySerializer()), new RegistryEntry<>(Graph.class, new GraphSerializer()), new RegistryEntry<>(Vertex.class, new VertexSerializer()), - new RegistryEntry<>(SackFunctions.Barrier.class, EnumSerializer.BarrierSerializer), - new RegistryEntry<>(Bytecode.Binding.class, new BindingSerializer()), - new RegistryEntry<>(Bytecode.class, new ByteCodeSerializer()), - new RegistryEntry<>(VertexProperty.Cardinality.class, EnumSerializer.CardinalitySerializer), - new RegistryEntry<>(Column.class, EnumSerializer.ColumnSerializer), new RegistryEntry<>(Direction.class, EnumSerializer.DirectionSerializer), - new RegistryEntry<>(DT.class, EnumSerializer.DTSerializer), - new RegistryEntry<>(GType.class, EnumSerializer.GTypeSerializer), - new RegistryEntry<>(Merge.class, EnumSerializer.MergeSerializer), - new RegistryEntry<>(Operator.class, EnumSerializer.OperatorSerializer), - new RegistryEntry<>(Order.class, EnumSerializer.OrderSerializer), - new RegistryEntry<>(Pick.class, EnumSerializer.PickSerializer), - new RegistryEntry<>(Pop.class, EnumSerializer.PopSerializer), - new RegistryEntry<>(Lambda.class, new LambdaSerializer()), - new RegistryEntry<>(P.class, new PSerializer<>(DataType.P, P.class)), - new RegistryEntry<>(AndP.class, new PSerializer<>(DataType.P, AndP.class)), - new RegistryEntry<>(OrP.class, new PSerializer<>(DataType.P, OrP.class)), - new RegistryEntry<>(NotP.class, new PSerializer<>(DataType.P, NotP.class)), - new RegistryEntry<>(TextP.class, new PSerializer<>(DataType.TEXTP, TextP.class)), - new RegistryEntry<>(Scope.class, EnumSerializer.ScopeSerializer), new RegistryEntry<>(T.class, EnumSerializer.TSerializer), - new RegistryEntry<>(Traverser.class, new TraverserSerializer()), new RegistryEntry<>(Merge.class, EnumSerializer.MergeSerializer), - new RegistryEntry<>(N.class, new NSerializer()), new RegistryEntry<>(BigDecimal.class, new BigDecimalSerializer()), new RegistryEntry<>(BigInteger.class, new BigIntegerSerializer()), new RegistryEntry<>(Byte.class, SingleTypeSerializer.ByteSerializer), diff --cc gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/binary/types/EnumSerializer.java index a0e0bf77e3,299ee54bbc..a2382848dd --- 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 @@@ -46,9 -46,19 +46,10 @@@ import java.util.function.Function */ public class EnumSerializer<E extends Enum> extends SimpleTypeSerializer<E> { - public static final EnumSerializer<SackFunctions.Barrier> BarrierSerializer = new EnumSerializer<>(DataType.BARRIER, SackFunctions.Barrier::valueOf); - public static final EnumSerializer<VertexProperty.Cardinality> CardinalitySerializer = new EnumSerializer<>(DataType.CARDINALITY, VertexProperty.Cardinality::valueOf); - public static final EnumSerializer<Column> ColumnSerializer = new EnumSerializer<>(DataType.COLUMN, Column::valueOf); 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<GType> GTypeSerializer = new EnumSerializer<>(DataType.GTYPE, GType::valueOf); - public static final EnumSerializer<Merge> MergeSerializer = new EnumSerializer<>(DataType.MERGE, Merge::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); - public static final EnumSerializer<Pop> PopSerializer = new EnumSerializer<>(DataType.POP, Pop::valueOf); - public static final EnumSerializer<Scope> ScopeSerializer = new EnumSerializer<>(DataType.SCOPE, Scope::valueOf); public static final EnumSerializer<T> TSerializer = new EnumSerializer<>(DataType.T, T::valueOf); + public static final EnumSerializer<Merge> MergeSerializer = new EnumSerializer<>(DataType.MERGE, Merge::valueOf); ++ public static final EnumSerializer<GType> GTypeSerializer = new EnumSerializer<>(DataType.GTYPE, GType::valueOf); private final Function<String, E> readFunc; diff --cc gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONModule.java index 7271c1ea38,259a684da9..1ffcc09ce7 --- 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 @@@ -19,10 -19,14 +19,10 @@@ package org.apache.tinkerpop.gremlin.structure.io.graphson; import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy; -import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.finalization.ComputerFinalizationStrategy; import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.optimization.GraphFilterStrategy; -import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.optimization.MessagePassingReductionStrategy; -import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.verification.VertexProgramRestrictionStrategy; -import org.apache.tinkerpop.gremlin.process.traversal.Bytecode; import org.apache.tinkerpop.gremlin.process.traversal.DT; + import org.apache.tinkerpop.gremlin.process.traversal.GType; import org.apache.tinkerpop.gremlin.process.traversal.Merge; - import org.apache.tinkerpop.gremlin.process.traversal.N; import org.apache.tinkerpop.gremlin.process.traversal.NotP; import org.apache.tinkerpop.gremlin.process.traversal.Operator; import org.apache.tinkerpop.gremlin.process.traversal.Order; @@@ -400,9 -289,9 +401,8 @@@ abstract class GraphSONModule extends T 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()); addSerializer(Traverser.class, new TraversalSerializersV3.TraverserJacksonSerializer()); addSerializer(TraversalStrategy.class, new TraversalSerializersV3.TraversalStrategyJacksonSerializer()); @@@ -642,9 -547,9 +643,8 @@@ 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()); addSerializer(Traverser.class, new TraversalSerializersV2.TraverserJacksonSerializer()); addSerializer(TraversalStrategy.class, new TraversalSerializersV2.TraversalStrategyJacksonSerializer()); diff --cc gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/TraversalSerializersV2.java index 8541a43f8a,3d162994b3..ae374ccd77 --- 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,7 -22,8 +22,7 @@@ package org.apache.tinkerpop.gremlin.st 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.N; -import org.apache.tinkerpop.gremlin.process.traversal.Bytecode; + import org.apache.tinkerpop.gremlin.process.traversal.GType; import org.apache.tinkerpop.gremlin.process.traversal.NotP; import org.apache.tinkerpop.gremlin.process.traversal.P; import org.apache.tinkerpop.gremlin.process.traversal.TextP; diff --cc gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/TraversalSerializersV3.java index fd5cd09716,d771edc702..db3ab05486 --- 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,7 -22,8 +22,7 @@@ package org.apache.tinkerpop.gremlin.st 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.N; -import org.apache.tinkerpop.gremlin.process.traversal.Bytecode; + import org.apache.tinkerpop.gremlin.process.traversal.GType; import org.apache.tinkerpop.gremlin.process.traversal.NotP; import org.apache.tinkerpop.gremlin.process.traversal.P; import org.apache.tinkerpop.gremlin.process.traversal.TextP; diff --cc gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoVersion.java index 0bf3ceac08,ac1083e3a8..4e8fa1c5f9 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoVersion.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoVersion.java @@@ -26,10 -25,11 +26,10 @@@ import org.apache.tinkerpop.gremlin.pro import org.apache.tinkerpop.gremlin.process.computer.util.ComputerGraph; import org.apache.tinkerpop.gremlin.process.computer.util.MapMemory; import org.apache.tinkerpop.gremlin.process.remote.traversal.DefaultRemoteTraverser; -import org.apache.tinkerpop.gremlin.process.traversal.Bytecode; import org.apache.tinkerpop.gremlin.process.traversal.Contains; import org.apache.tinkerpop.gremlin.process.traversal.DT; + import org.apache.tinkerpop.gremlin.process.traversal.GType; import org.apache.tinkerpop.gremlin.process.traversal.Merge; - import org.apache.tinkerpop.gremlin.process.traversal.N; import org.apache.tinkerpop.gremlin.process.traversal.Operator; import org.apache.tinkerpop.gremlin.process.traversal.Order; import org.apache.tinkerpop.gremlin.process.traversal.P; @@@ -429,7 -430,8 +430,7 @@@ public enum GryoVersion add(GryoTypeReg.of(LabelledCounter.class, 180)); add(GryoTypeReg.of(Stack.class, 181)); add(GryoTypeReg.of(ReferenceMap.class, 182)); - add(GryoTypeReg.of(GValue.class, 199, new JavaSerializer())); // ***LAST ID*** - + add(GryoTypeReg.of(GValue.class, 199, new JavaSerializer())); // placeholder serializers for classes that don't live here in core. this will allow them to be used if // present or ignored if the class isn't available. either way the registration numbers are held as @@@ -644,7 -645,8 +645,7 @@@ add(GryoTypeReg.of(LabelledCounter.class, 180)); add(GryoTypeReg.of(Stack.class, 181)); add(GryoTypeReg.of(ReferenceMap.class, 182)); - add(GryoTypeReg.of(GValue.class, 199, new JavaSerializer())); // ***LAST ID*** - + add(GryoTypeReg.of(GValue.class, 199, new JavaSerializer())); }}; } diff --cc gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/language/translator/GremlinTranslatorTest.java index b5f56c10dc,1c743e62c6..c42df77556 --- 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 @@@ -742,33 -741,51 +742,60 @@@ 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.inject(\"123.4\").asNumber(GType.INT)", + null, + "g.inject(string0).asNumber(GType.INT)", + "g.Inject<object>(\"123.4\").AsNumber(GType.Int)", + "g.Inject(\"123.4\").AsNumber(gremlingo.GType.Int)", + "g.inject(\"123.4\").asNumber(GType.INT)", + "g.inject(\"123.4\").asNumber(GType.INT)", + "g.inject(\"123.4\").asNumber(GType.int)", + "g.inject('123.4').as_number(GType.INT)"}, + {"g.inject(\"123.4\").asNumber(GType.BIGINT)", + null, + "g.inject(string0).asNumber(GType.BIGINT)", + "g.Inject<object>(\"123.4\").AsNumber(GType.BigInt)", + "g.Inject(\"123.4\").AsNumber(gremlingo.GType.BigInt)", + null, + null, + "g.inject(\"123.4\").asNumber(GType.bigInt)", + "g.inject('123.4').as_number(GType.BIGINT)"}, + {"g.inject(123).is(P.typeOf(GType.BIGINT))", + null, + "g.inject(number0).is(P.typeOf(GType.BIGINT))", + "g.Inject<object>(123).Is(P.TypeOf(GType.BigInt))", + "g.Inject(123).Is(gremlingo.P.TypeOf(gremlingo.GType.BigInt))", + null, + null, + "g.inject(123).is(P.typeOf(GType.bigInt))", + "g.inject(123).is_(P.type_of(GType.BIGINT))"}, + {"g.inject(123).is(P.typeOf(GType.BYTE))", + null, + "g.inject(number0).is(P.typeOf(GType.BYTE))", + "g.Inject<object>(123).Is(P.TypeOf(GType.Byte))", + "g.Inject(123).Is(gremlingo.P.TypeOf(gremlingo.GType.Byte))", + null, + null, + "g.inject(123).is(P.typeOf(GType.byte))", + "g.inject(123).is_(P.type_of(GType.BYTE))"}, + {"g.inject(123).is(P.typeOf(GType.UUID))", + null, + "g.inject(number0).is(P.typeOf(GType.UUID))", + "g.Inject<object>(123).Is(P.TypeOf(GType.UUID))", + "g.Inject(123).Is(gremlingo.P.TypeOf(gremlingo.GType.UUID))", + null, + null, + "g.inject(123).is(P.typeOf(GType.uuid))", + "g.inject(123).is_(P.type_of(GType.UUID))"}, + {"g.inject(null, null).inject(null, null)", + null, + "g.inject(object0, object0).inject(object0, object0)", + "g.Inject<object>(null, null).Inject(null, null)", + "g.Inject(nil, nil).Inject(nil, nil)", + "g.inject(null, (Object) null).inject(null, (Object) null)", + "g.inject(null, null).inject(null, null)", + "g.inject(null, null).inject(null, null)", + "g.inject(None, None).inject(None, None)"}, {"g.V().hasLabel(null)", null, "g.V().hasLabel(string0)", diff --cc gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs index 80b02d8a0e,803907fbe2..282a3f0432 --- a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs +++ b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs @@@ -169,8 -170,124 +169,124 @@@ namespace Gremlin.Net.IntegrationTest.G {"g_VX1_2X_unionXoutE_count__inE_count__outE_weight_sumX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V(p["vid1"], p["vid2"]).Union<object>(__.OutE().Count(), __.InE().Count(), __.OutE().Values<object>("weight").Sum<object>())}}, {"g_VX1_2X_localXunionXoutE_count__inE_count__outE_weight_sumXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V(p["vid1"], p["vid2"]).Local<object>(__.Union<object>(__.OutE().Count(), __.InE().Count(), __.OutE().Values<object>("weight").Sum<object>()))}}, {"g_VX1_2X_localXunionXcountXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V(p["vid1"], p["vid2"]).Local<object>(__.Union<object>(__.Count()))}}, - {"g_unionXaddVXpersonX_propertyXname_aliceX_addVXpersonX_propertyXname_bobX_addVXpersonX_propertyXname_chrisX_name", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Union<object>(__.AddV("person").Property("name", "alice"), __.AddV("person").Property("name", "bob"), __.AddV("person").Property("name", "chris")).Values<object>("name")}}, + {"g_unionXaddVXpersonX_propertyXname_aliceX_addVXpersonX_propertyXname_bobX_addVXpersonX_propertyXname_chrisX_name", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Union<object>(__.AddV((string) "person").Property("name", "alice"), __.AddV((string) "person").Property("name", "bob"), __.AddV((string) "person").Property("name", "chris")).Values<object>("name")}}, {"g_VX_hasLabelXpersonX_unionX_whereX_out_count_isXgtX2XXX_valuesXageX_notX_whereX_bothE_count_isXgt2XXX_valusXnameXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().HasLabel("person").Union<object>(__.Where(__.OutE().Count().Is(P.Gt(2))).Values<object>("age"), __.Not(__.Where(__.OutE().Count().Is(P.Gt(2)))).Values<object>("name"))}}, + {"g_V_valuesXintX_asNumberXGType_BIGDECIMALX_isXtypeOfXGType_BIGDECIMALXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("int", 123), (g,p) =>g.V().Values<object>("int").AsNumber(GType.BigDecimal).Is(P.TypeOf(GType.BigDecimal))}}, + {"g_V_valuesXintX_asNumberXGType_BIGDECIMALX_isXtypeOfXGType_BIGDECIMALXX_mathXaddX0_5XX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("int", 10), (g,p) =>g.V().Values<object>("int").AsNumber(GType.BigDecimal).Is(P.TypeOf(GType.BigDecimal)).Math("_ + 0.5")}}, + {"g_V_valuesXintX_asNumberXGType_BIGDECIMALX_isXtypeOfXGType_BIGDECIMALXX_isXgtX0XX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("int", 5), (g,p) =>g.V().Values<object>("int").AsNumber(GType.BigDecimal).Is(P.TypeOf(GType.BigDecimal)).Is(P.Gt(0))}}, + {"g_V_valuesXintX_asNumberXGType_BIGDECIMALX_isXtypeOfXGType_BIGDECIMALXX_sumX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("int", 2).AddV("data").Property("int", 3).AddV("data").Property("int", 4), (g,p) =>g.V().Values<object>("int").AsNumber(GType.BigDecimal).Is(P.TypeOf(GType.BigDecimal)).Sum<object>()}}, + {"g_V_valuesXintX_asNumberXGType_BIGDECIMALX_isXtypeOfXGType_BIGDECIMALXX_minX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("int", 1).AddV("data").Property("int", 5).AddV("data").Property("int", 10), (g,p) =>g.V().Values<object>("int").AsNumber(GType.BigDecimal).Is(P.TypeOf(GType.BigDecimal)).Min<object>()}}, + {"g_V_valuesXintX_asNumberXGType_BIGDECIMALX_isXtypeOfXGType_BIGDECIMALXX_maxX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("int", 7).AddV("data").Property("int", 14).AddV("data").Property("int", 21), (g,p) =>g.V().Values<object>("int").AsNumber(GType.BigDecimal).Is(P.TypeOf(GType.BigDecimal)).Max<object>()}}, + {"g_V_valuesXintX_asNumberXGType_BIGDECIMALX_isXtypeOfXGType_BIGDECIMALXX_project_byXidentityX_byXmathXmulX10XXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("int", 6), (g,p) =>g.V().Values<object>("int").AsNumber(GType.BigDecimal).Is(P.TypeOf(GType.BigDecimal)).Project<object>("original", "multiplied").By(__.Identity()).By(__.Math("_ * 10"))}}, + {"g_injectX99X_asNumberXGType_BIGDECIMALX_isXtypeOfXGType_BIGDECIMALXX_groupCount", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(99).AsNumber(GType.BigDecimal).Is(P.TypeOf(GType.BigDecimal)).GroupCount<object>()}}, + {"g_V_valuesXageX_isXtypeOfXGType_BIGDECIMALXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Values<object>("age").Is(P.TypeOf(GType.BigDecimal))}}, + {"g_V_valuesXintX_asNumberXGType_BIGINTX_isXtypeOfXGType_BIGINTXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("int", 456), (g,p) =>g.V().Values<object>("int").AsNumber(GType.BigInt).Is(P.TypeOf(GType.BigInt))}}, + {"g_V_valuesXintX_asNumberXGType_BIGINTX_isXtypeOfXGType_BIGINTXX_mathXmulX1000XX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("int", 100), (g,p) =>g.V().Values<object>("int").AsNumber(GType.BigInt).Is(P.TypeOf(GType.BigInt)).Math("_ * 1000")}}, + {"g_V_valuesXintX_asNumberXGType_BIGINTX_isXtypeOfXGType_BIGINTXX_isXeqX42XX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("int", 42), (g,p) =>g.V().Values<object>("int").AsNumber(GType.BigInt).Is(P.TypeOf(GType.BigInt)).Is(P.Eq(42))}}, + {"g_V_valuesXintX_asNumberXGType_BIGINTX_isXtypeOfXGType_BIGINTXX_sumX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("int", 10).AddV("data").Property("int", 20).AddV("data").Property("int", 30), (g,p) =>g.V().Values<object>("int").AsNumber(GType.BigInt).Is(P.TypeOf(GType.BigInt)).Sum<object>()}}, + {"g_V_valuesXintX_asNumberXGType_BIGINTX_isXtypeOfXGType_BIGINTXX_minX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("int", 5).AddV("data").Property("int", 15).AddV("data").Property("int", 25), (g,p) =>g.V().Values<object>("int").AsNumber(GType.BigInt).Is(P.TypeOf(GType.BigInt)).Min<object>()}}, + {"g_V_valuesXintX_asNumberXGType_BIGINTX_isXtypeOfXGType_BIGINTXX_maxX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("int", 100).AddV("data").Property("int", 200).AddV("data").Property("int", 300), (g,p) =>g.V().Values<object>("int").AsNumber(GType.BigInt).Is(P.TypeOf(GType.BigInt)).Max<object>()}}, + {"g_V_valuesXintX_asNumberXGType_BIGINTX_isXtypeOfXGType_BIGINTXX_project_byXidentityX_byXmathXaddX999XXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("int", 50), (g,p) =>g.V().Values<object>("int").AsNumber(GType.BigInt).Is(P.TypeOf(GType.BigInt)).Project<object>("original", "added").By(__.Identity()).By(__.Math("_ + 999"))}}, + {"g_injectX777X_asNumberXGType_BIGINTX_isXtypeOfXGType_BIGINTXX_groupCount", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(777).AsNumber(GType.BigInt).Is(P.TypeOf(GType.BigInt)).GroupCount<object>()}}, + {"g_V_valuesXageX_isXtypeOfXGType_BIGINTXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Values<object>("age").Is(P.TypeOf(GType.BigInt))}}, + {"g_V_valuesXintX_asNumberXGType_BYTEX_isXtypeOfXGType_BYTEXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("int", 5), (g,p) =>g.V().Values<object>("int").AsNumber(GType.Byte).Is(P.TypeOf(GType.Byte))}}, + {"g_V_valuesXintX_asNumberXGType_BYTEX_isXtypeOfXGType_BYTEXX_mathXaddX20XX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("int", 10), (g,p) =>g.V().Values<object>("int").AsNumber(GType.Byte).Is(P.TypeOf(GType.Byte)).Math("_ + 20")}}, + {"g_V_valuesXintX_asNumberXGType_BYTEX_isXtypeOfXGType_BYTEXX_isXltX10XX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("int", 7), (g,p) =>g.V().Values<object>("int").AsNumber(GType.Byte).Is(P.TypeOf(GType.Byte)).Is(P.Lt(10))}}, + {"g_V_valuesXintX_asNumberXGType_BYTEX_isXtypeOfXGType_BYTEXX_sumX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("int", 1).AddV("data").Property("int", 2).AddV("data").Property("int", 3), (g,p) =>g.V().Values<object>("int").AsNumber(GType.Byte).Is(P.TypeOf(GType.Byte)).Sum<object>()}}, + {"g_V_valuesXintX_asNumberXGType_BYTEX_isXtypeOfXGType_BYTEXX_project_byXidentityX_byXmathXmulX2XXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("int", 8), (g,p) =>g.V().Values<object>("int").AsNumber(GType.Byte).Is(P.TypeOf(GType.Byte)).Project<object>("original", "doubled").By(__.Identity()).By(__.Math("_ * 2"))}}, + {"g_V_valuesXintX_asNumberXGType_BYTEX_isXtypeOfXGType_BYTEXX_chooseXisXeqX12XX_constantXtwelveX_constantXotherXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("int", 12), (g,p) =>g.V().Values<object>("int").AsNumber(GType.Byte).Is(P.TypeOf(GType.Byte)).Choose<object>(__.Is(P.Eq(12)), __.Constant<object>("twelve"), __.Constant<object>("other"))}}, + {"g_injectX15X_asNumberXGType_BYTEX_isXtypeOfXGType_BYTEXX_groupCount", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(15).AsNumber(GType.Byte).Is(P.TypeOf(GType.Byte)).GroupCount<object>()}}, + {"g_V_valuesXageX_isXtypeOfXGType_BYTEXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Values<object>("age").Is(P.TypeOf(GType.Byte))}}, + {"g_V_valuesXdatetimeX_isXtypeOfXGType_DATETIMEXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("event").Property("datetime", DateTimeOffset.Parse("2023-08-08T00:00Z")), (g,p) =>g.V().Values<object>("datetime").Is(P.TypeOf(GType.DateTime))}}, + {"g_V_valuesXdatetimeX_isXtypeOfXGType_DATETIMEXX_project_byXidentityX_byXdateAddXDT_dayX1XX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("event").Property("datetime", DateTimeOffset.Parse("2023-08-08T00:00Z")), (g,p) =>g.V().Values<object>("datetime").Is(P.TypeOf(GType.DateTime)).Project<object>("original", "nextDay").By(__.Identity()).By(__.DateAdd(DT.Day, 1))}}, + {"g_V_valuesXdatetimeX_isXtypeOfXGType_DATETIMEXX_dateDiffXdatetimeX2023_08_10XX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("event").Property("datetime", DateTimeOffset.Parse("2023-08-08T00:00Z")), (g,p) =>g.V().Values<object>("datetime").Is(P.TypeOf(GType.DateTime)).DateDiff(DateTimeOffset.Parse("2023-08-08T00:00:30Z"))}}, + {"g_V_valuesXdatetimeX_isXtypeOfXGType_DATETIMEXX_whereXisXgtXdatetimeX2020_01_01XXXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("event").Property("datetime", DateTimeOffset.Parse("2023-08-08T00:00Z")), (g,p) =>g.V().Values<object>("datetime").Is(P.TypeOf(GType.DateTime)).Where(__.Is(P.Gt(DateTimeOffset.Parse("2020-01-01T00:00Z"))))}}, + {"g_V_valuesXdatetimeX_isXtypeOfXGType_DATETIMEXX_chooseXisXeqXdatetimeX2023_08_08XXXX_constantXmatchX_constantXnoMatchXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("event").Property("datetime", DateTimeOffset.Parse("2023-08-08T00:00Z")), (g,p) =>g.V().Values<object>("datetime").Is(P.TypeOf(GType.DateTime)).Choose<object>(__.Is(P.Eq(DateTimeOffset.Parse("2023-08-08T00:00Z"))), __.Constant<object>("match"), __.Constant<o [...] + {"g_V_valuesXdatetimeX_isXtypeOfXGType_DATETIMEXX_localXaggregateXaX_capXaX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("event").Property("datetime", DateTimeOffset.Parse("2023-08-08T00:00Z")), (g,p) =>g.V().Values<object>("datetime").Is(P.TypeOf(GType.DateTime)).Local<object>(__.Aggregate("a")).Cap<object>("a")}}, + {"g_injectXdatetimeX_isXtypeOfXGType_DATETIMEXX_aggregateXaX_capXaX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(DateTimeOffset.Parse("2023-08-08T00:00Z")).Is(P.TypeOf(GType.DateTime)).Aggregate("a").Cap<object>("a")}}, + {"g_injectXdatetimeX_isXtypeOfXGType_DATETIMEXX_groupCount", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(DateTimeOffset.Parse("2023-08-08T00:00Z")).Is(P.TypeOf(GType.DateTime)).GroupCount<object>()}}, + {"g_V_valuesXdoubleX_isXtypeOfXGType_DOUBLEXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("double", 1.5d), (g,p) =>g.V().Values<object>("double").Is(P.TypeOf(GType.Double))}}, + {"g_E_valuesXweightX_isXtypeOfXGType_DOUBLEXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.E().Values<object>("weight").Is(P.TypeOf(GType.Double))}}, + {"g_V_valuesXdoubleX_isXtypeOfXGType_DOUBLEXX_mathXceilX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("double", 2.7d), (g,p) =>g.V().Values<object>("double").Is(P.TypeOf(GType.Double)).Math("ceil _")}}, + {"g_V_valuesXdoubleX_isXtypeOfXGType_DOUBLEXX_isXgtX1_0XX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("double", 0.8d).AddV("data").Property("double", 1.2d), (g,p) =>g.V().Values<object>("double").Is(P.TypeOf(GType.Double)).Is(P.Gt(1.0d))}}, + {"g_V_valuesXdoubleX_isXtypeOfXGType_DOUBLEXX_sumX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("double", 1.5d).AddV("data").Property("double", 2.5d).AddV("data").Property("double", 3.5d), (g,p) =>g.V().Values<object>("double").Is(P.TypeOf(GType.Double)).Sum<object>()}}, + {"g_V_valuesXdoubleX_isXtypeOfXGType_DOUBLEXX_minX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("double", 0.1d).AddV("data").Property("double", 0.5d).AddV("data").Property("double", 0.9d), (g,p) =>g.V().Values<object>("double").Is(P.TypeOf(GType.Double)).Min<object>()}}, + {"g_V_valuesXdoubleX_isXtypeOfXGType_DOUBLEXX_maxX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("double", 2.1d).AddV("data").Property("double", 3.7d).AddV("data").Property("double", 1.9d), (g,p) =>g.V().Values<object>("double").Is(P.TypeOf(GType.Double)).Max<object>()}}, + {"g_V_valuesXdoubleX_isXtypeOfXGType_DOUBLEXX_meanX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("double", 2.1d).AddV("data").Property("double", 4.1d).AddV("data").Property("double", 6.1d), (g,p) =>g.V().Values<object>("double").Is(P.TypeOf(GType.Double)).Mean<object>()}}, + {"g_V_valuesXdoubleX_isXtypeOfXGType_DOUBLEXX_order_byXascX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("double", 3.2d).AddV("data").Property("double", 1.8d).AddV("data").Property("double", 2.5d), (g,p) =>g.V().Values<object>("double").Is(P.TypeOf(GType.Double)).Order().By(Order.Asc)}}, + {"g_injectX5_5dX_isXtypeOfXGType_DOUBLEXX_groupCount", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(5.5d).Is(P.TypeOf(GType.Double)).GroupCount<object>()}}, + {"g_V_valuesXageX_isXtypeOfXGType_DOUBLEXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Values<object>("age").Is(P.TypeOf(GType.Double))}}, + {"g_V_valuesXfloatX_isXtypeOfXGType_FLOATXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("float", 2.5), (g,p) =>g.V().Values<object>("float").AsNumber(GType.Float).Is(P.TypeOf(GType.Float))}}, + {"g_V_valuesXfloatX_isXtypeOfXGType_FLOATXX_mathXmulX2XX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("float", 3.0), (g,p) =>g.V().Values<object>("float").AsNumber(GType.Float).Is(P.TypeOf(GType.Float)).Math("_ * 2")}}, + {"g_V_valuesXfloatX_isXtypeOfXGType_FLOATXX_isXeqX1_5XX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("float", 1.5), (g,p) =>g.V().Values<object>("float").AsNumber(GType.Float).Is(P.TypeOf(GType.Float)).Is(P.Eq(1.5))}}, + {"g_V_valuesXfloatX_isXtypeOfXGType_FLOATXX_sumX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("float", 1.5).AddV("data").Property("float", 2.5).AddV("data").Property("float", 3.0), (g,p) =>g.V().Values<object>("float").AsNumber(GType.Float).Is(P.TypeOf(GType.Float)).Sum<object>()}}, + {"g_V_valuesXfloatX_isXtypeOfXGType_FLOATXX_project_byXidentityX_byXmathXmulX10XXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("float", 4.5), (g,p) =>g.V().Values<object>("float").AsNumber(GType.Float).Is(P.TypeOf(GType.Float)).Project<object>("original", "multiplied").By(__.Identity()).By(__.Math("_ * 10"))}}, + {"g_V_valuesXfloatX_isXtypeOfXGType_FLOATXX_whereXisXgtX1_0XXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("float", 0.5).AddV("data").Property("float", 1.5), (g,p) =>g.V().Values<object>("float").AsNumber(GType.Float).Is(P.TypeOf(GType.Float)).Where(__.Is(P.Gt(1.0)))}}, + {"g_V_valuesXfloatX_isXtypeOfXGType_FLOATXX_chooseXisXeqX3_0XX_constantXthreeX_constantXotherXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("float", 3.0), (g,p) =>g.V().Values<object>("float").AsNumber(GType.Float).Is(P.TypeOf(GType.Float)).Choose<object>(__.Is(P.Eq(3.0)), __.Constant<object>("three"), __.Constant<object>("other"))}}, + {"g_injectX2_0fX_isXtypeOfXGType_FLOATXX_groupCount", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(2.0).AsNumber(GType.Float).Is(P.TypeOf(GType.Float)).GroupCount<object>()}}, + {"g_V_valuesXageX_isXtypeOfXGType_FLOATXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Values<object>("age").Is(P.TypeOf(GType.Float))}}, + {"g_V_valuesXageX_isXtypeOfXGType_INTXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Values<object>("age").Is(P.TypeOf(GType.Int))}}, + {"g_V_hasXage_typeOfXGType_INTXX_valuesXnameX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Has("age", P.TypeOf(GType.Int)).Values<object>("name")}}, + {"g_V_whereXvaluesXageX_isXtypeOfXGType_INTXXX_valuesXnameX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Where(__.Values<object>("age").Is(P.TypeOf(GType.Int))).Values<object>("name")}}, + {"g_V_valuesXageX_isXtypeOfXGType_INTXX_mathXincX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Values<object>("name", "age").Is(P.TypeOf(GType.Int)).Math("_ + 1")}}, + {"g_V_valuesXageX_isXtypeOfXGType_INTXX_sumX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Values<object>("age").Is(P.TypeOf(GType.Int)).Sum<object>()}}, + {"g_V_valuesXageX_isXtypeOfXGType_INTXX_minX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Values<object>("age").Is(P.TypeOf(GType.Int)).Min<object>()}}, + {"g_V_valuesXageX_isXtypeOfXGType_INTXX_maxX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Values<object>("age").Is(P.TypeOf(GType.Int)).Max<object>()}}, + {"g_V_valuesXageX_isXtypeOfXGType_INTXX_meanX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Values<object>("age").Is(P.TypeOf(GType.Int)).Mean<object>()}}, + {"g_V_valuesXageX_isXtypeOfXGType_INTXX_order_byXdescX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Values<object>("age").Is(P.TypeOf(GType.Int)).Order().By(Order.Desc)}}, + {"g_V_valuesXageX_isXtypeOfXGType_INTXX_groupCount", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Values<object>("age").Is(P.TypeOf(GType.Int)).GroupCount<object>()}}, + {"g_V_valuesXnameX_fold_isXtypeOfXGType_LISTXX_count", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Values<object>("name").Fold().Is(P.TypeOf(GType.List)).Count()}}, + {"g_V_valuesXageX_isXtypeOfXGType_LISTXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Values<object>("age").Is(P.TypeOf(GType.List))}}, + {"g_V_valuesXlistX_isXtypeOfXGType_LISTXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("list", new List<object> { "a", "b", "c" }), (g,p) =>g.V().Values<object>("list").Is(P.TypeOf(GType.List))}}, + {"g_V_hasXlist_typeOfXGType_LISTXX_valuesXnameX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("name", "test").Property("list", new List<object> { 1, 2, 3 }), (g,p) =>g.V().Has("list", P.TypeOf(GType.List)).Values<object>("name")}}, + {"g_V_valuesXlistX_isXtypeOfXGType_LISTXX_unfold", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("list", new List<object> { "x", "y", "z" }), (g,p) =>g.V().Values<object>("list").Is(P.TypeOf(GType.List)).Unfold<object>()}}, + {"g_V_valuesXlistX_isXtypeOfXGType_LISTXX_countXlocalX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("list", new List<object> { 1, 2, 3, 4, 5 }), (g,p) =>g.V().Values<object>("list").Is(P.TypeOf(GType.List)).Count(Scope.Local)}}, + {"g_V_valuesXlistX_isXtypeOfXGType_LISTXX_unfold_rangeX1_3X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("list", new List<object> { "first", "second", "third", "fourth" }), (g,p) =>g.V().Values<object>("list").Is(P.TypeOf(GType.List)).Unfold<object>().Range<object>(1, 3)}}, + {"g_V_valuesXlistX_isXtypeOfXGType_LISTXX_project_byXidentityX_byXcountXlocalX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("list", new List<object> { "apple", "banana" }), (g,p) =>g.V().Values<object>("list").Is(P.TypeOf(GType.List)).Project<object>("original", "size").By(__.Identity()).By(__.Count(Scope.Local))}}, + {"g_V_valuesXlistX_isXtypeOfXGType_LISTXX_whereXcountXlocalX_isXgtX2XXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("list", new List<object> { 1 }).AddV("data").Property("list", new List<object> { 1, 2, 3 }), (g,p) =>g.V().Values<object>("list").Is(P.TypeOf(GType.List)).Where(__.Count(Scope.Local).Is(P.Gt(2)))}}, + {"g_injectXlistX_isXtypeOfXGType_LISTXX_groupCount", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(new List<object> { "test" }).Is(P.TypeOf(GType.List)).GroupCount<object>()}}, + {"g_V_valuesXlongX_isXtypeOfXGType_LONGXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("long", 1l), (g,p) =>g.V().Values<object>("long").Is(P.TypeOf(GType.Long))}}, + {"g_V_hasXlong_typeOfXGType_LONGXX_valuesXnameX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("name", "test").Property("long", 1l), (g,p) =>g.V().Has("long", P.TypeOf(GType.Long)).Values<object>("name")}}, + {"g_V_valuesXlongX_isXtypeOfXGType_LONGXX_mathXmulX2XX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("long", 5l), (g,p) =>g.V().Values<object>("long").Is(P.TypeOf(GType.Long)).Math("_ * 2")}}, + {"g_V_valuesXlongX_isXtypeOfXGType_LONGXX_isXgtX5XX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("long", 10l), (g,p) =>g.V().Values<object>("long").Is(P.TypeOf(GType.Long)).Is(P.Gt(5l))}}, + {"g_V_valuesXlongX_isXtypeOfXGType_LONGXX_sumX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("long", 1l).AddV("data").Property("long", 2l).AddV("data").Property("long", 3l), (g,p) =>g.V().Values<object>("long").Is(P.TypeOf(GType.Long)).Sum<object>()}}, + {"g_V_valuesXlongX_isXtypeOfXGType_LONGXX_localXaggregateXaXX_capXaX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("long", 100l), (g,p) =>g.V().Values<object>("long").Is(P.TypeOf(GType.Long)).Local<object>(__.Aggregate("a")).Cap<object>("a")}}, + {"g_V_hasLabelXpersonX_valueMap_isXtypeOfXGType_MAPXX_count", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().HasLabel("person").ValueMap<object, object>().Is(P.TypeOf(GType.Map)).Count()}}, + {"g_V_groupCount_byXlabelX_isXtypeOfXGType_MAPX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().GroupCount<object>().By(T.Label).Is(P.TypeOf(GType.Map))}}, + {"g_V_valuesXageX_isXtypeOfXGType_MAPXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Values<object>("age").Is(P.TypeOf(GType.Map))}}, + {"g_V_valuesXmapX_isXtypeOfXGType_MAPXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("map", new Dictionary<object, object> {{ "key1", "1" }, { "key2", "2" }}), (g,p) =>g.V().Values<object>("map").Is(P.TypeOf(GType.Map))}}, + {"g_V_hasXmap_typeOfXGType_MAPXX_valuesXnameX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("name", "test").Property("map", new Dictionary<object, object> {{ "a", 1 }, { "b", 2 }}), (g,p) =>g.V().Has("map", P.TypeOf(GType.Map)).Values<object>("name")}}, + {"g_V_valuesXmapX_isXtypeOfXGType_MAPXX_countXlocalX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("map", new Dictionary<object, object> {{ "a", 1 }, { "b", 2 }, { "c", 3 }}), (g,p) =>g.V().Values<object>("map").Is(P.TypeOf(GType.Map)).Count(Scope.Local)}}, + {"g_V_valuesXmapX_isXtypeOfXGType_MAPXX_selectXvaluesX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("map", new Dictionary<object, object> {{ "city", "NYC" }, { "country", "USA" }}), (g,p) =>g.V().Values<object>("map").Is(P.TypeOf(GType.Map)).Select<object>(Column.Values)}}, + {"g_V_valuesXmapX_isXtypeOfXGType_MAPXX_whereX_countXlocalX_isXgtX1XXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("map", new Dictionary<object, object> {{ "single", "value" }}).AddV("data").Property("map", new Dictionary<object, object> {{ "key1", "1" }, { "key2", "2" }}), (g,p) =>g.V().Values<object>("map").Is(P.TypeOf(GType.Map)).Where(__.Count(Scope.Local).Is(P.Gt(1)))}}, + {"g_V_valuesXmapX_isXtypeOfXGType_MAPXX_foldX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("map", new Dictionary<object, object> {{ "a", 1 }}).AddV("data").Property("map", new Dictionary<object, object> {{ "b", 2 }, { "c", 3 }}), (g,p) =>g.V().Values<object>("map").Is(P.TypeOf(GType.Map)).Fold()}}, + {"g_V_valueXnameX_aggregateXxX_capXxX_isXtypeOfXGType_SETX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Values<object>("name").Aggregate("x").Cap<object>("x").Is(P.TypeOf(GType.Set))}}, + {"g_V_valuesXageX_isXtypeOfXGType_SETXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Values<object>("age").Is(P.TypeOf(GType.Set))}}, + {"g_V_valueMap_selectXkeysX_dedup_isXtypeOfXGType_SETXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().ValueMap<object, object>().Select<object>(Column.Keys).Dedup().Is(P.TypeOf(GType.Set))}}, + {"g_V_valuesXsetX_isXtypeOfXGType_SETXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("set", new HashSet<object> { "a", "b", "c" }), (g,p) =>g.V().Values<object>("set").Is(P.TypeOf(GType.Set))}}, + {"g_V_hasXset_typeOfXGType_SETXX_valuesXnameX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("name", "test").Property("set", new HashSet<object> { 1, 2, 3 }), (g,p) =>g.V().Has("set", P.TypeOf(GType.Set)).Values<object>("name")}}, + {"g_V_valuesXsetX_isXtypeOfXGType_SETXX_unfold", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("set", new HashSet<object> { "x", "y", "z" }), (g,p) =>g.V().Values<object>("set").Is(P.TypeOf(GType.Set)).Unfold<object>()}}, + {"g_V_valuesXsetX_isXtypeOfXGType_SETXX_countXlocalX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("set", new HashSet<object> { 1, 2, 3, 4, 5 }), (g,p) =>g.V().Values<object>("set").Is(P.TypeOf(GType.Set)).Count(Scope.Local)}}, + {"g_V_valuesXsetX_isXtypeOfXGType_SETXX_whereXcountXlocalX_isXeqX3XXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("set", new HashSet<object> { 1, 2 }).AddV("data").Property("set", new HashSet<object> { 1, 2, 3 }), (g,p) =>g.V().Values<object>("set").Is(P.TypeOf(GType.Set)).Where(__.Count(Scope.Local).Is(P.Eq(3)))}}, + {"g_V_valuesXsetX_isXtypeOfXGType_SETXX_unfold_limitX2X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("set", new HashSet<object> { "first", "second", "third", "fourth" }), (g,p) =>g.V().Values<object>("set").Is(P.TypeOf(GType.Set)).Unfold<object>().Limit<object>(2)}}, + {"g_injectXsetX_isXtypeOfXGType_SETXX_groupCount", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(new HashSet<object> { "test" }).Is(P.TypeOf(GType.Set)).GroupCount<object>()}}, + {"g_V_valuesXintX_asNumberXGType_SHORTX_isXtypeOfXGType_SHORTXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("int", 100), (g,p) =>g.V().Values<object>("int").AsNumber(GType.Short).Is(P.TypeOf(GType.Short))}}, + {"g_V_valuesXintX_asNumberXGType_SHORTX_isXtypeOfXGType_SHORTXX_mathXmulX10XX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("int", 50), (g,p) =>g.V().Values<object>("int").AsNumber(GType.Short).Is(P.TypeOf(GType.Short)).Math("_ * 10")}}, + {"g_V_valuesXintX_asNumberXGType_SHORTX_isXtypeOfXGType_SHORTXX_isXbetweenX20_30XX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("int", 25), (g,p) =>g.V().Values<object>("int").AsNumber(GType.Short).Is(P.TypeOf(GType.Short)).Is(P.Between(20, 30))}}, + {"g_V_valuesXintX_asNumberXGType_SHORTX_isXtypeOfXGType_SHORTXX_minX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("int", 10).AddV("data").Property("int", 20).AddV("data").Property("int", 30), (g,p) =>g.V().Values<object>("int").AsNumber(GType.Short).Is(P.TypeOf(GType.Short)).Min<object>()}}, + {"g_V_valuesXintX_asNumberXGType_SHORTX_isXtypeOfXGType_SHORTXX_maxX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("int", 15).AddV("data").Property("int", 25).AddV("data").Property("int", 35), (g,p) =>g.V().Values<object>("int").AsNumber(GType.Short).Is(P.TypeOf(GType.Short)).Max<object>()}}, + {"g_injectX42X_asNumberXGType_SHORTX_isXtypeOfXGType_SHORTXX_storeXaX_capXaX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(42).AsNumber(GType.Short).Is(P.TypeOf(GType.Short)).Store("a").Cap<object>("a")}}, + {"g_V_valuesXageX_isXtypeOfXGType_SHORTXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Values<object>("age").Is(P.TypeOf(GType.Short))}}, + {"g_V_valuesXuuidX_isXtypeOfXGType_UUIDXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("uuid", Guid.Parse("f47af10b-58cc-4372-a567-0f02b2f3d479")), (g,p) =>g.V().Values<object>("uuid").Is(P.TypeOf(GType.UUID))}}, + {"g_V_hasXuuid_typeOfXGType_UUIDXX_valuesXnameX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("name", "test").Property("uuid", Guid.Parse("f47af10b-58cc-4372-a567-0f02b2f3d479")), (g,p) =>g.V().Has("uuid", P.TypeOf(GType.UUID)).Values<object>("name")}}, + {"g_V_valuesXuuidX_isXtypeOfXGType_UUIDXX_project_byXidentityX_byXconstantXuuidXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("uuid", Guid.Parse("f47af10b-58cc-4372-a567-0f02b2f3d479")), (g,p) =>g.V().Values<object>("uuid").Is(P.TypeOf(GType.UUID)).Project<object>("original", "type").By(__.Identity()).By(__.Constant<object>("uuid"))}}, + {"g_V_valuesXuuidX_isXtypeOfXGType_UUIDXX_whereXisXeqXuuidXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("uuid", Guid.Parse("f47af10b-58cc-4372-a567-0f02b2f3d479")), (g,p) =>g.V().Values<object>("uuid").Is(P.TypeOf(GType.UUID)).Where(__.Is(P.Eq(Guid.Parse("f47af10b-58cc-4372-a567-0f02b2f3d479"))))}}, + {"g_V_valuesXuuidX_isXtypeOfXGType_UUIDXX_chooseXisXeqXuuidXX_constantXmatchX_constantXnoMatchXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("uuid", Guid.Parse("f47af10b-58cc-4372-a567-0f02b2f3d479")), (g,p) =>g.V().Values<object>("uuid").Is(P.TypeOf(GType.UUID)).Choose<object>(__.Is(P.Eq(Guid.Parse("f47af10b-58cc-4372-a567-0f02b2f3d479"))), __.Constant<object>("match"), __.Constant<object>("noMatch"))}}, + {"g_V_valuesXuuidX_isXtypeOfXGType_UUIDXX_localXaggregateXaXX_capXaX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("uuid", Guid.Parse("f47af10b-58cc-4372-a567-0f02b2f3d479")), (g,p) =>g.V().Values<object>("uuid").Is(P.TypeOf(GType.UUID)).Local<object>(__.Aggregate("a")).Cap<object>("a")}}, + {"g_V_valuesXuuidX_isXtypeOfXGType_UUIDXX_aggregateXaX_capXaX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("data").Property("uuid", Guid.Parse("f47af10b-58cc-4372-a567-0f02b2f3d479")), (g,p) =>g.V().Values<object>("uuid").Is(P.TypeOf(GType.UUID)).Aggregate("a").Cap<object>("a")}}, + {"g_injectXuuidX_isXtypeOfXGType_UUIDXX_groupCount", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(Guid.Parse("f47af10b-58cc-4372-a567-0f02b2f3d479")).Is(P.TypeOf(GType.UUID)).GroupCount<object>()}}, + {"g_injectXUUIDX47af10b_58cc_4372_a567_0f02b2f3d479XX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(Guid.Parse("f47af10b-58cc-4372-a567-0f02b2f3d479"))}}, + {"g_injectXUUIDXXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(Guid.NewGuid())}}, {"g_V_aggregateXxX_byXnameX_byXageX_capXxX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Aggregate("x").By("name").By("age").Cap<object>("x")}}, {"g_V_aggregateXScope_local_xX_byXnameX_byXageX_capXxX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Aggregate(Scope.Local, "x").By("name").By("age").Cap<object>("x")}}, {"g_V_valuesXageX_allXgtX32XX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Values<object>("age").All(P.Gt(32))}}, diff --cc gremlin-javascript/src/main/javascript/gremlin-javascript/lib/process/traversal.ts index 299c930ee0,11bd6ea406..5ab11721d0 --- a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/process/traversal.ts +++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/process/traversal.ts @@@ -347,8 -345,13 +347,13 @@@ export class P<T1 = any, T2 = any> return createP('outside', args); } + /** @param {...Object} args */ - static typeOf(...args) { ++ static typeOf(...args: any[]) { + return createP('typeOf', args); + } + /** @param {...Object} args */ - static test(...args) { + static test(...args: any[]) { return createP('test', args); } } @@@ -491,29 -492,50 +496,38 @@@ function toDirectionEnum(typeName: stri return result; } -function toGTypeEnum(typeName, keys) { - const result = {}; ++function toGTypeEnum(typeName: string, keys: string) { ++ const result: { [key: string]: any } = {}; + keys.split(' ').forEach((k) => { + result[k] = new EnumValue(typeName, k.toUpperCase()); + }); + return result; + } + -class EnumValue { - constructor(typeName, elementName) { - this.typeName = typeName; - this.elementName = elementName; - } +export class EnumValue { + constructor( + public typeName: string, + public elementName: string, + ) {} toString() { return this.elementName; } } -module.exports = { - EnumValue, - P, - TextP, - withOptions, - IO, - Traversal, - TraversalSideEffects, - Traverser, - barrier: toEnum('Barrier', 'normSack'), - cardinality: toEnum('Cardinality', 'list set single'), - column: toEnum('Column', 'keys values'), - direction: toDirectionEnum('Direction', 'BOTH IN OUT from_ to'), - dt: toEnum('DT', 'second minute hour day'), - gType: toGTypeEnum( - 'GType', - 'bigDecimal bigInt binary boolean byte char datetime double duration edge float graph int list long map null number path property set short string tree uuid vertex vproperty', - ), - graphSONVersion: toEnum('GraphSONVersion', 'V1_0 V2_0 V3_0'), - gryoVersion: toEnum('GryoVersion', 'V1_0 V3_0'), - merge: toEnum('Merge', 'onCreate onMatch outV inV'), - operator: toEnum('Operator', 'addAll and assign div max min minus mult or sum sumLong'), - order: toEnum('Order', 'asc desc shuffle'), - pick: toEnum('Pick', 'any none unproductive'), - pop: toEnum('Pop', 'all first last mixed'), - scope: toEnum('Scope', 'global local'), - t: toEnum('T', 'id key label value'), -}; +export const barrier = toEnum('Barrier', 'normSack'); +export const cardinality = toEnum('Cardinality', 'list set single'); +export const column = toEnum('Column', 'keys values'); +export const direction = toDirectionEnum('Direction', 'BOTH IN OUT from_ to'); +export const dt = toEnum('DT', 'second minute hour day'); ++export const gType = toGTypeEnum('GType', 'bigDecimal bigInt binary boolean byte char datetime double duration edge float graph int list long map null number path property set short string tree uuid vertex vproperty'); +export const graphSONVersion = toEnum('GraphSONVersion', 'V1_0 V2_0 V3_0'); +export const gryoVersion = toEnum('GryoVersion', 'V1_0 V3_0'); +export const merge = toEnum('Merge', 'onCreate onMatch outV inV'); +export const operator = toEnum('Operator', 'addAll and assign div max min minus mult or sum sumLong'); +export const order = toEnum('Order', 'asc desc shuffle'); +export const pick = toEnum('Pick', 'any none unproductive'); +export const pop = toEnum('Pop', 'all first last mixed'); +export const scope = toEnum('Scope', 'global local'); +export const t = toEnum('T', 'id key label value'); +export const n = toEnum('N', 'byte_ short_ int_ long_ float_ double_ bigInt bigDecimal'); diff --cc gremlin-javascript/src/main/javascript/gremlin-javascript/lib/structure/io/binary/internals/EnumSerializer.js index 43b4b50f84,ab36841ec6..809cbe0e68 --- a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/structure/io/binary/internals/EnumSerializer.js +++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/structure/io/binary/internals/EnumSerializer.js @@@ -52,19 -38,19 +52,19 @@@ export default class EnumSerializer }; const DT = ioc.DataType; this.types = [ - { name: 'Barrier', code: DT.BARRIER, enum: to_orig_enum(t.barrier) }, - { name: 'Cardinality', code: DT.CARDINALITY, enum: to_orig_enum(t.cardinality) }, - { name: 'Column', code: DT.COLUMN, enum: to_orig_enum(t.column) }, - { name: 'Direction', code: DT.DIRECTION, enum: to_orig_enum(t.direction) }, - { name: 'DT', code: DT.DT, enum: to_orig_enum(t.dt) }, - { name: 'GType', code: DT.GTYPE, enum: to_orig_enum(t.gType) }, - { name: 'Merge', code: DT.MERGE, enum: to_orig_enum(t.merge) }, - { name: 'Operator', code: DT.OPERATOR, enum: to_orig_enum(t.operator) }, - { name: 'Order', code: DT.ORDER, enum: to_orig_enum(t.order) }, - { name: 'Pick', code: DT.PICK, enum: to_orig_enum(t.pick) }, - { name: 'Pop', code: DT.POP, enum: to_orig_enum(t.pop) }, - { name: 'Scope', code: DT.SCOPE, enum: to_orig_enum(t.scope) }, - { name: 'T', code: DT.T, enum: to_orig_enum(t.t) }, + { name: 'Barrier', code: DT.BARRIER, enum: to_orig_enum(barrier) }, + { name: 'Cardinality', code: DT.CARDINALITY, enum: to_orig_enum(cardinality) }, + { name: 'Column', code: DT.COLUMN, enum: to_orig_enum(column) }, + { name: 'Direction', code: DT.DIRECTION, enum: to_orig_enum(direction) }, + { name: 'DT', code: DT.DT, enum: to_orig_enum(dt) }, ++ { name: 'GType', code: DT.GTYPE, enum: to_orig_enum(gType) }, + { name: 'Merge', code: DT.MERGE, enum: to_orig_enum(merge) }, + { name: 'Operator', code: DT.OPERATOR, enum: to_orig_enum(operator) }, + { name: 'Order', code: DT.ORDER, enum: to_orig_enum(order) }, + { name: 'Pick', code: DT.PICK, enum: to_orig_enum(pick) }, + { name: 'Pop', code: DT.POP, enum: to_orig_enum(pop) }, + { name: 'Scope', code: DT.SCOPE, enum: to_orig_enum(scope) }, + { name: 'T', code: DT.T, enum: to_orig_enum(_t) }, - { name: 'N', code: DT.N, enum: to_orig_enum(_n) }, ]; this.byname = {}; this.bycode = {}; diff --cc gremlin-javascript/src/main/javascript/gremlin-javascript/package.json index 7abc1072bf,f3a22a6220..dad0edc45b --- a/gremlin-javascript/src/main/javascript/gremlin-javascript/package.json +++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/package.json @@@ -64,20 -48,18 +64,20 @@@ "url": "https://issues.apache.org/jira/browse/TINKERPOP" }, "scripts": { + "build": "rm -rf build && duel --dirs", + "prepare": "npm run build", "test": "npm run unit-test && npm run integration-test", - "unit-test": "mocha test/unit/*", + "unit-test": "cross-env TS_NODE_PROJECT='tsconfig.test.json' mocha test/unit/*", "integration-test": "npm run integration-test-graphson30 && npm run integration-test-graphbinary", - "integration-test-graphson30": "cross-env CLIENT_MIMETYPE='application/vnd.gremlin-v3.0+json' ./node_modules/mocha/bin/mocha.js test/integration -t 5000", - "integration-test-graphbinary": "cross-env CLIENT_MIMETYPE='application/vnd.graphbinary-v1.0' ./node_modules/mocha/bin/mocha.js test/integration -t 5000", + "integration-test-graphson30": "cross-env TS_NODE_PROJECT='tsconfig.test.json' CLIENT_MIMETYPE='application/vnd.gremlin-v3.0+json' ./node_modules/mocha/bin/mocha.js test/integration -t 5000", + "integration-test-graphbinary": "cross-env TS_NODE_PROJECT='tsconfig.test.json' CLIENT_MIMETYPE='application/vnd.graphbinary-v1.0' ./node_modules/mocha/bin/mocha.js test/integration -t 5000", "TODO": "# test other mime types like graphbinary stringd", "features": "npm run features-graphson30 && npm run features-graphbinary", - "features-graphson30": "cross-env NODE_OPTIONS='--loader ts-node/esm' TS_NODE_PROJECT='tsconfig.test.json' CLIENT_MIMETYPE='application/vnd.gremlin-v3.0+json' cucumber-js --import test/cucumber ../../../../../gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/", - "features-graphbinary": "cross-env NODE_OPTIONS='--loader ts-node/esm' TS_NODE_PROJECT='tsconfig.test.json' CLIENT_MIMETYPE='application/vnd.graphbinary-v1.0' cucumber-js --import test/cucumber ../../../../../gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/", - "features-graphson30": "cross-env CLIENT_MIMETYPE='application/vnd.gremlin-v3.0+json' cucumber-js --tags \"not @DataUUID and not @DataLong\" --require test/cucumber ../../../../../gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/", - "features-graphbinary": "cross-env CLIENT_MIMETYPE='application/vnd.graphbinary-v1.0' cucumber-js --tags \"not @DataBigDecimal and not @DataBigInt and not @DataUUID and not @DataLong\" --require test/cucumber ../../../../../gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/", ++ "features-graphson30": "cross-env NODE_OPTIONS='--loader ts-node/esm' TS_NODE_PROJECT='tsconfig.test.json' CLIENT_MIMETYPE='application/vnd.gremlin-v3.0+json' cucumber-js --tags \"not @DataUUID and not @DataLong\" --import test/cucumber ../../../../../gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/", ++ "features-graphbinary": "cross-env NODE_OPTIONS='--loader ts-node/esm' TS_NODE_PROJECT='tsconfig.test.json' CLIENT_MIMETYPE='application/vnd.graphbinary-v1.0' cucumber-js --tags \"not @DataBigDecimal and not @DataBigInt and not @DataUUID and not @DataLong\" --import test/cucumber ../../../../../gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/", "features-docker": "npm run features-graphson30-docker && npm run features-graphbinary-docker", - "features-graphson30-docker": "cross-env NODE_OPTIONS='--loader ts-node/esm' TS_NODE_PROJECT='tsconfig.test.json' CLIENT_MIMETYPE='application/vnd.gremlin-v3.0+json' cucumber-js --import test/cucumber ../gremlin-test/", - "features-graphbinary-docker": "cross-env NODE_OPTIONS='--loader ts-node/esm' TS_NODE_PROJECT='tsconfig.test.json' CLIENT_MIMETYPE='application/vnd.graphbinary-v1.0' cucumber-js --import test/cucumber ../gremlin-test/", - "features-graphson30-docker": "cross-env CLIENT_MIMETYPE='application/vnd.gremlin-v3.0+json' cucumber-js --tags \"not @DataUUID and not @DataLong\" --require test/cucumber ../gremlin-test/", - "features-graphbinary-docker": "cross-env CLIENT_MIMETYPE='application/vnd.graphbinary-v1.0' cucumber-js --tags \"not @DataBigDecimal and not @DataBigInt and not @DataUUID and not @DataLong\" --require test/cucumber ../gremlin-test/", ++ "features-graphson30-docker": "cross-env NODE_OPTIONS='--loader ts-node/esm' TS_NODE_PROJECT='tsconfig.test.json' CLIENT_MIMETYPE='application/vnd.gremlin-v3.0+json' cucumber-js --tags \"not @DataUUID and not @DataLong\" --import test/cucumber ../gremlin-test/", ++ "features-graphbinary-docker": "cross-env NODE_OPTIONS='--loader ts-node/esm' TS_NODE_PROJECT='tsconfig.test.json' CLIENT_MIMETYPE='application/vnd.graphbinary-v1.0' cucumber-js --tags \"not @DataBigDecimal and not @DataBigInt and not @DataUUID and not @DataLong\" --import test/cucumber ../gremlin-test/", "lint": "eslint --ext .js ." }, "engines": { diff --cc gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/gremlin.js index 34f9017f3d,6df14113d7..74f355386d --- a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/gremlin.js +++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/gremlin.js @@@ -1889,8 -2036,6 +2038,6 @@@ const gremlins = g_VX1X_out_out_out_tree: [function({g}) { return g.V().out().out().out().tree() }], g_VX1X_outE_inV_bothE_otherV_tree: [function({g, vid1}) { return g.V(vid1).outE().inV().bothE().otherV().tree() }], g_VX1X_outE_inV_bothE_otherV_tree_byXnameX_byXlabelX: [function({g, vid1}) { return g.V(vid1).outE().inV().bothE().otherV().tree().by("name").by(T.label) }], - g_injectXUUIDX47af10b_58cc_4372_a567_0f02b2f3d479XX: [function({g}) { return g.inject("f47af10b-58cc-4372-a567-0f02b2f3d479") }], - g_injectXUUIDXXX: [function({g}) { return g.inject(uuid.v4()) }], } -exports.gremlin = gremlins +export const gremlin = gremlins diff --cc gremlin-javascript/src/main/javascript/gremlin-javascript/test/unit/graphbinary/AnySerializer-test.js index 24bcae2ed5,f3e77bff02..bcd323ac96 --- 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 @@@ -157,27 -158,27 +157,27 @@@ describe('GraphBinary.AnySerializer', ( }, // EnumSerializer (actually represents different enum like types) - { v: new t.EnumValue('Barrier', 'normSack'), + { v: new EnumValue('Barrier', 'normSack'), b: [ DataType.BARRIER,0x00, DataType.STRING,0x00, 0x00,0x00,0x00,0x08, ...from('normSack') ] }, - { v: new t.EnumValue('Cardinality', 'single'), + { v: new EnumValue('Cardinality', 'single'), b: [ DataType.CARDINALITY,0x00, DataType.STRING,0x00, 0x00,0x00,0x00,0x06, ...from('single') ] }, - { v: new t.EnumValue('Column', 'keys'), + { v: new EnumValue('Column', 'keys'), b: [ DataType.COLUMN,0x00, DataType.STRING,0x00, 0x00,0x00,0x00,0x04, ...from('keys') ] }, - { v: new t.EnumValue('Direction', 'OUT'), + { v: new EnumValue('Direction', 'OUT'), b: [ DataType.DIRECTION,0x00, DataType.STRING,0x00, 0x00,0x00,0x00,0x03, ...from('OUT') ] }, - { v: new t.EnumValue('DT', 'minute'), + { v: new EnumValue('DT', 'minute'), b: [ DataType.DT,0x00, DataType.STRING,0x00, 0x00,0x00,0x00,0x06, ...from('minute') ] }, - { v: new t.EnumValue('GType', 'BYTE'), - b: [ DataType.GTYPE,0x00, DataType.STRING,0x00, 0x00,0x00,0x00,0x04, ...from('BYTE') ] - }, - { v: new t.EnumValue('Merge', 'onMatch'), + { v: new EnumValue('Merge', 'onMatch'), b: [ DataType.MERGE,0x00, DataType.STRING,0x00, 0x00,0x00,0x00,0x07, ...from('onMatch') ] }, - { v: new t.EnumValue('N', 'byte'), - b: [ DataType.N,0x00, DataType.STRING,0x00, 0x00,0x00,0x00,0x04, ...from('byte') ] ++ { v: new EnumValue('GType', 'BYTE'), ++ b: [ DataType.GTYPE,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') ] }, @@@ -513,19 -514,19 +513,19 @@@ // DT { v:null, b:[0x2f,0x01] }, - { v:new t.EnumValue('DT','minute'), b:[0x2f,0x00, 0x03,0x00, 0x00,0x00,0x00,0x06, ...from('minute')] }, + { v:new EnumValue('DT','minute'), b:[0x2f,0x00, 0x03,0x00, 0x00,0x00,0x00,0x06, ...from('minute')] }, + // GType + { v:null, b:[0x30,0x01] }, - { v:new t.EnumValue('GType','BYTE'), b:[0x30,0x00, 0x03,0x00, 0x00,0x00,0x00,0x04, ...from('BYTE')] }, ++ { v:new EnumValue('GType','BYTE'), b:[0x30,0x00, 0x03,0x00, 0x00,0x00,0x00,0x04, ...from('BYTE')] }, + // MERGE { v:null, b:[0x2e,0x01] }, - { v:new t.EnumValue('Merge','onCreate'), b:[0x2e,0x00, 0x03,0x00, 0x00,0x00,0x00,0x08, ...from('onCreate')] }, + { v:new EnumValue('Merge','onCreate'), b:[0x2e,0x00, 0x03,0x00, 0x00,0x00,0x00,0x08, ...from('onCreate')] }, - // N - { v:null, b:[0x30,0x01] }, - { v:new t.EnumValue('N','byte'), b:[0x30,0x00, 0x03,0x00, 0x00,0x00,0x00,0x04, ...from('byte')] }, - // OPERATOR { v:null, b:[0x19,0x01] }, - { v:new t.EnumValue('Operator','addAll'), b:[0x19,0x00, 0x03,0x00, 0x00,0x00,0x00,0x06, ...from('addAll')] }, + { v:new EnumValue('Operator','addAll'), b:[0x19,0x00, 0x03,0x00, 0x00,0x00,0x00,0x06, ...from('addAll')] }, // ORDER { v:null, b:[0x1A,0x01] }, diff --cc gremlin-python/docker-compose.yml index 7c367138eb,8b6117a168..28bb770e89 --- a/gremlin-python/docker-compose.yml +++ b/gremlin-python/docker-compose.yml @@@ -47,24 -50,29 +47,24 @@@ services volumes: - ${BUILD_DIR:-./src/main/python}:/python_app - ../gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features:/python_app/gremlin-test/features + - ../gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary:/python_app/gremlin-test/graphbinary + - ../gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson:/python_app/gremlin-test/graphson - ../docker/gremlin-test-server:/python_app/gremlin-test-server - - ../gremlin-tools/gremlin-socket-server/conf:/python_app/gremlin-socket-server/conf/ - environment: - DEBIAN_FRONTEND=noninteractive - - KRB5_CONFIG=./gremlin-test-server/krb5.conf - - KRB5CCNAME=./test-tkt.cc - - GREMLIN_SERVER_URL=ws://gremlin-server-test-python:{}/gremlin - - GREMLIN_SERVER_BASIC_AUTH_URL=wss://gremlin-server-test-python:{}/gremlin - - GREMLIN_SERVER_URL_HTTP=http://gremlin-server-test-python:{}/ - - GREMLIN_SERVER_BASIC_AUTH_URL_HTTP=https://gremlin-server-test-python:{}/ - - KRB_HOSTNAME=${KRB_HOSTNAME:-gremlin-server-test} - - GREMLIN_SOCKET_SERVER_URL=ws://gremlin-socket-server-python:{}/gremlin - - GREMLIN_SOCKET_SERVER_CONFIG_PATH=/python_app/gremlin-socket-server/conf/test-ws-gremlin.yaml + - GREMLIN_SERVER_URL=http://gremlin-server-test-python:{}/gremlin + - GREMLIN_SERVER_BASIC_AUTH_URL=https://gremlin-server-test-python:{}/gremlin + - IO_TEST_DIRECTORY=/python_app/gremlin-test/graphbinary/ + - IO_TEST_DIRECTORY_GRAPHSON=/python_app/gremlin-test/graphson/ working_dir: /python_app command: > - bash -c "apt-get update && apt-get -y install libkrb5-dev krb5-user - && echo 'password' | kinit stephen - && klist - && pip install .[test,kerberos] + bash -c "pip install .[test,kerberos] && pytest - && radish -f dots -e -t -b ./radish ./gremlin-test --user-data='serializer=application/vnd.graphbinary-v4.0' --user-data='bulked=true' - && radish -f dots -e -t -b ./radish ./gremlin-test --user-data='serializer=application/vnd.graphbinary-v4.0' --user-data='parameterize=true' - && radish -f dots -e -t -b ./radish ./gremlin-test --user-data='serializer=application/vnd.graphbinary-v4.0' - && radish -f dots -e -t -b ./radish ./gremlin-test --user-data='serializer=application/vnd.gremlin-v4.0+json' --user-data='parameterize=true' - && radish -f dots -e -t -b ./radish ./gremlin-test --user-data='serializer=application/vnd.gremlin-v4.0+json'; - && radish -f dots -e -t -b ./radish ./gremlin-test --tags='not DataBigDecimal' --user-data='serializer=application/vnd.gremlin-v3.0+json' - && radish -f dots -e -t -b ./radish ./gremlin-test --tags='not DataBigDecimal' --user-data='serializer=application/vnd.graphbinary-v1.0'; ++ && radish -f dots -e -t -b ./radish ./gremlin-test --tags='not DataBigDecimal' --user-data='serializer=application/vnd.graphbinary-v4.0' --user-data='bulked=true' ++ && radish -f dots -e -t -b ./radish ./gremlin-test --tags='not DataBigDecimal' --user-data='serializer=application/vnd.graphbinary-v4.0' --user-data='parameterize=true' ++ && radish -f dots -e -t -b ./radish ./gremlin-test --tags='not DataBigDecimal' --user-data='serializer=application/vnd.graphbinary-v4.0' ++ && radish -f dots -e -t -b ./radish ./gremlin-test --tags='not DataBigDecimal' --user-data='serializer=application/vnd.gremlin-v4.0+json' --user-data='parameterize=true' ++ && radish -f dots -e -t -b ./radish ./gremlin-test --tags='not DataBigDecimal' --user-data='serializer=application/vnd.gremlin-v4.0+json'; EXIT_CODE=$$?; chown -R `stat -c "%u:%g" .` .; exit $$EXIT_CODE" depends_on: gremlin-server-test-python: diff --cc gremlin-python/src/main/python/gremlin_python/structure/io/graphbinaryV4.py index dda7c0845d,4bfa71e43a..50a5c24a3f --- a/gremlin-python/src/main/python/gremlin_python/structure/io/graphbinaryV4.py +++ b/gremlin-python/src/main/python/gremlin_python/structure/io/graphbinaryV4.py @@@ -16,22 -16,29 +16,22 @@@ KIND, either express or implied. See t specific language governing permissions and limitations under the License. """ - -import datetime import calendar -import uuid -import math import io +import logging +import math import struct +import uuid from collections import OrderedDict -import logging - +from datetime import datetime, timedelta, timezone from struct import pack, unpack + from aenum import Enum - from gremlin_python.process.traversal import Direction, T, Merge, N -from datetime import timedelta -from gremlin_python import statics -from gremlin_python.statics import FloatType, BigDecimal, FunctionType, ShortType, IntType, LongType, BigIntType, \ - TypeType, DictType, ListType, SetType, SingleByte, ByteBufferType, GremlinType, \ - SingleChar -from gremlin_python.process.traversal import Barrier, Binding, Bytecode, Cardinality, Column, Direction, DT, GType, \ - Merge,Operator, Order, Pick, Pop, P, Scope, TextP, Traversal, Traverser, \ - TraversalStrategy, T -from gremlin_python.process.graph_traversal import GraphTraversal ++from gremlin_python.process.traversal import Direction, T, Merge, GType +from gremlin_python.statics import FloatType, BigDecimal, ShortType, IntType, LongType, BigIntType, \ + DictType, SetType, SingleByte, SingleChar from gremlin_python.structure.graph import Graph, Edge, Property, Vertex, VertexProperty, Path -from gremlin_python.structure.io.util import HashableDict, SymbolUtil +from gremlin_python.structure.io.util import HashableDict, SymbolUtil, Marker log = logging.getLogger(__name__) @@@ -66,14 -87,33 +66,14 @@@ class DataType(Enum) bigdecimal = 0x22 biginteger = 0x23 byte = 0x24 - bytebuffer = 0x25 + binary = 0x25 short = 0x26 boolean = 0x27 - textp = 0x28 - traversalstrategy = 0x29 - bulkset = 0x2a tree = 0x2b # not supported - no tree object in Python yet - n = 0x30 - metrics = 0x2c - traversalmetrics = 0x2d - merge = 0x2e - dt = 0x2f + gtype = 0x30 char = 0x80 duration = 0x81 - inetaddress = 0x82 # todo - instant = 0x83 # todo - localdate = 0x84 # todo - localdatetime = 0x85 # todo - localtime = 0x86 # todo - monthday = 0x87 # todo - offsetdatetime = 0x88 - offsettime = 0x89 # todo - period = 0x8a # todo - year = 0x8b # todo - yearmonth = 0x8c # todo - zonedatetime = 0x8d # todo - zoneoffset = 0x8e # todo + marker = 0xfd custom = 0x00 # todo @@@ -747,11 -978,43 +747,11 @@@ class MergeIO(_EnumIO) python_type = Merge - class NIO(_EnumIO): - graphbinary_type = DataType.n - python_type = N -class ScopeIO(_EnumIO): - graphbinary_type = DataType.scope - python_type = Scope - - -class TIO(_EnumIO): - graphbinary_type = DataType.t - python_type = T - - + class GTYPEIO(_EnumIO): + graphbinary_type = DataType.gtype + python_type = GType -class TraverserIO(_GraphBinaryTypeIO): - graphbinary_type = DataType.traverser - python_type = Traverser - - @classmethod - def dictify(cls, obj, writer, to_extend, as_value=False, nullable=True): - cls.prefix_bytes(cls.graphbinary_type, as_value, nullable, to_extend) - to_extend.extend(int64_pack(obj.bulk)) - writer.to_dict(obj.object, to_extend) - return to_extend - - @classmethod - def objectify(cls, buff, reader, nullable=True): - return cls.is_null(buff, reader, cls._read_traverser, nullable) - - @classmethod - def _read_traverser(cls, b, r): - bulk = int64_unpack(b.read(8)) - obj = r.read_object(b) - return Traverser(obj, bulk=bulk) - - class ByteIO(_GraphBinaryTypeIO): python_type = SingleByte graphbinary_type = DataType.byte diff --cc gremlin-python/src/main/python/tests/driver/test_driver_remote_connection.py index ef59ffd6f6,90250c3837..27cc98f574 --- 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 @@@ -18,12 -18,15 +18,13 @@@ # import os +import pytest + from gremlin_python import statics + from gremlin_python.driver import serializer from gremlin_python.driver.driver_remote_connection import DriverRemoteConnection -from gremlin_python.driver.protocol import GremlinServerError -from gremlin_python.statics import long, bigint -from gremlin_python.process.traversal import Traverser, Operator, Barrier -from gremlin_python.process.traversal import TraversalStrategy -from gremlin_python.process.traversal import Bindings -from gremlin_python.process.traversal import P, Order, T +from gremlin_python.statics import long +from gremlin_python.process.traversal import TraversalStrategy, P, Order, T, DT, GValue, Cardinality from gremlin_python.process.graph_traversal import __ from gremlin_python.process.anonymous_traversal import traversal from gremlin_python.structure.graph import Vertex diff --cc neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/Neo4jGraphFeatureTest.java index e03987a1d3,c88dd84ee2..aff9188e42 --- a/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/Neo4jGraphFeatureTest.java +++ b/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/Neo4jGraphFeatureTest.java @@@ -50,7 -50,8 +50,8 @@@ import static org.apache.tinkerpop.grem @RunWith(Cucumber.class) @CucumberOptions( - tags = "not @MultiProperties and not @MetaProperties and not @GraphComputerOnly and " + + tags = "not @MultiProperties and not @MetaProperties and not @GraphComputerOnly and not @StepHasId and " + + "not @DataDateTime and not @DataList and not @DataMap and not @DataSet and not @DataUUID and " + "not @AllowNullPropertyValues and not @UserSuppliedVertexPropertyIds and not @UserSuppliedEdgeIds and " + "not @UserSuppliedVertexIds and not @TinkerServiceRegistry and not @InsertionOrderingRequired and not @StepHasId", //TODO:: can we include hasId? glue = { "org.apache.tinkerpop.gremlin.features" }, diff --cc tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java index c086813b7c,1d5436ea28..837994a574 --- a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java +++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java @@@ -18,12 -18,9 +18,13 @@@ */ package org.apache.tinkerpop.gremlin.tinkergraph.structure; +import org.apache.tinkerpop.gremlin.jsr223.GremlinLangScriptEngine; +import org.apache.tinkerpop.gremlin.jsr223.VariableResolverCustomizer; +import org.apache.tinkerpop.gremlin.language.grammar.VariableResolver; import org.apache.tinkerpop.gremlin.process.computer.Computer; + import org.apache.tinkerpop.gremlin.process.traversal.GType; import org.apache.tinkerpop.gremlin.process.traversal.P; +import org.apache.tinkerpop.gremlin.process.traversal.Scope; import org.apache.tinkerpop.gremlin.process.traversal.Traversal; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
