package cz.cuni.mff.d3s.been.persistence;
import static cz.cuni.mff.d3s.been.persistence.FilterValues.*;
/**
* A translation factory that serves the purpose of translating {@link cz.cuni.mff.d3s.been.persistence.Query} objects into database-specific queries.
*
* @author darklight
*/
public final class QueryTranslator {
/**
* Translate a {@link cz.cuni.mff.d3s.been.persistence.Query} using a native (database-specific) {@link QueryRedactor}
*
* @param query Query to interpret
* @param interpreter Interpreter to inform of the query's specifics
*
* @throws cz.cuni.mff.d3s.been.persistence.UnsupportedQueryException When the query cannot be interpreted
*/
public void interpret(Query query, QueryRedactor interpreter) throws UnsupportedQueryException {
for (String selectorName: query.getSelectorNames()) {
final AttributeFilter filter = query.getSelector(selectorName);
if (! (filter instanceof SkeletalAttributeFilter)) {
throw new UnsupportedQueryException(query, String.format("Unsupported selector for attribute '%s'", selectorName));
}
final SkeletalAttributeFilter skelf = (SkeletalAttributeFilter) filter;
switch (skelf.getType()) {
case ABOVE:
interpreter.aboveSelector(
selectorName,
skelf.getValues().get(LOW_BOUND.getKey())
);
break;
case BELOW:
interpreter.belowSelector(
selectorName,
skelf.getValues().get(HIGH_BOUND.getKey()));
break;
case BETWEEN:
interpreter.intervalSelector(
selectorName,
skelf.getValues().get(LOW_BOUND.getKey()),
skelf.getValues().get(HIGH_BOUND.getKey()));
break;
case LIKE:
interpreter.patternSelector(
selectorName,
(String) skelf.getValues().get(PATTERN.getKey()));
break;
case EQUAL:
interpreter.equalitySelector(
selectorName,
skelf.getValues().get(HARD_VALUE.getKey()));
break;
case NOT_EQUAL:
interpreter.inequalitySelector(
selectorName,
skelf.getValues().get(HARD_VALUE.getKey()));
break;
default:
throw new UnsupportedQueryException(query, String.format("Filter type '%s' on attribute '%s' not supported.", skelf.getType().name(), selectorName));
}
}
if (query.getMappings() != null) {
interpreter.map(query.getMappings());
}
}
}