TINKERPOP-1878 Major refactoring of sparql-gremlin classes

Renamed the "compiler" to a "transpiler" since it's really transforming sparql 
to a language of a similar level of abstraction in Gremlin. Lots of code 
reformatting and dead code pruning.


Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/c4a2c7e1
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/c4a2c7e1
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/c4a2c7e1

Branch: refs/heads/TINKERPOP-1878
Commit: c4a2c7e1093cb18fe1085b52e6036df860114388
Parents: a1b1a58
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Fri Jan 26 13:36:29 2018 -0500
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Thu Aug 2 06:49:16 2018 -0400

----------------------------------------------------------------------
 .../gremlin/sparql/SparqlToGremlinCompiler.java | 381 -------------------
 .../sparql/SparqlToGremlinTranspiler.java       | 286 ++++++++++++++
 .../gremlin/sparql/TraversalBuilder.java        |   7 +-
 .../gremlin/sparql/WhereTraversalBuilder.java   |  66 ++--
 .../traversal/strategy/SparqlStrategy.java      |   5 +-
 5 files changed, 322 insertions(+), 423 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/c4a2c7e1/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/SparqlToGremlinCompiler.java
----------------------------------------------------------------------
diff --git 
a/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/SparqlToGremlinCompiler.java
 
b/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/SparqlToGremlinCompiler.java
deleted file mode 100644
index adb36e9..0000000
--- 
a/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/SparqlToGremlinCompiler.java
+++ /dev/null
@@ -1,381 +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.sparql;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.apache.jena.graph.Triple;
-import org.apache.jena.query.Query;
-import org.apache.jena.query.QueryFactory;
-import org.apache.jena.query.SortCondition;
-import org.apache.jena.query.Syntax;
-import org.apache.jena.sparql.algebra.Algebra;
-import org.apache.jena.sparql.algebra.Op;
-import org.apache.jena.sparql.algebra.OpVisitorBase;
-import org.apache.jena.sparql.algebra.OpWalker;
-import org.apache.jena.sparql.algebra.op.OpBGP;
-import org.apache.jena.sparql.algebra.op.OpFilter;
-import org.apache.jena.sparql.algebra.op.OpLeftJoin;
-import org.apache.jena.sparql.algebra.op.OpUnion;
-import org.apache.jena.sparql.core.Var;
-import org.apache.jena.sparql.core.VarExprList;
-import org.apache.jena.sparql.expr.Expr;
-import org.apache.jena.sparql.expr.ExprAggregator;
-import org.apache.tinkerpop.gremlin.process.traversal.Order;
-import org.apache.tinkerpop.gremlin.process.traversal.Scope;
-import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
-import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
-import 
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
-import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
-import org.apache.tinkerpop.gremlin.structure.Graph;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-
-// TODO: implement OpVisitor, don't extend OpVisitorBase
-public class SparqlToGremlinCompiler extends OpVisitorBase {
-
-       private GraphTraversal<Vertex, ?> traversal;
-
-       List<Traversal> traversalList = new ArrayList<Traversal>();
-
-       String groupVariable = "";
-       int sortingDirection = 0;
-       long offsetLimit = 0;
-       String sortingVariable = "";
-
-       GraphTraversalSource temp;
-       Graph graph;
-
-       private SparqlToGremlinCompiler(final GraphTraversal<Vertex, ?> 
traversal) {
-               this.traversal = traversal;
-       }
-
-       private SparqlToGremlinCompiler(final GraphTraversalSource g) {
-               this(g.V());
-               temp = g;
-
-       }
-
-       private SparqlToGremlinCompiler(final Graph g) {
-               this.traversal = (GraphTraversal<Vertex, ?>) g.traversal();
-               graph = g;
-       }
-
-       public String createMatchStep(String step) {
-               String st = "";
-               step = step.substring(1, step.length() - 2);
-               String first = step.substring(0, step.indexOf(","));
-               String second = step.substring(step.indexOf(",") + 1);
-               //System.out.println("First : " + first);
-               //System.out.println("Second : " + second);
-               st = first.substring(first.indexOf("["), first.length() - 1);
-               st = "[" + st + "," + second + "]";
-               return st;
-       }
-
-       GraphTraversal<Vertex, ?> convertToGremlinTraversal(final Query query) {
-               
-               // long startTime = System.currentTimeMillis();
-               // long endTime;
-               final Op op = Algebra.compile(query); // SPARQL query compiles 
here to
-                                                                               
                // OP
-//             System.out.println("OP Tree: " + op.toString());
-
-               
-               OpWalker.walk(op, this); // OP is being walked here
-               
-               
-               
-               
-               //System.out.println("time taken for opWalker:"+ 
(endTime-startTime));
-               // startTime = System.currentTimeMillis();
-               int traversalIndex = 0;
-               int numberOfTraversal = traversalList.size();
-               Traversal arrayOfAllTraversals[] = new 
Traversal[numberOfTraversal];
-
-               if (query.hasOrderBy() && !query.hasGroupBy()) {
-                       List<SortCondition> sortingConditions = 
query.getOrderBy();
-                       int directionOfSort = 0;
-
-                       for (SortCondition sortCondition : sortingConditions) {
-                               Expr expr = sortCondition.getExpression();
-                               directionOfSort = sortCondition.getDirection();
-                               sortingVariable = expr.getVarName();
-
-                       }
-
-                       Order orderDirection = Order.incr;
-                       if (directionOfSort == -1) {
-                               orderDirection = Order.decr;
-                       }
-               }
-               for (Traversal tempTrav : traversalList) {
-
-                       arrayOfAllTraversals[traversalIndex++] = tempTrav;
-               }
-
-               int directionOfSort = 0;
-               Order orderDirection = Order.incr;
-               if (query.hasOrderBy()) {
-                       List<SortCondition> sortingConditions = 
query.getOrderBy();
-
-                       //
-                       for (SortCondition sortCondition : sortingConditions) {
-                               Expr expr = sortCondition.getExpression();
-                               directionOfSort = sortCondition.getDirection();
-                               sortingVariable = expr.getVarName();
-//                             System.out.println("order by var: 
"+sortingDirection);
-                       }
-                       //
-
-                       if (directionOfSort == -1) {
-                               orderDirection = Order.decr;
-                       }
-
-               }
-
-               if (traversalList.size() > 0)
-                       traversal = traversal.match(arrayOfAllTraversals);
-
-               final List<String> vars = query.getResultVars();
-               List<ExprAggregator> lstexpr = query.getAggregators();
-               if (!query.isQueryResultStar() && !query.hasGroupBy()) {
-
-                       switch (vars.size()) {
-                       case 0:
-                               throw new IllegalStateException();
-                       case 1:
-                               if (query.isDistinct()) {
-//                                     System.out.println("Inside 
------------------- >Select 1------------------------> Distinct");
-                                       traversal = 
traversal.dedup(vars.get(0));
-                               }
-                               if (query.hasOrderBy()) {
-//                                     System.out.println("Inside 
------------------- >Select 1");
-                                       traversal = 
traversal.order().by(sortingVariable, orderDirection);
-                               } else {
-
-                                       traversal = 
traversal.select(vars.get(0));
-                               }
-                               break;
-                       case 2:
-                               if (query.isDistinct()) {
-                                       traversal = 
traversal.dedup(vars.get(0), vars.get(1));
-                               }
-                               if (query.hasOrderBy()) {
-//                                     System.out.println("Inside 
------------------- >Select 1");
-                                       traversal = 
traversal.order().by(__.select(vars.get(0)), 
orderDirection).by(__.select(vars.get(1)));
-                               } else
-                                       traversal = 
traversal.select(vars.get(0), vars.get(1));
-                               break;
-                       default:
-                               final String[] all = new String[vars.size()];
-                               vars.toArray(all);
-                               if (query.isDistinct()) {
-
-                                       traversal = traversal.dedup(all);
-                               }
-                               final String[] others = Arrays.copyOfRange(all, 
2, vars.size());
-                               if (query.hasOrderBy()) {
-
-                                       traversal = 
traversal.order().by(__.select(vars.get(0)), 
orderDirection).by(__.select(vars.get(1)));
-
-                               } else
-                                       traversal = 
traversal.select(vars.get(0), vars.get(1), others);
-
-                               break;
-                       }
-
-               }
-               
-               
-               if (query.hasGroupBy()) {
-                       VarExprList lstExpr = query.getGroupBy();
-                       String grpVar = "";
-                       Traversal tempTrav;
-                       for (Var expr : lstExpr.getVars()) {
-                               grpVar = expr.getName();
-                               // System.out.println("The Group by var: " + 
expr.getName());
-                       }
-
-                       if (query.hasLimit()) {
-                               long limit = query.getLimit(), offset = 0;
-
-                               if (query.hasOffset()) {
-                                       offset = query.getOffset();
-
-                               }
-                               // if (query.hasGroupBy() && query.hasOrderBy())
-                               // traversal = traversal.range( offset, offset 
+ limit);
-                               // else
-                               // traversal = traversal.range(offset, offset + 
limit);
-
-                       }
-
-                       if (!grpVar.isEmpty())
-                               traversal = traversal.select(grpVar);
-                       if (query.hasAggregators()) {
-                               List<ExprAggregator> exprAgg = 
query.getAggregators();
-                               for (ExprAggregator expr : exprAgg) {
-
-//                                     System.out.println("The Aggregator by 
var: " + expr.getAggregator().getExprList().toString()
-//                                                     + " is :" + 
expr.getAggregator().toString());
-                                       if 
(expr.getAggregator().getName().contains("COUNT")) {
-                                               if 
(!query.toString().contains("GROUP")) {
-                                                       if 
(expr.getAggregator().toString().contains("DISTINCT")) {
-                                                               traversal = 
traversal
-                                                                               
.dedup(expr.getAggregator().getExprList().get(0).toString().substring(1));
-                                                       } else {
-                                                               traversal = 
traversal
-                                                                               
.select(expr.getAggregator().getExprList().get(0).toString().substring(1));
-                                                       }
-                                                       traversal = 
traversal.count();
-                                               } else
-                                                       traversal = 
traversal.groupCount();
-                                       }
-                                       if 
(expr.getAggregator().getName().contains("MAX")) {
-                                               traversal = traversal.max();
-                                       }
-                               }
-
-                       } else {
-
-                               traversal = traversal.group();
-                       }
-                       
-                       
-               }
-
-
-               if (query.hasOrderBy() && query.hasGroupBy()) {
-
-                       traversal = traversal.order().by(sortingVariable, 
orderDirection);
-               }
-               if (query.hasLimit()) {
-                       long limit = query.getLimit(), offset = 0;
-
-                       if (query.hasOffset()) {
-                               offset = query.getOffset();
-
-                       }
-                       if (query.hasGroupBy() && query.hasOrderBy())
-                               traversal = traversal.range(Scope.local, 
offset, offset + limit);
-                       else
-                               traversal = traversal.range(offset, offset + 
limit);
-
-               }
-               // endTime = System.currentTimeMillis();
-               // System.out.println("time taken for convertToGremlinTraversal 
Function : "+ (endTime-startTime)+" mili seconds");
-               
-               return traversal;
-       }
-
-       private static GraphTraversal<Vertex, ?> 
convertToGremlinTraversal(final GraphTraversalSource g,
-                       final Query query) {
-               return new 
SparqlToGremlinCompiler(g).convertToGremlinTraversal(query);
-       }
-
-       public static GraphTraversal<Vertex, ?> convertToGremlinTraversal(final 
Graph graph, final String query) {
-               return convertToGremlinTraversal(graph.traversal(),     
QueryFactory.create(Prefixes.prepend(query)));
-       }
-
-       public static GraphTraversal<Vertex, ?> convertToGremlinTraversal(final 
GraphTraversalSource g,
-                       final String query) {
-               return convertToGremlinTraversal(g, 
QueryFactory.create(Prefixes.prepend(query), Syntax.syntaxSPARQL));
-       }
-
-       // VISITING SPARQL ALGEBRA OP BASIC TRIPLE PATTERNS - MAYBE
-       @Override
-       public void visit(final OpBGP opBGP) {
-               {
-                       
-                       // System.out.println("Inside opBGP 
---------------------------------------------->");
-                       final List<Triple> triples = 
opBGP.getPattern().getList();
-                       final Traversal[] matchTraversals = new 
Traversal[triples.size()];
-                       int i = 0;
-                       for (final Triple triple : triples) {
-
-                               matchTraversals[i++] = 
TraversalBuilder.transform(triple);
-                               traversalList.add(matchTraversals[i - 1]);
-                       }
-
-               }
-
-       }
-
-       // VISITING SPARQL ALGEBRA OP FILTER - MAYBE
-       @Override
-       public void visit(final OpFilter opFilter) {
-
-               // System.out.println("Inside opFilter 
---------------------------------------------->");
-               Traversal traversal = null;
-
-               for (Expr expr : opFilter.getExprs().getList()) {
-                       if (expr != null) {
-
-                               traversal = 
__.where(WhereTraversalBuilder.transform(expr));
-                               traversalList.add(traversal);
-                       }
-               }
-
-       }
-       // TODO: add more functions for operators other than FILTER, such as
-       // OPTIONAL
-       // This can be done by understanding how Jena handles these other
-       // operators/filters inherently and then map them to Gremlin
-
-       public void visit(final OpLeftJoin opLeftJoin) {
-
-//             System.out.println("Inside opOptional 
---------------------------------------------->");
-//             System.out.println(opLeftJoin.getRight().toString());
-
-       }
-
-       @Override
-       public void visit(final OpUnion opUnion) {
-
-               // System.out.println("Inside opUnion 
---------------------------------------------->");
-               Traversal unionTemp[] = new Traversal[2];
-               Traversal unionTemp1[] = new Traversal[traversalList.size() / 
2];
-               Traversal unionTemp2[] = new Traversal[traversalList.size() / 
2];
-
-               int count = 0;
-
-               for (int i = 0; i < traversalList.size(); i++) {
-
-                       if (i < traversalList.size() / 2) {
-
-                               unionTemp1[i] = traversalList.get(i);
-                       } else {
-                               unionTemp2[count++] = traversalList.get(i);
-                       }
-               }
-
-               unionTemp[1] = __.match(unionTemp2);
-               unionTemp[0] = __.match(unionTemp1);
-
-               traversalList.clear();
-               traversal = (GraphTraversal<Vertex, ?>) 
traversal.union(unionTemp);
-               // System.out.println("Getting out from Union 
-------------------> :
-               // "+traversal);
-               // traversalList.add(__.union(unionTemp));
-               // traversalList.clear();
-       }
-}

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/c4a2c7e1/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/SparqlToGremlinTranspiler.java
----------------------------------------------------------------------
diff --git 
a/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/SparqlToGremlinTranspiler.java
 
