package com.mysema.rdfbean.query; import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import com.mysema.query.types.Predicate; import com.mysema.rdfbean.model.Block; import com.mysema.rdfbean.model.Blocks; import com.mysema.rdfbean.model.GroupBlock; /** * @author tiwe * */ public class Filters { private final Set<Predicate> filters = new LinkedHashSet<Predicate>(); private Set<Block> optBlocks = new LinkedHashSet<Block>(); private Set<Predicate> optFilters = new LinkedHashSet<Predicate>(); private boolean inOptional = false; public Set<Predicate> getFilters() { return filters; } public int size() { return filters.size(); } public void add(Predicate predicate) { if (inOptional) { if (predicate instanceof Block) { optBlocks.add((Block) predicate); } else { optFilters.add(predicate); } } else { filters.add(predicate); } } public boolean inOptional() { return inOptional; } public void beginOptional() { inOptional = true; } public void endOptional() { if (optBlocks.isEmpty()) { filters.addAll(optFilters); } else { filters.add(Blocks.optional( new ArrayList<Block>(optBlocks), optFilters.toArray(new Predicate[optFilters.size()]))); } optBlocks = new LinkedHashSet<Block>(); optFilters = new LinkedHashSet<Predicate>(); inOptional = false; } public Predicate[] toArray() { return filters.toArray(new Predicate[filters.size()]); } public Block asBlock() { List<Block> b = new ArrayList<Block>(); List<Predicate> f = new ArrayList<Predicate>(); for (Predicate filter : filters) { if (filter instanceof Block) { b.add((Block) filter); } else { f.add(filter); } } return new GroupBlock(b, f.toArray(new Predicate[f.size()])); } }