package jpasearch.repository.query.builder; import javax.persistence.metamodel.PluralAttribute; import javax.persistence.metamodel.SingularAttribute; import jpasearch.repository.query.Path; import jpasearch.repository.query.SearchMode; import jpasearch.repository.query.selector.ObjectTermSelector; import jpasearch.repository.query.selector.PropertySelector; import jpasearch.repository.query.selector.Range; import jpasearch.repository.query.selector.StringTermSelector; /** * @author speralta */ public class SelectorBuilder<F, FROM, TO, B extends SelectorsBuilder<F, ?, B>> extends AbstractPathBuilder<B, F, FROM, TO> { private boolean not = false; public SelectorBuilder(B builder, Path<F, TO> path) { super(builder, path); } public SelectorBuilder(B builder, SingularAttribute<? super F, TO> attribute) { super(builder, attribute); } public SelectorBuilder(B builder, PluralAttribute<? super F, ?, TO> attribute) { super(builder, attribute); } private <E> SelectorBuilder(B builder, SelectorBuilder<F, E, FROM, B> selectorBuilder, SingularAttribute<? super FROM, TO> attribute) { super(builder, selectorBuilder, attribute); this.not = selectorBuilder.not; } private <E> SelectorBuilder(B builder, SelectorBuilder<F, E, FROM, B> selectorBuilder, PluralAttribute<? super FROM, ?, TO> attribute) { super(builder, selectorBuilder, attribute); this.not = selectorBuilder.not; } @SuppressWarnings("unchecked") public B equalsTo(TO... values) { return getParent().add(new PropertySelector<>(getPath(), values).searchMode(SearchMode.EQUALS).notMode(not)); } @SuppressWarnings("unchecked") public B anywhere(TO... values) { return getParent().add(new PropertySelector<>(getPath(), values).searchMode(SearchMode.ANYWHERE).notMode(not)); } @SuppressWarnings("unchecked") public B endingLike(TO... values) { return getParent().add(new PropertySelector<>(getPath(), values).searchMode(SearchMode.ENDING_LIKE).notMode(not)); } @SuppressWarnings("unchecked") public B startingLike(TO... values) { return getParent().add(new PropertySelector<>(getPath(), values).searchMode(SearchMode.STARTING_LIKE).notMode(not)); } @SuppressWarnings("unchecked") public B like(TO... values) { return getParent().add(new PropertySelector<>(getPath(), values).searchMode(SearchMode.LIKE).notMode(not)); } public B fullText(String... selected) { return getParent().add(new StringTermSelector<>(getPath()).notMode(not).selected(selected)); } public B fullText(Object... selected) { return getParent().add(new ObjectTermSelector<>(getPath()).notMode(not).selected(selected)); } public <E extends Comparable<E>> B between(E from, E to, SingularAttribute<? super TO, E> attribute) { return getParent().add(new Range<F, E>(from, to, getPath().add(attribute))); } public <E extends Comparable<E>> B between(E from, E to, PluralAttribute<? super TO, ?, E> attribute) { return getParent().add(new Range<F, E>(from, to, getPath().add(attribute))); } public <E> SelectorBuilder<F, TO, E, B> to(SingularAttribute<? super TO, E> attribute) { return new SelectorBuilder<F, TO, E, B>(getParent(), this, attribute); } public <E> SelectorBuilder<F, TO, E, B> to(PluralAttribute<? super TO, ?, E> attribute) { return new SelectorBuilder<F, TO, E, B>(getParent(), this, attribute); } public SelectorBuilder<F, FROM, TO, B> not() { not = true; return this; } }