package org.xenei.jdbc4sparql.utils;
import java.util.ArrayList;
import java.util.List;
import com.hp.hpl.jena.sparql.expr.Expr;
import com.hp.hpl.jena.sparql.expr.ExprAggregator;
import com.hp.hpl.jena.sparql.expr.ExprFunction0;
import com.hp.hpl.jena.sparql.expr.ExprFunction1;
import com.hp.hpl.jena.sparql.expr.ExprFunction2;
import com.hp.hpl.jena.sparql.expr.ExprFunction3;
import com.hp.hpl.jena.sparql.expr.ExprFunctionN;
import com.hp.hpl.jena.sparql.expr.ExprFunctionOp;
import com.hp.hpl.jena.sparql.expr.ExprVar;
import com.hp.hpl.jena.sparql.expr.ExprVisitor;
import com.hp.hpl.jena.sparql.expr.NodeValue;
import com.hp.hpl.jena.sparql.expr.aggregate.Aggregator;
/**
* Class for test classes to extract element types from query.
*/
public class ExpressionExtractor implements ExprVisitor {
private final List<Expr> extracted = new ArrayList<Expr>();
private Class<? extends Expr> matchType;
/**
* Set the type to match
*
* @param clazz
* The class type to match
* @return this ElementExtractor for chaining
*/
public ExpressionExtractor setMatchType(final Class<? extends Expr> clazz) {
matchType = clazz;
return this;
}
/**
* Reset the results.
*
* @return this ElementExtractor for chaining
*/
public ExpressionExtractor reset() {
extracted.clear();
return this;
}
public List<Expr> getExtracted() {
return extracted;
}
public ExpressionExtractor(final Class<? extends Expr> clazz) {
setMatchType(clazz);
}
@Override
public void startVisit() {
}
@Override
public void visit(final ExprFunction0 func) {
if (matchType.isAssignableFrom(func.getClass())) {
extracted.add(func);
}
for (final Expr e : func.getArgs()) {
e.visit(this);
}
}
@Override
public void visit(final ExprFunction1 func) {
if (matchType.isAssignableFrom(func.getClass())) {
extracted.add(func);
}
for (final Expr e : func.getArgs()) {
e.visit(this);
}
}
@Override
public void visit(final ExprFunction2 func) {
if (matchType.isAssignableFrom(func.getClass())) {
extracted.add(func);
}
for (final Expr e : func.getArgs()) {
e.visit(this);
}
}
@Override
public void visit(final ExprFunction3 func) {
if (matchType.isAssignableFrom(func.getClass())) {
extracted.add(func);
}
for (final Expr e : func.getArgs()) {
e.visit(this);
}
}
@Override
public void visit(final ExprFunctionN func) {
if (matchType.isAssignableFrom(func.getClass())) {
extracted.add(func);
}
for (final Expr e : func.getArgs()) {
e.visit(this);
}
}
@Override
public void visit(final ExprFunctionOp funcOp) {
if (matchType.isAssignableFrom(funcOp.getClass())) {
extracted.add(funcOp);
}
for (final Expr e : funcOp.getArgs()) {
e.visit(this);
}
}
@Override
public void visit(final NodeValue nv) {
if (matchType.isAssignableFrom(nv.getClass())) {
extracted.add(nv);
}
}
@Override
public void visit(final ExprVar nv) {
if (matchType.isAssignableFrom(nv.getClass())) {
extracted.add(nv);
}
}
@Override
public void visit(final ExprAggregator eAgg) {
if (matchType.isAssignableFrom(eAgg.getClass())) {
extracted.add(eAgg);
}
eAgg.getAggVar().visit(this);
final Aggregator agg = eAgg.getAggregator();
if (agg.getExpr() != null) {
agg.getExpr().visit(this);
}
}
@Override
public void finishVisit() {
}
}