package org.jai.search.model;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.elasticsearch.search.sort.SortOrder;
public class SearchCriteria {
private String query;
private String[] indices;
private String[] documentTypes;
private int from = 0;
private int size = 10;
private SortOrder sortOrder;
private boolean noFacets;
private final List<String> facets = new ArrayList<String>();
// Used to handle single select in "and" operations
private final Map<String, String> singleSelectFilters;
// Used for "or" operations between different facet entries.
private final Map<String, List<String>> multiSelectFilters;
// Used to filter on field values separately
// OR { condition1 AND {condition2 OR condition3 } }
private final List<Map<String, Object>> fieldValueFilters;
private final List<ProductProperty> productProperties;
private final List<Specification> specifications;
// sold out items at the end of list.
private boolean rescoreOnSoldOut;
private boolean useBoostingFactor;
public SearchCriteria() {
singleSelectFilters = new LinkedHashMap<String, String>();
multiSelectFilters = new LinkedHashMap<String, List<String>>();
fieldValueFilters = new ArrayList<Map<String, Object>>();
productProperties = new ArrayList<ProductProperty>();
specifications = new ArrayList<Specification>();
}
public String[] getIndexes() {
return indices;
}
public SearchCriteria indices(final String... indices) {
this.indices = indices;
return this;
}
public String[] getDocumentTypes() {
return documentTypes;
}
public SearchCriteria documentTypes(final String... documentTypes) {
this.documentTypes = documentTypes;
return this;
}
public SearchCriteria query(final String query) {
this.query = query;
return this;
}
public String getQuery() {
return query;
}
public int getFrom() {
return from;
}
public SearchCriteria from(final int from) {
this.from = from;
return this;
}
public SearchCriteria size(final int size) {
this.size = size;
return this;
}
public int getSize() {
return size;
}
public SortOrder getSortOrder() {
return sortOrder;
}
public SearchCriteria sortOrder(final SortOrder sortOrder) {
this.sortOrder = sortOrder;
return this;
}
public boolean isNoFacets() {
return noFacets;
}
public SearchCriteria noFacets(final boolean noFacets) {
this.noFacets = noFacets;
return this;
}
public List<String> getFacets() {
return facets;
}
public SearchCriteria facets(final String facet) {
facets.add(facet);
return this;
}
public void addFiledValueFilter(final String fieldName, final Object value) {
final Map<String, Object> fieldCrtiteria = new HashMap<String, Object>();
fieldCrtiteria.put(fieldName, value);
fieldValueFilters.add(fieldCrtiteria);
}
public SearchCriteria addMultiSelectFilter(final String facetCode,
final String facetTerm) {
List<String> list = multiSelectFilters.get(facetCode);
if (list == null) {
list = new ArrayList<String>();
multiSelectFilters.put(facetCode, list);
}
list.add(facetTerm);
return this;
}
public SearchCriteria addSingleSelectFilter(final String facetCode,
final String facetTerm) {
singleSelectFilters.put(facetCode, facetTerm);
return this;
}
public boolean hasFilters() {
return singleSelectFilters.size() > 0 || multiSelectFilters.size() > 0
|| fieldValueFilters.size() > 0 || productProperties.size() > 0
|| specifications.size() > 0;
}
public List<Map<String, Object>> getFieldValueFilters() {
return fieldValueFilters;
}
public Map<String, String> getSingleSelectFilters() {
return singleSelectFilters;
}
public Map<String, List<String>> getMultiSelectFilters() {
return multiSelectFilters;
}
public void addProductProperty(final ProductProperty productProperty) {
productProperties.add(productProperty);
}
public List<ProductProperty> getProductProperties() {
return productProperties;
}
public List<Specification> getSpecifications() {
return specifications;
}
public void addSpecifications(final Specification specification) {
specifications.add(specification);
}
public boolean isRescoreOnSoldOut() {
return rescoreOnSoldOut;
}
public SearchCriteria rescoreOnSoldOut(final boolean rescoreOnSoldOut) {
this.rescoreOnSoldOut = rescoreOnSoldOut;
return this;
}
public boolean isUseBoostingFactor() {
return useBoostingFactor;
}
public SearchCriteria useBoostingFactor(final boolean useBoostingFactor) {
this.useBoostingFactor = useBoostingFactor;
return this;
}
}