package pl.edu.icm.saos.persistence.search.dto; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import pl.edu.icm.saos.persistence.common.DataObject; import pl.edu.icm.saos.persistence.search.model.Order; import java.io.Serializable; import java.util.ArrayList; import java.util.List; /** * Search filter. * @author lukdumi * */ @SuppressWarnings("serial") public abstract class SearchFilter implements Serializable { private static Logger log = LoggerFactory.getLogger(SearchFilter.class); protected int first = 0; protected int limit = 10; private QueryLanguage globalTermSyntax = QueryLanguage.SEARCH_TERMS; protected String globalTerm; protected String omit; protected List<Order> orders = new ArrayList<Order>(); /** * Oczekiwany typ wyniku */ public abstract Class<? extends DataObject> getReqType(); public SearchFilter byAll(String aAll) { setGlobalTerm(aAll); return this; } /** * Omit results marked with this omit flag * * @param omit the flag for results to omit * @return <code>this</this> * @see FieldNames#F_OMIT */ public SearchFilter omit(String omit) { setOmit(omit); return this; } //******************** LOGIC ******************** /** * pierwsza strona ma nr 0 */ public void setPage(int pageNo, int pageSize) { setLimit(pageSize); setFirst(pageNo * pageSize); } public boolean isEmpty() { return isGlobalTermEmpty(); } public boolean isGlobalTermEmpty() { return StringUtils.isEmpty(globalTerm); } public String toString() { return String.format("globalKey=%s", globalTerm); } /** * see {@link #addOrderBy(Order)} */ public void addOrderBy(String fieldName, boolean ascending) { addOrderBy( new Order(fieldName, ascending) ); } public void removeOrderBy(String fieldName) { for (Order order : new ArrayList<Order>(orders)) { if (order.getField().equals(fieldName)) { orders.remove(order); } } } /** * Nazwa pola z {@link FieldNames} * Uwaga: * - jeśli wybierzesz pole niesortowalne - solr rzuci wyjątek */ public void addOrderBy(Order order) { orders.add(order); } public SearchFilter orderByScore() { orders.clear(); orders.add(Order.relevanceOrder()); return this; } public Order getOrderBy(String fieldName) { for (Order order : orders) { if (order.getField().equals(fieldName)) { return order; } } return null; } //******************** GETTERS ******************** /** * @return the {@link QueryLanguage} that the query string is expressed in */ public QueryLanguage getGlobalTermSyntax() { return globalTermSyntax; } /** * Returns global query string (for example the value from the main GUI search input field). * * bw: aka ALL field search */ public String getGlobalTerm() { return globalTerm; } /** * @return the marker of results that should be excluded * @see FieldNames#F_OMIT */ public String getOmit() { return omit; } /** * pierwszy rekordy w result set, start licznika od 0 */ public int getFirst() { return first; } /** * lmit rekordów w result set */ public int getLimit() { return limit; } public List<Order> getOrders() { return orders; } //******************** SETTERS ******************** public void setGlobalTermSyntax(QueryLanguage queryType) { this.globalTermSyntax = queryType; } public void setGlobalTerm(String globalTerm) { this.globalTerm = globalTerm; } public void setOmit(String omit) { this.omit = omit; } public void setLimit(int limit) { this.limit = limit; } public void setFirst(int first) { this.first = first; } }