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.Selector;
import jpasearch.repository.query.selector.Selectors;
/**
* @author speralta
*/
public abstract class SelectorsBuilder<FROM, PARENT, CURRENT extends SelectorsBuilder<FROM, PARENT, CURRENT>> extends AbstractBuilder<PARENT> {
protected final Selectors<FROM> selectors;
public SelectorsBuilder(PARENT parent) {
super(parent);
selectors = new Selectors<>();
}
public SelectorsBuilder(PARENT parent, Selectors<FROM> selectors) {
super(parent);
this.selectors = selectors.copy();
}
public <TO> SelectorBuilder<FROM, FROM, TO, CURRENT> on(Path<FROM, TO> path) {
return new SelectorBuilder<>(getThis(), path);
}
public <TO> SelectorBuilder<FROM, FROM, TO, CURRENT> on(SingularAttribute<? super FROM, TO> attribute) {
return new SelectorBuilder<>(getThis(), attribute);
}
public <TO> SelectorBuilder<FROM, FROM, TO, CURRENT> on(PluralAttribute<? super FROM, ?, TO> attribute) {
return new SelectorBuilder<>(getThis(), attribute);
}
public <TO> TermSelectorPathBuilder<FROM, FROM, TO, CURRENT, PARENT> fullText(SingularAttribute<? super FROM, TO> attribute) {
return new TermSelectorBuilder<FROM, CURRENT, PARENT>(getThis()).on(attribute);
}
public <TO> TermSelectorPathBuilder<FROM, FROM, TO, CURRENT, PARENT> fullText(PluralAttribute<? super FROM, ?, TO> attribute) {
return new TermSelectorBuilder<FROM, CURRENT, PARENT>(getThis()).on(attribute);
}
public Selectors<FROM> getSelectors() {
return selectors;
}
public CURRENT add(Selector<FROM, ?> selector) {
selectors.add(selector);
return getThis();
}
protected abstract CURRENT getThis();
}