package au.com.vaadinutils.dao; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import au.com.vaadinutils.dao.JpaBaseDao.Condition; /** * Sometimes it is faster to run multiple queries returning the same entity than * it is to run a single (potentially slow) query with multiple joins and * clauses. This class can be used to group the queries and return the results * from them in a single set. * * Usage example: * * <pre> * <code> * final JpaDslBuilderGroup<TblSalesCustCallItem> queryGroup = new JpaDslBuilderGroup<>(TblSalesCustCallItem.class); * queryGroup.setCommon(new JpaDslBuilderGroupCommon<TblSalesCustCallItem>() * { * @Override * public void conditionsWillBeAdded(JpaDslBuilder<TblSalesCustCallItem> builder, * List<Condition<TblSalesCustCallItem>> conditions) * { * conditions.add(builder.eq(TblSalesCustCallItem_.contact, contact)); * } * }); * * queryGroup.addItem(new JpaDslBuilderGroupItem<TblSalesCustCallItem>() * { * @Override * public void conditionsWillBeAdded(JpaDslBuilder<TblSalesCustCallItem> builder, * List<Condition<TblSalesCustCallItem>> conditions) * { * conditions.add(builder.eq(TblSalesCustCallItem_.salesperson, salesperson)); * } * }); * * final List<TblSalesCustCallItem> results = queryGroup.getResults(); * </code> * </pre> * */ public class JpaDslBuilderGroup<E> { private List<JpaDslBuilderGroupItem<E>> builders = new ArrayList<>(); private JpaDslBuilderGroupCommon<E> common; private Class<E> entityClass; private List<E> results = new ArrayList<>(); private boolean distinct = false; private List<JpaDslOrder> orders = new ArrayList<>(); public JpaDslBuilderGroup(final Class<E> entityClass) { this.entityClass = entityClass; } public void addItem(JpaDslBuilderGroupItem<E> builder) { builders.add(builder); } public interface JpaDslBuilderGroupItem<E> { public void conditionsWillBeAdded(final JpaDslBuilder<E> builder, final List<Condition<E>> conditions); } public void setCommon(JpaDslBuilderGroupCommon<E> common) { this.common = common; } public interface JpaDslBuilderGroupCommon<E> { public void conditionsWillBeAdded(final JpaDslBuilder<E> builder, final List<Condition<E>> conditions); } public List<E> getResults() { if (builders.size() > 0) { for (JpaDslBuilderGroupItem<E> builder : builders) { results.addAll(makeQuery(builder)); } } else { results.addAll(makeQuery(null)); } return results; } private List<E> makeQuery(final JpaDslBuilderGroupItem<E> builder) { final JpaDslBuilder<E> q = new JpaDslBuilder<E>(entityClass); final List<Condition<E>> conditions = new LinkedList<>(); if (common != null) { common.conditionsWillBeAdded(q, conditions); } if (builder != null) { builder.conditionsWillBeAdded(q, conditions); } if (distinct) { q.distinct(); } q.where(conditions); for (JpaDslOrder order : orders) { q.orderBy(order.getField(), order.getAscending()); } return q.getResultList(); } public void distinct() { distinct = true; } public void orderBy(final String field, final boolean ascending) { orders.add(new JpaDslOrder(field, ascending)); } }