Note that there are some explanatory texts on larger screens.

plurals
  1. PORefactoring and removing if null checks in chain filtering
    primarykey
    data
    text
    <p>I'm doing some filtering on database entries and I ended up with somewhat ugly code, which I don't like.</p> <p>I have my <code>MyFilterResolverFactory</code> class where I build and return my <code>MyFilterResolver</code> chain.</p> <pre><code>public abstract class MyFilterResolver { protected MyFilterResolver nextResolver = EMPTY; protected List&lt;Predicate&gt; predicates; public List&lt;Predicate&gt; resolve(MyFilter filter, CriteriaBuilder cb, Root&lt;MyEntity&gt; root) { this.predicates = new ArrayList&lt;Predicate&gt;(); resolveFilter(filter, cb, root); this.predicates.addAll(this.nextResolver.resolve(filter, cb, root)); return this.predicates; } protected abstract void resolveFilter(MyFilter filter, CriteriaBuilder cb, Root&lt;MyEntity&gt; root); public void attachNextResolver(MyFilterResolver nextResolver) { this.nextResolver = nextResolver; } public static MyFilterResolver EMPTY = new MyFilterResolver() { @Override public List&lt;Predicate&gt; resolve(MyFilter filter, CriteriaBuilder cb, Root&lt;MyEntity&gt; root) { return new ArrayList&lt;Predicate&gt;(); } @Override protected void resolveFilter(MyFilter filter, CriteriaBuilder cb, Root&lt;MyEntity&gt; root) { } }; } </code></pre> <p>And an ugly, concrete implementation of it:</p> <pre><code>public class MyDateFilterResolver extends MyFilterResolver { @Override protected void resolveFilter(MyFilter filter, CriteriaBuilder cb, Root&lt;MyEntity&gt; root) { if (filter != null) { Date dateExact = filter.getDateExact(); Date dateAfter = filter.getDateAfter(); Date dateBefore = filter.getDateBefore(); if (dateExact != null) { Calendar calendar = Calendar.getInstance(); calendar.setTime(dateExact); calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); Date dayStart = calendar.getTime(); calendar = Calendar.getInstance(); calendar.setTime(dayStart); calendar.add(Calendar.DATE, 1); calendar.add(Calendar.MILLISECOND, -1); Date dayEnd = calendar.getTime(); super.predicates.add( cb.greaterThanOrEqualTo( root.get("date").as(Date.class), dayStart ) ); super.predicates.add( cb.lessThanOrEqualTo( root.get("date").as(Date.class), dayEnd ) ); } if (dateAfter != null) { super.predicates.add( cb.greaterThanOrEqualTo( root.get("date").as(Date.class), dateAfter ) ); } if (dateBefore != null) { predicates.add( cb.lessThanOrEqualTo( root.get("date").as(Date.class), dateBefore ) ); } } } } </code></pre> <p><code>MyFilter</code> class is a regular POJO with getters/setters only.</p> <p>I'd like to get rid of these <code>if (something != null)</code> checks, but I am not able to see how.</p>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload