package jpasearch.repository.query.builder; import javax.persistence.metamodel.PluralAttribute; import javax.persistence.metamodel.SingularAttribute; import jpasearch.repository.query.Path; import jpasearch.repository.query.selector.Range; /** * @author speralta */ public class RangeFinalBuilder<F, FROM, TO extends Comparable<? super TO>, B extends SelectorsBuilder<F, ?, B>> extends AbstractPathBuilder<B, F, FROM, TO> { private Boolean includeNull = null; private boolean includeLowerBound = true; private boolean includeHigherBound = true; public RangeFinalBuilder(B parent, Path<F, TO> path) { super(parent, path); } public RangeFinalBuilder(B parent, PluralAttribute<? super F, ?, TO> attribute) { super(parent, attribute); } public RangeFinalBuilder(B parent, SingularAttribute<? super F, TO> attribute) { super(parent, attribute); } <E> RangeFinalBuilder(B parent, AbstractPathBuilder<B, F, E, FROM> pathBuilder, PluralAttribute<? super FROM, ?, TO> attribute) { super(parent, pathBuilder, attribute); } <E> RangeFinalBuilder(B parent, AbstractPathBuilder<B, F, E, FROM> pathBuilder, SingularAttribute<? super FROM, TO> attribute) { super(parent, pathBuilder, attribute); } public B between(TO from, TO to) { return getParent().add(createRange().lowerBound(from).higherBound(to)); } public B moreThan(TO from) { return getParent().add(createRange().lowerBound(from)); } public B lessThan(TO to) { return getParent().add(createRange().higherBound(to)); } public B and() { return getParent().add(createRange()); } public RangeFinalBuilder<F, FROM, TO, B> includingNull() { includeNull = true; return this; } public RangeFinalBuilder<F, FROM, TO, B> excludingNull() { includeNull = false; return this; } public RangeFinalBuilder<F, FROM, TO, B> excludingLowerBound() { includeLowerBound = false; return this; } public RangeFinalBuilder<F, FROM, TO, B> excludingHigherBound() { includeHigherBound = false; return this; } public RangeFinalBuilder<F, FROM, TO, B> excludingBounds() { return excludingHigherBound().excludingLowerBound(); } private Range<F, TO> createRange() { return new Range<>(getPath()).includeNull(includeNull).includeHigherBound(includeHigherBound).includeLowerBound(includeLowerBound); } }