This is an automated email from the ASF dual-hosted git repository.

valentyn pushed a commit to branch valentyn/bytecode-poc
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git


The following commit(s) were added to refs/heads/valentyn/bytecode-poc by this 
push:
     new 67ba850d08 basic tests
67ba850d08 is described below

commit 67ba850d08a8680f8eef4eb51358bcdd6971e9b9
Author: Valentyn Kahamlyk <[email protected]>
AuthorDate: Tue May 28 13:43:23 2024 -0700

    basic tests
---
 .../gremlin/process/traversal/Bytecode.java        | 15 ++++---
 .../gremlin/process/traversal/BytecodeV4test.java  | 46 +++++++++++++++++++---
 .../handler/HttpGremlinResponseStreamDecoder.java  |  2 +-
 .../driver/remote/DriverRemoteConnection.java      |  6 ++-
 .../driver/remote/DriverRemoteTraversal.java       |  4 +-
 .../gremlin/server/HttpDriverIntegrateTest.java    | 16 +++++++-
 .../gremlin/util/message/RequestMessageV4.java     |  6 +++
 7 files changed, 81 insertions(+), 14 deletions(-)

diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Bytecode.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Bytecode.java
index 37535765df..08493a63cd 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Bytecode.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Bytecode.java
@@ -22,6 +22,7 @@ package org.apache.tinkerpop.gremlin.process.traversal;
 import 
org.apache.tinkerpop.gremlin.process.traversal.strategy.TraversalStrategyProxy;
 import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
 import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
+import org.javatuples.Pair;
 
 import java.io.Serializable;
 import java.util.ArrayList;
