From commits-return-31670-archive-asf-public=cust-asf.ponee.io@tinkerpop.apache.org Thu Aug 16 18:57:54 2018 Return-Path: X-Original-To: archive-asf-public@cust-asf.ponee.io Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by mx-eu-01.ponee.io (Postfix) with SMTP id 1E005180675 for ; Thu, 16 Aug 2018 18:57:51 +0200 (CEST) Received: (qmail 16045 invoked by uid 500); 16 Aug 2018 16:57:51 -0000 Mailing-List: contact commits-help@tinkerpop.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@tinkerpop.apache.org Delivered-To: mailing list commits@tinkerpop.apache.org Received: (qmail 15721 invoked by uid 99); 16 Aug 2018 16:57:50 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 16 Aug 2018 16:57:50 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 393B4E1193; Thu, 16 Aug 2018 16:57:50 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: spmallette@apache.org To: commits@tinkerpop.apache.org Date: Thu, 16 Aug 2018 16:58:03 -0000 Message-Id: In-Reply-To: References: X-Mailer: ASF-Git Admin Mailer Subject: [15/50] tinkerpop git commit: TINKERPOP-1878 Major refactoring of sparql-gremlin classes 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/a8e25a84 Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/a8e25a84 Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/a8e25a84 Branch: refs/heads/TINKERPOP-1342 Commit: a8e25a8461c9a34f01eca561bd15e84bf84abdd4 Parents: 6211e76 Author: Stephen Mallette Authored: Fri Jan 26 13:36:29 2018 -0500 Committer: Stephen Mallette Committed: Mon Aug 13 14:39:22 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/a8e25a84/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 traversal; - - List traversalList = new ArrayList(); - - String groupVariable = ""; - int sortingDirection = 0; - long offsetLimit = 0; - String sortingVariable = ""; - - GraphTraversalSource temp; - Graph graph; - - private SparqlToGremlinCompiler(final GraphTraversal traversal) { - this.traversal = traversal; - } - - private SparqlToGremlinCompiler(final GraphTraversalSource g) { - this(g.V()); - temp = g; - - } - - private SparqlToGremlinCompiler(final Graph g) { - this.traversal = (GraphTraversal) 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 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 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 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 vars = query.getResultVars(); - List 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 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 convertToGremlinTraversal(final GraphTraversalSource g, - final Query query) { - return new SparqlToGremlinCompiler(g).convertToGremlinTraversal(query); - } - - public static GraphTraversal convertToGremlinTraversal(final Graph graph, final String query) { - return convertToGremlinTraversal(graph.traversal(), QueryFactory.create(Prefixes.prepend(query))); - } - - public static GraphTraversal 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 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) 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/a8e25a84/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 traversal; + + private List traversalList = new ArrayList<>(); + + private String sortingVariable = ""; + + private SparqlToGremlinTranspiler(final GraphTraversal 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 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 transpile(final GraphTraversalSource g, final String sparqlQuery) { + return transpile(g, QueryFactory.create(Prefixes.prepend(sparqlQuery), Syntax.syntaxSPARQL)); + } + + private GraphTraversal 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 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 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 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 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 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 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) traversal.union(unionTemp); + } + + } +} http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/a8e25a84/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 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/a8e25a84/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 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 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 - 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/a8e25a84/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 sparqlTraversal = SparqlToGremlinCompiler.convertToGremlinTraversal( + final Traversal sparqlTraversal = SparqlToGremlinTranspiler.transpile( traversal.getGraph().get(), sparql); TraversalHelper.removeAllSteps(traversal); sparqlTraversal.asAdmin().getSteps().forEach(s -> traversal.addStep(s));