package net.techreadiness.persistence.criteriaquery;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlElement;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;
public class Criteria {
private String queryName;
private String fullTextSearch;
private boolean delimitFullTextSearch = true;
private List<CriteriaSort> sorts = new ArrayList<>();
private List<CriteriaFilter> filters = new ArrayList<>();
private Multimap<String, Object> parameters = HashMultimap.create();
private Integer firstResults = null;
private Integer pageSize = null;
public Criteria(String queryName, Integer firstResults, Integer pageSize) {
this.queryName = queryName;
this.firstResults = firstResults;
this.pageSize = pageSize;
}
public Criteria(Integer firstResults, Integer pageSize) {
this.firstResults = firstResults;
this.pageSize = pageSize;
}
public Criteria() {
}
/**
* Name of the query to be executed. This query must be defined in the CMOS meta-data table (CM_QUERY_SQL).
*
* @return query name
*/
@XmlElement(required = true)
public String getQueryName() {
return queryName;
}
/**
* Sets the name of the query to be executed. This query must be defined in the CMOS meta-data table (CM_QUERY_SQL).
*
* @param queryName
* name of query to be executed.
*/
public void setQueryName(String queryName) {
this.queryName = queryName;
}
/**
* Set the first result (starting at 1) to be retrieved. This can be used in combination with {@code setPageSize} to do
* paging.
*
* @return first result (starting at 1) to be retrieved
*/
public Integer getFirstResults() {
return firstResults;
}
/**
* Set the first row (starting at 1) to be retrieved.
*
* @param firstResults
* first row to be retrieved
*/
public void setFirstResults(Integer firstResults) {
this.firstResults = firstResults;
}
/**
* Returns the limit upon the number of rows to be retrieved.
* @return Maximum number of results to display on a single page.
*/
@XmlElement(required = true)
public Integer getPageSize() {
return pageSize;
}
/**
* Set a limit upon the number of rows to be retrieved.
*
* @param pageSize
* max number of rows to be retrieved
*/
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(queryName);
if (sorts != null && sorts.size() > 0) {
sb.append(" ( sortOrder=[");
for (CriteriaSort sort : sorts) {
sb.append(sort.fieldName + (sort.isDescending() ? "asc " : "desc "));
}
sb.append(")");
}
if (firstResults != null) {
sb.append(", firstResults=" + firstResults);
}
if (pageSize != null) {
sb.append(", pageSize=" + pageSize);
}
sb.append(", parameters=[");
if (filters == null) {
sb.append("none");
} else {
for (CriteriaFilter filter : filters) {
sb.append(filter + ",");
}
// sb.append(StringUtils.join(parameters, ','));
}
sb.append("]");
return sb.toString();
}
public String getFullTextSearch() {
return fullTextSearch;
}
public void setFullTextSearch(String fullTextSearch) {
this.fullTextSearch = fullTextSearch;
}
public List<CriteriaFilter> getFilters() {
return filters;
}
public void setFilters(List<CriteriaFilter> filters) {
this.filters = filters;
}
public void addFilter(CriteriaFilter filter) {
filters.add(filter);
}
public void addSimpleFilter(String field, String value) {
filters.add(new CriteriaFilter(field, value));
}
public void addSort(CriteriaSort sort) {
sorts.add(sort);
}
public List<CriteriaSort> getSorts() {
return sorts;
}
public void setSorts(List<CriteriaSort> sorts) {
this.sorts = sorts;
}
public boolean isPagingActive() {
return pageSize != null && firstResults != null;
}
public Multimap<String, Object> getParameters() {
return parameters;
}
public void setParameters(Multimap<String, Object> parameters) {
this.parameters = parameters;
}
public boolean getDelimitFullTextSearch() {
return delimitFullTextSearch;
}
public void setDelimitFullTextSearch(boolean delimitFullTextSearch) {
this.delimitFullTextSearch = delimitFullTextSearch;
}
}