# HG changeset patch # User Stella Giannakopoulou # Date 1423502369 -7200 # Node ID faad70631f8b473328b50d340f6bd5f309699d20 # Parent beac3abdaed146e39d6b628d51ad36e164f7fc3a there is no need to call the JoinOptimizer twice (for the spatial and then for the temporal). So, I merged the optimizers in one, by taking into account both the spatial and the temporal functions. diff -r beac3abdaed1 -r faad70631f8b evaluation/src/main/java/org/openrdf/query/algebra/evaluation/impl/SpatialJoinOptimizer.java --- a/evaluation/src/main/java/org/openrdf/query/algebra/evaluation/impl/SpatialJoinOptimizer.java Tue Jan 27 13:21:49 2015 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,100 +0,0 @@ -/** - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * Copyright (C) 2010, 2011, 2012, Pyravlos Team - * - * http://www.strabon.di.uoa.gr/ - */ -package org.openrdf.query.algebra.evaluation.impl; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import org.openrdf.query.BindingSet; -import org.openrdf.query.Dataset; -import org.openrdf.query.algebra.Compare; -import org.openrdf.query.algebra.Extension; -import org.openrdf.query.algebra.Filter; -import org.openrdf.query.algebra.FunctionCall; -import org.openrdf.query.algebra.Join; -import org.openrdf.query.algebra.LeftJoin; -import org.openrdf.query.algebra.MathExpr; -import org.openrdf.query.algebra.Or; -import org.openrdf.query.algebra.QueryModelNode; -import org.openrdf.query.algebra.StatementPattern; -import org.openrdf.query.algebra.StatementPattern.Scope; -import org.openrdf.query.algebra.TupleExpr; -import org.openrdf.query.algebra.ValueExpr; -import org.openrdf.query.algebra.Var; -import org.openrdf.query.algebra.evaluation.function.Function; -import org.openrdf.query.algebra.evaluation.function.FunctionRegistry; -import org.openrdf.query.algebra.evaluation.function.spatial.SpatialConstructFunc; -import org.openrdf.query.algebra.evaluation.function.spatial.SpatialMetricFunc; -import org.openrdf.query.algebra.evaluation.function.spatial.SpatialPropertyFunc; -import org.openrdf.query.algebra.evaluation.function.spatial.SpatialRelationshipFunc; -import org.openrdf.query.algebra.helpers.QueryModelVisitorBase; -import org.openrdf.query.algebra.helpers.StatementPatternCollector; - -/** - * A query optimizer that re-orders nested Joins. - * - * @author Manos Karpathiotakis - * - * @author Konstantina Bereta - */ -public class SpatialJoinOptimizer extends SpatioTemporalJoinOptimizer -//implements QueryOptimizer //Removed it consciously -{ - - - //private Set existingVars = new TreeSet(); - /** - * Applies generally applicable optimizations: path expressions are sorted - * from more to less specific. - * - * @param tupleExpr - */ - public void optimize(TupleExpr tupleExpr, Dataset dataset, BindingSet bindings, List spatialJoins) { - tupleExpr.visit(new JoinVisitor(spatialJoins)); - } - - - protected boolean isRelevantSTFunc(FunctionCall functionCall) - { - Function function = FunctionRegistry.getInstance().get(functionCall.getURI()); - if(function instanceof SpatialConstructFunc) - { - //TODO may have to comment this part again - //uncommented because I use this function in the case of metrics - return true; - } - else if(function instanceof SpatialRelationshipFunc) - { - return true; - } - else if(function instanceof SpatialPropertyFunc) //1 argument - { - return true; - } - else if(function instanceof SpatialMetricFunc) //Arguments # depends on the function selected - { - return true; - } - return false; - } - - - @Override - public String getClassName() { - // TODO Auto-generated method stub - return this.getClass().getCanonicalName(); - } - -} diff -r beac3abdaed1 -r faad70631f8b evaluation/src/main/java/org/openrdf/query/algebra/evaluation/impl/SpatioTemporalJoinOptimizer.java --- a/evaluation/src/main/java/org/openrdf/query/algebra/evaluation/impl/SpatioTemporalJoinOptimizer.java Tue Jan 27 13:21:49 2015 +0200 +++ b/evaluation/src/main/java/org/openrdf/query/algebra/evaluation/impl/SpatioTemporalJoinOptimizer.java Mon Feb 09 19:19:29 2015 +0200 @@ -35,10 +35,7 @@ import org.openrdf.query.algebra.Var; import org.openrdf.query.algebra.evaluation.function.Function; import org.openrdf.query.algebra.evaluation.function.FunctionRegistry; -import org.openrdf.query.algebra.evaluation.function.spatial.SpatialConstructFunc; -import org.openrdf.query.algebra.evaluation.function.spatial.SpatialMetricFunc; -import org.openrdf.query.algebra.evaluation.function.spatial.SpatialPropertyFunc; -import org.openrdf.query.algebra.evaluation.function.spatial.SpatialRelationshipFunc; +import org.openrdf.query.algebra.evaluation.function.temporal.stsparql.construct.TemporalConstructFunc; import org.openrdf.query.algebra.evaluation.function.temporal.stsparql.relation.TemporalRelationFunc; import org.openrdf.query.algebra.helpers.QueryModelVisitorBase; import org.openrdf.query.algebra.helpers.StatementPatternCollector; @@ -68,26 +65,29 @@ public abstract String getClassName(); - public void optimize(TupleExpr tupleExpr, Dataset dataset, BindingSet bindings, List spatialJoins) { - tupleExpr.visit(new JoinVisitor(spatialJoins)); + public void optimize(TupleExpr tupleExpr, Dataset dataset, BindingSet bindings, List spatialJoins, List temporalJoins) { + tupleExpr.visit(new JoinVisitor(spatialJoins, temporalJoins)); } protected class JoinVisitor extends QueryModelVisitorBase { - public JoinVisitor(List spatialJoins) { + public JoinVisitor(List spatialJoins, List temporalJoins) { super(); this.spatialJoins = spatialJoins; + this.temporalJoins = temporalJoins; } private List spatialJoins; + private List temporalJoins; //buffer with a var as a second argument private boolean problematicBuffer = false; //indicates whether a metric expression contains a spatial function call private boolean containsSpatial = false; + private boolean containsTemporal = false; private boolean optimizableMetricOrProperty = true; private int thematicJoinsSize = 0; @@ -271,7 +271,6 @@ { int reduced = finalList.get(fix) - 1; finalList.set(fix, reduced); - } } break; @@ -288,6 +287,7 @@ { { Map.Entry entry = (Map.Entry)it.next(); + if(count == position - varsMapSize) { //If I keep record of this entry, I can use the info later to avoid duplicate filters @@ -369,8 +369,10 @@ { if(node.getCondition() instanceof FunctionCall) { + FunctionCall functionCall = (FunctionCall) node.getCondition(); + Function function = FunctionRegistry.getInstance().get(functionCall.getURI()); //Only interested in spatial ones - if(isRelevantSTFunc((FunctionCall) node.getCondition())) + if(isRelevantSTFunc(functionCall)) { //Have to retrieve all nested variables and other info @@ -402,8 +404,10 @@ */ StatementPattern t = new StatementPattern(); - String className = getClassName(); - if(className.equals("org.openrdf.query.algebra.evaluation.impl.SpatialJoinOptimizer")) + + //String className = getClassName(); + if(!(function instanceof TemporalConstructFunc) && !(function instanceof TemporalRelationFunc)) + //if(className.equals("org.openrdf.query.algebra.evaluation.impl.SpatialJoinOptimizer")) { t.setSubjectVar(new Var("-dummy-")); t.setPredicateVar(new Var("-dummy-")); @@ -435,8 +439,9 @@ else if(node.getCondition() instanceof Compare) { containsSpatial = false; + containsTemporal = false; List allVars = new ArrayList(getVarsInMetricOrProperty(node.getCondition())); - if(containsSpatial&&optimizableMetricOrProperty) + if((containsSpatial || containsTemporal) && optimizableMetricOrProperty) { //if the arguments are not 2, I am essentially doing a selection! //No reason to push into optimizer then @@ -448,10 +453,20 @@ Filter toEnter = node.clone(); StatementPattern t = new StatementPattern(); - t.setSubjectVar(new Var("-dummy-")); - t.setPredicateVar(new Var("-dummy-")); - t.setObjectVar(new Var("-dummy-")); + if(containsSpatial) + { + t.setSubjectVar(new Var("-dummy-")); + t.setPredicateVar(new Var("-dummy-")); + t.setObjectVar(new Var("-dummy-")); + } + else if(containsTemporal) + { + t.setSubjectVar(new Var("-dummy-temporal")); + t.setPredicateVar(new Var("-dummy-temporal")); + t.setObjectVar(new Var("-dummy-temporal")); + } t.setScope(Scope.DEFAULT_CONTEXTS); + toEnter.setArg(t); if(!allSFilters.containsKey(toEnter)) @@ -460,6 +475,7 @@ } } containsSpatial = false; + containsTemporal = false; } optimizableMetricOrProperty = true; } @@ -556,9 +572,13 @@ /** * There is a point in continuing the search recursively ONLY * if I reach this case. Otherwise, the function call - * may not refer to a spatial function + * may not refer to a spatial or temporal function */ - this.containsSpatial = true; + Function function = FunctionRegistry.getInstance().get(((FunctionCall) expr).getURI()); + if(!(function instanceof TemporalRelationFunc) && !(function instanceof TemporalConstructFunc)) + this.containsSpatial = true; + else + this.containsTemporal = true; allVars.addAll(getFunctionCallVars((FunctionCall) expr)); } @@ -648,7 +668,7 @@ private boolean createOrderedJoins(int table[][], int lineToScan,int columnToSkip, int pathLen, Set varsTillNow, List tempList, List pathList, List finalList) { - boolean success = false; + boolean success = false; int dims = table.length; int j; @@ -660,7 +680,6 @@ { continue; } - //A connection exists! if(table[lineToScan][j]>0) { diff -r beac3abdaed1 -r faad70631f8b evaluation/src/main/java/org/openrdf/query/algebra/evaluation/impl/TemporalJoinOptimizer.java --- a/evaluation/src/main/java/org/openrdf/query/algebra/evaluation/impl/TemporalJoinOptimizer.java Tue Jan 27 13:21:49 2015 +0200 +++ b/evaluation/src/main/java/org/openrdf/query/algebra/evaluation/impl/TemporalJoinOptimizer.java Mon Feb 09 19:19:29 2015 +0200 @@ -9,36 +9,20 @@ */ package org.openrdf.query.algebra.evaluation.impl; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedHashSet; import java.util.List; -import java.util.Map; -import java.util.Set; import org.openrdf.query.BindingSet; import org.openrdf.query.Dataset; -import org.openrdf.query.algebra.Compare; -import org.openrdf.query.algebra.Extension; -import org.openrdf.query.algebra.Filter; import org.openrdf.query.algebra.FunctionCall; -import org.openrdf.query.algebra.Join; -import org.openrdf.query.algebra.LeftJoin; -import org.openrdf.query.algebra.MathExpr; -import org.openrdf.query.algebra.Or; -import org.openrdf.query.algebra.QueryModelNode; -import org.openrdf.query.algebra.StatementPattern; -import org.openrdf.query.algebra.StatementPattern.Scope; import org.openrdf.query.algebra.TupleExpr; -import org.openrdf.query.algebra.ValueExpr; -import org.openrdf.query.algebra.Var; import org.openrdf.query.algebra.evaluation.function.Function; import org.openrdf.query.algebra.evaluation.function.FunctionRegistry; +import org.openrdf.query.algebra.evaluation.function.spatial.SpatialConstructFunc; +import org.openrdf.query.algebra.evaluation.function.spatial.SpatialMetricFunc; +import org.openrdf.query.algebra.evaluation.function.spatial.SpatialPropertyFunc; +import org.openrdf.query.algebra.evaluation.function.spatial.SpatialRelationshipFunc; +import org.openrdf.query.algebra.evaluation.function.temporal.stsparql.construct.TemporalConstructFunc; import org.openrdf.query.algebra.evaluation.function.temporal.stsparql.relation.TemporalRelationFunc; -import org.openrdf.query.algebra.helpers.QueryModelVisitorBase; -import org.openrdf.query.algebra.helpers.StatementPatternCollector; - /** * A query optimizer that re-orders nested Joins. * @@ -59,8 +43,8 @@ * * @param tupleExpr */ - public void optimize(TupleExpr tupleExpr, Dataset dataset, BindingSet bindings, List temporalJoins) { - tupleExpr.visit(new JoinVisitor(temporalJoins)); + public void optimize(TupleExpr tupleExpr, Dataset dataset, BindingSet bindings, List spatialJoins, List temporalJoins) { + tupleExpr.visit(new JoinVisitor(spatialJoins, temporalJoins)); } @@ -68,7 +52,7 @@ protected boolean isRelevantSTFunc(FunctionCall functionCall) { Function function = FunctionRegistry.getInstance().get(functionCall.getURI()); - if(function instanceof org.openrdf.query.algebra.evaluation.function.temporal.stsparql.construct.TemporalConstructFunc ) + if(function instanceof TemporalConstructFunc) { //TODO may have to comment this part again //uncommented because I use this function in the case of metrics @@ -78,6 +62,24 @@ { return true; } + else if(function instanceof SpatialConstructFunc) + { + //TODO may have to comment this part again + //uncommented because I use this function in the case of metrics + return true; + } + else if(function instanceof SpatialRelationshipFunc) + { + return true; + } + else if(function instanceof SpatialPropertyFunc) //1 argument + { + return true; + } + else if(function instanceof SpatialMetricFunc) //Arguments # depends on the function selected + { + return true; + } return false; } diff -r beac3abdaed1 -r faad70631f8b generaldb/src/main/java/org/openrdf/sail/generaldb/optimizers/GeneralDBQueryOptimizer.java --- a/generaldb/src/main/java/org/openrdf/sail/generaldb/optimizers/GeneralDBQueryOptimizer.java Tue Jan 27 13:21:49 2015 +0200 +++ b/generaldb/src/main/java/org/openrdf/sail/generaldb/optimizers/GeneralDBQueryOptimizer.java Mon Feb 09 19:19:29 2015 +0200 @@ -18,7 +18,6 @@ import org.openrdf.query.algebra.evaluation.impl.ConjunctiveConstraintSplitter; import org.openrdf.query.algebra.evaluation.impl.DisjunctiveConstraintOptimizer; import org.openrdf.query.algebra.evaluation.impl.SameTermFilterOptimizer; -import org.openrdf.query.algebra.evaluation.impl.SpatialJoinOptimizer; import org.openrdf.query.algebra.evaluation.impl.TemporalJoinOptimizer; import org.openrdf.query.algebra.evaluation.impl.stSPARQLConstantOptimizer; import org.openrdf.sail.generaldb.GeneralDBValueFactory; @@ -118,9 +117,9 @@ //XXX - new TemporalJoinOptimizer().optimize(expr, dataset, bindings, temporalJoins); + new TemporalJoinOptimizer().optimize(expr, dataset, bindings, spatialJoins, temporalJoins); - new SpatialJoinOptimizer().optimize(expr, dataset, bindings,spatialJoins); + //new SpatialJoinOptimizer().optimize(expr, dataset, bindings,spatialJoins); } @@ -139,5 +138,4 @@ new GeneralDBRegexFlagsInliner().optimize(expr, dataset, bindings); } - }