@Test public void testTwoIndex() throws Exception { String q1 = "" + "SELECT ?f ?m ?d ?h ?i " + "{" + " ?f a ?m ." + " ?m <http: + " ?d <uri:talksTo> ?f . " + " ?d <uri:hangOutWith> ?f ." + " ?f <uri:hangOutWith> ?h ." + " ?f <uri:associatesWith> ?i ." + " ?i <uri:associatesWith> ?h ." + "}"; String q2 = "" + "SELECT ?t ?s ?u " + "{" + " ?s a ?t ." + " ?t <http: + " ?u <uri:talksTo> ?s . " + "}"; String q3 = "" + "SELECT ?s ?t ?u " + "{" + " ?s <uri:hangOutWith> ?t ." + " ?t <uri:hangOutWith> ?u ." + "}"; String q4 = "" + "SELECT ?s ?t ?u " + "{" + " ?s <uri:associatesWith> ?t ." + " ?t <uri:associatesWith> ?u ." + "}"; String q5 = "" + "SELECT ?m ?f ?d " + "{" + " ?f a ?m ." + " ?m <http: + " ?d <uri:talksTo> ?f . " + "}"; String q6 = "" + "SELECT ?d ?f ?h " + "{" + " ?d <uri:hangOutWith> ?f ." + " ?f <uri:hangOutWith> ?h ." + "}"; String q7 = "" + "SELECT ?f ?i ?h " + "{" + " ?f <uri:associatesWith> ?i ." + " ?i <uri:associatesWith> ?h ." + "}"; SPARQLParser parser = new SPARQLParser(); ParsedQuery pq1 = parser.parseQuery(q1, null); ParsedQuery pq2 = parser.parseQuery(q2, null); ParsedQuery pq3 = parser.parseQuery(q3, null); ParsedQuery pq4 = parser.parseQuery(q4, null); ParsedQuery pq5 = parser.parseQuery(q5, null); ParsedQuery pq6 = parser.parseQuery(q6, null); ParsedQuery pq7 = parser.parseQuery(q7, null); SimpleExternalTupleSet extTup1 = new SimpleExternalTupleSet( (Projection) pq2.getTupleExpr()); SimpleExternalTupleSet extTup2 = new SimpleExternalTupleSet( (Projection) pq3.getTupleExpr()); SimpleExternalTupleSet extTup3 = new SimpleExternalTupleSet( (Projection) pq4.getTupleExpr()); SimpleExternalTupleSet extTup4 = new SimpleExternalTupleSet( (Projection) pq5.getTupleExpr()); SimpleExternalTupleSet extTup5 = new SimpleExternalTupleSet( (Projection) pq6.getTupleExpr()); SimpleExternalTupleSet extTup6 = new SimpleExternalTupleSet( (Projection) pq7.getTupleExpr()); List<ExternalTupleSet> list = new ArrayList<ExternalTupleSet>(); list.add(extTup2); list.add(extTup1); list.add(extTup3); List<QueryModelNode> optTupNodes = Lists.newArrayList(); optTupNodes.add(extTup4); optTupNodes.add(extTup6); optTupNodes.add(extTup5); IndexedExecutionPlanGenerator iep = new IndexedExecutionPlanGenerator( pq1.getTupleExpr(), list); Iterator<TupleExpr> plans = new TupleExecutionPlanGenerator() .getPlans(iep.getIndexedTuples()); IndexPlanValidator ipv = new IndexPlanValidator(true); Iterator<TupleExpr> validPlans = ipv.getValidTuples(plans); ThreshholdPlanSelector tps = new ThreshholdPlanSelector( pq1.getTupleExpr()); TupleExpr optimalTup = tps.getThreshholdQueryPlan(validPlans, .2, .6, .4, 0); NodeCollector nc = new NodeCollector(); optimalTup.visit(nc); List<QueryModelNode> qNodes = nc.getNodes(); Assert.assertTrue(qNodes.equals(optTupNodes)); }
@Override public TupleExpr getThreshholdQueryPlan(Iterator<TupleExpr> tuples, double threshhold, double indexWeight, double commonVarWeight, double extProdWeight) { if (threshhold < 0 || threshhold > 1) { throw new IllegalArgumentException("Threshhold must be between 0 and 1!"); } double minCost = Double.MAX_VALUE; TupleExpr minTup = null; double tempCost = 0; TupleExpr tempTup = null; while (tuples.hasNext()) { tempTup = tuples.next(); tempCost = getCost(tempTup, indexWeight, commonVarWeight, extProdWeight); if (tempCost < minCost) { minCost = tempCost; minTup = tempTup; } if (minCost <= threshhold) { return minTup; } } return minTup; }
ThreshholdPlanSelector implements IndexedQueryPlanSelector { @Override public TupleExpr getThreshholdQueryPlan(Iterator<TupleExpr> tuples, double threshhold, double indexWeight, double commonVarWeight, double extProdWeight) { if (threshhold < 0 || threshhold > 1) { throw new IllegalArgumentException("Threshhold must be between 0 and 1!"); } double minCost = Double.MAX_VALUE; TupleExpr minTup = null; double tempCost = 0; TupleExpr tempTup = null; while (tuples.hasNext()) { tempTup = tuples.next(); tempCost = getCost(tempTup, indexWeight, commonVarWeight, extProdWeight); if (tempCost < minCost) { minCost = tempCost; minTup = tempTup; } if (minCost <= threshhold) { return minTup; } } return minTup; } }
ThreshholdPlanSelector implements IndexedQueryPlanSelector { @Override public TupleExpr getThreshholdQueryPlan(Iterator<TupleExpr> tuples, double threshhold, double indexWeight, double commonVarWeight, double extProdWeight) { if (threshhold < 0 || threshhold > 1) { throw new IllegalArgumentException("Threshhold must be between 0 and 1!"); } double minCost = Double.MAX_VALUE; TupleExpr minTup = null; double tempCost = 0; TupleExpr tempTup = null; while (tuples.hasNext()) { tempTup = tuples.next(); tempCost = getCost(tempTup, indexWeight, commonVarWeight, extProdWeight); if (tempCost < minCost) { minCost = tempCost; minTup = tempTup; } if (minCost <= threshhold) { return minTup; } } return minTup; } ThreshholdPlanSelector(TupleExpr query); }
ThreshholdPlanSelector implements IndexedQueryPlanSelector { @Override public TupleExpr getThreshholdQueryPlan(Iterator<TupleExpr> tuples, double threshhold, double indexWeight, double commonVarWeight, double extProdWeight) { if (threshhold < 0 || threshhold > 1) { throw new IllegalArgumentException("Threshhold must be between 0 and 1!"); } double minCost = Double.MAX_VALUE; TupleExpr minTup = null; double tempCost = 0; TupleExpr tempTup = null; while (tuples.hasNext()) { tempTup = tuples.next(); tempCost = getCost(tempTup, indexWeight, commonVarWeight, extProdWeight); if (tempCost < minCost) { minCost = tempCost; minTup = tempTup; } if (minCost <= threshhold) { return minTup; } } return minTup; } ThreshholdPlanSelector(TupleExpr query); @Override TupleExpr getThreshholdQueryPlan(Iterator<TupleExpr> tuples, double threshhold, double indexWeight,
            double commonVarWeight, double extProdWeight); double getCost(TupleExpr te, double indexWeight, double commonVarWeight, double dirProdWeight); }
ThreshholdPlanSelector implements IndexedQueryPlanSelector { @Override public TupleExpr getThreshholdQueryPlan(Iterator<TupleExpr> tuples, double threshhold, double indexWeight, double commonVarWeight, double extProdWeight) { if (threshhold < 0 || threshhold > 1) { throw new IllegalArgumentException("Threshhold must be between 0 and 1!"); } double minCost = Double.MAX_VALUE; TupleExpr minTup = null; double tempCost = 0; TupleExpr tempTup = null; while (tuples.hasNext()) { tempTup = tuples.next(); tempCost = getCost(tempTup, indexWeight, commonVarWeight, extProdWeight); if (tempCost < minCost) { minCost = tempCost; minTup = tempTup; } if (minCost <= threshhold) { return minTup; } } return minTup; } ThreshholdPlanSelector(TupleExpr query); @Override TupleExpr getThreshholdQueryPlan(Iterator<TupleExpr> tuples, double threshhold, double indexWeight,
            double commonVarWeight, double extProdWeight); double getCost(TupleExpr te, double indexWeight, double commonVarWeight, double dirProdWeight);  }