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;
}