[ 
https://issues.apache.org/jira/browse/TINKERPOP-2959?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17901815#comment-17901815
 ] 

ASF GitHub Bot commented on TINKERPOP-2959:
-------------------------------------------

andreachild commented on code in PR #2919:
URL: https://github.com/apache/tinkerpop/pull/2919#discussion_r1862771631


##########
gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/GValue.java:
##########
@@ -0,0 +1,446 @@
+/*
+ * 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.step;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Element;
+import org.apache.tinkerpop.gremlin.structure.Property;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Stream;
+
+/**
+ * A {@code GValue} is a variable or literal value that is used in a {@link 
Traversal}. It is composed of a key-value
+ * pair where the key is the name given to the variable and the value is the 
object that the variable resolved to. If
+ * the name is not given, the value was provided literally in the traversal. 
The value of the variable can be any
+ * object. The {@code GValue} also includes the {@link GType} that describes 
the type it contains.
+ */
+public class GValue<V> implements Cloneable, Serializable {
+    private final String name;
+    private final GType type;
+
+    private final V value;
+
+    private GValue(final GType type, final V value) {
+        this(null, type, value);
+    }
+
+    private GValue(final String name, final GType type, final V value) {
+        if (name != null && name.startsWith("_")) {
+            throw new IllegalArgumentException(String.format("Invalid GValue 
name [%s]. Should not start with _.", name));
+        }
+        this.name = name;
+        this.type = type;
+        this.value = value;
+    }
+
+    /**
+     * Determines if the value held by this object was defined as a variable 
or a literal value. Literal values simply
+     * have no name.
+     */
+    public boolean isVariable() {
+        return this.name != null;
+    }
+
+    /**
+     * Gets the name of the variable if it was defined as such and returns 
empty if the value was a literal.
+     */
+    public String getName() {
+        return this.name;
+    }
+
+    /**
+     * Gets the type of the value. The explicit type could be determined with 
{@code instanceof} on the value, but this
+     * might be helpful for cases where the value was constructed with a 
{@code null} value which might just return as
+     * {@code Object}.
+     */
+    public GType getType() {
+        return this.type;
+    }
+
+    /**
+     * Determines if the value held is of a {@code null} value.
+     */
+    public boolean isNull() {
+        return this.value == null;
+    }
+
+    /**
+     * Gets the value.
+     */
+    public V get() {
+        return this.value;
+    }
+
+    @Override
+    public String toString() {
+        return isVariable() ?
+                String.format("%s&%s", name, value) : Objects.toString(value);
+    }
+
+    @Override
+    public boolean equals(final Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        final GValue<?> gValue = (GValue<?>) o;
+        return Objects.equals(name, gValue.name) && type == gValue.type && 
Objects.equals(value, gValue.value);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(name, type, value);
+    }
+
+    /**
+     * Create a new {@code Var} from a particular value but without the 
specified name. If the argument provide is
+     * already a {@code GValue} then it is returned as-is.
+     *
+     * @param value the value of the variable
+     */
+    static <V> GValue<V> of(final V value) {
+        if (value instanceof GValue) return (GValue) value;
+        return new GValue<>(GType.getType(value), value);
+    }
+
+    /**
+     * Create a new {@code Var} with the specified name and value.. If the 
argument provide is  already a
+     * {@code GValue} then it is returned as-is.
+     *
+     * @param name the name of the variable
+     * @param value the value of the variable
+     */
+    public static <V> GValue<V> of(final String name, final V value) {
+        if (value instanceof GValue) throw new IllegalArgumentException("value 
cannot be a GValue");

Review Comment:
   This logic contradicts the javadoc and is also inconsistent with `static <V> 
GValue<V> of(final V value)`.





> Allow the grammar to support parameters
> ---------------------------------------
>
>                 Key: TINKERPOP-2959
>                 URL: https://issues.apache.org/jira/browse/TINKERPOP-2959
>             Project: TinkerPop
>          Issue Type: Improvement
>          Components: language
>    Affects Versions: 3.6.4
>            Reporter: Stephen Mallette
>            Assignee: Stephen Mallette
>            Priority: Major
>             Fix For: 3.7.0
>
>
> Allow the grammar to support parameters similar to how the groovy engine does 
> like, {{g.inject(x,y,z)}}. Doing this will make it easier for a transition 
> away from the groovy engine as a lot of Gremlin in the world today uses 
> parameters. The grammar may have to come with some limitations though as 
> groovy is wide open in terms of what can be treated as a variable. Probably 
> going to keep parameters tied to primitives, collections and tokens/enums 
> like {{Order}} and {{Scope}}. Collections themselves will not contain 
> parameters and things like a {{Traversal}} or {{P}} cannot be treated as one.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to