You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by ok...@apache.org on 2016/06/08 21:27:05 UTC
[1/2] incubator-tinkerpop git commit: added
Graph.traversal(Translator). A translator is able to translate a Java
traversal into any other language -- for example -- gremlin-python. Moreover,
for doing scripts to RemoteGraph, we can simply do graph.trave
Repository: incubator-tinkerpop
Updated Branches:
refs/heads/TINKERPOP-1278 d175894d6 -> 47e71228f
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/47e71228/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/VariantGraphTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/VariantGraphTraversal.java b/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/VariantGraphTraversal.java
deleted file mode 100644
index 0245d5a..0000000
--- a/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/VariantGraphTraversal.java
+++ /dev/null
@@ -1,968 +0,0 @@
-/*
- * 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.variant;
-
-import org.apache.tinkerpop.gremlin.process.computer.VertexProgram;
-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.Pop;
-import org.apache.tinkerpop.gremlin.process.traversal.Scope;
-import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
-import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
-import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
-import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree;
-import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
-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.structure.Graph;
-import org.apache.tinkerpop.gremlin.structure.Property;
-import org.apache.tinkerpop.gremlin.structure.T;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.structure.VertexProperty;
-import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph;
-import org.apache.tinkerpop.gremlin.util.ScriptEngineCache;
-
-import javax.script.Bindings;
-import javax.script.ScriptEngine;
-import javax.script.SimpleBindings;
-import java.util.Collection;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.function.BiFunction;
-import java.util.function.Consumer;
-import java.util.function.Function;
-import java.util.function.Predicate;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class VariantGraphTraversal<S, E> extends DefaultGraphTraversal<S, E> {
-
-
- public StringBuilder variantString;
- protected VariantConverter variantConverter;
-
- public VariantGraphTraversal(final Graph graph, final StringBuilder variantString, final VariantConverter variantConverter) {
- super(graph);
- this.variantConverter = variantConverter;
- this.variantString = variantString;
- __.EMPTY_GRAPH_TRAVERSAL = () -> {
- final StringBuilder builder = new StringBuilder("__");
- return new VariantGraphTraversal<>(EmptyGraph.instance(), builder, this.variantConverter);
- };
- }
-
- public StringBuilder getVariantString() {
- return this.variantString;
- }
-
- public String toString() {
- return this.steps.isEmpty() ? this.variantString.toString() : super.toString();
- }
-
- @Override
- public void applyStrategies() {
- if (!(this.getParent() instanceof EmptyStep)) {
- return;
- }
- try {
- final String jythonString = this.variantConverter.generateGremlinGroovy(this.variantString);
- __.EMPTY_GRAPH_TRAVERSAL = DefaultGraphTraversal::new;
- ScriptEngine groovy = ScriptEngineCache.get("gremlin-groovy");
- final Bindings groovyBindings = new SimpleBindings();
- groovyBindings.put("g", new GraphTraversalSource(this.getGraph().get(), this.getStrategies()));
- Traversal.Admin<S, E> traversal = (Traversal.Admin<S, E>) groovy.eval(jythonString, groovyBindings);
- assert !traversal.isLocked();
- this.sideEffects = traversal.getSideEffects();
- this.strategies = traversal.getStrategies();
- traversal.getSteps().forEach(step -> this.addStep(step));
- super.applyStrategies();
- } catch (final Exception e) {
- throw new IllegalArgumentException(e.getMessage(), e);
- }
- }
-
- private static String getMethodName() {
- return Thread.currentThread().getStackTrace()[2].getMethodName();
- }
-
- //////////////////////////
-
- public <E2> GraphTraversal<S, E2> map(final Function<Traverser<E>, E2> function) {
- this.variantConverter.addStep(this.variantString, getMethodName(), function);
- return (GraphTraversal) this;
- }
-
- public <E2> GraphTraversal<S, E2> map(final Traversal<?, E2> mapTraversal) {
- this.variantConverter.addStep(this.variantString, getMethodName(), mapTraversal);
- return (GraphTraversal) this;
- }
-
- public <E2> GraphTraversal<S, E2> flatMap(final Function<Traverser<E>, Iterator<E2>> function) {
- this.variantConverter.addStep(this.variantString, getMethodName(), function);
- return (GraphTraversal) this;
- }
-
- public <E2> GraphTraversal<S, E2> flatMap(final Traversal<?, E2> flatMapTraversal) {
- this.variantConverter.addStep(this.variantString, getMethodName(), flatMapTraversal);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, Object> id() {
- this.variantConverter.addStep(this.variantString, getMethodName());
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, String> label() {
- this.variantConverter.addStep(this.variantString, getMethodName());
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> identity() {
- this.variantConverter.addStep(this.variantString, getMethodName());
- return (GraphTraversal) this;
- }
-
- public <E2> GraphTraversal<S, E2> constant(final E2 e) {
- this.variantConverter.addStep(this.variantString, getMethodName(), e);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, Vertex> V(final Object... vertexIdsOrElements) {
- this.variantConverter.addStep(this.variantString, getMethodName(), vertexIdsOrElements);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, Vertex> to(final Direction direction, final String... edgeLabels) {
- this.variantConverter.addStep(this.variantString, getMethodName(), direction, edgeLabels);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, Vertex> out(final String... edgeLabels) {
- this.variantConverter.addStep(this.variantString, getMethodName(), edgeLabels);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, Vertex> in(final String... edgeLabels) {
- this.variantConverter.addStep(this.variantString, getMethodName(), edgeLabels);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, Vertex> both(final String... edgeLabels) {
- this.variantConverter.addStep(this.variantString, getMethodName(), edgeLabels);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, Edge> toE(final Direction direction, final String... edgeLabels) {
- this.variantConverter.addStep(this.variantString, getMethodName(), direction, edgeLabels);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, Edge> outE(final String... edgeLabels) {
- this.variantConverter.addStep(this.variantString, getMethodName(), edgeLabels);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, Edge> inE(final String... edgeLabels) {
- this.variantConverter.addStep(this.variantString, getMethodName(), edgeLabels);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, Edge> bothE(final String... edgeLabels) {
- this.variantConverter.addStep(this.variantString, getMethodName(), edgeLabels);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, Vertex> toV(final Direction direction) {
- this.variantConverter.addStep(this.variantString, getMethodName(), direction);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, Vertex> inV() {
- this.variantConverter.addStep(this.variantString, getMethodName());
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, Vertex> outV() {
- this.variantConverter.addStep(this.variantString, getMethodName());
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, Vertex> bothV() {
- this.variantConverter.addStep(this.variantString, getMethodName());
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, Vertex> otherV() {
- this.variantConverter.addStep(this.variantString, getMethodName());
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> order() {
- this.variantConverter.addStep(this.variantString, getMethodName());
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> order(final Scope scope) {
- this.variantConverter.addStep(this.variantString, getMethodName(), scope);
- return (GraphTraversal) this;
- }
-
- public <E2> GraphTraversal<S, ? extends Property<E2>> properties(final String... propertyKeys) {
- this.variantConverter.addStep(this.variantString, getMethodName(), propertyKeys);
- return (GraphTraversal) this;
- }
-
- public <E2> GraphTraversal<S, E2> values(final String... propertyKeys) {
- this.variantConverter.addStep(this.variantString, getMethodName(), propertyKeys);
- return (GraphTraversal) this;
- }
-
- public <E2> GraphTraversal<S, Map<String, E2>> propertyMap(final String... propertyKeys) {
- this.variantConverter.addStep(this.variantString, getMethodName(), propertyKeys);
- return (GraphTraversal) this;
- }
-
- public <E2> GraphTraversal<S, Map<String, E2>> valueMap(final String... propertyKeys) {
- this.variantConverter.addStep(this.variantString, getMethodName(), propertyKeys);
- return (GraphTraversal) this;
- }
-
- public <E2> GraphTraversal<S, Map<String, E2>> valueMap(final boolean includeTokens, final String... propertyKeys) {
- this.variantConverter.addStep(this.variantString, getMethodName(), includeTokens, propertyKeys);
- return (GraphTraversal) this;
- }
-
- public <E2> GraphTraversal<S, Collection<E2>> select(final Column column) {
- this.variantConverter.addStep(this.variantString, getMethodName(), column);
- return (GraphTraversal) this;
- }
-
- @Deprecated
- public <E2> GraphTraversal<S, E2> mapValues() {
- this.variantConverter.addStep(this.variantString, getMethodName());
- return (GraphTraversal) this;
- }
-
- @Deprecated
- public <E2> GraphTraversal<S, E2> mapKeys() {
- this.variantConverter.addStep(this.variantString, getMethodName());
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, String> key() {
- this.variantConverter.addStep(this.variantString, getMethodName());
- return (GraphTraversal) this;
- }
-
- public <E2> GraphTraversal<S, E2> value() {
- this.variantConverter.addStep(this.variantString, getMethodName());
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, Path> path() {
- this.variantConverter.addStep(this.variantString, getMethodName());
- return (GraphTraversal) this;
- }
-
- public <E2> GraphTraversal<S, Map<String, E2>> match(final Traversal<?, ?>... matchTraversals) {
- this.variantConverter.addStep(this.variantString, getMethodName(), matchTraversals);
- return (GraphTraversal) this;
- }
-
- public <E2> GraphTraversal<S, E2> sack() {
- this.variantConverter.addStep(this.variantString, getMethodName());
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, Integer> loops() {
- this.variantConverter.addStep(this.variantString, getMethodName());
- return (GraphTraversal) this;
- }
-
- public <E2> GraphTraversal<S, Map<String, E2>> project(final String projectKey, final String... otherProjectKeys) {
- this.variantConverter.addStep(this.variantString, getMethodName(), projectKey, otherProjectKeys);
- return (GraphTraversal) this;
- }
-
- public <E2> GraphTraversal<S, Map<String, E2>> select(final Pop pop, final String selectKey1, final String selectKey2, String... otherSelectKeys) {
- this.variantConverter.addStep(this.variantString, getMethodName(), pop, selectKey1, selectKey2, otherSelectKeys);
- return (GraphTraversal) this;
- }
-
- public <E2> GraphTraversal<S, Map<String, E2>> select(final String selectKey1, final String selectKey2, String... otherSelectKeys) {
- this.variantConverter.addStep(this.variantString, getMethodName(), selectKey1, selectKey2, otherSelectKeys);
- return (GraphTraversal) this;
- }
-
- public <E2> GraphTraversal<S, E2> select(final Pop pop, final String selectKey) {
- this.variantConverter.addStep(this.variantString, getMethodName(), pop, selectKey);
- return (GraphTraversal) this;
- }
-
- public <E2> GraphTraversal<S, E2> select(final String selectKey) {
- this.variantConverter.addStep(this.variantString, getMethodName(), selectKey);
- return (GraphTraversal) this;
- }
-
- public <E2> GraphTraversal<S, E2> unfold() {
- this.variantConverter.addStep(this.variantString, getMethodName());
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, List<E>> fold() {
- this.variantConverter.addStep(this.variantString, getMethodName());
- return (GraphTraversal) this;
- }
-
- public <E2> GraphTraversal<S, E2> fold(final E2 seed, final BiFunction<E2, E, E2> foldFunction) {
- this.variantConverter.addStep(this.variantString, getMethodName(), seed, foldFunction);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, Long> count() {
- this.variantConverter.addStep(this.variantString, getMethodName());
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, Long> count(final Scope scope) {
- this.variantConverter.addStep(this.variantString, getMethodName(), scope);
- return (GraphTraversal) this;
- }
-
- public <E2 extends Number> GraphTraversal<S, E2> sum() {
- this.variantConverter.addStep(this.variantString, getMethodName());
- return (GraphTraversal) this;
- }
-
- public <E2 extends Number> GraphTraversal<S, E2> sum(final Scope scope) {
- this.variantConverter.addStep(this.variantString, getMethodName(), scope);
- return (GraphTraversal) this;
- }
-
- public <E2 extends Number> GraphTraversal<S, E2> max() {
- this.variantConverter.addStep(this.variantString, getMethodName());
- return (GraphTraversal) this;
- }
-
- public <E2 extends Number> GraphTraversal<S, E2> max(final Scope scope) {
- this.variantConverter.addStep(this.variantString, getMethodName(), scope);
- return (GraphTraversal) this;
- }
-
- public <E2 extends Number> GraphTraversal<S, E2> min() {
- this.variantConverter.addStep(this.variantString, getMethodName());
- return (GraphTraversal) this;
- }
-
- public <E2 extends Number> GraphTraversal<S, E2> min(final Scope scope) {
- this.variantConverter.addStep(this.variantString, getMethodName(), scope);
- return (GraphTraversal) this;
- }
-
- public <E2 extends Number> GraphTraversal<S, E2> mean() {
- this.variantConverter.addStep(this.variantString, getMethodName());
- return (GraphTraversal) this;
- }
-
- public <E2 extends Number> GraphTraversal<S, E2> mean(final Scope scope) {
- this.variantConverter.addStep(this.variantString, getMethodName(), scope);
- return (GraphTraversal) this;
- }
-
- public <K, V> GraphTraversal<S, Map<K, V>> group() {
- this.variantConverter.addStep(this.variantString, getMethodName());
- return (GraphTraversal) this;
- }
-
- @Deprecated
- public <K, V> GraphTraversal<S, Map<K, V>> groupV3d0() {
- this.variantConverter.addStep(this.variantString, getMethodName());
- return (GraphTraversal) this;
- }
-
- public <K> GraphTraversal<S, Map<K, Long>> groupCount() {
- this.variantConverter.addStep(this.variantString, getMethodName());
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, Tree> tree() {
- this.variantConverter.addStep(this.variantString, getMethodName());
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, Vertex> addV(final String vertexLabel) {
- this.variantConverter.addStep(this.variantString, getMethodName(), vertexLabel);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, Vertex> addV() {
- this.variantConverter.addStep(this.variantString, getMethodName());
- return (GraphTraversal) this;
- }
-
- @Deprecated
- public GraphTraversal<S, Vertex> addV(final Object... propertyKeyValues) {
- this.variantConverter.addStep(this.variantString, getMethodName(), propertyKeyValues);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, Edge> addE(final String edgeLabel) {
- this.variantConverter.addStep(this.variantString, getMethodName(), edgeLabel);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> to(final String toStepLabel) {
- this.variantConverter.addStep(this.variantString, getMethodName(), toStepLabel);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> from(final String fromStepLabel) {
- this.variantConverter.addStep(this.variantString, getMethodName(), fromStepLabel);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> to(final Traversal<E, Vertex> toVertex) {
- this.variantConverter.addStep(this.variantString, getMethodName(), toVertex);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> from(final Traversal<E, Vertex> fromVertex) {
- this.variantConverter.addStep(this.variantString, getMethodName(), fromVertex);
- return (GraphTraversal) this;
- }
-
- @Deprecated
- public GraphTraversal<S, Edge> addE(final Direction direction, final String firstVertexKeyOrEdgeLabel, final String edgeLabelOrSecondVertexKey, final Object... propertyKeyValues) {
- this.variantConverter.addStep(this.variantString, getMethodName(), direction, firstVertexKeyOrEdgeLabel, edgeLabelOrSecondVertexKey, propertyKeyValues);
- return (GraphTraversal) this;
- }
-
- @Deprecated
- public GraphTraversal<S, Edge> addOutE(final String firstVertexKeyOrEdgeLabel, final String edgeLabelOrSecondVertexKey, final Object... propertyKeyValues) {
- this.variantConverter.addStep(this.variantString, getMethodName(), firstVertexKeyOrEdgeLabel, edgeLabelOrSecondVertexKey, propertyKeyValues);
- return (GraphTraversal) this;
- }
-
- @Deprecated
- public GraphTraversal<S, Edge> addInE(final String firstVertexKeyOrEdgeLabel, final String edgeLabelOrSecondVertexKey, final Object... propertyKeyValues) {
- this.variantConverter.addStep(this.variantString, getMethodName(), firstVertexKeyOrEdgeLabel, edgeLabelOrSecondVertexKey, propertyKeyValues);
- return (GraphTraversal) this;
- }
-
- ///////////////////// FILTER STEPS /////////////////////
-
- public GraphTraversal<S, E> filter(final Predicate<Traverser<E>> predicate) {
- this.variantConverter.addStep(this.variantString, getMethodName(), predicate);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> filter(final Traversal<?, ?> filterTraversal) {
- this.variantConverter.addStep(this.variantString, getMethodName(), filterTraversal);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> or(final Traversal<?, ?>... orTraversals) {
- this.variantConverter.addStep(this.variantString, getMethodName(), orTraversals);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> and(final Traversal<?, ?>... andTraversals) {
- this.variantConverter.addStep(this.variantString, getMethodName(), andTraversals);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> inject(final E... injections) {
- this.variantConverter.addStep(this.variantString, getMethodName(), injections);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> dedup(final Scope scope, final String... dedupLabels) {
- this.variantConverter.addStep(this.variantString, getMethodName(), scope, dedupLabels);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> dedup(final String... dedupLabels) {
- this.variantConverter.addStep(this.variantString, getMethodName(), dedupLabels);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> where(final String startKey, final P<String> predicate) {
- this.variantConverter.addStep(this.variantString, getMethodName(), startKey, predicate);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> where(final P<String> predicate) {
- this.variantConverter.addStep(this.variantString, getMethodName(), predicate);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> where(final Traversal<?, ?> whereTraversal) {
- this.variantConverter.addStep(this.variantString, getMethodName(), whereTraversal);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> has(final String propertyKey, final P<?> predicate) {
- this.variantConverter.addStep(this.variantString, getMethodName(), propertyKey, predicate);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> has(final T accessor, final P<?> predicate) {
- this.variantConverter.addStep(this.variantString, getMethodName(), accessor, predicate);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> has(final String propertyKey, final Object value) {
- this.variantConverter.addStep(this.variantString, getMethodName(), propertyKey, value);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> has(final T accessor, final Object value) {
- this.variantConverter.addStep(this.variantString, getMethodName(), accessor, value);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> has(final String label, final String propertyKey, final P<?> predicate) {
- this.variantConverter.addStep(this.variantString, getMethodName(), label, propertyKey, predicate);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> has(final String label, final String propertyKey, final Object value) {
- this.variantConverter.addStep(this.variantString, getMethodName(), label, propertyKey, value);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> has(final T accessor, final Traversal<?, ?> propertyTraversal) {
- this.variantConverter.addStep(this.variantString, getMethodName(), accessor, propertyTraversal);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> has(final String propertyKey, final Traversal<?, ?> propertyTraversal) {
- this.variantConverter.addStep(this.variantString, getMethodName(), propertyKey, propertyTraversal);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> has(final String propertyKey) {
- this.variantConverter.addStep(this.variantString, getMethodName(), propertyKey);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> hasNot(final String propertyKey) {
- this.variantConverter.addStep(this.variantString, getMethodName(), propertyKey);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> hasLabel(final String... labels) {
- this.variantConverter.addStep(this.variantString, getMethodName(), labels);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> hasId(final Object... ids) {
- this.variantConverter.addStep(this.variantString, getMethodName(), ids);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> hasKey(final String... keys) {
- this.variantConverter.addStep(this.variantString, getMethodName(), keys);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> hasValue(final Object... values) {
- this.variantConverter.addStep(this.variantString, getMethodName(), values);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> is(final P<E> predicate) {
- this.variantConverter.addStep(this.variantString, getMethodName(), predicate);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> is(final Object value) {
- this.variantConverter.addStep(this.variantString, getMethodName(), value);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> not(final Traversal<?, ?> notTraversal) {
- this.variantConverter.addStep(this.variantString, getMethodName(), notTraversal);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> coin(final double probability) {
- this.variantConverter.addStep(this.variantString, getMethodName(), probability);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> range(final long low, final long high) {
- this.variantConverter.addStep(this.variantString, getMethodName(), low, high);
- return (GraphTraversal) this;
- }
-
- public <E2> GraphTraversal<S, E2> range(final Scope scope, final long low, final long high) {
- this.variantConverter.addStep(this.variantString, getMethodName(), scope, low, high);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> limit(final long limit) {
- this.variantConverter.addStep(this.variantString, getMethodName(), limit);
- return (GraphTraversal) this;
- }
-
- public <E2> GraphTraversal<S, E2> limit(final Scope scope, final long limit) {
- this.variantConverter.addStep(this.variantString, getMethodName(), scope, limit);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> tail() {
- this.variantConverter.addStep(this.variantString, getMethodName());
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> tail(final long limit) {
- this.variantConverter.addStep(this.variantString, getMethodName(), limit);
- return (GraphTraversal) this;
- }
-
- public <E2> GraphTraversal<S, E2> tail(final Scope scope) {
- this.variantConverter.addStep(this.variantString, getMethodName(), scope);
- return (GraphTraversal) this;
- }
-
- public <E2> GraphTraversal<S, E2> tail(final Scope scope, final long limit) {
- this.variantConverter.addStep(this.variantString, getMethodName(), scope, limit);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> timeLimit(final long timeLimit) {
- this.variantConverter.addStep(this.variantString, getMethodName(), timeLimit);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> simplePath() {
- this.variantConverter.addStep(this.variantString, getMethodName());
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> cyclicPath() {
- this.variantConverter.addStep(this.variantString, getMethodName());
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> sample(final int amountToSample) {
- this.variantConverter.addStep(this.variantString, getMethodName(), amountToSample);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> sample(final Scope scope, final int amountToSample) {
- this.variantConverter.addStep(this.variantString, getMethodName(), scope, amountToSample);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> drop() {
- this.variantConverter.addStep(this.variantString, getMethodName());
- return (GraphTraversal) this;
- }
-
- ///////////////////// SIDE-EFFECT STEPS /////////////////////
-
- public GraphTraversal<S, E> sideEffect(final Consumer<Traverser<E>> consumer) {
- this.variantConverter.addStep(this.variantString, getMethodName(), consumer);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> sideEffect(final Traversal<?, ?> sideEffectTraversal) {
- this.variantConverter.addStep(this.variantString, getMethodName(), sideEffectTraversal);
- return (GraphTraversal) this;
- }
-
- public <E2> GraphTraversal<S, E2> cap(final String sideEffectKey, final String... sideEffectKeys) {
- this.variantConverter.addStep(this.variantString, getMethodName(), sideEffectKey, sideEffectKeys);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, Edge> subgraph(final String sideEffectKey) {
- this.variantConverter.addStep(this.variantString, getMethodName(), sideEffectKey);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> aggregate(final String sideEffectKey) {
- this.variantConverter.addStep(this.variantString, getMethodName(), sideEffectKey);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> group(final String sideEffectKey) {
- this.variantConverter.addStep(this.variantString, getMethodName(), sideEffectKey);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> groupV3d0(final String sideEffectKey) {
- this.variantConverter.addStep(this.variantString, getMethodName(), sideEffectKey);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> groupCount(final String sideEffectKey) {
- this.variantConverter.addStep(this.variantString, getMethodName(), sideEffectKey);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> tree(final String sideEffectKey) {
- this.variantConverter.addStep(this.variantString, getMethodName(), sideEffectKey);
- return (GraphTraversal) this;
- }
-
- public <V, U> GraphTraversal<S, E> sack(final BiFunction<V, U, V> sackOperator) {
- this.variantConverter.addStep(this.variantString, getMethodName(), sackOperator);
- return (GraphTraversal) this;
- }
-
-
- @Deprecated
- public <V, U> GraphTraversal<S, E> sack(final BiFunction<V, U, V> sackOperator, final String elementPropertyKey) {
- this.variantConverter.addStep(this.variantString, getMethodName(), sackOperator, elementPropertyKey);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> store(final String sideEffectKey) {
- this.variantConverter.addStep(this.variantString, getMethodName(), sideEffectKey);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> profile(final String sideEffectKey) {
- this.variantConverter.addStep(this.variantString, getMethodName(), sideEffectKey);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> property(final VertexProperty.Cardinality cardinality, final Object key, final Object value, final Object... keyValues) {
- this.variantConverter.addStep(this.variantString, getMethodName(), cardinality, key, value, keyValues);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> property(final Object key, final Object value, final Object... keyValues) {
- this.variantConverter.addStep(this.variantString, getMethodName(), key, value, keyValues);
- return (GraphTraversal) this;
- }
-
- ///////////////////// BRANCH STEPS /////////////////////
-
- public <M, E2> GraphTraversal<S, E2> branch(final Traversal<?, M> branchTraversal) {
- this.variantConverter.addStep(this.variantString, getMethodName(), branchTraversal);
- return (GraphTraversal) this;
- }
-
- public <M, E2> GraphTraversal<S, E2> branch(final Function<Traverser<E>, M> function) {
- this.variantConverter.addStep(this.variantString, getMethodName(), function);
- return (GraphTraversal) this;
- }
-
- public <M, E2> GraphTraversal<S, E2> choose(final Traversal<?, M> choiceTraversal) {
- this.variantConverter.addStep(this.variantString, getMethodName(), choiceTraversal);
- return (GraphTraversal) this;
- }
-
- public <E2> GraphTraversal<S, E2> choose(final Traversal<?, ?> traversalPredicate,
- final Traversal<?, E2> trueChoice, final Traversal<?, E2> falseChoice) {
- this.variantConverter.addStep(this.variantString, getMethodName(), traversalPredicate, trueChoice, falseChoice);
- return (GraphTraversal) this;
- }
-
- public <M, E2> GraphTraversal<S, E2> choose(final Function<E, M> choiceFunction) {
- this.variantConverter.addStep(this.variantString, getMethodName(), choiceFunction);
- return (GraphTraversal) this;
- }
-
- public <E2> GraphTraversal<S, E2> choose(final Predicate<E> choosePredicate,
- final Traversal<?, E2> trueChoice, final Traversal<?, E2> falseChoice) {
- this.variantConverter.addStep(this.variantString, getMethodName(), choosePredicate, trueChoice, falseChoice);
- return (GraphTraversal) this;
- }
-
- public <E2> GraphTraversal<S, E2> optional(final Traversal<?, E2> optionalTraversal) {
- this.variantConverter.addStep(this.variantString, getMethodName(), optionalTraversal);
- return (GraphTraversal) this;
- }
-
- public <E2> GraphTraversal<S, E2> union(final Traversal<?, E2>... unionTraversals) {
- this.variantConverter.addStep(this.variantString, getMethodName(), unionTraversals);
- return (GraphTraversal) this;
- }
-
- public <E2> GraphTraversal<S, E2> coalesce(final Traversal<?, E2>... coalesceTraversals) {
- this.variantConverter.addStep(this.variantString, getMethodName(), coalesceTraversals);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> repeat(final Traversal<?, E> repeatTraversal) {
- this.variantConverter.addStep(this.variantString, getMethodName(), repeatTraversal);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> emit(final Traversal<?, ?> emitTraversal) {
- this.variantConverter.addStep(this.variantString, getMethodName(), emitTraversal);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> emit(final Predicate<Traverser<E>> emitPredicate) {
- this.variantConverter.addStep(this.variantString, getMethodName(), emitPredicate);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> emit() {
- this.variantConverter.addStep(this.variantString, getMethodName());
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> until(final Traversal<?, ?> untilTraversal) {
- this.variantConverter.addStep(this.variantString, getMethodName(), untilTraversal);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> until(final Predicate<Traverser<E>> untilPredicate) {
- this.variantConverter.addStep(this.variantString, getMethodName(), untilPredicate);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> times(final int maxLoops) {
- this.variantConverter.addStep(this.variantString, getMethodName(), maxLoops);
- return (GraphTraversal) this;
- }
-
- public <E2> GraphTraversal<S, E2> local(final Traversal<?, E2> localTraversal) {
- this.variantConverter.addStep(this.variantString, getMethodName(), localTraversal);
- return (GraphTraversal) this;
- }
-
- /////////////////// VERTEX PROGRAM STEPS ////////////////
-
- public GraphTraversal<S, E> pageRank() {
- this.variantConverter.addStep(this.variantString, getMethodName());
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> pageRank(final double alpha) {
- this.variantConverter.addStep(this.variantString, getMethodName(), alpha);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> peerPressure() {
- this.variantConverter.addStep(this.variantString, getMethodName());
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> program(final VertexProgram<?> vertexProgram) {
- this.variantConverter.addStep(this.variantString, getMethodName(), vertexProgram);
- return (GraphTraversal) this;
- }
-
- ///////////////////// UTILITY STEPS /////////////////////
-
- public GraphTraversal<S, E> as(final String stepLabel, final String... stepLabels) {
- this.variantConverter.addStep(this.variantString, getMethodName(), stepLabel, stepLabels);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> barrier() {
- this.variantConverter.addStep(this.variantString, getMethodName());
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> barrier(final int maxBarrierSize) {
- this.variantConverter.addStep(this.variantString, getMethodName(), maxBarrierSize);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> barrier(final Consumer<TraverserSet<Object>> barrierConsumer) {
- this.variantConverter.addStep(this.variantString, getMethodName(), barrierConsumer);
- return (GraphTraversal) this;
- }
-
-
- //// BY-MODULATORS
-
- public GraphTraversal<S, E> by() {
- this.variantConverter.addStep(this.variantString, getMethodName());
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> by(final Traversal<?, ?> traversal) {
- this.variantConverter.addStep(this.variantString, getMethodName(), traversal);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> by(final T token) {
- this.variantConverter.addStep(this.variantString, getMethodName(), token);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> by(final String key) {
- this.variantConverter.addStep(this.variantString, getMethodName(), key);
- return (GraphTraversal) this;
- }
-
- public <V> GraphTraversal<S, E> by(final Function<V, Object> function) {
- this.variantConverter.addStep(this.variantString, getMethodName(), function);
- return (GraphTraversal) this;
- }
-
- //// COMPARATOR BY-MODULATORS
-
- public <V> GraphTraversal<S, E> by(final Traversal<?, ?> traversal, final Comparator<V> comparator) {
- this.variantConverter.addStep(this.variantString, getMethodName(), traversal, comparator);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> by(final Comparator<E> comparator) {
- this.variantConverter.addStep(this.variantString, getMethodName(), comparator);
- return (GraphTraversal) this;
- }
-
- public GraphTraversal<S, E> by(final Order order) {
- this.variantConverter.addStep(this.variantString, getMethodName(), order);
- return (GraphTraversal) this;
- }
-
- public <V> GraphTraversal<S, E> by(final String key, final Comparator<V> comparator) {
- this.variantConverter.addStep(this.variantString, getMethodName(), key, comparator);
- return (GraphTraversal) this;
- }
-
- public <U> GraphTraversal<S, E> by(final Function<U, Object> function, final Comparator comparator) {
- this.variantConverter.addStep(this.variantString, getMethodName(), function, comparator);
- return (GraphTraversal) this;
- }
-
- ////
-
- public <M, E2> GraphTraversal<S, E> option(final M pickToken, final Traversal<E, E2> traversalOption) {
- this.variantConverter.addStep(this.variantString, getMethodName(), pickToken, traversalOption);
- return (GraphTraversal) this;
- }
-
- public <E2> GraphTraversal<S, E> option(final Traversal<E, E2> traversalOption) {
- this.variantConverter.addStep(this.variantString, getMethodName(), traversalOption);
- return (GraphTraversal) this;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/47e71228/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/VariantGraphTraversalSource.java
----------------------------------------------------------------------
diff --git a/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/VariantGraphTraversalSource.java b/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/VariantGraphTraversalSource.java
deleted file mode 100644
index 9e4382f..0000000
--- a/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/VariantGraphTraversalSource.java
+++ /dev/null
@@ -1,219 +0,0 @@
-/*
- * 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.variant;
-
-import org.apache.tinkerpop.gremlin.process.computer.Computer;
-import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
-import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
-import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
-import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexStartStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.GraphStep;
-import org.apache.tinkerpop.gremlin.structure.Edge;
-import org.apache.tinkerpop.gremlin.structure.Graph;
-import org.apache.tinkerpop.gremlin.structure.Transaction;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-
-import java.util.function.BinaryOperator;
-import java.util.function.Supplier;
-import java.util.function.UnaryOperator;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class VariantGraphTraversalSource extends GraphTraversalSource {
-
- private VariantConverter variantConverter;
- private StringBuilder sourceString = new StringBuilder("g");
-
- public VariantGraphTraversalSource(final VariantConverter variantConverter, final Graph graph, final TraversalStrategies traversalStrategies) {
- super(graph, traversalStrategies);
- this.variantConverter = variantConverter;
- }
-
- private static String getMethodName() {
- return Thread.currentThread().getStackTrace()[2].getMethodName();
- }
-
- ///
-
- @Override
- public GraphTraversal<Edge, Edge> E(final Object... edgeIds) {
- final StringBuilder temp = new StringBuilder(this.sourceString.toString());
- this.variantConverter.addStep(temp, getMethodName(), edgeIds);
- return new VariantGraphTraversal<>(this.getGraph(), temp, this.variantConverter);
- }
-
- @Override
- public GraphTraversal<Vertex, Vertex> V(final Object... vertexIds) {
- final StringBuilder temp = new StringBuilder(this.sourceString.toString());
- this.variantConverter.addStep(temp, getMethodName(), vertexIds);
- return new VariantGraphTraversal<>(this.getGraph(), temp, this.variantConverter);
- }
-
- @Deprecated
- public GraphTraversal<Vertex, Vertex> addV(final Object... keyValues) {
- final StringBuilder temp = new StringBuilder(this.sourceString.toString());
- this.variantConverter.addStep(temp, getMethodName(), keyValues);
- return new VariantGraphTraversal<>(this.getGraph(), temp, this.variantConverter);
- }
-
- public GraphTraversal<Vertex, Vertex> addV(final String label) {
- final StringBuilder temp = new StringBuilder(this.sourceString.toString());
- this.variantConverter.addStep(temp, getMethodName(), label);
- return new VariantGraphTraversal<>(this.getGraph(), temp, this.variantConverter);
- }
-
- public GraphTraversal<Vertex, Vertex> addV() {
- final StringBuilder temp = new StringBuilder(this.sourceString.toString());
- this.variantConverter.addStep(temp, getMethodName());
- return new VariantGraphTraversal<>(this.getGraph(), temp, this.variantConverter);
- }
-
- public <S> GraphTraversal<S, S> inject(S... starts) {
- final StringBuilder temp = new StringBuilder(this.sourceString.toString());
- this.variantConverter.addStep(temp, getMethodName(), starts);
- return new VariantGraphTraversal<>(this.getGraph(), temp, this.variantConverter);
- }
-
- ///
-
- @Override
- public GraphTraversalSource withComputer(final Computer computer) {
- this.variantConverter.addStep(this.sourceString, getMethodName(), computer);
- return this;
- }
-
- @Override
- public GraphTraversalSource withComputer(final Class<? extends GraphComputer> graphComputerClass) {
- this.variantConverter.addStep(this.sourceString, getMethodName(), graphComputerClass);
- return this;
- }
-
- @Override
- public GraphTraversalSource withComputer() {
- this.variantConverter.addStep(this.sourceString, getMethodName());
- return this;
- }
-
- @Override
- public GraphTraversalSource withStrategies(final TraversalStrategy... traversalStrategies) {
- return super.withStrategies(traversalStrategies);
- //this.variantConverter.addStep(this.sourceString, getMethodName(), traversalStrategies);
- //return this;
- }
-
- @Override
- @SuppressWarnings({"unchecked", "varargs"})
- public GraphTraversalSource withoutStrategies(final Class<? extends TraversalStrategy>... traversalStrategyClasses) {
- this.variantConverter.addStep(this.sourceString, getMethodName(), traversalStrategyClasses);
- return this;
- }
-
- @Override
- public <A> GraphTraversalSource withSack(final Supplier<A> initialValue, final UnaryOperator<A> splitOperator, final BinaryOperator<A> mergeOperator) {
- this.variantConverter.addStep(this.sourceString, getMethodName(), splitOperator, mergeOperator);
- return this;
- }
-
- @Override
- public <A> GraphTraversalSource withSack(final A initialValue, final UnaryOperator<A> splitOperator, final BinaryOperator<A> mergeOperator) {
- this.variantConverter.addStep(this.sourceString, getMethodName(), initialValue, splitOperator, mergeOperator);
- return this;
- }
-
- @Override
- public <A> GraphTraversalSource withSack(final A initialValue) {
- this.variantConverter.addStep(this.sourceString, getMethodName(), initialValue);
- return this;
- }
-
- @Override
- public <A> GraphTraversalSource withSack(final Supplier<A> initialValue) {
- this.variantConverter.addStep(this.sourceString, getMethodName(), initialValue);
- return this;
- }
-
- @Override
- public <A> GraphTraversalSource withSack(final Supplier<A> initialValue, final UnaryOperator<A> splitOperator) {
- this.variantConverter.addStep(this.sourceString, getMethodName(), initialValue, splitOperator);
- return this;
- }
-
- @Override
- public <A> GraphTraversalSource withSack(final A initialValue, final UnaryOperator<A> splitOperator) {
- this.variantConverter.addStep(this.sourceString, getMethodName(), initialValue, splitOperator);
- return this;
- }
-
- @Override
- public <A> GraphTraversalSource withSack(final Supplier<A> initialValue, final BinaryOperator<A> mergeOperator) {
- this.variantConverter.addStep(this.sourceString, getMethodName(), initialValue, mergeOperator);
- return this;
- }
-
- @Override
- public <A> GraphTraversalSource withSack(final A initialValue, final BinaryOperator<A> mergeOperator) {
- this.variantConverter.addStep(this.sourceString, getMethodName(), initialValue, mergeOperator);
- return this;
- }
-
- /////
-
- @Override
- public <A> GraphTraversalSource withSideEffect(final String key, final Supplier<A> initialValue, final BinaryOperator<A> reducer) {
- this.variantConverter.addStep(this.sourceString, getMethodName(), key, initialValue, reducer);
- return this;
- }
-
- @Override
- public <A> GraphTraversalSource withSideEffect(final String key, final A initialValue, final BinaryOperator<A> reducer) {
- this.variantConverter.addStep(this.sourceString, getMethodName(), key, initialValue, reducer);
- return this;
- }
-
- @Override
- public <A> GraphTraversalSource withSideEffect(final String key, final A initialValue) {
- this.variantConverter.addStep(this.sourceString, getMethodName(), key, initialValue);
- return this;
- }
-
- @Override
- public <A> GraphTraversalSource withSideEffect(final String key, final Supplier<A> initialValue) {
- this.variantConverter.addStep(this.sourceString, getMethodName(), key, initialValue);
- return this;
- }
-
- /////
-
- @Override
- public GraphTraversalSource withBulk(final boolean useBulk) {
- this.variantConverter.addStep(this.sourceString, getMethodName(), useBulk);
- return this;
- }
-
- @Override
- public GraphTraversalSource withPath() {
- this.variantConverter.addStep(this.sourceString, getMethodName());
- return this;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/47e71228/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/VariantGraphTraversalSourceTest.java
----------------------------------------------------------------------
diff --git a/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/VariantGraphTraversalSourceTest.java b/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/VariantGraphTraversalSourceTest.java
deleted file mode 100644
index 672eeca..0000000
--- a/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/VariantGraphTraversalSourceTest.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * 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.variant;
-
-import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
-import org.junit.Test;
-
-import java.lang.reflect.Method;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class VariantGraphTraversalSourceTest {
-
- private static Set<String> NO_GRAPH = new HashSet<>(Arrays.asList("clone", "iterate"));
-
- @Test
- public void variantGraphTraversalSourceShouldHaveMethodsOfGraphTraversalSource() {
- for (Method methodA : GraphTraversalSource.class.getMethods()) {
- if ((GraphTraversal.class.isAssignableFrom(methodA.getReturnType()) || GraphTraversalSource.class.isAssignableFrom(methodA.getReturnType())) && !NO_GRAPH.contains(methodA.getName())) {
- boolean found = false;
- final String methodAName = methodA.getName();
- final String methodAParameters = Arrays.asList(methodA.getParameterTypes()).toString();
- for (final Method methodB : VariantGraphTraversalSource.class.getDeclaredMethods()) {
- final String methodBName = methodB.getName();
- final String methodBParameters = Arrays.asList(methodB.getParameterTypes()).toString();
- if (methodAName.equals(methodBName) && methodAParameters.equals(methodBParameters))
- found = true;
- }
- if (!found)
- throw new IllegalStateException(VariantGraphTraversal.class.getSimpleName() + " is missing the following method: " + methodAName + ":" + methodAParameters);
- }
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/47e71228/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/VariantGraphTraversalTest.java
----------------------------------------------------------------------
diff --git a/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/VariantGraphTraversalTest.java b/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/VariantGraphTraversalTest.java
deleted file mode 100644
index fd4ad0d..0000000
--- a/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/VariantGraphTraversalTest.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * 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.variant;
-
-import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
-import org.junit.Test;
-
-import java.lang.reflect.Method;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class VariantGraphTraversalTest {
-
- private static Set<String> NO_GRAPH = new HashSet<>(Arrays.asList("asAdmin","iterate"));
-
- @Test
- public void variantGraphTraversalShouldHaveMethodsOfGraphTraversal() {
- for (Method methodA : GraphTraversal.class.getMethods()) {
- if (GraphTraversal.class.isAssignableFrom(methodA.getReturnType()) && !NO_GRAPH.contains(methodA.getName())) {
- boolean found = false;
- final String methodAName = methodA.getName();
- final String methodAParameters = Arrays.asList(methodA.getParameterTypes()).toString();
- for (final Method methodB : VariantGraphTraversal.class.getDeclaredMethods()) {
- final String methodBName = methodB.getName();
- final String methodBParameters = Arrays.asList(methodB.getParameterTypes()).toString();
- if (methodAName.equals(methodBName) && methodAParameters.equals(methodBParameters))
- found = true;
- }
- if (!found)
- throw new IllegalStateException(VariantGraphTraversal.class.getSimpleName() + " is missing the following method: " + methodAName + ":" + methodAParameters);
- }
- }
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/47e71228/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonProvider.java
----------------------------------------------------------------------
diff --git a/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonProvider.java b/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonProvider.java
index 067f3c8..2b2aeb0 100644
--- a/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonProvider.java
+++ b/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonProvider.java
@@ -20,8 +20,8 @@
package org.apache.tinkerpop.gremlin.process.variant.python;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.script.ScriptGraphTraversalSource;
import org.apache.tinkerpop.gremlin.process.variant.VariantGraphProvider;
-import org.apache.tinkerpop.gremlin.process.variant.VariantGraphTraversalSource;
import org.apache.tinkerpop.gremlin.structure.Graph;
/**
@@ -34,7 +34,7 @@ public class PythonProvider extends VariantGraphProvider {
return graph.traversal();
//throw new VerificationException("This test current does not work with Gremlin-Python", EmptyTraversal.instance());
else
- return new VariantGraphTraversalSource(new PythonVariantConverter(), graph, graph.traversal().getStrategies());
+ return new ScriptGraphTraversalSource(graph, graph.traversal().getStrategies(), new PythonTranslator("gremlin-groovy", "g"));
}
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/47e71228/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonVariantConverter.java
----------------------------------------------------------------------
diff --git a/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonVariantConverter.java b/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonVariantConverter.java
deleted file mode 100644
index d488bed..0000000
--- a/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonVariantConverter.java
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * 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.variant.python;
-
-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.Pop;
-import org.apache.tinkerpop.gremlin.process.traversal.SackFunctions;
-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.strategy.verification.VerificationException;
-import org.apache.tinkerpop.gremlin.process.traversal.util.ConnectiveP;
-import org.apache.tinkerpop.gremlin.process.traversal.util.EmptyTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.util.OrP;
-import org.apache.tinkerpop.gremlin.process.variant.VariantConverter;
-import org.apache.tinkerpop.gremlin.process.variant.VariantGraphTraversal;
-import org.apache.tinkerpop.gremlin.structure.Column;
-import org.apache.tinkerpop.gremlin.structure.Direction;
-import org.apache.tinkerpop.gremlin.structure.Element;
-import org.apache.tinkerpop.gremlin.structure.T;
-import org.apache.tinkerpop.gremlin.structure.VertexProperty;
-import org.apache.tinkerpop.gremlin.util.ScriptEngineCache;
-import org.apache.tinkerpop.gremlin.util.iterator.ArrayIterator;
-import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
-
-import javax.script.Bindings;
-import javax.script.ScriptContext;
-import javax.script.ScriptEngine;
-import javax.script.ScriptException;
-import javax.script.SimpleBindings;
-import java.io.File;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Random;
-import java.util.Set;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class PythonVariantConverter implements VariantConverter {
-
- private static ScriptEngine JYTHON_ENGINE = ScriptEngineCache.get("jython");
- private static boolean IMPORT_STATICS = new Random().nextBoolean();
-
- static {
- try {
- final String rootPackageName = (new File("gremlin-variant").exists() ? "gremlin-variant/" : "") + "src/main/jython/";
- final String gremlinPythonPackageName = rootPackageName + "/gremlin_python";
- final String gremlinDriverPackageName = rootPackageName + "/gremlin_driver";
- final String gremlinPythonModuleName = gremlinPythonPackageName + "/gremlin_python.py";
- GremlinPythonGenerator.create(gremlinPythonModuleName);
- JYTHON_ENGINE.eval("import sys");
- JYTHON_ENGINE.eval("sys.path.append('" + gremlinPythonPackageName + "')");
- JYTHON_ENGINE.eval("sys.path.append('" + gremlinDriverPackageName + "')");
- JYTHON_ENGINE.eval("from gremlin_python import *");
- JYTHON_ENGINE.eval("from gremlin_python import __");
- if (IMPORT_STATICS)
- JYTHON_ENGINE.eval("for k in statics:\n globals()[k] = statics[k]");
- } catch (final ScriptException e) {
- throw new IllegalStateException(e.getMessage(), e);
- }
- }
-
- private static final Set<String> STEP_NAMES = Stream.of(GraphTraversal.class.getMethods()).filter(method -> Traversal.class.isAssignableFrom(method.getReturnType())).map(Method::getName).collect(Collectors.toSet());
- private static final Set<String> PREFIX_NAMES = new HashSet<>(Arrays.asList("as", "in", "and", "or", "is", "not", "from", "global"));
- private static final Set<String> NO_STATIC = Stream.of(T.values(), Operator.values())
- .flatMap(arg -> IteratorUtils.stream(new ArrayIterator<>(arg)))
- .map(arg -> ((Enum) arg).name())
- .collect(Collectors.toCollection(() -> new HashSet<>(Arrays.asList("not"))));
-
-
- public String generateGremlinGroovy(final StringBuilder currentTraversal) throws ScriptException {
- //if (IMPORT_STATICS) assert !currentTraversal.toString().contains("__");
- if (currentTraversal.toString().contains("$"))
- throw new VerificationException("Lambdas are currently not supported: " + currentTraversal.toString(), EmptyTraversal.instance());
-
- final Bindings jythonBindings = new SimpleBindings();
- jythonBindings.put("g", JYTHON_ENGINE.eval("PythonGraphTraversalSource(\"g\", None)"));
- JYTHON_ENGINE.getContext().setBindings(jythonBindings, ScriptContext.GLOBAL_SCOPE);
- return JYTHON_ENGINE.eval(currentTraversal.toString()).toString();
- }
-
- @Override
- public void addStep(final StringBuilder currentTraversal, final String stepName, final Object... arguments) {
- // flatten the arguments into a single array
- final Object[] objects = Stream.of(arguments)
- .flatMap(arg ->
- IteratorUtils.stream(arg instanceof Object[] ?
- new ArrayIterator<>((Object[]) arg) :
- IteratorUtils.of(arg)))
- .toArray();
- if (objects.length == 0)
- currentTraversal.append(".").append(convertStepName(stepName)).append("()");
- else if (stepName.equals("range") && 2 == objects.length)
- currentTraversal.append("[").append(objects[0]).append(":").append(objects[1]).append("]");
- else if (stepName.equals("limit") && 1 == objects.length)
- currentTraversal.append("[0:").append(objects[0]).append("]");
- else if (stepName.equals("values") && 1 == objects.length && !currentTraversal.toString().equals("__") && !STEP_NAMES.contains(objects[0].toString()))
- currentTraversal.append(".").append(objects[0]);
- else {
- currentTraversal.append(".");
- String temp = convertStepName(stepName) + "(";
- for (final Object object : objects) {
- temp = temp + convertToString(object) + ",";
- }
- currentTraversal.append(temp.substring(0, temp.length() - 1) + ")");
- }
- if (IMPORT_STATICS && currentTraversal.toString().startsWith("__.")
- && !NO_STATIC.stream().filter(name -> currentTraversal.toString().contains(name)).findAny().isPresent())
- currentTraversal.delete(0, 3);
- if (!IMPORT_STATICS)
- assert currentTraversal.toString().startsWith("g.") || currentTraversal.toString().startsWith("__.");
- }
-
- private static String convertToString(final Object object) {
- if (object instanceof String)
- return "\"" + object + "\"";
- else if (object instanceof List) {
- final List list = new ArrayList<>(((List) object).size());
- for (final Object item : (List) object) {
- list.add(item instanceof String ? "'" + item + "'" : convertToString(item)); // hack
- }
- return list.toString();
- } else if (object instanceof Long)
- return object + "L";
- else if (object instanceof Class)
- return ((Class) object).getCanonicalName();
- else if (object instanceof SackFunctions.Barrier)
- return convertStatic("Barrier.") + object.toString();
- else if (object instanceof VertexProperty.Cardinality)
- return "Cardinality." + object.toString();
- else if (object instanceof Direction)
- return convertStatic("Direction.") + object.toString();
- else if (object instanceof Operator)
- return convertStatic("Operator.") + convertStepName(object.toString()); // to catch and/or
- else if (object instanceof Pop)
- return convertStatic("Pop.") + object.toString();
- else if (object instanceof Column)
- return convertStatic("Column.") + object.toString();
- else if (object instanceof P)
- return convertPToString((P) object, new StringBuilder()).toString();
- else if (object instanceof T)
- return convertStatic("T.") + object.toString();
- else if (object instanceof Order)
- return convertStatic("Order.") + object.toString();
- else if (object instanceof Scope)
- return convertStatic("Scope.") + convertStepName(object.toString()); // to catch global
- else if (object instanceof Element)
- return convertToString(((Element) object).id()); // hack
- else if (object instanceof VariantGraphTraversal)
- return ((VariantGraphTraversal) object).getVariantString().toString();
- else if (object instanceof Boolean)
- return object.equals(Boolean.TRUE) ? "True" : "False";
- else
- return null == object ? "" : object.toString();
- }
-
- private static String convertStatic(final String name) {
- return IMPORT_STATICS ? "" : name;
- }
-
- private static String convertStepName(final String stepName) {
- if (PREFIX_NAMES.contains(stepName))
- return "_" + stepName;
- else
- return stepName;
- }
-
- private static StringBuilder convertPToString(final P p, final StringBuilder current) {
- if (p instanceof ConnectiveP) {
- final List<P<?>> list = ((ConnectiveP) p).getPredicates();
- for (int i = 0; i < list.size(); i++) {
- convertPToString(list.get(i), current);
- if (i < list.size() - 1)
- current.append(p instanceof OrP ? "._or(" : "._and(");
- }
- current.append(")");
- } else
- current.append(convertStatic("P.")).append(p.getBiPredicate().toString()).append("(").append(convertToString(p.getValue())).append(")");
- return current;
- }
-}
[2/2] incubator-tinkerpop git commit: added
Graph.traversal(Translator). A translator is able to translate a Java
traversal into any other language -- for example -- gremlin-python. Moreover,
for doing scripts to RemoteGraph, we can simply do graph.trave
Posted by ok...@apache.org.
added Graph.traversal(Translator). A translator is able to translate a Java traversal into any other language -- for example -- gremlin-python. Moreover, for doing scripts to RemoteGraph, we can simply do graph.traversal(GroovyTranslator.of('g')) and the Java API will generate a Groovy string in the backend and then RemoteStrategy will send it as a ScriptTraversal which can contain lambdas (as they are still strings at this point). This translator work is now in gremlin-core as it use to be in gremlin-variant test/. Its generally useful beyond variants so its got center stage.
Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/47e71228
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/47e71228
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/47e71228
Branch: refs/heads/TINKERPOP-1278
Commit: 47e71228f3b13c8e409f838f22fbd6a61098460a
Parents: d175894
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Wed Jun 8 15:27:04 2016 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Wed Jun 8 15:27:04 2016 -0600
----------------------------------------------------------------------
.../dsl/graph/GraphTraversalSource.java | 4 +-
.../gremlin/process/traversal/dsl/graph/__.java | 9 +-
.../dsl/graph/script/ScriptGraphTraversal.java | 957 ++++++++++++++++++
.../script/ScriptGraphTraversalSource.java | 239 +++++
.../process/traversal/util/Translator.java | 44 +
.../tinkerpop/gremlin/structure/Graph.java | 7 +
.../script/ScriptGraphTraversalSourceTest.java | 58 ++
.../graph/script/ScriptGraphTraversalTest.java | 57 ++
.../AbstractImportCustomizerProvider.java | 2 +
.../traversal/dsl/graph/GroovyTranslator.java | 153 +++
.../variant/python/PythonTranslator.java | 258 +++++
.../process/variant/VariantConverter.java | 32 -
.../process/variant/VariantGraphTraversal.java | 968 -------------------
.../variant/VariantGraphTraversalSource.java | 219 -----
.../VariantGraphTraversalSourceTest.java | 56 --
.../variant/VariantGraphTraversalTest.java | 56 --
.../process/variant/python/PythonProvider.java | 4 +-
.../variant/python/PythonVariantConverter.java | 206 ----
18 files changed, 1785 insertions(+), 1544 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/47e71228/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSource.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSource.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSource.java
index ad33bf8..720d529 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSource.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSource.java
@@ -51,8 +51,8 @@ import java.util.function.UnaryOperator;
*/
public class GraphTraversalSource implements TraversalSource {
- private final Graph graph;
- private TraversalStrategies strategies;
+ protected final Graph graph;
+ protected TraversalStrategies strategies;
public GraphTraversalSource(final Graph graph, final TraversalStrategies traversalStrategies) {
this.graph = graph;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/47e71228/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java
index 21352cb..c4f83da 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java
@@ -51,16 +51,19 @@ import java.util.function.Supplier;
*/
public class __ {
- private static final boolean isTesting = Boolean.valueOf(System.getProperty("is.testing", "false"));
- public static Supplier<GraphTraversal> EMPTY_GRAPH_TRAVERSAL = () -> new DefaultGraphTraversal<>();
+ private static Supplier<GraphTraversal> ANONYMOUS_GRAPH_TRAVERSAL = null;
protected __() {
}
//////////////////////////////////////////////////////////////////////
+ public static void setAnonymousGraphTraversalSupplier(final Supplier<GraphTraversal> anonymousGraphTraversalSupplier) {
+ ANONYMOUS_GRAPH_TRAVERSAL = anonymousGraphTraversalSupplier;
+ }
+
public static <A> GraphTraversal<A, A> start() {
- return isTesting ? EMPTY_GRAPH_TRAVERSAL.get() : new DefaultGraphTraversal<>();
+ return null == ANONYMOUS_GRAPH_TRAVERSAL ? new DefaultGraphTraversal<>() : ANONYMOUS_GRAPH_TRAVERSAL.get();
}
public static <A> GraphTraversal<A, A> __(final A... starts) {
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/47e71228/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/script/ScriptGraphTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/script/ScriptGraphTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/script/ScriptGraphTraversal.java
new file mode 100644
index 0000000..3b890e5
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/script/ScriptGraphTraversal.java
@@ -0,0 +1,957 @@
+/*
+ * 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.dsl.graph.script;
+
+import org.apache.tinkerpop.gremlin.process.computer.VertexProgram;
+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.Pop;
+import org.apache.tinkerpop.gremlin.process.traversal.Scope;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
+import org.apache.tinkerpop.gremlin.process.traversal.util.Translator;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
+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.structure.Graph;
+import org.apache.tinkerpop.gremlin.structure.Property;
+import org.apache.tinkerpop.gremlin.structure.T;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.structure.VertexProperty;
+import org.apache.tinkerpop.gremlin.util.ScriptEngineCache;
+
+import javax.script.Bindings;
+import javax.script.ScriptEngine;
+import javax.script.SimpleBindings;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.function.BiFunction;
+import java.util.function.Consumer;
+import java.util.function.Function;
+import java.util.function.Predicate;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class ScriptGraphTraversal<S, E> extends DefaultGraphTraversal<S, E> {
+
+ protected Translator translator;
+
+ public ScriptGraphTraversal(final Graph graph, final Translator translator) {
+ super(graph);
+ this.translator = translator;
+ }
+
+ public String getTraversalScript() {
+ return this.translator.getTraversalScript();
+ }
+
+ @Override
+ public void applyStrategies() {
+ if (!(this.getParent() instanceof EmptyStep)) {
+ return;
+ }
+ try {
+ final String traversalScriptString = this.getTraversalScript();
+ __.setAnonymousGraphTraversalSupplier(null);
+ ScriptEngine engine = ScriptEngineCache.get(this.translator.getScriptEngine());
+ final Bindings bindings = new SimpleBindings();
+ bindings.put(this.translator.getAlias(), new GraphTraversalSource(this.getGraph().get(), this.getStrategies()));
+ Traversal.Admin<S, E> traversal = (Traversal.Admin<S, E>) engine.eval(traversalScriptString, bindings);
+ assert !traversal.isLocked();
+ this.sideEffects = traversal.getSideEffects();
+ this.strategies = traversal.getStrategies();
+ traversal.getSteps().forEach(step -> this.addStep(step));
+ super.applyStrategies();
+ } catch (final Exception e) {
+ throw new IllegalArgumentException(e.getMessage(), e);
+ }
+ }
+
+ private static String getMethodName() {
+ return Thread.currentThread().getStackTrace()[2].getMethodName();
+ }
+
+ //////////////////////////
+
+ public <E2> GraphTraversal<S, E2> map(final Function<Traverser<E>, E2> function) {
+ this.translator.addStep(getMethodName(), function);
+ return (GraphTraversal) this;
+ }
+
+ public <E2> GraphTraversal<S, E2> map(final Traversal<?, E2> mapTraversal) {
+ this.translator.addStep(getMethodName(), mapTraversal);
+ return (GraphTraversal) this;
+ }
+
+ public <E2> GraphTraversal<S, E2> flatMap(final Function<Traverser<E>, Iterator<E2>> function) {
+ this.translator.addStep(getMethodName(), function);
+ return (GraphTraversal) this;
+ }
+
+ public <E2> GraphTraversal<S, E2> flatMap(final Traversal<?, E2> flatMapTraversal) {
+ this.translator.addStep(getMethodName(), flatMapTraversal);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, Object> id() {
+ this.translator.addStep(getMethodName());
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, String> label() {
+ this.translator.addStep(getMethodName());
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> identity() {
+ this.translator.addStep(getMethodName());
+ return (GraphTraversal) this;
+ }
+
+ public <E2> GraphTraversal<S, E2> constant(final E2 e) {
+ this.translator.addStep(getMethodName(), e);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, Vertex> V(final Object... vertexIdsOrElements) {
+ this.translator.addStep(getMethodName(), vertexIdsOrElements);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, Vertex> to(final Direction direction, final String... edgeLabels) {
+ this.translator.addStep(getMethodName(), direction, edgeLabels);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, Vertex> out(final String... edgeLabels) {
+ this.translator.addStep(getMethodName(), edgeLabels);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, Vertex> in(final String... edgeLabels) {
+ this.translator.addStep(getMethodName(), edgeLabels);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, Vertex> both(final String... edgeLabels) {
+ this.translator.addStep(getMethodName(), edgeLabels);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, Edge> toE(final Direction direction, final String... edgeLabels) {
+ this.translator.addStep(getMethodName(), direction, edgeLabels);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, Edge> outE(final String... edgeLabels) {
+ this.translator.addStep(getMethodName(), edgeLabels);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, Edge> inE(final String... edgeLabels) {
+ this.translator.addStep(getMethodName(), edgeLabels);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, Edge> bothE(final String... edgeLabels) {
+ this.translator.addStep(getMethodName(), edgeLabels);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, Vertex> toV(final Direction direction) {
+ this.translator.addStep(getMethodName(), direction);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, Vertex> inV() {
+ this.translator.addStep(getMethodName());
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, Vertex> outV() {
+ this.translator.addStep(getMethodName());
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, Vertex> bothV() {
+ this.translator.addStep(getMethodName());
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, Vertex> otherV() {
+ this.translator.addStep(getMethodName());
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> order() {
+ this.translator.addStep(getMethodName());
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> order(final Scope scope) {
+ this.translator.addStep(getMethodName(), scope);
+ return (GraphTraversal) this;
+ }
+
+ public <E2> GraphTraversal<S, ? extends Property<E2>> properties(final String... propertyKeys) {
+ this.translator.addStep(getMethodName(), propertyKeys);
+ return (GraphTraversal) this;
+ }
+
+ public <E2> GraphTraversal<S, E2> values(final String... propertyKeys) {
+ this.translator.addStep(getMethodName(), propertyKeys);
+ return (GraphTraversal) this;
+ }
+
+ public <E2> GraphTraversal<S, Map<String, E2>> propertyMap(final String... propertyKeys) {
+ this.translator.addStep(getMethodName(), propertyKeys);
+ return (GraphTraversal) this;
+ }
+
+ public <E2> GraphTraversal<S, Map<String, E2>> valueMap(final String... propertyKeys) {
+ this.translator.addStep(getMethodName(), propertyKeys);
+ return (GraphTraversal) this;
+ }
+
+ public <E2> GraphTraversal<S, Map<String, E2>> valueMap(final boolean includeTokens, final String... propertyKeys) {
+ this.translator.addStep(getMethodName(), includeTokens, propertyKeys);
+ return (GraphTraversal) this;
+ }
+
+ public <E2> GraphTraversal<S, Collection<E2>> select(final Column column) {
+ this.translator.addStep(getMethodName(), column);
+ return (GraphTraversal) this;
+ }
+
+ @Deprecated
+ public <E2> GraphTraversal<S, E2> mapValues() {
+ this.translator.addStep(getMethodName());
+ return (GraphTraversal) this;
+ }
+
+ @Deprecated
+ public <E2> GraphTraversal<S, E2> mapKeys() {
+ this.translator.addStep(getMethodName());
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, String> key() {
+ this.translator.addStep(getMethodName());
+ return (GraphTraversal) this;
+ }
+
+ public <E2> GraphTraversal<S, E2> value() {
+ this.translator.addStep(getMethodName());
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, Path> path() {
+ this.translator.addStep(getMethodName());
+ return (GraphTraversal) this;
+ }
+
+ public <E2> GraphTraversal<S, Map<String, E2>> match(final Traversal<?, ?>... matchTraversals) {
+ this.translator.addStep(getMethodName(), matchTraversals);
+ return (GraphTraversal) this;
+ }
+
+ public <E2> GraphTraversal<S, E2> sack() {
+ this.translator.addStep(getMethodName());
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, Integer> loops() {
+ this.translator.addStep(getMethodName());
+ return (GraphTraversal) this;
+ }
+
+ public <E2> GraphTraversal<S, Map<String, E2>> project(final String projectKey, final String... otherProjectKeys) {
+ this.translator.addStep(getMethodName(), projectKey, otherProjectKeys);
+ return (GraphTraversal) this;
+ }
+
+ public <E2> GraphTraversal<S, Map<String, E2>> select(final Pop pop, final String selectKey1, final String selectKey2, String... otherSelectKeys) {
+ this.translator.addStep(getMethodName(), pop, selectKey1, selectKey2, otherSelectKeys);
+ return (GraphTraversal) this;
+ }
+
+ public <E2> GraphTraversal<S, Map<String, E2>> select(final String selectKey1, final String selectKey2, String... otherSelectKeys) {
+ this.translator.addStep(getMethodName(), selectKey1, selectKey2, otherSelectKeys);
+ return (GraphTraversal) this;
+ }
+
+ public <E2> GraphTraversal<S, E2> select(final Pop pop, final String selectKey) {
+ this.translator.addStep(getMethodName(), pop, selectKey);
+ return (GraphTraversal) this;
+ }
+
+ public <E2> GraphTraversal<S, E2> select(final String selectKey) {
+ this.translator.addStep(getMethodName(), selectKey);
+ return (GraphTraversal) this;
+ }
+
+ public <E2> GraphTraversal<S, E2> unfold() {
+ this.translator.addStep(getMethodName());
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, List<E>> fold() {
+ this.translator.addStep(getMethodName());
+ return (GraphTraversal) this;
+ }
+
+ public <E2> GraphTraversal<S, E2> fold(final E2 seed, final BiFunction<E2, E, E2> foldFunction) {
+ this.translator.addStep(getMethodName(), seed, foldFunction);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, Long> count() {
+ this.translator.addStep(getMethodName());
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, Long> count(final Scope scope) {
+ this.translator.addStep(getMethodName(), scope);
+ return (GraphTraversal) this;
+ }
+
+ public <E2 extends Number> GraphTraversal<S, E2> sum() {
+ this.translator.addStep(getMethodName());
+ return (GraphTraversal) this;
+ }
+
+ public <E2 extends Number> GraphTraversal<S, E2> sum(final Scope scope) {
+ this.translator.addStep(getMethodName(), scope);
+ return (GraphTraversal) this;
+ }
+
+ public <E2 extends Number> GraphTraversal<S, E2> max() {
+ this.translator.addStep(getMethodName());
+ return (GraphTraversal) this;
+ }
+
+ public <E2 extends Number> GraphTraversal<S, E2> max(final Scope scope) {
+ this.translator.addStep(getMethodName(), scope);
+ return (GraphTraversal) this;
+ }
+
+ public <E2 extends Number> GraphTraversal<S, E2> min() {
+ this.translator.addStep(getMethodName());
+ return (GraphTraversal) this;
+ }
+
+ public <E2 extends Number> GraphTraversal<S, E2> min(final Scope scope) {
+ this.translator.addStep(getMethodName(), scope);
+ return (GraphTraversal) this;
+ }
+
+ public <E2 extends Number> GraphTraversal<S, E2> mean() {
+ this.translator.addStep(getMethodName());
+ return (GraphTraversal) this;
+ }
+
+ public <E2 extends Number> GraphTraversal<S, E2> mean(final Scope scope) {
+ this.translator.addStep(getMethodName(), scope);
+ return (GraphTraversal) this;
+ }
+
+ public <K, V> GraphTraversal<S, Map<K, V>> group() {
+ this.translator.addStep(getMethodName());
+ return (GraphTraversal) this;
+ }
+
+ @Deprecated
+ public <K, V> GraphTraversal<S, Map<K, V>> groupV3d0() {
+ this.translator.addStep(getMethodName());
+ return (GraphTraversal) this;
+ }
+
+ public <K> GraphTraversal<S, Map<K, Long>> groupCount() {
+ this.translator.addStep(getMethodName());
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, Tree> tree() {
+ this.translator.addStep(getMethodName());
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, Vertex> addV(final String vertexLabel) {
+ this.translator.addStep(getMethodName(), vertexLabel);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, Vertex> addV() {
+ this.translator.addStep(getMethodName());
+ return (GraphTraversal) this;
+ }
+
+ @Deprecated
+ public GraphTraversal<S, Vertex> addV(final Object... propertyKeyValues) {
+ this.translator.addStep(getMethodName(), propertyKeyValues);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, Edge> addE(final String edgeLabel) {
+ this.translator.addStep(getMethodName(), edgeLabel);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> to(final String toStepLabel) {
+ this.translator.addStep(getMethodName(), toStepLabel);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> from(final String fromStepLabel) {
+ this.translator.addStep(getMethodName(), fromStepLabel);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> to(final Traversal<E, Vertex> toVertex) {
+ this.translator.addStep(getMethodName(), toVertex);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> from(final Traversal<E, Vertex> fromVertex) {
+ this.translator.addStep(getMethodName(), fromVertex);
+ return (GraphTraversal) this;
+ }
+
+ @Deprecated
+ public GraphTraversal<S, Edge> addE(final Direction direction, final String firstVertexKeyOrEdgeLabel, final String edgeLabelOrSecondVertexKey, final Object... propertyKeyValues) {
+ this.translator.addStep(getMethodName(), direction, firstVertexKeyOrEdgeLabel, edgeLabelOrSecondVertexKey, propertyKeyValues);
+ return (GraphTraversal) this;
+ }
+
+ @Deprecated
+ public GraphTraversal<S, Edge> addOutE(final String firstVertexKeyOrEdgeLabel, final String edgeLabelOrSecondVertexKey, final Object... propertyKeyValues) {
+ this.translator.addStep(getMethodName(), firstVertexKeyOrEdgeLabel, edgeLabelOrSecondVertexKey, propertyKeyValues);
+ return (GraphTraversal) this;
+ }
+
+ @Deprecated
+ public GraphTraversal<S, Edge> addInE(final String firstVertexKeyOrEdgeLabel, final String edgeLabelOrSecondVertexKey, final Object... propertyKeyValues) {
+ this.translator.addStep(getMethodName(), firstVertexKeyOrEdgeLabel, edgeLabelOrSecondVertexKey, propertyKeyValues);
+ return (GraphTraversal) this;
+ }
+
+ ///////////////////// FILTER STEPS /////////////////////
+
+ public GraphTraversal<S, E> filter(final Predicate<Traverser<E>> predicate) {
+ this.translator.addStep(getMethodName(), predicate);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> filter(final Traversal<?, ?> filterTraversal) {
+ this.translator.addStep(getMethodName(), filterTraversal);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> or(final Traversal<?, ?>... orTraversals) {
+ this.translator.addStep(getMethodName(), orTraversals);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> and(final Traversal<?, ?>... andTraversals) {
+ this.translator.addStep(getMethodName(), andTraversals);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> inject(final E... injections) {
+ this.translator.addStep(getMethodName(), injections);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> dedup(final Scope scope, final String... dedupLabels) {
+ this.translator.addStep(getMethodName(), scope, dedupLabels);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> dedup(final String... dedupLabels) {
+ this.translator.addStep(getMethodName(), dedupLabels);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> where(final String startKey, final P<String> predicate) {
+ this.translator.addStep(getMethodName(), startKey, predicate);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> where(final P<String> predicate) {
+ this.translator.addStep(getMethodName(), predicate);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> where(final Traversal<?, ?> whereTraversal) {
+ this.translator.addStep(getMethodName(), whereTraversal);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> has(final String propertyKey, final P<?> predicate) {
+ this.translator.addStep(getMethodName(), propertyKey, predicate);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> has(final T accessor, final P<?> predicate) {
+ this.translator.addStep(getMethodName(), accessor, predicate);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> has(final String propertyKey, final Object value) {
+ this.translator.addStep(getMethodName(), propertyKey, value);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> has(final T accessor, final Object value) {
+ this.translator.addStep(getMethodName(), accessor, value);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> has(final String label, final String propertyKey, final P<?> predicate) {
+ this.translator.addStep(getMethodName(), label, propertyKey, predicate);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> has(final String label, final String propertyKey, final Object value) {
+ this.translator.addStep(getMethodName(), label, propertyKey, value);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> has(final T accessor, final Traversal<?, ?> propertyTraversal) {
+ this.translator.addStep(getMethodName(), accessor, propertyTraversal);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> has(final String propertyKey, final Traversal<?, ?> propertyTraversal) {
+ this.translator.addStep(getMethodName(), propertyKey, propertyTraversal);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> has(final String propertyKey) {
+ this.translator.addStep(getMethodName(), propertyKey);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> hasNot(final String propertyKey) {
+ this.translator.addStep(getMethodName(), propertyKey);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> hasLabel(final String... labels) {
+ this.translator.addStep(getMethodName(), labels);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> hasId(final Object... ids) {
+ this.translator.addStep(getMethodName(), ids);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> hasKey(final String... keys) {
+ this.translator.addStep(getMethodName(), keys);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> hasValue(final Object... values) {
+ this.translator.addStep(getMethodName(), values);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> is(final P<E> predicate) {
+ this.translator.addStep(getMethodName(), predicate);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> is(final Object value) {
+ this.translator.addStep(getMethodName(), value);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> not(final Traversal<?, ?> notTraversal) {
+ this.translator.addStep(getMethodName(), notTraversal);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> coin(final double probability) {
+ this.translator.addStep(getMethodName(), probability);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> range(final long low, final long high) {
+ this.translator.addStep(getMethodName(), low, high);
+ return (GraphTraversal) this;
+ }
+
+ public <E2> GraphTraversal<S, E2> range(final Scope scope, final long low, final long high) {
+ this.translator.addStep(getMethodName(), scope, low, high);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> limit(final long limit) {
+ this.translator.addStep(getMethodName(), limit);
+ return (GraphTraversal) this;
+ }
+
+ public <E2> GraphTraversal<S, E2> limit(final Scope scope, final long limit) {
+ this.translator.addStep(getMethodName(), scope, limit);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> tail() {
+ this.translator.addStep(getMethodName());
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> tail(final long limit) {
+ this.translator.addStep(getMethodName(), limit);
+ return (GraphTraversal) this;
+ }
+
+ public <E2> GraphTraversal<S, E2> tail(final Scope scope) {
+ this.translator.addStep(getMethodName(), scope);
+ return (GraphTraversal) this;
+ }
+
+ public <E2> GraphTraversal<S, E2> tail(final Scope scope, final long limit) {
+ this.translator.addStep(getMethodName(), scope, limit);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> timeLimit(final long timeLimit) {
+ this.translator.addStep(getMethodName(), timeLimit);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> simplePath() {
+ this.translator.addStep(getMethodName());
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> cyclicPath() {
+ this.translator.addStep(getMethodName());
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> sample(final int amountToSample) {
+ this.translator.addStep(getMethodName(), amountToSample);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> sample(final Scope scope, final int amountToSample) {
+ this.translator.addStep(getMethodName(), scope, amountToSample);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> drop() {
+ this.translator.addStep(getMethodName());
+ return (GraphTraversal) this;
+ }
+
+ ///////////////////// SIDE-EFFECT STEPS /////////////////////
+
+ public GraphTraversal<S, E> sideEffect(final Consumer<Traverser<E>> consumer) {
+ this.translator.addStep(getMethodName(), consumer);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> sideEffect(final Traversal<?, ?> sideEffectTraversal) {
+ this.translator.addStep(getMethodName(), sideEffectTraversal);
+ return (GraphTraversal) this;
+ }
+
+ public <E2> GraphTraversal<S, E2> cap(final String sideEffectKey, final String... sideEffectKeys) {
+ this.translator.addStep(getMethodName(), sideEffectKey, sideEffectKeys);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, Edge> subgraph(final String sideEffectKey) {
+ this.translator.addStep(getMethodName(), sideEffectKey);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> aggregate(final String sideEffectKey) {
+ this.translator.addStep(getMethodName(), sideEffectKey);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> group(final String sideEffectKey) {
+ this.translator.addStep(getMethodName(), sideEffectKey);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> groupV3d0(final String sideEffectKey) {
+ this.translator.addStep(getMethodName(), sideEffectKey);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> groupCount(final String sideEffectKey) {
+ this.translator.addStep(getMethodName(), sideEffectKey);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> tree(final String sideEffectKey) {
+ this.translator.addStep(getMethodName(), sideEffectKey);
+ return (GraphTraversal) this;
+ }
+
+ public <V, U> GraphTraversal<S, E> sack(final BiFunction<V, U, V> sackOperator) {
+ this.translator.addStep(getMethodName(), sackOperator);
+ return (GraphTraversal) this;
+ }
+
+
+ @Deprecated
+ public <V, U> GraphTraversal<S, E> sack(final BiFunction<V, U, V> sackOperator, final String elementPropertyKey) {
+ this.translator.addStep(getMethodName(), sackOperator, elementPropertyKey);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> store(final String sideEffectKey) {
+ this.translator.addStep(getMethodName(), sideEffectKey);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> profile(final String sideEffectKey) {
+ this.translator.addStep(getMethodName(), sideEffectKey);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> property(final VertexProperty.Cardinality cardinality, final Object key, final Object value, final Object... keyValues) {
+ this.translator.addStep(getMethodName(), cardinality, key, value, keyValues);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> property(final Object key, final Object value, final Object... keyValues) {
+ this.translator.addStep(getMethodName(), key, value, keyValues);
+ return (GraphTraversal) this;
+ }
+
+ ///////////////////// BRANCH STEPS /////////////////////
+
+ public <M, E2> GraphTraversal<S, E2> branch(final Traversal<?, M> branchTraversal) {
+ this.translator.addStep(getMethodName(), branchTraversal);
+ return (GraphTraversal) this;
+ }
+
+ public <M, E2> GraphTraversal<S, E2> branch(final Function<Traverser<E>, M> function) {
+ this.translator.addStep(getMethodName(), function);
+ return (GraphTraversal) this;
+ }
+
+ public <M, E2> GraphTraversal<S, E2> choose(final Traversal<?, M> choiceTraversal) {
+ this.translator.addStep(getMethodName(), choiceTraversal);
+ return (GraphTraversal) this;
+ }
+
+ public <E2> GraphTraversal<S, E2> choose(final Traversal<?, ?> traversalPredicate,
+ final Traversal<?, E2> trueChoice, final Traversal<?, E2> falseChoice) {
+ this.translator.addStep(getMethodName(), traversalPredicate, trueChoice, falseChoice);
+ return (GraphTraversal) this;
+ }
+
+ public <M, E2> GraphTraversal<S, E2> choose(final Function<E, M> choiceFunction) {
+ this.translator.addStep(getMethodName(), choiceFunction);
+ return (GraphTraversal) this;
+ }
+
+ public <E2> GraphTraversal<S, E2> choose(final Predicate<E> choosePredicate,
+ final Traversal<?, E2> trueChoice, final Traversal<?, E2> falseChoice) {
+ this.translator.addStep(getMethodName(), choosePredicate, trueChoice, falseChoice);
+ return (GraphTraversal) this;
+ }
+
+ public <E2> GraphTraversal<S, E2> optional(final Traversal<?, E2> optionalTraversal) {
+ this.translator.addStep(getMethodName(), optionalTraversal);
+ return (GraphTraversal) this;
+ }
+
+ public <E2> GraphTraversal<S, E2> union(final Traversal<?, E2>... unionTraversals) {
+ this.translator.addStep(getMethodName(), unionTraversals);
+ return (GraphTraversal) this;
+ }
+
+ public <E2> GraphTraversal<S, E2> coalesce(final Traversal<?, E2>... coalesceTraversals) {
+ this.translator.addStep(getMethodName(), coalesceTraversals);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> repeat(final Traversal<?, E> repeatTraversal) {
+ this.translator.addStep(getMethodName(), repeatTraversal);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> emit(final Traversal<?, ?> emitTraversal) {
+ this.translator.addStep(getMethodName(), emitTraversal);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> emit(final Predicate<Traverser<E>> emitPredicate) {
+ this.translator.addStep(getMethodName(), emitPredicate);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> emit() {
+ this.translator.addStep(getMethodName());
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> until(final Traversal<?, ?> untilTraversal) {
+ this.translator.addStep(getMethodName(), untilTraversal);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> until(final Predicate<Traverser<E>> untilPredicate) {
+ this.translator.addStep(getMethodName(), untilPredicate);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> times(final int maxLoops) {
+ this.translator.addStep(getMethodName(), maxLoops);
+ return (GraphTraversal) this;
+ }
+
+ public <E2> GraphTraversal<S, E2> local(final Traversal<?, E2> localTraversal) {
+ this.translator.addStep(getMethodName(), localTraversal);
+ return (GraphTraversal) this;
+ }
+
+ /////////////////// VERTEX PROGRAM STEPS ////////////////
+
+ public GraphTraversal<S, E> pageRank() {
+ this.translator.addStep(getMethodName());
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> pageRank(final double alpha) {
+ this.translator.addStep(getMethodName(), alpha);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> peerPressure() {
+ this.translator.addStep(getMethodName());
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> program(final VertexProgram<?> vertexProgram) {
+ this.translator.addStep(getMethodName(), vertexProgram);
+ return (GraphTraversal) this;
+ }
+
+ ///////////////////// UTILITY STEPS /////////////////////
+
+ public GraphTraversal<S, E> as(final String stepLabel, final String... stepLabels) {
+ this.translator.addStep(getMethodName(), stepLabel, stepLabels);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> barrier() {
+ this.translator.addStep(getMethodName());
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> barrier(final int maxBarrierSize) {
+ this.translator.addStep(getMethodName(), maxBarrierSize);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> barrier(final Consumer<TraverserSet<Object>> barrierConsumer) {
+ this.translator.addStep(getMethodName(), barrierConsumer);
+ return (GraphTraversal) this;
+ }
+
+
+ //// BY-MODULATORS
+
+ public GraphTraversal<S, E> by() {
+ this.translator.addStep(getMethodName());
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> by(final Traversal<?, ?> traversal) {
+ this.translator.addStep(getMethodName(), traversal);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> by(final T token) {
+ this.translator.addStep(getMethodName(), token);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> by(final String key) {
+ this.translator.addStep(getMethodName(), key);
+ return (GraphTraversal) this;
+ }
+
+ public <V> GraphTraversal<S, E> by(final Function<V, Object> function) {
+ this.translator.addStep(getMethodName(), function);
+ return (GraphTraversal) this;
+ }
+
+ //// COMPARATOR BY-MODULATORS
+
+ public <V> GraphTraversal<S, E> by(final Traversal<?, ?> traversal, final Comparator<V> comparator) {
+ this.translator.addStep(getMethodName(), traversal, comparator);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> by(final Comparator<E> comparator) {
+ this.translator.addStep(getMethodName(), comparator);
+ return (GraphTraversal) this;
+ }
+
+ public GraphTraversal<S, E> by(final Order order) {
+ this.translator.addStep(getMethodName(), order);
+ return (GraphTraversal) this;
+ }
+
+ public <V> GraphTraversal<S, E> by(final String key, final Comparator<V> comparator) {
+ this.translator.addStep(getMethodName(), key, comparator);
+ return (GraphTraversal) this;
+ }
+
+ public <U> GraphTraversal<S, E> by(final Function<U, Object> function, final Comparator comparator) {
+ this.translator.addStep(getMethodName(), function, comparator);
+ return (GraphTraversal) this;
+ }
+
+ ////
+
+ public <M, E2> GraphTraversal<S, E> option(final M pickToken, final Traversal<E, E2> traversalOption) {
+ this.translator.addStep(getMethodName(), pickToken, traversalOption);
+ return (GraphTraversal) this;
+ }
+
+ public <E2> GraphTraversal<S, E> option(final Traversal<E, E2> traversalOption) {
+ this.translator.addStep(getMethodName(), traversalOption);
+ return (GraphTraversal) this;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/47e71228/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/script/ScriptGraphTraversalSource.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/script/ScriptGraphTraversalSource.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/script/ScriptGraphTraversalSource.java
new file mode 100644
index 0000000..9e0db74
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/script/ScriptGraphTraversalSource.java
@@ -0,0 +1,239 @@
+/*
+ * 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.dsl.graph.script;
+
+import org.apache.tinkerpop.gremlin.process.computer.Computer;
+import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
+import org.apache.tinkerpop.gremlin.process.traversal.util.Translator;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+import org.apache.tinkerpop.gremlin.structure.Transaction;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
+
+import java.util.function.BinaryOperator;
+import java.util.function.Supplier;
+import java.util.function.UnaryOperator;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class ScriptGraphTraversalSource extends GraphTraversalSource {
+
+ private final Translator<GraphTraversal> translator;
+
+ public ScriptGraphTraversalSource(final Graph graph, final TraversalStrategies traversalStrategies, final Translator<GraphTraversal> translator) {
+ super(graph, traversalStrategies);
+ this.translator = translator;
+ }
+
+ public ScriptGraphTraversalSource(final Graph graph, final Translator<GraphTraversal> translator) {
+ super(graph);
+ this.translator = translator;
+ }
+
+ @Override
+ public TraversalStrategies getStrategies() {
+ return this.strategies;
+ }
+
+ @Override
+ public Graph getGraph() {
+ return this.graph;
+ }
+
+ @Override
+ public GraphTraversalSource clone() {
+ final ScriptGraphTraversalSource clone = (ScriptGraphTraversalSource) super.clone();
+ clone.strategies = this.strategies.clone();
+ return clone;
+ }
+
+
+ //// CONFIGURATIONS
+
+ @Override
+ public GraphTraversalSource withComputer(final Computer computer) {
+ this.translator.addStrategy("withComputer", computer);
+ return this;
+ }
+
+ @Override
+ public GraphTraversalSource withComputer(final Class<? extends GraphComputer> graphComputerClass) {
+ this.translator.addStrategy("withComputer", graphComputerClass);
+ return this;
+ }
+
+ @Override
+ public GraphTraversalSource withComputer() {
+ this.translator.addStrategy("withComputer");
+ return this;
+ }
+
+ @Override
+ public GraphTraversalSource withStrategies(final TraversalStrategy... traversalStrategies) {
+ return super.withStrategies(traversalStrategies);
+ //this.translator.addStep("withStrategies", traversalStrategies);
+ }
+
+ @Override
+ @SuppressWarnings({"unchecked", "varargs"})
+ public GraphTraversalSource withoutStrategies(final Class<? extends TraversalStrategy>... traversalStrategyClasses) {
+ this.translator.addStrategy("withoutStrategies", traversalStrategyClasses);
+ return this;
+ }
+
+ @Override
+ public <A> GraphTraversalSource withSideEffect(final String key, final Supplier<A> initialValue, final BinaryOperator<A> reducer) {
+ this.translator.addStrategy("withSideEffect", key, initialValue, reducer);
+ return this;
+ }
+
+ @Override
+ public <A> GraphTraversalSource withSideEffect(final String key, final A initialValue, final BinaryOperator<A> reducer) {
+ this.translator.addStrategy("withSideEffect", key, initialValue, reducer);
+ return this;
+ }
+
+ @Override
+ public <A> GraphTraversalSource withSideEffect(final String key, final A initialValue) {
+ this.translator.addStrategy("withSideEffect", key, initialValue);
+ return this;
+ }
+
+ @Override
+ public <A> GraphTraversalSource withSideEffect(final String key, final Supplier<A> initialValue) {
+ this.translator.addStrategy("withSideEffect", key, initialValue);
+ return this;
+ }
+
+ @Override
+ public <A> GraphTraversalSource withSack(final Supplier<A> initialValue, final UnaryOperator<A> splitOperator, final BinaryOperator<A> mergeOperator) {
+ this.translator.addStrategy("withSack", initialValue, splitOperator, mergeOperator);
+ return this;
+ }
+
+ @Override
+ public <A> GraphTraversalSource withSack(final A initialValue, final UnaryOperator<A> splitOperator, final BinaryOperator<A> mergeOperator) {
+ this.translator.addStrategy("withSack", initialValue, splitOperator, mergeOperator);
+ return this;
+ }
+
+ @Override
+ public <A> GraphTraversalSource withSack(final A initialValue) {
+ this.translator.addStrategy("withSack", initialValue);
+ return this;
+ }
+
+ @Override
+ public <A> GraphTraversalSource withSack(final Supplier<A> initialValue) {
+ this.translator.addStrategy("withSack", initialValue);
+ return this;
+ }
+
+ @Override
+ public <A> GraphTraversalSource withSack(final Supplier<A> initialValue, final UnaryOperator<A> splitOperator) {
+ this.translator.addStrategy("withSack", initialValue, splitOperator);
+ return this;
+ }
+
+ @Override
+ public <A> GraphTraversalSource withSack(final A initialValue, final UnaryOperator<A> splitOperator) {
+ this.translator.addStrategy("withSack", initialValue, splitOperator);
+ return this;
+ }
+
+ @Override
+ public <A> GraphTraversalSource withSack(final Supplier<A> initialValue, final BinaryOperator<A> mergeOperator) {
+ this.translator.addStrategy("withSack", initialValue, mergeOperator);
+ return this;
+ }
+
+ @Override
+ public <A> GraphTraversalSource withSack(final A initialValue, final BinaryOperator<A> mergeOperator) {
+ this.translator.addStrategy("withSack", initialValue, mergeOperator);
+ return this;
+ }
+
+ public GraphTraversalSource withBulk(final boolean useBulk) {
+ this.translator.addStrategy("withBulk", useBulk);
+ return this;
+ }
+
+ public GraphTraversalSource withPath() {
+ this.translator.addStrategy("withPath");
+ return this;
+ }
+
+ //// SPAWNS
+
+ /**
+ * @deprecated As of release 3.1.0, replaced by {@link #addV()}
+ */
+ @Deprecated
+ public GraphTraversal<Vertex, Vertex> addV(final Object... keyValues) {
+ return this.generateTraversal("addV", keyValues);
+ }
+
+ public GraphTraversal<Vertex, Vertex> addV(final String label) {
+ return this.generateTraversal("addV", label);
+ }
+
+ public GraphTraversal<Vertex, Vertex> addV() {
+ return this.generateTraversal("addV");
+ }
+
+ public <S> GraphTraversal<S, S> inject(S... starts) {
+ return this.generateTraversal("inject", starts);
+ }
+
+ public GraphTraversal<Vertex, Vertex> V(final Object... vertexIds) {
+ return this.generateTraversal("V", vertexIds);
+ }
+
+ public GraphTraversal<Edge, Edge> E(final Object... edgesIds) {
+ return this.generateTraversal("E", edgesIds);
+ }
+
+ private GraphTraversal generateTraversal(final String stepName, final Object... arguments) {
+ __.setAnonymousGraphTraversalSupplier(this.translator::__);
+ final Translator clone = this.translator.clone();
+ clone.addStep(stepName, arguments);
+ final GraphTraversal traversal = new ScriptGraphTraversal(this.graph, clone);
+ traversal.asAdmin().setStrategies(this.strategies);
+ return traversal;
+ }
+
+
+ public Transaction tx() {
+ return this.graph.tx();
+ }
+
+
+ @Override
+ public String toString() {
+ return StringFactory.traversalSourceString(this);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/47e71228/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/Translator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/Translator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/Translator.java
new file mode 100644
index 0000000..e3438cb
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/Translator.java
@@ -0,0 +1,44 @@
+/*
+ * 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.util;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public interface Translator<V extends Traversal> extends Cloneable {
+
+ public String getScriptEngine();
+
+ public String getAlias();
+
+ public void addStep(final String stepName, final Object... arguments);
+
+ public default void addStrategy(final String strategyName, final Object... arguments) {
+ this.addStep(strategyName, arguments);
+ }
+
+ public V __();
+
+ public String getTraversalScript();
+
+ public Translator<V> clone();
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/47e71228/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/Graph.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/Graph.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/Graph.java
index 455b1a4..0e95d29 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/Graph.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/Graph.java
@@ -23,7 +23,10 @@ import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.script.ScriptGraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.util.Translator;
import org.apache.tinkerpop.gremlin.structure.io.Io;
import org.apache.tinkerpop.gremlin.structure.io.IoRegistry;
import org.apache.tinkerpop.gremlin.structure.util.FeatureDescriptor;
@@ -183,6 +186,10 @@ public interface Graph extends AutoCloseable, Host {
return new GraphTraversalSource(this);
}
+ public default GraphTraversalSource traversal(final Translator<GraphTraversal> translator) {
+ return new ScriptGraphTraversalSource(this, translator);
+ }
+
/**
* Get the {@link Vertex} objects in this graph with the provided vertex ids. If no ids are provided, get all
* vertices. Note that a vertex identifier does not need to correspond to the actual id used in the graph. It
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/47e71228/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/script/ScriptGraphTraversalSourceTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/script/ScriptGraphTraversalSourceTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/script/ScriptGraphTraversalSourceTest.java
new file mode 100644
index 0000000..fe7ad1f
--- /dev/null
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/script/ScriptGraphTraversalSourceTest.java
@@ -0,0 +1,58 @@
+/*
+ * 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.dsl.graph.script;
+
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.script.ScriptGraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.script.ScriptGraphTraversalSource;
+import org.junit.Test;
+
+import java.lang.reflect.Method;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class ScriptGraphTraversalSourceTest {
+
+ private static Set<String> NO_GRAPH = new HashSet<>(Arrays.asList("clone", "iterate"));
+
+ @Test
+ public void scriptGraphTraversalSourceShouldHaveMethodsOfGraphTraversalSource() {
+ for (Method methodA : GraphTraversalSource.class.getMethods()) {
+ if ((GraphTraversal.class.isAssignableFrom(methodA.getReturnType()) || GraphTraversalSource.class.isAssignableFrom(methodA.getReturnType())) && !NO_GRAPH.contains(methodA.getName())) {
+ boolean found = false;
+ final String methodAName = methodA.getName();
+ final String methodAParameters = Arrays.asList(methodA.getParameterTypes()).toString();
+ for (final Method methodB : ScriptGraphTraversalSource.class.getDeclaredMethods()) {
+ final String methodBName = methodB.getName();
+ final String methodBParameters = Arrays.asList(methodB.getParameterTypes()).toString();
+ if (methodAName.equals(methodBName) && methodAParameters.equals(methodBParameters))
+ found = true;
+ }
+ if (!found)
+ throw new IllegalStateException(ScriptGraphTraversal.class.getSimpleName() + " is missing the following method: " + methodAName + ":" + methodAParameters);
+ }
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/47e71228/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/script/ScriptGraphTraversalTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/script/ScriptGraphTraversalTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/script/ScriptGraphTraversalTest.java
new file mode 100644
index 0000000..8ce7f23
--- /dev/null
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/script/ScriptGraphTraversalTest.java
@@ -0,0 +1,57 @@
+/*
+ * 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.dsl.graph.script;
+
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.script.ScriptGraphTraversal;
+import org.junit.Test;
+
+import java.lang.reflect.Method;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class ScriptGraphTraversalTest {
+
+ private static Set<String> NO_GRAPH = new HashSet<>(Arrays.asList("asAdmin","iterate"));
+
+ @Test
+ public void scriptGraphTraversalShouldHaveMethodsOfGraphTraversal() {
+ for (Method methodA : GraphTraversal.class.getMethods()) {
+ if (GraphTraversal.class.isAssignableFrom(methodA.getReturnType()) && !NO_GRAPH.contains(methodA.getName())) {
+ boolean found = false;
+ final String methodAName = methodA.getName();
+ final String methodAParameters = Arrays.asList(methodA.getParameterTypes()).toString();
+ for (final Method methodB : ScriptGraphTraversal.class.getDeclaredMethods()) {
+ final String methodBName = methodB.getName();
+ final String methodBParameters = Arrays.asList(methodB.getParameterTypes()).toString();
+ if (methodAName.equals(methodBName) && methodAParameters.equals(methodBParameters))
+ found = true;
+ }
+ if (!found)
+ throw new IllegalStateException(ScriptGraphTraversal.class.getSimpleName() + " is missing the following method: " + methodAName + ":" + methodAParameters);
+ }
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/47e71228/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java
----------------------------------------------------------------------
diff --git a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java
index a6d3609..11400ba 100644
--- a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java
+++ b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java
@@ -23,6 +23,7 @@ import groovy.json.JsonBuilder;
import org.apache.commons.configuration.Configuration;
import org.apache.tinkerpop.gremlin.groovy.function.GFunction;
import org.apache.tinkerpop.gremlin.groovy.loaders.GremlinLoader;
+import org.apache.tinkerpop.gremlin.groovy.process.traversal.dsl.graph.GroovyTranslator;
import org.apache.tinkerpop.gremlin.process.computer.Computer;
import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
import org.apache.tinkerpop.gremlin.process.computer.bulkdumping.BulkDumperVertexProgram;
@@ -108,6 +109,7 @@ public abstract class AbstractImportCustomizerProvider implements ImportCustomiz
imports.add(VertexProgramStrategy.class.getPackage().getName() + DOT_STAR); // computer decoration strategies
imports.add(GraphFilterStrategy.class.getPackage().getName() + DOT_STAR); // computer optimization strategies
imports.add(Event.class.getPackage().getName() + DOT_STAR); // eventing
+ imports.add(GroovyTranslator.class.getPackage().getName() + DOT_STAR); // groovy translator
staticImports.add(P.class.getCanonicalName() + DOT_STAR);
staticImports.add(Order.class.getCanonicalName() + DOT_STAR);
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/47e71228/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/process/traversal/dsl/graph/GroovyTranslator.java
----------------------------------------------------------------------
diff --git a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/process/traversal/dsl/graph/GroovyTranslator.java b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/process/traversal/dsl/graph/GroovyTranslator.java
new file mode 100644
index 0000000..639fa04
--- /dev/null
+++ b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/process/traversal/dsl/graph/GroovyTranslator.java
@@ -0,0 +1,153 @@
+/*
+ * 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.groovy.process.traversal.dsl.graph;
+
+import org.apache.tinkerpop.gremlin.process.traversal.P;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.script.ScriptGraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.util.ConnectiveP;
+import org.apache.tinkerpop.gremlin.process.traversal.util.OrP;
+import org.apache.tinkerpop.gremlin.process.traversal.util.Translator;
+import org.apache.tinkerpop.gremlin.structure.Element;
+import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph;
+import org.apache.tinkerpop.gremlin.util.iterator.ArrayIterator;
+import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Stream;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class GroovyTranslator implements Translator<GraphTraversal> {
+
+ private StringBuilder traversalScript;
+ private final String alias;
+
+ public GroovyTranslator(final String alias) {
+ this.alias = alias;
+ this.traversalScript = new StringBuilder(this.alias);
+
+ }
+
+ @Override
+ public String getScriptEngine() {
+ return "gremlin-groovy";
+ }
+
+ @Override
+ public String getAlias() {
+ return this.alias;
+ }
+
+ @Override
+ public void addStep(final String stepName, final Object... arguments) {
+ // flatten the arguments into a single array
+ final Object[] objects = Stream.of(arguments)
+ .flatMap(arg ->
+ IteratorUtils.stream(arg instanceof Object[] ?
+ new ArrayIterator<>((Object[]) arg) :
+ IteratorUtils.of(arg)))
+ .toArray();
+ if (objects.length == 0)
+ this.traversalScript.append(".").append(stepName).append("()");
+ else {
+ this.traversalScript.append(".");
+ String temp = stepName + "(";
+ for (final Object object : objects) {
+ temp = temp + convertToString(object) + ",";
+ }
+ this.traversalScript.append(temp.substring(0, temp.length() - 1) + ")");
+ }
+ }
+
+ @Override
+ public GraphTraversal __() {
+ return new ScriptGraphTraversal(EmptyGraph.instance(), new GroovyTranslator("__"));
+ }
+
+ @Override
+ public String getTraversalScript() {
+ return this.traversalScript.toString();
+ }
+
+ @Override
+ public GroovyTranslator clone() {
+ try {
+ final GroovyTranslator clone = (GroovyTranslator) super.clone();
+ clone.traversalScript = new StringBuilder(this.traversalScript);
+ return clone;
+ } catch (final CloneNotSupportedException e) {
+ throw new IllegalStateException(e.getMessage(), e);
+ }
+ }
+
+ public static final GroovyTranslator of(final String alias) {
+ return new GroovyTranslator(alias);
+ }
+
+ ///////
+
+ private static String convertToString(final Object object) {
+ if (object instanceof String)
+ return "\"" + object + "\"";
+ else if (object instanceof List) {
+ final List list = new ArrayList<>(((List) object).size());
+ for (final Object item : (List) object) {
+ list.add(item instanceof String ? "'" + item + "'" : convertToString(item)); // hack
+ }
+ return list.toString();
+ } else if (object instanceof Long)
+ return object + "L";
+ else if (object instanceof Double)
+ return object + "d";
+ else if (object instanceof Float)
+ return object + "f";
+ else if (object instanceof Integer)
+ return "(int) " + object;
+ else if (object instanceof Class)
+ return ((Class) object).getCanonicalName();
+ else if (object instanceof P)
+ return convertPToString((P) object, new StringBuilder()).toString();
+ else if (object instanceof Enum)
+ return ((Enum) object).getDeclaringClass().getSimpleName() + "." + object.toString();
+ else if (object instanceof Element)
+ return convertToString(((Element) object).id()); // hack
+ else if (object instanceof ScriptGraphTraversal)
+ return ((ScriptGraphTraversal) object).getTraversalScript();
+ else
+ return null == object ? "null" : object.toString();
+ }
+
+ private static StringBuilder convertPToString(final P p, final StringBuilder current) {
+ if (p instanceof ConnectiveP) {
+ final List<P<?>> list = ((ConnectiveP) p).getPredicates();
+ for (int i = 0; i < list.size(); i++) {
+ convertPToString(list.get(i), current);
+ if (i < list.size() - 1)
+ current.append(p instanceof OrP ? "._or(" : "._and(");
+ }
+ current.append(")");
+ } else
+ current.append("P.").append(p.getBiPredicate().toString()).append("(").append(convertToString(p.getValue())).append(")");
+ return current;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/47e71228/gremlin-variant/src/main/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonTranslator.java
----------------------------------------------------------------------
diff --git a/gremlin-variant/src/main/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonTranslator.java b/gremlin-variant/src/main/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonTranslator.java
new file mode 100644
index 0000000..3a0dbee
--- /dev/null
+++ b/gremlin-variant/src/main/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonTranslator.java
@@ -0,0 +1,258 @@
+/*
+ * 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.variant.python;
+
+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.Pop;
+import org.apache.tinkerpop.gremlin.process.traversal.SackFunctions;
+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.script.ScriptGraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.VerificationException;
+import org.apache.tinkerpop.gremlin.process.traversal.util.ConnectiveP;
+import org.apache.tinkerpop.gremlin.process.traversal.util.EmptyTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.util.OrP;
+import org.apache.tinkerpop.gremlin.process.traversal.util.Translator;
+import org.apache.tinkerpop.gremlin.structure.Column;
+import org.apache.tinkerpop.gremlin.structure.Direction;
+import org.apache.tinkerpop.gremlin.structure.Element;
+import org.apache.tinkerpop.gremlin.structure.T;
+import org.apache.tinkerpop.gremlin.structure.VertexProperty;
+import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph;
+import org.apache.tinkerpop.gremlin.util.ScriptEngineCache;
+import org.apache.tinkerpop.gremlin.util.iterator.ArrayIterator;
+import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
+
+import javax.script.Bindings;
+import javax.script.ScriptContext;
+import javax.script.ScriptEngine;
+import javax.script.ScriptException;
+import javax.script.SimpleBindings;
+import java.io.File;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Random;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class PythonTranslator implements Translator<GraphTraversal> {
+
+ private static boolean isTesting = Boolean.valueOf(System.getProperty("is.testing", "false"));
+ private static ScriptEngine JYTHON_ENGINE;
+ private static boolean IMPORT_STATICS = false;
+ ////
+ private static final Set<String> STEP_NAMES = Stream.of(GraphTraversal.class.getMethods()).filter(method -> Traversal.class.isAssignableFrom(method.getReturnType())).map(Method::getName).collect(Collectors.toSet());
+ private static final Set<String> PREFIX_NAMES = new HashSet<>(Arrays.asList("as", "in", "and", "or", "is", "not", "from", "global"));
+ private static final Set<String> NO_STATIC = Stream.of(T.values(), Operator.values())
+ .flatMap(arg -> IteratorUtils.stream(new ArrayIterator<>(arg)))
+ .map(arg -> ((Enum) arg).name())
+ .collect(Collectors.toCollection(() -> new HashSet<>(Arrays.asList("not"))));
+
+ static {
+ if (isTesting) {
+ IMPORT_STATICS = new Random().nextBoolean();
+ try {
+ final String rootPackageName = (new File("gremlin-variant").exists() ? "gremlin-variant/" : "") + "src/main/jython/";
+ final String gremlinPythonPackageName = rootPackageName + "/gremlin_python";
+ final String gremlinDriverPackageName = rootPackageName + "/gremlin_driver";
+ final String gremlinPythonModuleName = gremlinPythonPackageName + "/gremlin_python.py";
+ GremlinPythonGenerator.create(gremlinPythonModuleName);
+ JYTHON_ENGINE = ScriptEngineCache.get("jython");
+ JYTHON_ENGINE.eval("import sys");
+ JYTHON_ENGINE.eval("sys.path.append('" + gremlinPythonPackageName + "')");
+ JYTHON_ENGINE.eval("sys.path.append('" + gremlinDriverPackageName + "')");
+ JYTHON_ENGINE.eval("from gremlin_python import *");
+ JYTHON_ENGINE.eval("from gremlin_python import __");
+ if (IMPORT_STATICS)
+ JYTHON_ENGINE.eval("for k in statics:\n globals()[k] = statics[k]");
+ } catch (final ScriptException e) {
+ throw new IllegalStateException(e.getMessage(), e);
+ }
+ }
+ }
+
+ private StringBuilder traversalScript;
+ private final String alias;
+ private final String scriptEngine;
+
+ public PythonTranslator(final String scriptEngine, final String alias) {
+ this.scriptEngine = scriptEngine;
+ this.alias = alias;
+ this.traversalScript = new StringBuilder(this.alias);
+ }
+
+ @Override
+ public String getAlias() {
+ return this.alias;
+ }
+
+ @Override
+ public String getScriptEngine() {
+ return this.scriptEngine;
+ }
+
+ @Override
+ public GraphTraversal __() {
+ return new ScriptGraphTraversal(EmptyGraph.instance(), new PythonTranslator(this.scriptEngine, "__"));
+ }
+
+ @Override
+ public String getTraversalScript() {
+ if (isTesting && !this.alias.equals("__")) {
+ try {
+ if (traversalScript.toString().contains("$"))
+ throw new VerificationException("Lambdas are currently not supported: " + this.traversalScript.toString(), EmptyTraversal.instance());
+
+ final Bindings jythonBindings = new SimpleBindings();
+ jythonBindings.put(this.alias, JYTHON_ENGINE.eval("PythonGraphTraversalSource(\"" + this.alias + "\", None)"));
+ JYTHON_ENGINE.getContext().setBindings(jythonBindings, ScriptContext.GLOBAL_SCOPE);
+ return JYTHON_ENGINE.eval(this.traversalScript.toString()).toString();
+ } catch (final ScriptException e) {
+ throw new IllegalArgumentException(e.getMessage(), e);
+ }
+ } else {
+ return this.traversalScript.toString();
+ }
+ }
+
+ @Override
+ public void addStep(final String stepName, final Object... arguments) {
+ // flatten the arguments into a single array
+ final Object[] objects = Stream.of(arguments)
+ .flatMap(arg ->
+ IteratorUtils.stream(arg instanceof Object[] ?
+ new ArrayIterator<>((Object[]) arg) :
+ IteratorUtils.of(arg)))
+ .toArray();
+ if (objects.length == 0)
+ this.traversalScript.append(".").append(convertStepName(stepName)).append("()");
+ else if (stepName.equals("range") && 2 == objects.length)
+ this.traversalScript.append("[").append(objects[0]).append(":").append(objects[1]).append("]");
+ else if (stepName.equals("limit") && 1 == objects.length)
+ this.traversalScript.append("[0:").append(objects[0]).append("]");
+ else if (stepName.equals("values") && 1 == objects.length && !traversalScript.toString().equals("__") && !STEP_NAMES.contains(objects[0].toString()))
+ this.traversalScript.append(".").append(objects[0]);
+ else {
+ this.traversalScript.append(".");
+ String temp = convertStepName(stepName) + "(";
+ for (final Object object : objects) {
+ temp = temp + convertToString(object) + ",";
+ }
+ this.traversalScript.append(temp.substring(0, temp.length() - 1)).append(")");
+ }
+ if (IMPORT_STATICS && this.traversalScript.toString().startsWith("__.")
+ && !NO_STATIC.stream().filter(name -> this.traversalScript.toString().contains(name)).findAny().isPresent())
+ traversalScript.delete(0, 3);
+ if (isTesting && !IMPORT_STATICS)
+ assert this.traversalScript.toString().startsWith(this.alias + ".");
+ }
+
+ @Override
+ public PythonTranslator clone() {
+ try {
+ final PythonTranslator clone = (PythonTranslator) super.clone();
+ clone.traversalScript = new StringBuilder(this.traversalScript);
+ return clone;
+ } catch (final CloneNotSupportedException e) {
+ throw new IllegalStateException(e.getMessage(), e);
+ }
+ }
+
+ ///////
+
+ private static String convertToString(final Object object) {
+ if (object instanceof String)
+ return "\"" + object + "\"";
+ else if (object instanceof List) {
+ final List list = new ArrayList<>(((List) object).size());
+ for (final Object item : (List) object) {
+ list.add(item instanceof String ? "'" + item + "'" : convertToString(item)); // hack
+ }
+ return list.toString();
+ } else if (object instanceof Long)
+ return object + "L";
+ else if (object instanceof Class)
+ return ((Class) object).getCanonicalName();
+ else if (object instanceof SackFunctions.Barrier)
+ return convertStatic("Barrier.") + object.toString();
+ else if (object instanceof VertexProperty.Cardinality)
+ return "Cardinality." + object.toString();
+ else if (object instanceof Direction)
+ return convertStatic("Direction.") + object.toString();
+ else if (object instanceof Operator)
+ return convertStatic("Operator.") + convertStepName(object.toString()); // to catch and/or
+ else if (object instanceof Pop)
+ return convertStatic("Pop.") + object.toString();
+ else if (object instanceof Column)
+ return convertStatic("Column.") + object.toString();
+ else if (object instanceof P)
+ return convertPToString((P) object, new StringBuilder()).toString();
+ else if (object instanceof T)
+ return convertStatic("T.") + object.toString();
+ else if (object instanceof Order)
+ return convertStatic("Order.") + object.toString();
+ else if (object instanceof Scope)
+ return convertStatic("Scope.") + convertStepName(object.toString()); // to catch global
+ else if (object instanceof Element)
+ return convertToString(((Element) object).id()); // hack
+ else if (object instanceof ScriptGraphTraversal)
+ return ((ScriptGraphTraversal) object).getTraversalScript().toString();
+ else if (object instanceof Boolean)
+ return object.equals(Boolean.TRUE) ? "True" : "False";
+ else
+ return null == object ? "" : object.toString();
+ }
+
+ private static String convertStatic(final String name) {
+ return IMPORT_STATICS ? "" : name;
+ }
+
+ private static String convertStepName(final String stepName) {
+ if (PREFIX_NAMES.contains(stepName))
+ return "_" + stepName;
+ else
+ return stepName;
+ }
+
+ private static StringBuilder convertPToString(final P p, final StringBuilder current) {
+ if (p instanceof ConnectiveP) {
+ final List<P<?>> list = ((ConnectiveP) p).getPredicates();
+ for (int i = 0; i < list.size(); i++) {
+ convertPToString(list.get(i), current);
+ if (i < list.size() - 1)
+ current.append(p instanceof OrP ? "._or(" : "._and(");
+ }
+ current.append(")");
+ } else
+ current.append(convertStatic("P.")).append(p.getBiPredicate().toString()).append("(").append(convertToString(p.getValue())).append(")");
+ return current;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/47e71228/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/VariantConverter.java
----------------------------------------------------------------------
diff --git a/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/VariantConverter.java b/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/VariantConverter.java
deleted file mode 100644
index 110a1ef..0000000
--- a/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/VariantConverter.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * 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.variant;
-
-import javax.script.ScriptException;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public interface VariantConverter {
-
- public void addStep(final StringBuilder currentTraversal, final String stepName, final Object... arguments);
-
- public String generateGremlinGroovy(final StringBuilder currentTraversal) throws ScriptException;
-}