blob: b08349d56f7a46c96b4da6f32c8f94169efd4708 [file] [log] [blame]
package edu.uci.ics.asterix.algebra.operators.physical;
import edu.uci.ics.asterix.metadata.declared.AqlSourceId;
import edu.uci.ics.asterix.om.base.AInt32;
import edu.uci.ics.asterix.om.base.AString;
import edu.uci.ics.asterix.om.base.IAObject;
import edu.uci.ics.asterix.om.constants.AsterixConstantValue;
import edu.uci.ics.asterix.om.types.ATypeTag;
import edu.uci.ics.hyracks.algebricks.common.exceptions.AlgebricksException;
import edu.uci.ics.hyracks.algebricks.common.exceptions.NotImplementedException;
import edu.uci.ics.hyracks.algebricks.common.utils.Pair;
import edu.uci.ics.hyracks.algebricks.core.algebra.base.ILogicalExpression;
import edu.uci.ics.hyracks.algebricks.core.algebra.base.ILogicalOperator;
import edu.uci.ics.hyracks.algebricks.core.algebra.base.IOptimizationContext;
import edu.uci.ics.hyracks.algebricks.core.algebra.base.LogicalExpressionTag;
import edu.uci.ics.hyracks.algebricks.core.algebra.base.LogicalVariable;
import edu.uci.ics.hyracks.algebricks.core.algebra.expressions.AbstractFunctionCallExpression;
import edu.uci.ics.hyracks.algebricks.core.algebra.expressions.ConstantExpression;
import edu.uci.ics.hyracks.algebricks.core.algebra.expressions.VariableReferenceExpression;
import edu.uci.ics.hyracks.algebricks.core.algebra.metadata.IDataSource;
import edu.uci.ics.hyracks.algebricks.core.algebra.metadata.IDataSourceIndex;
import edu.uci.ics.hyracks.algebricks.core.algebra.metadata.IDataSourcePropertiesProvider;
import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.AbstractScanOperator;
import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.IOperatorSchema;
import edu.uci.ics.hyracks.algebricks.core.algebra.operators.physical.AbstractScanPOperator;
public abstract class TreeSearchPOperator extends AbstractScanPOperator {
private IDataSourceIndex<String, AqlSourceId> idx;
public TreeSearchPOperator(IDataSourceIndex<String, AqlSourceId> idx) {
this.idx = idx;
}
@Override
public boolean isMicroOperator() {
return false;
}
@Override
public void computeDeliveredProperties(ILogicalOperator op, IOptimizationContext context) {
IDataSource<?> ds = idx.getDataSource();
IDataSourcePropertiesProvider dspp = ds.getPropertiesProvider();
AbstractScanOperator as = (AbstractScanOperator) op;
deliveredProperties = dspp.computePropertiesVector(as.getVariables());
}
protected Pair<int[], Integer> getKeys(AbstractFunctionCallExpression f, int k, IOperatorSchema[] inputSchemas) {
IAObject obj = ((AsterixConstantValue) ((ConstantExpression) f.getArguments().get(k).getValue())
.getValue()).getObject();
int numKeys = ((AInt32) obj).getIntegerValue();
int[] keys = null;
if (numKeys > 0) {
keys = new int[numKeys];
for (int i = 0; i < numKeys; i++) {
LogicalVariable var = ((VariableReferenceExpression) f.getArguments().get(k + 1 + i).getValue())
.getVariableReference();
keys[i] = inputSchemas[0].findVariable(var);
}
}
return new Pair<int[], Integer>(keys, numKeys);
}
protected String getStringArgument(AbstractFunctionCallExpression f, int k) throws AlgebricksException {
ILogicalExpression arg = f.getArguments().get(k).getValue();
if (arg.getExpressionTag() != LogicalExpressionTag.CONSTANT) {
throw new NotImplementedException("Index search calls with non-constant " + k
+ "-th argument are not implemented.");
}
ConstantExpression ce = (ConstantExpression) arg;
if (!(ce.getValue() instanceof AsterixConstantValue)) {
throw new AlgebricksException("Third argument to index-search() should be a string.");
}
IAObject v = ((AsterixConstantValue) ce.getValue()).getObject();
if (v.getType().getTypeTag() != ATypeTag.STRING) {
throw new AlgebricksException("Third argument to index-search() should be a string.");
}
return ((AString) v).getStringValue();
}
}