b/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/SparqlToGremlinTranspiler.java
new file mode 100644
index 0000000..9db7d82
--- /dev/null
+++ 
b/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/SparqlToGremlinTranspiler.java
@@ -0,0 +1,286 @@
+/*
+ * 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.sparql;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.jena.graph.Triple;
+import org.apache.jena.query.Query;
+import org.apache.jena.query.QueryFactory;
+import org.apache.jena.query.SortCondition;
+import org.apache.jena.query.Syntax;
+import org.apache.jena.sparql.algebra.Algebra;
+import org.apache.jena.sparql.algebra.Op;
+import org.apache.jena.sparql.algebra.OpVisitorBase;
+import org.apache.jena.sparql.algebra.OpWalker;
+import org.apache.jena.sparql.algebra.op.OpBGP;
+import org.apache.jena.sparql.algebra.op.OpFilter;
+import org.apache.jena.sparql.algebra.op.OpUnion;
+import org.apache.jena.sparql.core.Var;
+import org.apache.jena.sparql.core.VarExprList;
+import org.apache.jena.sparql.expr.Expr;
+import org.apache.jena.sparql.expr.ExprAggregator;
+import org.apache.tinkerpop.gremlin.process.traversal.Order;
+import org.apache.tinkerpop.gremlin.process.traversal.Scope;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
+import 
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+
+/**
+ * The engine that transpiles SPARQL to Gremlin traversals thus enabling 
SPARQL to be executed on any TinkerPop-enabled
+ * graph system.
+ */
+public class SparqlToGremlinTranspiler {
+
+       private GraphTraversal<Vertex, ?> traversal;
+
+    private List<Traversal> traversalList = new ArrayList<>();
+
+    private String sortingVariable = "";
+
+       private SparqlToGremlinTranspiler(final GraphTraversal<Vertex, ?> 
traversal) {
+               this.traversal = traversal;
+       }
+
+       private SparqlToGremlinTranspiler(final GraphTraversalSource g) {
+               this(g.V());
+       }
+
+    /**
+     * Converts SPARQL to a Gremlin traversal.
+     *
+     * @param graph the {@link Graph} instance to execute the traversal from
+     * @param sparqlQuery the query to transpile to Gremlin
+     */
+    public static GraphTraversal<Vertex, ?> transpile(final Graph graph, final 
String sparqlQuery) {
+        return transpile(graph.traversal(),    sparqlQuery);
+    }
+
+    /**
+     * Converts SPARQL to a Gremlin traversal.
+     *
+     * @param g the {@link GraphTraversalSource} instance to execute the 
traversal from
+     * @param sparqlQuery the query to transpile to Gremlin
+     */
+    public static GraphTraversal<Vertex, ?> transpile(final 
GraphTraversalSource g, final String sparqlQuery) {
+        return transpile(g, QueryFactory.create(Prefixes.prepend(sparqlQuery), 
Syntax.syntaxSPARQL));
+    }
+
+       private GraphTraversal<Vertex, ?> transpile(final Query query) {
+               final Op op = Algebra.compile(query);
+               OpWalker.walk(op, new GremlinOpVisitor());
+
+               int traversalIndex = 0;
+               final int numberOfTraversal = traversalList.size();
+        final Traversal arrayOfAllTraversals[] = new 
Traversal[numberOfTraversal];
+
+               if (query.hasOrderBy() && !query.hasGroupBy()) {
+            final List<SortCondition> sortingConditions = query.getOrderBy();
+
+                       for (SortCondition sortCondition : sortingConditions) {
+                final Expr expr = sortCondition.getExpression();
+                               sortingVariable = expr.getVarName();
+                       }
+               }
+
+               for (Traversal tempTrav : traversalList) {
+                       arrayOfAllTraversals[traversalIndex++] = tempTrav;
+               }
+
+               Order orderDirection = Order.incr;
+               if (query.hasOrderBy()) {
+            int directionOfSort = 0;
+            final List<SortCondition> sortingConditions = query.getOrderBy();
+
+                       for (SortCondition sortCondition : sortingConditions) {
+                final Expr expr = sortCondition.getExpression();
+                               directionOfSort = sortCondition.getDirection();
+                               sortingVariable = expr.getVarName();
+                       }
+
+                       if (directionOfSort == -1) orderDirection = Order.decr;
+               }
+
+               if (traversalList.size() > 0)
+                       traversal = traversal.match(arrayOfAllTraversals);
+
+               final List<String> vars = query.getResultVars();
+               if (!query.isQueryResultStar() && !query.hasGroupBy()) {
+            switch (vars.size()) {
+                case 0:
+                    throw new IllegalStateException();
+                case 1:
+                    if (query.isDistinct())
+                        traversal = traversal.dedup(vars.get(0));
+
+                    if (query.hasOrderBy())
+                        traversal = traversal.order().by(sortingVariable, 
orderDirection);
+                    else
+                        traversal = traversal.select(vars.get(0));
+
+                    break;
+                case 2:
+                    if (query.isDistinct())
+                        traversal = traversal.dedup(vars.get(0), vars.get(1));
+
+                    if (query.hasOrderBy())
+                        traversal = 
traversal.order().by(__.select(vars.get(0)), 
orderDirection).by(__.select(vars.get(1)));
+                    else
+                        traversal = traversal.select(vars.get(0), vars.get(1));
+
+                    break;
+                default:
+                    final String[] all = new String[vars.size()];
+                    vars.toArray(all);
+                    if (query.isDistinct())
+                        traversal = traversal.dedup(all);
+
+                    final String[] others = Arrays.copyOfRange(all, 2, 
vars.size());
+                    if (query.hasOrderBy())
+                        traversal = 
traversal.order().by(__.select(vars.get(0)), 
orderDirection).by(__.select(vars.get(1)));
+                    else
+                        traversal = traversal.select(vars.get(0), vars.get(1), 
others);
+
+                    break;
+            }
+               }
+
+               if (query.hasGroupBy()) {
+                       final VarExprList lstExpr = query.getGroupBy();
+                       String grpVar = "";
+                       for (Var expr : lstExpr.getVars()) {
+                               grpVar = expr.getName();
+                       }
+
+                       if (!grpVar.isEmpty())
+                               traversal = traversal.select(grpVar);
+                       if (query.hasAggregators()) {
+                final List<ExprAggregator> exprAgg = query.getAggregators();
+                               for (ExprAggregator expr : exprAgg) {
+                                       if 
(expr.getAggregator().getName().contains("COUNT")) {
+                                               if 
(!query.toString().contains("GROUP")) {
+                                                       if 
(expr.getAggregator().toString().contains("DISTINCT"))
+                                                               traversal = 
traversal.dedup(expr.getAggregator().getExprList().get(0).toString().substring(1));
+                                                       else
+                                                               traversal = 
traversal.select(expr.getAggregator().getExprList().get(0).toString().substring(1));
+
+                                                       traversal = 
traversal.count();
+                                               } else {
+                            traversal = traversal.groupCount();
+                        }
+                                       }
+
+                                       if 
(expr.getAggregator().getName().contains("MAX")) {
+                                               traversal = traversal.max();
+                                       }
+                               }
+                       } else {
+                traversal = traversal.group();
+            }
+               }
+
+               if (query.hasOrderBy() && query.hasGroupBy())
+                       traversal = traversal.order().by(sortingVariable, 
orderDirection);
+
+               if (query.hasLimit()) {
+                       long limit = query.getLimit(), offset = 0;
+
+                       if (query.hasOffset())
+                               offset = query.getOffset();
+
+                       if (query.hasGroupBy() && query.hasOrderBy())
+                               traversal = traversal.range(Scope.local, 
offset, offset + limit);
+                       else
+                               traversal = traversal.range(offset, offset + 
limit);
+               }
+
+               return traversal;
+       }
+
+    private static GraphTraversal<Vertex, ?> transpile(final 
GraphTraversalSource g, final Query query) {
+        return new SparqlToGremlinTranspiler(g).transpile(query);
+    }
+
+    /**
+     * An {@code OpVisitor} implementation that reads SPARQL algebra 
operations into Gremlin traversals.
+     */
+    private class GremlinOpVisitor extends OpVisitorBase {
+
+        /**
+         * Visiting triple patterns in SPARQL algebra.
+         */
+        @Override
+        public void visit(final OpBGP opBGP) {
+            final List<Triple> triples = opBGP.getPattern().getList();
+            final Traversal[] matchTraversals = new Traversal[triples.size()];
+            int i = 0;
+            for (final Triple triple : triples) {
+
+                matchTraversals[i++] = TraversalBuilder.transform(triple);
+                traversalList.add(matchTraversals[i - 1]);
+            }
+        }
+
+        /**
+         * Visiting filters in SPARQL algebra.
+         */
+        @Override
+        public void visit(final OpFilter opFilter) {
+            Traversal traversal;
+            for (Expr expr : opFilter.getExprs().getList()) {
+                if (expr != null) {
+                    traversal = 
__.where(WhereTraversalBuilder.transform(expr));
+                    traversalList.add(traversal);
+                }
+            }
+        }
+
+        /**
+         * Visiting unions in SPARQL algebra.
+         */
+        @Override
+        public void visit(final OpUnion opUnion) {
+            final Traversal unionTemp[] = new Traversal[2];
+            final Traversal unionTemp1[] = new Traversal[traversalList.size() 
/ 2];
+            final Traversal unionTemp2[] = new Traversal[traversalList.size() 
/ 2];
+
+            int count = 0;
+
+            for (int i = 0; i < traversalList.size(); i++) {
+                if (i < traversalList.size() / 2)
+                    unionTemp1[i] = traversalList.get(i);
+                else
+                    unionTemp2[count++] = traversalList.get(i);
+            }
+
+            unionTemp[1] = __.match(unionTemp2);
+            unionTemp[0] = __.match(unionTemp1);
+
+            traversalList.clear();
+            traversal = (GraphTraversal<Vertex, ?>) traversal.union(unionTemp);
+        }
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/c4a2c7e1/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/TraversalBuilder.java
----------------------------------------------------------------------
diff --git 
a/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/TraversalBuilder.java
 
b/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/TraversalBuilder.java
index 72a32a5..6d29442 100644
--- 
a/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/TraversalBuilder.java
+++ 
b/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/TraversalBuilder.java
@@ -26,10 +26,12 @@ import 
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
 import org.apache.tinkerpop.gremlin.structure.PropertyType;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 
-
+/**
+ * Converts triple patterns into {@link GraphTraversal} instances.
+ */
 class TraversalBuilder {
 
-    public static GraphTraversal<?, ?> transform(final Triple triple) {
+    static GraphTraversal<?, ?> transform(final Triple triple) {
         final GraphTraversal<Vertex, ?> matchTraversal = 
__.as(triple.getSubject().getName());
         
         final Node predicate = triple.getPredicate();
@@ -53,7 +55,6 @@ class TraversalBuilder {
                                                       final PropertyType type, 
final Node object) {
         switch (propertyName) {
             case "id":
-         
                 return object.isConcrete()
                         ? traversal.hasId(object.getLiteralValue())
                         : traversal.id().as(object.getName());

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/c4a2c7e1/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/WhereTraversalBuilder.java
----------------------------------------------------------------------
diff --git 
a/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/WhereTraversalBuilder.java
 
b/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/WhereTraversalBuilder.java
index f4d49b6..80da707 100644
--- 
a/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/WhereTraversalBuilder.java
+++ 
b/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/WhereTraversalBuilder.java
@@ -33,61 +33,77 @@ import org.apache.jena.sparql.expr.E_LogicalAnd;
 import org.apache.jena.sparql.expr.E_LogicalOr;
 import org.apache.jena.sparql.expr.E_NotEquals;
 import org.apache.jena.sparql.expr.E_NotExists;
-import org.apache.jena.sparql.expr.E_StrLength;
 import org.apache.jena.sparql.expr.Expr;
 import org.apache.tinkerpop.gremlin.process.traversal.P;
 import org.apache.tinkerpop.gremlin.process.traversal.Step;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
 
+/**
+ * Converts SPARQL "where" expressions to Gremlin predicates.
+ */
 class WhereTraversalBuilder {
 
-    public static GraphTraversal<?, ?> transform(final E_Equals expression) {
-    // System.out.println("The aggr one : 
"+expression.getArg1().getClass().getName() + "The aggr one 
:"+expression.getArg2().getClass().getName());
+    /**
+     * Converts a general {@code Expr} to an anonymous {@link GraphTraversal}.
+     */
+    static GraphTraversal<?, ?> transform(final Expr expression) {
+        if (expression instanceof E_Equals) return transform((E_Equals) 
expression);
+        if (expression instanceof E_NotEquals) return transform((E_NotEquals) 
expression);
+        if (expression instanceof E_LessThan) return transform((E_LessThan) 
expression);
+        if (expression instanceof E_LessThanOrEqual) return 
transform((E_LessThanOrEqual) expression);
+        if (expression instanceof E_GreaterThan) return 
transform((E_GreaterThan) expression);
+        if (expression instanceof E_GreaterThanOrEqual) return 
transform((E_GreaterThanOrEqual) expression);
+        if (expression instanceof E_LogicalAnd) return 
transform((E_LogicalAnd) expression);
+        if (expression instanceof E_LogicalOr) return transform((E_LogicalOr) 
expression);
+        if (expression instanceof E_Exists) return transform((E_Exists) 
expression);
+        if (expression instanceof E_NotExists) return transform((E_NotExists) 
expression);
+        throw new IllegalStateException(String.format("Unhandled expression: 
%s", expression));
+    }
+
+    private static GraphTraversal<?, ?> transform(final E_Equals expression) {
         final Object value = 
expression.getArg2().getConstant().getNode().getLiteralValue();
         return __.as(expression.getArg1().getVarName()).is(P.eq(value));
     }
 
-    public static GraphTraversal<?, ?> transform(final E_NotEquals expression) 
{
+    private static GraphTraversal<?, ?> transform(final E_NotEquals 
expression) {
         final Object value = 
expression.getArg2().getConstant().getNode().getLiteralValue();
         return __.as(expression.getArg1().getVarName()).is(P.neq(value));
     }
 
-    public static GraphTraversal<?, ?> transform(final E_LessThan expression) {
-    // System.out.println("The aggr one : 
"+expression.getArg1().getClass().getName() + "The aggr one 
:"+expression.getArg2().getClass().getName());
+    private static GraphTraversal<?, ?> transform(final E_LessThan expression) 
{
        final Object value = 
expression.getArg2().getConstant().getNode().getLiteralValue();
         return __.as(expression.getArg1().getVarName()).is(P.lt(value));
     }
 
-    public static GraphTraversal<?, ?> transform(final E_LessThanOrEqual 
expression) {
-    // System.out.println("The aggr one : 
"+expression.getArg1().getClass().getName() + "The aggr one 
:"+expression.getArg2().getClass().getName());
+    private static GraphTraversal<?, ?> transform(final E_LessThanOrEqual 
expression) {
         final Object value = 
expression.getArg2().getConstant().getNode().getLiteralValue();
         return __.as(expression.getArg1().getVarName()).is(P.lte(value));
     }
 
-    public static GraphTraversal<?, ?> transform(final E_GreaterThan 
expression) {
+    private static GraphTraversal<?, ?> transform(final E_GreaterThan 
expression) {
         final Object value = 
expression.getArg2().getConstant().getNode().getLiteralValue();
         return __.as(expression.getArg1().getVarName()).is(P.gt(value));
     }
 
-    public static GraphTraversal<?, ?> transform(final E_GreaterThanOrEqual 
expression) {
+    private static GraphTraversal<?, ?> transform(final E_GreaterThanOrEqual 
expression) {
         final Object value = 
expression.getArg2().getConstant().getNode().getLiteralValue();
         return __.as(expression.getArg1().getVarName()).is(P.gte(value));
     }
 
-    public static GraphTraversal<?, ?> transform(final E_LogicalAnd 
expression) {
+    private static GraphTraversal<?, ?> transform(final E_LogicalAnd 
expression) {
         return __.and(
                 transform(expression.getArg1()),
                 transform(expression.getArg2()));
     }
 
-    public static GraphTraversal<?, ?> transform(final E_LogicalOr expression) 
{
+    private static GraphTraversal<?, ?> transform(final E_LogicalOr 
expression) {
         return __.or(
                 transform(expression.getArg1()),
                 transform(expression.getArg2()));
     }
 
-    public static GraphTraversal<?, ?> transform(final E_Exists expression) {
+    private static GraphTraversal<?, ?> transform(final E_Exists expression) {
         final OpBGP opBGP = (OpBGP) expression.getGraphPattern();
         final List<Triple> triples = opBGP.getPattern().getList();
         if (triples.size() != 1) throw new IllegalStateException("Unhandled 
EXISTS pattern");
@@ -99,7 +115,7 @@ class WhereTraversalBuilder {
     }
     
 
-    public static GraphTraversal<?, ?> transform(final E_NotExists expression) 
{
+    private static GraphTraversal<?, ?> transform(final E_NotExists 
expression) {
         final OpBGP opBGP = (OpBGP) expression.getGraphPattern();
         final List<Triple> triples = opBGP.getPattern().getList();
         if (triples.size() != 1) throw new IllegalStateException("Unhandled 
NOT EXISTS pattern");
@@ -109,26 +125,4 @@ class WhereTraversalBuilder {
         endStep.removeLabel(label);
         return __.not(traversal);
     }
-    
-    public static int getStrLength(final E_StrLength expression){
-       
-       return expression.getArg().toString().length();
-       
-    }
-    
-    
-    //what does <?, ?> signify? possibly <S,E>
-    public static GraphTraversal<?, ?> transform(final Expr expression) {
-        if (expression instanceof E_Equals) return transform((E_Equals) 
expression);
-        if (expression instanceof E_NotEquals) return transform((E_NotEquals) 
expression);
-        if (expression instanceof E_LessThan) return transform((E_LessThan) 
expression);
-        if (expression instanceof E_LessThanOrEqual) return 
transform((E_LessThanOrEqual) expression);
-        if (expression instanceof E_GreaterThan) return 
transform((E_GreaterThan) expression);
-        if (expression instanceof E_GreaterThanOrEqual) return 
transform((E_GreaterThanOrEqual) expression);
-        if (expression instanceof E_LogicalAnd) return 
transform((E_LogicalAnd) expression);
-        if (expression instanceof E_LogicalOr) return transform((E_LogicalOr) 
expression);
-        if (expression instanceof E_Exists) return transform((E_Exists) 
expression);
-        if (expression instanceof E_NotExists) return transform((E_NotExists) 
expression);
-        throw new IllegalStateException(String.format("Unhandled expression: 
%s", expression));
-    }
 }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/c4a2c7e1/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/process/traversal/strategy/SparqlStrategy.java
----------------------------------------------------------------------
diff --git 
a/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/process/traversal/strategy/SparqlStrategy.java
 
b/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/process/traversal/strategy/SparqlStrategy.java
index d74ac3e..4073ec2 100644
--- 
a/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/process/traversal/strategy/SparqlStrategy.java
+++ 
b/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/process/traversal/strategy/SparqlStrategy.java
@@ -18,7 +18,6 @@
  */
 package org.apache.tinkerpop.gremlin.sparql.process.traversal.strategy;
 
-import 
org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy;
 import 
org.apache.tinkerpop.gremlin.process.remote.traversal.strategy.decoration.RemoteStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
@@ -26,7 +25,7 @@ import 
org.apache.tinkerpop.gremlin.process.traversal.step.map.ConstantStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
 import 
org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.sparql.SparqlToGremlinCompiler;
+import org.apache.tinkerpop.gremlin.sparql.SparqlToGremlinTranspiler;
 import 
org.apache.tinkerpop.gremlin.sparql.process.traversal.dsl.sparql.SparqlTraversalSource;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 
@@ -69,7 +68,7 @@ public class SparqlStrategy extends 
AbstractTraversalStrategy<TraversalStrategy.
             final Object constant = stepWithSparql.getConstant();
             if (constant instanceof String) {
                 final String sparql = (String) constant;
-                final Traversal<Vertex, ?> sparqlTraversal = 
SparqlToGremlinCompiler.convertToGremlinTraversal(
+                final Traversal<Vertex, ?> sparqlTraversal = 
SparqlToGremlinTranspiler.transpile(
                         traversal.getGraph().get(), sparql);
                 TraversalHelper.removeAllSteps(traversal);
                 sparqlTraversal.asAdmin().getSteps().forEach(s -> 
traversal.addStep(s));

Reply via email to