package jpasearch.repository.query.builder;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.metamodel.PluralAttribute;
import javax.persistence.metamodel.SingularAttribute;
import jpasearch.repository.query.Path;
import jpasearch.repository.query.selector.ObjectTermSelector;
import jpasearch.repository.query.selector.StringTermSelector;
/**
* @author speralta
*/
public class TermSelectorBuilder<FROM, PARENT extends SelectorsBuilder<FROM, GRANDPARENT, PARENT>, GRANDPARENT> extends AbstractBuilder<PARENT> {
private final List<Path<FROM, ?>> paths = new ArrayList<>();
private Integer searchSimilarity = null;
private boolean orMode = true;
public TermSelectorBuilder(PARENT parent) {
super(parent);
}
public <TO> TermSelectorPathBuilder<FROM, FROM, TO, PARENT, GRANDPARENT> on(SingularAttribute<? super FROM, TO> attribute) {
return new TermSelectorPathBuilder<>(this, attribute);
}
public <TO> TermSelectorPathBuilder<FROM, FROM, TO, PARENT, GRANDPARENT> on(PluralAttribute<? super FROM, ?, TO> attribute) {
return new TermSelectorPathBuilder<>(this, attribute);
}
public TermSelectorBuilder<FROM, PARENT, GRANDPARENT> searchSimilarity(Integer searchSimilarity) {
this.searchSimilarity = searchSimilarity;
return this;
}
public TermSelectorBuilder<FROM, PARENT, GRANDPARENT> andMode() {
this.orMode = false;
return this;
}
public PARENT search(String... selected) {
StringTermSelector<FROM> termSelector = new StringTermSelector<>(paths);
termSelector.selected(selected);
termSelector.setSearchSimilarity(searchSimilarity);
termSelector.setOrMode(orMode);
return toParent().add(termSelector);
}
public PARENT search(Object... selected) {
ObjectTermSelector<FROM> termSelector = new ObjectTermSelector<>(paths);
termSelector.selected(selected);
termSelector.setSearchSimilarity(searchSimilarity);
termSelector.setOrMode(orMode);
return toParent().add(termSelector);
}
protected <TO> TermSelectorPathBuilder<FROM, FROM, TO, PARENT, GRANDPARENT> andOn(TermSelectorPathBuilder<FROM, ?, ?, PARENT, GRANDPARENT> termSelectorPathBuilder,
SingularAttribute<? super FROM, TO> attribute) {
addPath(termSelectorPathBuilder);
return new TermSelectorPathBuilder<>(this, attribute);
}
protected <TO> TermSelectorPathBuilder<FROM, FROM, TO, PARENT, GRANDPARENT> andOn(TermSelectorPathBuilder<FROM, ?, ?, PARENT, GRANDPARENT> termSelectorPathBuilder,
PluralAttribute<? super FROM, ?, TO> attribute) {
addPath(termSelectorPathBuilder);
return new TermSelectorPathBuilder<>(this, attribute);
}
protected PARENT search(TermSelectorPathBuilder<FROM, ?, ?, PARENT, GRANDPARENT> termSelectorPathBuilder, String... selected) {
addPath(termSelectorPathBuilder);
return search(selected);
}
protected PARENT search(TermSelectorPathBuilder<FROM, ?, ?, PARENT, GRANDPARENT> termSelectorPathBuilder, Object... selected) {
addPath(termSelectorPathBuilder);
return search(selected);
}
protected TermSelectorBuilder<FROM, PARENT, GRANDPARENT> searchSimilarity(TermSelectorPathBuilder<FROM, ?, ?, PARENT, GRANDPARENT> termSelectorPathBuilder, Integer searchSimilarity) {
addPath(termSelectorPathBuilder);
return searchSimilarity(searchSimilarity);
}
protected TermSelectorBuilder<FROM, PARENT, GRANDPARENT> andMode(TermSelectorPathBuilder<FROM, ?, ?, PARENT, GRANDPARENT> termSelectorPathBuilder) {
addPath(termSelectorPathBuilder);
return andMode();
}
private void addPath(TermSelectorPathBuilder<FROM, ?, ?, PARENT, GRANDPARENT> termSelectorPathBuilder) {
paths.add(termSelectorPathBuilder.getPath());
}
}