/******************************************************************************* * Copyright (c) 2011 Miami-Dade County. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Public License v2.0 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html * * Contributors: * Miami-Dade County - initial API and implementation ******************************************************************************/ package org.sharegov.cirm.search.solr; import java.net.URLEncoder; import java.util.Collection; public class SearchQuery { public static final String SPACE = "%20"; public static final String COLON = "%3A"; public static final String PLUS = "%2B"; public static final String QUOTE = "%22"; public static final String LEFT_BRACKET = "%5B"; public static final String RIGHT_BRACKET = "%5D"; public static final String CARET = "%5E"; // Searches in all fields // public String question = null; // if set search in specified field for given values // public Map<String, Object> fieldsValuesMap = new HashMap<String, Object>(); // rows returned private int rows = 25; // start page private int start = 0; // sorting private String sortBy = "score"; private String sortDir = "desc"; private boolean includeScore = true; // facet // public String facetField = null; // public int facetMinCount = 3; // OR or AND operator used in query // public boolean OR_AND = true; private QueryExpression expression; public SearchQuery() { } public SearchQuery(QueryExpression expression) { this.expression = expression; } @SuppressWarnings({ }) public String toString() { //System.out.println("SOLR Query:" + expression.toString()); StringBuilder sb = new StringBuilder(256); // try { sb.append("?q="); sb.append(expression.toString()); if (start > 0) sb.append("&start=" + start); sb.append("&rows=" + rows); if (includeScore) sb.append("&fl=score"); if (sortBy != null) { sb.append("&sort=" + sortBy + SPACE + sortDir); } String val = sb.toString(); return val; } public int getRows() { return rows; } public void setRows(int rows) { this.rows = rows; } public int getStart() { return start; } public void setStart(int start) { this.start = start; } public String getSortBy() { return sortBy; } public void setSortBy(String sortBy) { this.sortBy = sortBy; } public String getSortDir() { return sortDir; } public void setSortDir(String sortDir) { this.sortDir = sortDir; } public boolean isIncludeScore() { return includeScore; } public void setIncludeScore(boolean includeScore) { this.includeScore = includeScore; } public QueryExpression getExpression() { return expression; } public void setExpression(QueryExpression expression) { this.expression = expression; } @SuppressWarnings("deprecation") public static String encode(String s) { if (s.startsWith(QUOTE) && s.endsWith(QUOTE)) return quote(URLEncoder.encode(s.substring(QUOTE.length(), s.length()-QUOTE.length()))); else return URLEncoder.encode(s); } public static String quote(Object value) { return QUOTE + value.toString() + QUOTE; } public static QueryOr oneOf(String name, Object [] values) { QueryOr or = QueryOr.make(new QueryExpression[0]); if (values != null) for (Object x : values) { if (x instanceof String) x = quote(x); or.add(field(name, x)); } return or; } public static QueryOr oneOf(String name, Collection<?> values) { QueryOr or = QueryOr.make(new QueryExpression[0]); if (values != null) for (Object x : values) { if (x instanceof String) x = quote(x); or.add(field(name, x)); } return or; } public static QueryFieldValue field(String name, Object value) { return new QueryFieldValue(name, value, null); } public static QueryFieldValue requiredField(String name, Object value) { return new QueryFieldValue(name, value, PLUS); } public static QueryFieldValue absentField(String name, Object value) { return new QueryFieldValue(name, value, "-"); } public static QueryFieldRange range(String name, Object start, Object end) { return new QueryFieldRange(name, start, end, null); } public static QueryFieldRange requiredRange(String name, Object start, Object end) { return new QueryFieldRange(name, start, end, PLUS); } public static QueryFieldRange absentRange(String name, Object start, Object end) { return new QueryFieldRange(name, start, end, "-"); } public static QueryOr or(QueryExpression...expressions) { return QueryOr.make(expressions); } public static QueryAnd and(QueryExpression...expressions) { return QueryAnd.make(expressions); } public static QueryNot not(QueryExpression negated) { return QueryNot.make(negated); } public static QueryBoost boost(QueryExpression expression, float boost) { return new QueryBoost(expression, boost); } }