@@ -55,6 +56,8 @@ public class Bytecode implements Cloneable, Serializable {
     private List<Instruction> stepInstructions = new ArrayList<>();
 
     private final StringBuilder gremlin = new StringBuilder();
+    private final Map<String, Object> parameters = new HashMap<>();
+    private int paramCount = 0;
 
     public Bytecode() {}
 
@@ -79,15 +82,17 @@ public class Bytecode implements Cloneable, Serializable {
 
     private String argAsString(final Object arg) {
         if (arg instanceof String)
-            return "\"" + arg + "\"";
+            return "\"" + arg + "\""; // todo: escaping
         if (arg instanceof Integer)
             return arg.toString();
 
-        return null;
+        final String paramName = "_" + paramCount++;
+        parameters.put(paramName, arg);
+        return paramName;
     }
 
-    public String getGremlin(final String g) {
-        return g + gremlin;
+    public Pair<String, Map<String, Object>> getGremlin(final String g) {
+        return Pair.with(g + gremlin, parameters);
     }
 
     /**
@@ -180,7 +185,7 @@ public class Bytecode implements Cloneable, Serializable {
         return this.sourceInstructions.isEmpty() && 
this.stepInstructions.isEmpty();
     }
 
-    private static final void addArgumentBinding(final Map<String, Object> 
bindingsMap, final Object argument) {
+    private static void addArgumentBinding(final Map<String, Object> 
bindingsMap, final Object argument) {
         if (argument instanceof Binding)
             bindingsMap.put(((Binding) argument).key, ((Binding) 
argument).value);
         else if (argument instanceof Map) {
diff --git 
a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/BytecodeV4test.java
 
b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/BytecodeV4test.java
index dbc66b8a7d..89bb73734d 100644
--- 
a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/BytecodeV4test.java
+++ 
b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/BytecodeV4test.java
@@ -19,18 +19,54 @@
 package org.apache.tinkerpop.gremlin.process.traversal;
 
 import 
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph;
+import org.javatuples.Pair;
+import org.junit.Before;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
 
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Map;
+
+import static 
org.apache.tinkerpop.gremlin.process.traversal.AnonymousTraversalSource.traversal;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.out;
+import static 
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.select;
 import static org.junit.Assert.assertEquals;
 
+@RunWith(Parameterized.class)
 public class BytecodeV4test {
 
+    @Parameterized.Parameter(value = 0)
+    public Traversal original;
+
+    @Parameterized.Parameter(value = 1)
+    public String expected;
+
     @Test
-    public void shouldWork() {
-        assertEquals("g.V().count()",
-                
EmptyGraph.instance().traversal().V().count().asAdmin().getBytecode().getGremlin("g"));
-        assertEquals("g.addV(\"test\")",
-                
EmptyGraph.instance().traversal().addV("test").asAdmin().getBytecode().getGremlin("g"));
+    public void doTest() {
+        final Pair<String, Map<String, Object>> gremlin = 
original.asAdmin().getBytecode().getGremlin("g");
+        assertEquals(expected, gremlin.getValue0());
+    }
+
+    @Before
+    public void setUp() {
+
+    }
+
+    private static GraphTraversalSource newG() {
+        return traversal().with(EmptyGraph.instance());
+    }
+
+    @Parameterized.Parameters(name = "{0}")
+    public static Iterable<Object[]> generateTestParameters() {
+        return Arrays.asList(new Object[][]{
+                {newG().V().count(), "g.V().count()"},
+                {newG().addV("test"), "g.addV(\"test\")"},
+                {newG().V(1).out("knows").values("name"), 
"g.V(1).out(\"knows\").values(\"name\")"},
+        });
     }
 }
diff --git 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/handler/HttpGremlinResponseStreamDecoder.java
 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/handler/HttpGremlinResponseStreamDecoder.java
index 825a55ada2..2c27498d8c 100644
--- 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/handler/HttpGremlinResponseStreamDecoder.java
+++ 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/handler/HttpGremlinResponseStreamDecoder.java
@@ -88,7 +88,7 @@ public class HttpGremlinResponseStreamDecoder extends 
MessageToMessageDecoder<De
                     final HttpHeaders trailingHeaders = ((LastHttpContent) 
msg).trailingHeaders();
 
                     if (!Objects.equals(trailingHeaders.get("code"), "200")) {
-                        throw new Exception(trailingHeaders.get("message"));
+                        throw new 
Exception(trailingHeaders.contains("message") ? trailingHeaders.get("message") 
: "Server error");
                     }
                 }
 
diff --git 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/remote/DriverRemoteConnection.java
 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/remote/DriverRemoteConnection.java
index 420424232a..4e2e07fb5f 100644
--- 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/remote/DriverRemoteConnection.java
+++ 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/remote/DriverRemoteConnection.java
@@ -31,7 +31,9 @@ import 
org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.Option
 import org.apache.tinkerpop.gremlin.process.traversal.util.BytecodeHelper;
 import org.apache.tinkerpop.gremlin.structure.Transaction;
 import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
+import org.javatuples.Pair;
 
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Optional;
@@ -225,7 +227,9 @@ public class DriverRemoteConnection implements 
RemoteConnection {
     @Override
     public <E> CompletableFuture<RemoteTraversal<?, E>> submitAsync(final 
Bytecode bytecode) throws RemoteConnectionException {
         try {
-            return client.submitAsync(bytecode, 
getRequestOptions(bytecode)).thenApply(rs -> new DriverRemoteTraversal<>(rs, 
client, attachElements, conf));
+            final Pair<String, Map<String, Object>> gremlin = 
bytecode.getGremlin(remoteTraversalSourceName);
+            return client.submitAsync(gremlin.getValue0(), gremlin.getValue1())
+                    .thenApply(rs -> new DriverRemoteTraversal<>(rs, client, 
attachElements, conf));
         } catch (Exception ex) {
             throw new RemoteConnectionException(ex);
         }
diff --git 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/remote/DriverRemoteTraversal.java
 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/remote/DriverRemoteTraversal.java
index 54e7cc84ae..2fce12e5f8 100644
--- 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/remote/DriverRemoteTraversal.java
+++ 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/remote/DriverRemoteTraversal.java
@@ -23,6 +23,7 @@ import org.apache.tinkerpop.gremlin.driver.Client;
 import org.apache.tinkerpop.gremlin.driver.Result;
 import org.apache.tinkerpop.gremlin.driver.ResultSet;
 import 
org.apache.tinkerpop.gremlin.process.remote.traversal.AbstractRemoteTraversal;
+import 
org.apache.tinkerpop.gremlin.process.remote.traversal.DefaultRemoteTraverser;
 import org.apache.tinkerpop.gremlin.process.remote.traversal.RemoteTraverser;
 import 
org.apache.tinkerpop.gremlin.process.remote.traversal.step.map.RemoteStep;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
@@ -112,7 +113,8 @@ public class DriverRemoteTraversal<S, E> extends 
AbstractRemoteTraversal<S, E> {
 
         @Override
         public Traverser.Admin<E> next() {
-            return (RemoteTraverser<E>) inner.next().getObject();
+            return new DefaultRemoteTraverser<>((E)inner.next().getObject(), 
1);
+            // return (RemoteTraverser<E>) inner.next().getObject(); // !!!
         }
     }
 
diff --git 
a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/HttpDriverIntegrateTest.java
 
b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/HttpDriverIntegrateTest.java
index 514a88d80e..2ca807cdd8 100644
--- 
a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/HttpDriverIntegrateTest.java
+++ 
b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/HttpDriverIntegrateTest.java
@@ -93,7 +93,7 @@ public class HttpDriverIntegrateTest extends 
AbstractGremlinServerIntegrationTes
     }
 
     @Test
-    public void shouldSubmitBytecodeWithGraphBinary() {
+    public void shouldSubmitTraversalWithGraphBinary() {
         final Cluster cluster = TestClientFactory.build().create();
         try {
             final GraphTraversalSource g = 
traversal().with(DriverRemoteConnection.using(cluster));
@@ -106,6 +106,20 @@ public class HttpDriverIntegrateTest extends 
AbstractGremlinServerIntegrationTes
         }
     }
 
+    @Test
+    public void shouldSubmitGremlinWithUnsupportedType() {
+        final Cluster cluster = TestClientFactory.build().create();
+        try {
+            final GraphTraversalSource g = 
traversal().with(DriverRemoteConnection.using(cluster));
+            final long result = g.inject(5L).toList().get(0);
+            assertEquals(5L, result);
+        } catch (Exception ex) {
+            throw ex;
+        } finally {
+            cluster.close();
+        }
+    }
+
     @Test
     public void shouldSubmitMultipleQueriesWithSameConnection() throws 
InterruptedException, ExecutionException {
         final Cluster cluster = TestClientFactory.build().create();
diff --git 
a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/message/RequestMessageV4.java
 
b/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/message/RequestMessageV4.java
index ee66661b07..d3c293d139 100644
--- 
a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/message/RequestMessageV4.java
+++ 
b/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/message/RequestMessageV4.java
@@ -99,12 +99,18 @@ public final class RequestMessageV4 {
     public static Builder from(final RequestMessageV4 msg) {
         final Builder builder = build(msg.gremlin);
         builder.fields.putAll(msg.getFields());
+        if (msg.getFields().containsKey(TokensV4.ARGS_BINDINGS)) {
+            builder.addBindings((Map<String, Object>) 
msg.getFields().get(TokensV4.ARGS_BINDINGS));
+        }
         return builder;
     }
 
     public static Builder from(final RequestMessageV4 msg, final Object 
gremlin) {
         final Builder builder = build(gremlin);
         builder.fields.putAll(msg.getFields());
+        if (msg.getFields().containsKey(TokensV4.ARGS_BINDINGS)) {
+            builder.addBindings((Map<String, Object>) 
msg.getFields().get(TokensV4.ARGS_BINDINGS));
+        }
         return builder;
     }
 

Reply via email to