/*
* JBoss, Home of Professional Open Source
* Copyright 2012 Red Hat Inc. and/or its affiliates and other contributors
* as indicated by the @authors tag. All rights reserved.
*/
package org.searchisko.api.model;
import java.util.*;
import org.searchisko.api.util.QuerySettingsParser;
/**
* Search Query settings sent from client to search method.
*
* @author Lukas Vlcek
* @author Libor Krzyzanek
* @author Vlastimil Elias (velias at redhat dot com)
*/
public class QuerySettings {
public static class Filters {
private final Map<String, List<String>> acknowledgedFilterCandidates = new HashMap<>();
// should be used only in tests
public void acknowledgeUrlFilterCandidate(String urlParamName, String... values) {
acknowledgeUrlFilterCandidate(urlParamName, Arrays.asList(values));
}
/**
* Remember urlParamName and all provided values.
*
* @param urlParamName name of URL parameter
* @param values
*/
public void acknowledgeUrlFilterCandidate(String urlParamName, List<String> values) {
acknowledgedFilterCandidates.put(urlParamName, values);
}
/**
* Forgets previously remembered urlParamNames and its values.
*
* @param urlParamNames
*/
public void forgetUrlFilterCandidate(String... urlParamNames) {
for (String paramName : urlParamNames) {
if (acknowledgedFilterCandidates.containsKey(paramName)) {
acknowledgedFilterCandidates.remove(paramName);
}
}
}
/**
* @return set of filter names
*/
public Set<String> getFilterCandidatesKeys() {
return acknowledgedFilterCandidates.keySet();
}
/**
* Returns all URL parameter values as provided by the client.
*
* @param urlParamName
* @return
*/
public List<String> getFilterCandidateValues(String urlParamName) {
return acknowledgedFilterCandidates.get(urlParamName);
}
/**
* Returns a distinct set of URL values for all provided URL parameters.
*
* @param urlParamName
* @return
*/
public Set<String> getFilterCandidateValues(Set<String> urlParamName) {
Set<String> distinctValues = new HashSet<>();
for (String paramName: urlParamName) {
for (String value : acknowledgedFilterCandidates.get(paramName)) {
distinctValues.add(value);
}
}
return distinctValues;
}
/**
* Returns first random value for given parameter name.
* Generally, client can send multiple values for one parameter name.
*
* @param urlParamName first value for given parameter name or null
* @return first value for filter candidate or null
*/
public String getFirstValueForFilterCandidate(String urlParamName) {
if (acknowledgedFilterCandidates.containsKey(urlParamName) &&
acknowledgedFilterCandidates.get(urlParamName).size() > 0) {
return acknowledgedFilterCandidates.get(urlParamName).get(0);
} else {
return null;
}
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("Filter candidates [");
boolean first = true;
for (String key : acknowledgedFilterCandidates.keySet()) {
if (!first) sb.append(", ");
sb.append(key).append("=").append(acknowledgedFilterCandidates.get(key));
first = false;
}
sb.append("]");
return sb.toString();
}
}
private Filters filters = null;
/**
* Fulltext query
*/
private String query;
public static final String QUERY_KEY = "query";
private boolean queryHighlight = false;
public static final String QUERY_HIGHLIGHT_KEY = "query_highlight";
/**
* List of fields in response
*/
private List<String> fields;
public static final String FIELDS_KEY = "field";
private Set<String> aggregations;
public static final String AGGREGATION_KEY = "agg";
/**
* Results Paging - start index
*/
private Integer from = null;
public static final String FROM_KEY = "from";
/**
* Results Paging - count of returned results
*/
private Integer size = null;
public static final String SIZE_KEY = "size";
/**
* Sorting of results
*/
private SortByValue sortBy;
public static final String SORT_BY_KEY = "sortBy";
public void setFilters(Filters filters) {
this.filters = filters;
}
public void setQuery(String query) {
this.query = query;
}
public void setSortBy(SortByValue sortBy) {
this.sortBy = sortBy;
}
public Filters getFilters() {
return filters;
}
/**
* Get filters, init object if not initialized yet
*
* @return filters, never null
*/
public Filters getFiltersInit() {
if (filters == null)
filters = new Filters();
return filters;
}
/**
* @return search query or null
*/
public String getQuery() {
return query;
}
public SortByValue getSortBy() {
return sortBy;
}
public List<String> getFields() {
return fields;
}
public void setFields(List<String> fields) {
this.fields = fields;
}
public void addField(String value) {
if (value == null)
return;
if (fields == null)
fields = new ArrayList<String>();
fields.add(value);
}
public boolean isQueryHighlight() {
return queryHighlight;
}
public void setQueryHighlight(boolean queryHighlight) {
this.queryHighlight = queryHighlight;
}
public Set<String> getAggregations() {
return aggregations;
}
public void addAggregation(String value) {
if (value == null)
return;
if (aggregations == null)
aggregations = new LinkedHashSet<>();
aggregations.add(value);
}
public void setFrom(Integer from) {
this.from = from;
}
public Integer getFrom() {
return from;
}
public Integer getSize() {
return size;
}
public void setSize(Integer size) {
this.size = size;
}
public void clearAggregations() {
if (aggregations != null)
aggregations.clear();
}
public void clearFields() {
if (fields != null)
fields.clear();
}
@Override
public String toString() {
return "QuerySettings [filters=" + filters + ", query=" + query + ", queryHighlight=" + queryHighlight + ", field="
+ fields + ", aggregations=" + aggregations + ", sortBy=" + sortBy + "]";
}
}