package com.mysema.rdfbean.model;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.annotation.Nullable;
import com.mysema.query.JoinExpression;
import com.mysema.query.QueryMetadata;
import com.mysema.query.types.Constant;
import com.mysema.query.types.Expression;
import com.mysema.query.types.FactoryExpression;
import com.mysema.query.types.Operation;
import com.mysema.query.types.ParamExpression;
import com.mysema.query.types.Path;
import com.mysema.query.types.SubQueryExpression;
import com.mysema.query.types.TemplateExpression;
public class NamespaceCollector implements RDFVisitor<Void, Void> {
private final Set<String> namespaces = new HashSet<String>();
@Override
public Void visit(QueryMetadata md, QueryLanguage<?, ?> queryType) {
return visit(md);
}
@Nullable
private Void visit(QueryMetadata md) {
// select
handle(md.getProjection());
// from
for (JoinExpression join : md.getJoins()) {
join.getTarget().accept(this, null);
}
// where
handle(md.getWhere());
// group
handle(md.getGroupBy());
// having
handle(md.getHaving());
return null;
}
@Override
public Void visit(UnionBlock expr, Void context) {
handle(expr.getBlocks());
return null;
}
@Override
public Void visit(GroupBlock expr, Void context) {
handle(expr.getBlocks());
handle(expr.getFilters());
return null;
}
@Override
public Void visit(GraphBlock expr, Void context) {
handle(expr.getBlocks());
handle(expr.getContext());
return null;
}
@Override
public Void visit(OptionalBlock expr, Void context) {
handle(expr.getBlocks());
handle(expr.getFilters());
return null;
}
@Override
public Void visit(PatternBlock expr, Void context) {
handle(expr.getSubject());
handle(expr.getPredicate());
handle(expr.getObject());
handle(expr.getContext());
return null;
}
@Override
public Void visit(Constant<?> expr, Void context) {
Object o = expr.getConstant();
if (o instanceof Collection<?>) {
Collection<?> col = (Collection<?>) o;
for (Object c : col) {
if (c instanceof UID) {
namespaces.add(((UID) c).ns());
}
}
} else if (o instanceof UID) {
namespaces.add(((UID) o).ns());
}
return null;
}
@Override
public Void visit(FactoryExpression<?> expr, Void context) {
return null;
}
@Override
public Void visit(Operation<?> expr, Void context) {
handle(expr.getArgs());
return null;
}
@Override
public Void visit(ParamExpression<?> expr, Void context) {
return null;
}
@Override
public Void visit(Path<?> expr, Void context) {
if (expr.getMetadata().getElement() instanceof Expression) {
handle((Expression) expr.getMetadata().getElement());
}
handle(expr.getMetadata().getParent());
return null;
}
@Override
public Void visit(SubQueryExpression<?> expr, Void context) {
return visit(expr.getMetadata());
}
@Override
public Void visit(TemplateExpression<?> expr, Void context) {
handle(expr.getArgs());
return null;
}
private void handle(@Nullable Expression<?> e) {
if (e != null) {
e.accept(this, null);
}
}
private void handle(List<?> args) {
for (Object arg : args) {
if (arg instanceof Expression) {
((Expression) arg).accept(this, null);
}
}
}
public Set<String> getNamespaces() {
return namespaces;
}
}