package org.aksw.jena_sparql_api.unsorted;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import java.util.function.Function;
import org.apache.jena.sparql.algebra.Op;
import org.apache.jena.sparql.algebra.OpVisitorByTypeBase;
import org.apache.jena.sparql.algebra.OpWalker;
import org.apache.jena.sparql.algebra.op.Op0;
import org.apache.jena.sparql.algebra.op.Op1;
import org.apache.jena.sparql.algebra.op.Op2;
import org.apache.jena.sparql.algebra.op.OpExt;
import org.apache.jena.sparql.algebra.op.OpFilter;
import org.apache.jena.sparql.algebra.op.OpLeftJoin;
import org.apache.jena.sparql.algebra.op.OpN;
public class OpVisitorFeatureExtractor<T>
extends OpVisitorByTypeBase
{
protected Set<T> features;
protected Function<Op, T> fnToFeature;
public OpVisitorFeatureExtractor(Function<Op, T> fnToFeature) {
super();
this.features = new HashSet<>();
this.fnToFeature = fnToFeature;
}
public Set<T> getFeatures() {
return features;
}
@Override
protected void visitN(OpN op) {
T t = fnToFeature.apply(op);
features.add(t);
}
@Override
protected void visit2(Op2 op) {
T t = fnToFeature.apply(op);
features.add(t);
}
@Override
protected void visit1(Op1 op) {
T t = fnToFeature.apply(op);
features.add(t);
}
@Override
protected void visit0(Op0 op) {
T t = fnToFeature.apply(op);
features.add(t);
}
@Override
protected void visitExt(OpExt op) {
T t = fnToFeature.apply(op);
features.add(t);
}
@Override
protected void visitFilter(OpFilter op) {
T t = fnToFeature.apply(op);
features.add(t);
}
@Override
protected void visitLeftJoin(OpLeftJoin op) {
T t = fnToFeature.apply(op);
features.add(t);
}
public static <T> Set<T> getFeatures(Op op, Function<Op, T> fnToFeature) {
Set<T> result;
if(op != null)
{
OpVisitorFeatureExtractor<T> visitor = new OpVisitorFeatureExtractor<T>(fnToFeature);
OpWalker.walk(op, visitor);
result = visitor.getFeatures();
} else {
result = Collections.emptySet();
}
return result;
}
}