blob: 27882f5c197b9359b0c928f52a6cc127c19b82c3 [file] [log] [blame]
package org.apache.rya.rdftriplestore.evaluation;
/*
* 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.
*/
import static com.google.common.base.Preconditions.checkNotNull;
import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
import org.apache.rya.api.persist.RdfEvalStatsDAO;
import org.apache.rya.api.persist.joinselect.SelectivityEvalDAO;
import org.apache.rya.rdftriplestore.inference.DoNotExpandSP;
import org.apache.rya.rdftriplestore.utils.FixedStatementPattern;
import org.eclipse.rdf4j.query.algebra.Join;
import org.eclipse.rdf4j.query.algebra.StatementPattern;
public class RdfCloudTripleStoreSelectivityEvaluationStatistics<C extends RdfCloudTripleStoreConfiguration> extends RdfCloudTripleStoreEvaluationStatistics {
// allows access to join selectivity and extending RdfCloudTripleStoreEvaluationStatistics allows for use of prospector
private SelectivityEvalDAO<C> selectEvalStatsDAO; // TODO redundancy here as RdfCloudTripleStoreEvalStats object contains
// RdfEvalStatsDAO object
protected double filterCard;
C config; // TODO redundancy here as RdfCloudTripleStoreEvalStats object contains conf as well
public RdfCloudTripleStoreSelectivityEvaluationStatistics(final C conf,
final RdfEvalStatsDAO<C> prospector, final SelectivityEvalDAO<C> selectEvalStatsDAO) {
super(conf, prospector);
checkNotNull(selectEvalStatsDAO);
try {
this.selectEvalStatsDAO = selectEvalStatsDAO;
this.config = conf; // TODO fix this!
} catch (final Exception e) {
throw new RuntimeException(e);
}
}
@Override
protected CardinalityCalculator createCardinalityCalculator() {
try {
return new SelectivityCardinalityCalculator(this);
} catch (final Exception e) {
System.out.println(e);
throw new RuntimeException(e);
}
}
public class SelectivityCardinalityCalculator extends RdfCloudTripleStoreCardinalityCalculator {
public SelectivityCardinalityCalculator(final RdfCloudTripleStoreSelectivityEvaluationStatistics<C> statistics) {
super(statistics);
}
@Override
public void meet(final Join node) {
node.getLeftArg().visit(this);
final double leftArgCost = cardinality;
// System.out.println("Left cardinality is " + cardinality);
node.getRightArg().visit(this);
if (node.getLeftArg() instanceof FixedStatementPattern && node.getRightArg() instanceof DoNotExpandSP) {
return;
}
try {
final double selectivity = selectEvalStatsDAO.getJoinSelect(config, node.getLeftArg(), node.getRightArg());
// System.out.println("CardCalc: left cost of " + node.getLeftArg() + " is " + leftArgCost + " right cost of "
// + node.getRightArg() + " is " + cardinality);
// System.out.println("Right cardinality is " + cardinality);
cardinality += leftArgCost + leftArgCost * cardinality * selectivity;
// System.out.println("CardCalc: Cardinality is " + cardinality);
// System.out.println("CardCalc: Selectivity is " + selectivity);
// System.out.println("Join cardinality is " + cardinality);
} catch (final Exception e) {
e.printStackTrace();
}
}
@Override
public double getCardinality(final StatementPattern node) {
cardinality = super.getCardinality(node);
// If sp contains all variables or is EmptyRDFtype, assign
// cardinality
// equal to table size
if (cardinality == Double.MAX_VALUE || cardinality == Double.MAX_VALUE - 1) {
try {
cardinality = selectEvalStatsDAO.getTableSize(config);
} catch (final Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return cardinality;
}
}
}