You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by cp...@apache.org on 2015/11/18 20:48:41 UTC
svn commit: r1715049 - in /lucene/dev/trunk/solr: ./
core/src/java/org/apache/solr/handler/component/
core/src/java/org/apache/solr/search/ core/src/java/org/apache/solr/util/
core/src/test/org/apache/solr/search/
solrj/src/java/org/apache/solr/client/...
Author: cpoerschke
Date: Wed Nov 18 19:48:40 2015
New Revision: 1715049
URL: http://svn.apache.org/viewvc?rev=1715049&view=rev
Log:
SOLR-8283: factor out SortSpecParsing[Test] from QueryParsing[Test]
Added:
lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/SortSpecParsing.java
- copied, changed from r1715019, lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/QueryParsing.java
lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/SortSpecParsingTest.java
- copied, changed from r1715019, lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/QueryParsingTest.java
Modified:
lucene/dev/trunk/solr/CHANGES.txt
lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/ExpandComponent.java
lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java
lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/CollapsingQParserPlugin.java
lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/LuceneQParserPlugin.java
lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/QParser.java
lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/QueryParsing.java
lucene/dev/trunk/solr/core/src/java/org/apache/solr/util/SolrPluginUtils.java
lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/CursorMarkTest.java
lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/QueryParsingTest.java
lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/TestSort.java
lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/SolrQuery.java
Modified: lucene/dev/trunk/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/CHANGES.txt?rev=1715049&r1=1715048&r2=1715049&view=diff
==============================================================================
--- lucene/dev/trunk/solr/CHANGES.txt (original)
+++ lucene/dev/trunk/solr/CHANGES.txt Wed Nov 18 19:48:40 2015
@@ -532,7 +532,8 @@ Other Changes
* SOLR-8300: Use constants for the /overseer_elect znode (Varun Thacker)
-* SOLR-8283: factor out StrParser from QueryParsing.StrParser (Christine Poerschke)
+* SOLR-8283: factor out StrParser from QueryParsing.StrParser and SortSpecParsing[Test]
+ from QueryParsing[Test] (Christine Poerschke)
================== 5.3.1 ==================
Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/ExpandComponent.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/ExpandComponent.java?rev=1715049&r1=1715048&r2=1715049&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/ExpandComponent.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/ExpandComponent.java Wed Nov 18 19:48:40 2015
@@ -88,9 +88,9 @@ import org.apache.solr.search.DocIterato
import org.apache.solr.search.DocList;
import org.apache.solr.search.DocSlice;
import org.apache.solr.search.QParser;
-import org.apache.solr.search.QueryParsing;
import org.apache.solr.search.SolrConstantScoreQuery;
import org.apache.solr.search.SolrIndexSearcher;
+import org.apache.solr.search.SortSpecParsing;
import org.apache.solr.util.plugin.PluginInfoInitialized;
import org.apache.solr.util.plugin.SolrCoreAware;
@@ -169,7 +169,7 @@ public class ExpandComponent extends Sea
Sort sort = null;
if (sortParam != null) {
- sort = QueryParsing.parseSortSpec(sortParam, rb.req).getSort();
+ sort = SortSpecParsing.parseSortSpec(sortParam, rb.req).getSort();
}
Query query;
Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java?rev=1715049&r1=1715048&r2=1715049&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java Wed Nov 18 19:48:40 2015
@@ -85,6 +85,7 @@ import org.apache.solr.search.ReturnFiel
import org.apache.solr.search.SolrIndexSearcher;
import org.apache.solr.search.SolrReturnFields;
import org.apache.solr.search.SortSpec;
+import org.apache.solr.search.SortSpecParsing;
import org.apache.solr.search.SyntaxError;
import org.apache.solr.search.grouping.CommandHandler;
import org.apache.solr.search.grouping.GroupingSpecification;
@@ -257,7 +258,7 @@ public class QueryComponent extends Sear
// groupSort defaults to sort
String groupSortStr = params.get(GroupParams.GROUP_SORT);
//TODO: move weighting of sort
- Sort sortWithinGroup = groupSortStr == null ? groupSort : searcher.weightSort(QueryParsing.parseSortSpec(groupSortStr, req).getSort());
+ Sort sortWithinGroup = groupSortStr == null ? groupSort : searcher.weightSort(SortSpecParsing.parseSortSpec(groupSortStr, req).getSort());
if (sortWithinGroup == null) {
sortWithinGroup = Sort.RELEVANCE;
}
Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/CollapsingQParserPlugin.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/CollapsingQParserPlugin.java?rev=1715049&r1=1715048&r2=1715049&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/CollapsingQParserPlugin.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/CollapsingQParserPlugin.java Wed Nov 18 19:48:40 2015
@@ -295,7 +295,7 @@ public class CollapsingQParserPlugin ext
this.sortSpec = GroupHeadSelectorType.SORT.equals(groupHeadSelector.type)
- ? QueryParsing.parseSortSpec(groupHeadSelector.selectorText, request)
+ ? SortSpecParsing.parseSortSpec(groupHeadSelector.selectorText, request)
: null;
this.hint = localParams.get("hint");
Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/LuceneQParserPlugin.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/LuceneQParserPlugin.java?rev=1715049&r1=1715048&r2=1715049&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/LuceneQParserPlugin.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/LuceneQParserPlugin.java Wed Nov 18 19:48:40 2015
@@ -86,7 +86,7 @@ class OldLuceneQParser extends LuceneQPa
public SortSpec getSort(boolean useGlobal) throws SyntaxError {
SortSpec sort = super.getSort(useGlobal);
if (sortStr != null && sortStr.length()>0 && sort.getSort()==null) {
- SortSpec oldSort = QueryParsing.parseSortSpec(sortStr, getReq());
+ SortSpec oldSort = SortSpecParsing.parseSortSpec(sortStr, getReq());
if( oldSort.getSort() != null ) {
sort.setSortAndFields(oldSort.getSort(), oldSort.getSchemaFields());
}
Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/QParser.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/QParser.java?rev=1715049&r1=1715048&r2=1715049&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/QParser.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/QParser.java Wed Nov 18 19:48:40 2015
@@ -244,7 +244,7 @@ public abstract class QParser {
int start = startS != null ? Integer.parseInt(startS) : 0;
int rows = rowsS != null ? Integer.parseInt(rowsS) : 10;
- SortSpec sort = QueryParsing.parseSortSpec(sortStr, req);
+ SortSpec sort = SortSpecParsing.parseSortSpec(sortStr, req);
sort.setOffset(start);
sort.setCount(rows);
Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/QueryParsing.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/QueryParsing.java?rev=1715049&r1=1715048&r2=1715049&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/QueryParsing.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/QueryParsing.java Wed Nov 18 19:48:40 2015
@@ -18,8 +18,6 @@
package org.apache.solr.search;
import org.apache.lucene.index.Term;
-import org.apache.lucene.queries.function.FunctionQuery;
-import org.apache.lucene.queries.function.valuesource.QueryValueSource;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.BoostQuery;
@@ -28,25 +26,19 @@ import org.apache.lucene.search.FuzzyQue
import org.apache.lucene.search.NumericRangeQuery;
import org.apache.lucene.search.PrefixQuery;
import org.apache.lucene.search.Query;
-import org.apache.lucene.search.Sort;
-import org.apache.lucene.search.SortField;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TermRangeQuery;
import org.apache.lucene.search.WildcardQuery;
import org.apache.lucene.util.BytesRef;
import org.apache.lucene.util.CharsRefBuilder;
-import org.apache.solr.common.SolrException;
import org.apache.solr.common.params.MapSolrParams;
import org.apache.solr.common.params.SolrParams;
import org.apache.solr.parser.QueryParser;
-import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.schema.FieldType;
import org.apache.solr.schema.IndexSchema;
-import org.apache.solr.schema.SchemaField;
import java.io.IOException;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -64,9 +56,6 @@ public class QueryParsing {
public static final String DEFTYPE = "defType"; // default parser for any direct subqueries
public static final String LOCALPARAM_START = "{!";
public static final char LOCALPARAM_END = '}';
- public static final String DOCID = "_docid_";
- public static final String SCORE = "score";
-
// true if the value was specified by the "v" param (i.e. v=myval, or v=$param)
public static final String VAL_EXPLICIT = "__VAL_EXPLICIT__";
@@ -221,162 +210,6 @@ public class QueryParsing {
return new MapSolrParams(localParams);
}
- /**
- * <p>
- * The form of the sort specification string currently parsed is:
- * </p>
- * <pre>
- * SortSpec ::= SingleSort [, SingleSort]*
- * SingleSort ::= <fieldname|function> SortDirection
- * SortDirection ::= top | desc | bottom | asc
- * </pre>
- * Examples:
- * <pre>
- * score desc #normal sort by score (will return null)
- * weight bottom #sort by weight ascending
- * weight desc #sort by weight descending
- * height desc,weight desc #sort by height descending, and use weight descending to break any ties
- * height desc,weight asc #sort by height descending, using weight ascending as a tiebreaker
- * </pre>
- * @return a SortSpec object populated with the appropriate Sort (which may be null if
- * default score sort is used) and SchemaFields (where applicable) using
- * hardcoded default count & offset values.
- */
- public static SortSpec parseSortSpec(String sortSpec, SolrQueryRequest req) {
- if (sortSpec == null || sortSpec.length() == 0) return newEmptySortSpec();
-
- List<SortField> sorts = new ArrayList<>(4);
- List<SchemaField> fields = new ArrayList<>(4);
-
- try {
-
- StrParser sp = new StrParser(sortSpec);
- while (sp.pos < sp.end) {
- sp.eatws();
-
- final int start = sp.pos;
-
- // short circuit test for a really simple field name
- String field = sp.getId(null);
- Exception qParserException = null;
-
- if (field == null || !Character.isWhitespace(sp.peekChar())) {
- // let's try it as a function instead
- field = null;
- String funcStr = sp.val.substring(start);
-
- QParser parser = QParser.getParser(funcStr, FunctionQParserPlugin.NAME, req);
- Query q = null;
- try {
- if (parser instanceof FunctionQParser) {
- FunctionQParser fparser = (FunctionQParser)parser;
- fparser.setParseMultipleSources(false);
- fparser.setParseToEnd(false);
-
- q = fparser.getQuery();
-
- if (fparser.localParams != null) {
- if (fparser.valFollowedParams) {
- // need to find the end of the function query via the string parser
- int leftOver = fparser.sp.end - fparser.sp.pos;
- sp.pos = sp.end - leftOver; // reset our parser to the same amount of leftover
- } else {
- // the value was via the "v" param in localParams, so we need to find
- // the end of the local params themselves to pick up where we left off
- sp.pos = start + fparser.localParamsEnd;
- }
- } else {
- // need to find the end of the function query via the string parser
- int leftOver = fparser.sp.end - fparser.sp.pos;
- sp.pos = sp.end - leftOver; // reset our parser to the same amount of leftover
- }
- } else {
- // A QParser that's not for function queries.
- // It must have been specified via local params.
- q = parser.getQuery();
-
- assert parser.getLocalParams() != null;
- sp.pos = start + parser.localParamsEnd;
- }
-
- Boolean top = sp.getSortDirection();
- if (null != top) {
- // we have a Query and a valid direction
- if (q instanceof FunctionQuery) {
- sorts.add(((FunctionQuery)q).getValueSource().getSortField(top));
- } else {
- sorts.add((new QueryValueSource(q, 0.0f)).getSortField(top));
- }
- fields.add(null);
- continue;
- }
- } catch (Exception e) {
- // hang onto this in case the string isn't a full field name either
- qParserException = e;
- }
- }
-
- // if we made it here, we either have a "simple" field name,
- // or there was a problem parsing the string as a complex func/quer
-
- if (field == null) {
- // try again, simple rules for a field name with no whitespace
- sp.pos = start;
- field = sp.getSimpleString();
- }
- Boolean top = sp.getSortDirection();
- if (null == top) {
- throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
- "Can't determine a Sort Order (asc or desc) in sort spec " + sp);
- }
-
- if (SCORE.equals(field)) {
- if (top) {
- sorts.add(SortField.FIELD_SCORE);
- } else {
- sorts.add(new SortField(null, SortField.Type.SCORE, true));
- }
- fields.add(null);
- } else if (DOCID.equals(field)) {
- sorts.add(new SortField(null, SortField.Type.DOC, top));
- fields.add(null);
- } else {
- // try to find the field
- SchemaField sf = req.getSchema().getFieldOrNull(field);
- if (null == sf) {
- if (null != qParserException) {
- throw new SolrException
- (SolrException.ErrorCode.BAD_REQUEST,
- "sort param could not be parsed as a query, and is not a "+
- "field that exists in the index: " + field,
- qParserException);
- }
- throw new SolrException
- (SolrException.ErrorCode.BAD_REQUEST,
- "sort param field can't be found: " + field);
- }
- sorts.add(sf.getSortField(top));
- fields.add(sf);
- }
- }
-
- } catch (SyntaxError e) {
- throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "error in sort: " + sortSpec, e);
- }
-
-
- // normalize a sort on score desc to null
- if (sorts.size()==1 && sorts.get(0) == SortField.FIELD_SCORE) {
- return newEmptySortSpec();
- }
-
- Sort s = new Sort(sorts.toArray(new SortField[sorts.size()]));
- return new SortSpec(s, fields);
- }
-
- private static SortSpec newEmptySortSpec() {
- return new SortSpec(null, Collections.<SchemaField>emptyList());
- }
///////////////////////////
Copied: lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/SortSpecParsing.java (from r1715019, lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/QueryParsing.java)
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/SortSpecParsing.java?p2=lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/SortSpecParsing.java&p1=lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/QueryParsing.java&r1=1715019&r2=1715049&rev=1715049&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/QueryParsing.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/SortSpecParsing.java Wed Nov 18 19:48:40 2015
@@ -1,3 +1,18 @@
+package org.apache.solr.search;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.lucene.queries.function.FunctionQuery;
+import org.apache.lucene.queries.function.valuesource.QueryValueSource;
+import org.apache.lucene.search.Query;
+import org.apache.lucene.search.Sort;
+import org.apache.lucene.search.SortField;
+import org.apache.solr.common.SolrException;
+import org.apache.solr.request.SolrQueryRequest;
+import org.apache.solr.schema.SchemaField;
+
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
@@ -15,212 +30,11 @@
* limitations under the License.
*/
-package org.apache.solr.search;
-
-import org.apache.lucene.index.Term;
-import org.apache.lucene.queries.function.FunctionQuery;
-import org.apache.lucene.queries.function.valuesource.QueryValueSource;
-import org.apache.lucene.search.BooleanClause;
-import org.apache.lucene.search.BooleanQuery;
-import org.apache.lucene.search.BoostQuery;
-import org.apache.lucene.search.ConstantScoreQuery;
-import org.apache.lucene.search.FuzzyQuery;
-import org.apache.lucene.search.NumericRangeQuery;
-import org.apache.lucene.search.PrefixQuery;
-import org.apache.lucene.search.Query;
-import org.apache.lucene.search.Sort;
-import org.apache.lucene.search.SortField;
-import org.apache.lucene.search.TermQuery;
-import org.apache.lucene.search.TermRangeQuery;
-import org.apache.lucene.search.WildcardQuery;
-import org.apache.lucene.util.BytesRef;
-import org.apache.lucene.util.CharsRefBuilder;
-import org.apache.solr.common.SolrException;
-import org.apache.solr.common.params.MapSolrParams;
-import org.apache.solr.common.params.SolrParams;
-import org.apache.solr.parser.QueryParser;
-import org.apache.solr.request.SolrQueryRequest;
-import org.apache.solr.schema.FieldType;
-import org.apache.solr.schema.IndexSchema;
-import org.apache.solr.schema.SchemaField;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Collection of static utilities useful for query parsing.
- *
- *
- */
-public class QueryParsing {
- public static final String OP = "q.op"; // the SolrParam used to override the QueryParser "default operator"
- public static final String V = "v"; // value of this parameter
- public static final String F = "f"; // field that a query or command pertains to
- public static final String TYPE = "type";// parser for this query or command
- public static final String DEFTYPE = "defType"; // default parser for any direct subqueries
- public static final String LOCALPARAM_START = "{!";
- public static final char LOCALPARAM_END = '}';
+public class SortSpecParsing {
+
public static final String DOCID = "_docid_";
public static final String SCORE = "score";
- // true if the value was specified by the "v" param (i.e. v=myval, or v=$param)
- public static final String VAL_EXPLICIT = "__VAL_EXPLICIT__";
-
-
- /**
- * Returns the "preferred" default operator for use by Query Parsers,
- * based on the settings in the IndexSchema which may be overridden using
- * an optional String override value.
- *
- * @see IndexSchema#getQueryParserDefaultOperator()
- * @see #OP
- */
- public static QueryParser.Operator getQueryParserDefaultOperator(final IndexSchema sch,
- final String override) {
- String val = override;
- if (null == val) val = sch.getQueryParserDefaultOperator();
- return "AND".equals(val) ? QueryParser.Operator.AND : QueryParser.Operator.OR;
- }
-
- /**
- * Returns the effective default field based on the 'df' param or
- * hardcoded schema default. May be null if either exists specified.
- * @see org.apache.solr.common.params.CommonParams#DF
- * @see org.apache.solr.schema.IndexSchema#getDefaultSearchFieldName
- */
- public static String getDefaultField(final IndexSchema s, final String df) {
- return df != null ? df : s.getDefaultSearchFieldName();
- }
-
- // note to self: something needs to detect infinite recursion when parsing queries
- public static int parseLocalParams(String txt, int start, Map<String, String> target, SolrParams params) throws SyntaxError {
- return parseLocalParams(txt, start, target, params, LOCALPARAM_START, LOCALPARAM_END);
- }
-
-
- public static int parseLocalParams(String txt, int start, Map<String, String> target, SolrParams params, String startString, char endChar) throws SyntaxError {
- int off = start;
- if (!txt.startsWith(startString, off)) return start;
- StrParser p = new StrParser(txt, start, txt.length());
- p.pos += startString.length(); // skip over "{!"
-
- for (; ;) {
- /*
- if (p.pos>=txt.length()) {
- throw new SyntaxError("Missing '}' parsing local params '" + txt + '"');
- }
- */
- char ch = p.peek();
- if (ch == endChar) {
- return p.pos + 1;
- }
-
- String id = p.getId();
- if (id.length() == 0) {
- throw new SyntaxError("Expected ending character '" + endChar + "' parsing local params '" + txt + '"');
-
- }
- String val = null;
-
- ch = p.peek();
- if (ch != '=') {
- // single word... treat {!func} as type=func for easy lookup
- val = id;
- id = TYPE;
- } else {
- // saw equals, so read value
- p.pos++;
- ch = p.peek();
- boolean deref = false;
- if (ch == '$') {
- p.pos++;
- ch = p.peek();
- deref = true; // dereference whatever value is read by treating it as a variable name
- }
-
- if (ch == '\"' || ch == '\'') {
- val = p.getQuotedString();
- } else {
- // read unquoted literal ended by whitespace or endChar (normally '}')
- // there is no escaping.
- int valStart = p.pos;
- for (; ;) {
- if (p.pos >= p.end) {
- throw new SyntaxError("Missing end to unquoted value starting at " + valStart + " str='" + txt + "'");
- }
- char c = p.val.charAt(p.pos);
- if (c == endChar || Character.isWhitespace(c)) {
- val = p.val.substring(valStart, p.pos);
- break;
- }
- p.pos++;
- }
- }
-
- if (deref) { // dereference parameter
- if (params != null) {
- val = params.get(val);
- }
- }
- }
- if (target != null) target.put(id, val);
- }
- }
-
-
- public static String encodeLocalParamVal(String val) {
- int len = val.length();
- int i = 0;
- if (len > 0 && val.charAt(0) != '$') {
- for (;i<len; i++) {
- char ch = val.charAt(i);
- if (Character.isWhitespace(ch) || ch=='}') break;
- }
- }
-
- if (i>=len) return val;
-
- // We need to enclose in quotes... but now we need to escape
- StringBuilder sb = new StringBuilder(val.length() + 4);
- sb.append('\'');
- for (i=0; i<len; i++) {
- char ch = val.charAt(i);
- if (ch=='\'') {
- sb.append('\\');
- }
- sb.append(ch);
- }
- sb.append('\'');
- return sb.toString();
- }
-
-
- /**
- * "foo" returns null
- * "{!prefix f=myfield}yes" returns type="prefix",f="myfield",v="yes"
- * "{!prefix f=myfield v=$p}" returns type="prefix",f="myfield",v=params.get("p")
- */
- public static SolrParams getLocalParams(String txt, SolrParams params) throws SyntaxError {
- if (txt == null || !txt.startsWith(LOCALPARAM_START)) {
- return null;
- }
- Map<String, String> localParams = new HashMap<>();
- int start = QueryParsing.parseLocalParams(txt, 0, localParams, params);
-
- String val = localParams.get(V);
- if (val == null) {
- val = txt.substring(start);
- localParams.put(V, val);
- } else {
- // localParams.put(VAL_EXPLICIT, "true");
- }
- return new MapSolrParams(localParams);
- }
-
/**
* <p>
* The form of the sort specification string currently parsed is:
@@ -378,209 +192,4 @@ public class QueryParsing {
return new SortSpec(null, Collections.<SchemaField>emptyList());
}
-
- ///////////////////////////
- ///////////////////////////
- ///////////////////////////
-
- static FieldType writeFieldName(String name, IndexSchema schema, Appendable out, int flags) throws IOException {
- FieldType ft = null;
- ft = schema.getFieldTypeNoEx(name);
- out.append(name);
- if (ft == null) {
- out.append("(UNKNOWN FIELD " + name + ')');
- }
- out.append(':');
- return ft;
- }
-
- static void writeFieldVal(String val, FieldType ft, Appendable out, int flags) throws IOException {
- if (ft != null) {
- try {
- out.append(ft.indexedToReadable(val));
- } catch (Exception e) {
- out.append("EXCEPTION(val=");
- out.append(val);
- out.append(")");
- }
- } else {
- out.append(val);
- }
- }
-
- static void writeFieldVal(BytesRef val, FieldType ft, Appendable out, int flags) throws IOException {
- if (ft != null) {
- try {
- CharsRefBuilder readable = new CharsRefBuilder();
- ft.indexedToReadable(val, readable);
- out.append(readable.get());
- } catch (Exception e) {
- out.append("EXCEPTION(val=");
- out.append(val.utf8ToString());
- out.append(")");
- }
- } else {
- out.append(val.utf8ToString());
- }
- }
-
-
- private static int FLAG_BOOSTED=0x01;
- private static int FLAG_IS_CLAUSE=0x02;
- /**
- * @see #toString(Query,IndexSchema)
- */
- public static void toString(Query query, IndexSchema schema, Appendable out, int flags) throws IOException {
- int subflag = flags & ~(FLAG_BOOSTED|FLAG_IS_CLAUSE); // clear the boosted / is clause flags for recursion
-
- if (query instanceof TermQuery) {
- TermQuery q = (TermQuery) query;
- Term t = q.getTerm();
- FieldType ft = writeFieldName(t.field(), schema, out, flags);
- writeFieldVal(t.bytes(), ft, out, flags);
- } else if (query instanceof TermRangeQuery) {
- TermRangeQuery q = (TermRangeQuery) query;
- String fname = q.getField();
- FieldType ft = writeFieldName(fname, schema, out, flags);
- out.append(q.includesLower() ? '[' : '{');
- BytesRef lt = q.getLowerTerm();
- BytesRef ut = q.getUpperTerm();
- if (lt == null) {
- out.append('*');
- } else {
- writeFieldVal(lt, ft, out, flags);
- }
-
- out.append(" TO ");
-
- if (ut == null) {
- out.append('*');
- } else {
- writeFieldVal(ut, ft, out, flags);
- }
-
- out.append(q.includesUpper() ? ']' : '}');
- } else if (query instanceof NumericRangeQuery) {
- NumericRangeQuery q = (NumericRangeQuery) query;
- String fname = q.getField();
- FieldType ft = writeFieldName(fname, schema, out, flags);
- out.append(q.includesMin() ? '[' : '{');
- Number lt = q.getMin();
- Number ut = q.getMax();
- if (lt == null) {
- out.append('*');
- } else {
- out.append(lt.toString());
- }
-
- out.append(" TO ");
-
- if (ut == null) {
- out.append('*');
- } else {
- out.append(ut.toString());
- }
-
- out.append(q.includesMax() ? ']' : '}');
- } else if (query instanceof BooleanQuery) {
- BooleanQuery q = (BooleanQuery) query;
- boolean needParens = false;
-
- if (q.getMinimumNumberShouldMatch() != 0 || q.isCoordDisabled() || (flags & (FLAG_IS_CLAUSE | FLAG_BOOSTED)) != 0 ) {
- needParens = true;
- }
- if (needParens) {
- out.append('(');
- }
- boolean first = true;
- for (BooleanClause c : q.clauses()) {
- if (!first) {
- out.append(' ');
- } else {
- first = false;
- }
-
- if (c.isProhibited()) {
- out.append('-');
- } else if (c.isRequired()) {
- out.append('+');
- }
- Query subQuery = c.getQuery();
-
- toString(subQuery, schema, out, subflag | FLAG_IS_CLAUSE);
-
- }
-
- if (needParens) {
- out.append(')');
- }
- if (q.getMinimumNumberShouldMatch() > 0) {
- out.append('~');
- out.append(Integer.toString(q.getMinimumNumberShouldMatch()));
- }
- if (q.isCoordDisabled()) {
- out.append("/no_coord");
- }
-
- } else if (query instanceof PrefixQuery) {
- PrefixQuery q = (PrefixQuery) query;
- Term prefix = q.getPrefix();
- FieldType ft = writeFieldName(prefix.field(), schema, out, flags);
- out.append(prefix.text());
- out.append('*');
- } else if (query instanceof WildcardQuery) {
- out.append(query.toString());
- } else if (query instanceof FuzzyQuery) {
- out.append(query.toString());
- } else if (query instanceof ConstantScoreQuery) {
- out.append(query.toString());
- } else if (query instanceof WrappedQuery) {
- WrappedQuery q = (WrappedQuery)query;
- out.append(q.getOptions());
- toString(q.getWrappedQuery(), schema, out, subflag);
- } else if (query instanceof BoostQuery) {
- BoostQuery q = (BoostQuery)query;
- toString(q.getQuery(), schema, out, subflag | FLAG_BOOSTED);
- out.append("^");
- out.append(Float.toString(q.getBoost()));
- }
- else {
- out.append(query.getClass().getSimpleName()
- + '(' + query.toString() + ')');
- }
- }
-
- /**
- * Formats a Query for debugging, using the IndexSchema to make
- * complex field types readable.
- * <p>
- * The benefit of using this method instead of calling
- * <code>Query.toString</code> directly is that it knows about the data
- * types of each field, so any field which is encoded in a particularly
- * complex way is still readable. The downside is that it only knows
- * about built in Query types, and will not be able to format custom
- * Query classes.
- * </p>
- */
- public static String toString(Query query, IndexSchema schema) {
- try {
- StringBuilder sb = new StringBuilder();
- toString(query, schema, sb, 0);
- return sb.toString();
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
-
- /**
- * Builds a list of String which are stringified versions of a list of Queries
- */
- public static List<String> toString(List<Query> queries, IndexSchema schema) {
- List<String> out = new ArrayList<>(queries.size());
- for (Query q : queries) {
- out.add(QueryParsing.toString(q, schema));
- }
- return out;
- }
-
}
Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/util/SolrPluginUtils.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/util/SolrPluginUtils.java?rev=1715049&r1=1715048&r2=1715049&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/util/SolrPluginUtils.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/util/SolrPluginUtils.java Wed Nov 18 19:48:40 2015
@@ -76,6 +76,7 @@ import org.apache.solr.search.ReturnFiel
import org.apache.solr.search.SolrCache;
import org.apache.solr.search.SolrIndexSearcher;
import org.apache.solr.search.SolrQueryParser;
+import org.apache.solr.search.SortSpecParsing;
import org.apache.solr.search.SyntaxError;
/**
@@ -465,7 +466,7 @@ public class SolrPluginUtils {
// we can use the Lucene sort ability.
Sort sort = null;
if (commands.size() >= 2) {
- sort = QueryParsing.parseSortSpec(commands.get(1), req).getSort();
+ sort = SortSpecParsing.parseSortSpec(commands.get(1), req).getSort();
}
DocList results = req.getSearcher().getDocList(query,(DocSet)null, sort, start, limit);
@@ -907,7 +908,7 @@ public class SolrPluginUtils {
SolrException sortE = null;
Sort ss = null;
try {
- ss = QueryParsing.parseSortSpec(sort, req).getSort();
+ ss = SortSpecParsing.parseSortSpec(sort, req).getSort();
} catch (SolrException e) {
sortE = e;
}
Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/CursorMarkTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/CursorMarkTest.java?rev=1715049&r1=1715048&r2=1715049&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/CursorMarkTest.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/CursorMarkTest.java Wed Nov 18 19:48:40 2015
@@ -62,7 +62,7 @@ public class CursorMarkTest extends Solr
final IndexSchema schema = req.getSchema();
final String randomSortString = CursorPagingTest.buildRandomSort(allFieldNames);
- final SortSpec ss = QueryParsing.parseSortSpec(randomSortString, req);
+ final SortSpec ss = SortSpecParsing.parseSortSpec(randomSortString, req);
final CursorMark previous = new CursorMark(schema, ss);
previous.parseSerializedTotem(CURSOR_MARK_START);
@@ -74,7 +74,7 @@ public class CursorMarkTest extends Solr
try {
// append to our random sort string so we know it has wrong num clauses
- final SortSpec otherSort = QueryParsing.parseSortSpec(randomSortString+",id asc", req);
+ final SortSpec otherSort = SortSpecParsing.parseSortSpec(randomSortString+",id asc", req);
CursorMark trash = previous.createNext(Arrays.<Object>asList
(buildRandomSortObjects(otherSort)));
fail("didn't fail on next with incorrect num of sortvalues");
@@ -88,7 +88,7 @@ public class CursorMarkTest extends Solr
final IndexSchema schema = req.getSchema();
try {
- final SortSpec ss = QueryParsing.parseSortSpec("str desc, score desc", req);
+ final SortSpec ss = SortSpecParsing.parseSortSpec("str desc, score desc", req);
final CursorMark totem = new CursorMark(schema, ss);
fail("no failure from sort that doesn't include uniqueKey field");
} catch (SolrException e) {
@@ -98,7 +98,7 @@ public class CursorMarkTest extends Solr
for (final String dir : Arrays.asList("asc", "desc")) {
try {
- final SortSpec ss = QueryParsing.parseSortSpec("score " + dir, req);
+ final SortSpec ss = SortSpecParsing.parseSortSpec("score " + dir, req);
final CursorMark totem = new CursorMark(schema, ss);
fail("no failure from score only sort: " + dir);
} catch (SolrException e) {
@@ -107,7 +107,7 @@ public class CursorMarkTest extends Solr
}
try {
- final SortSpec ss = QueryParsing.parseSortSpec("_docid_ "+dir+", id desc", req);
+ final SortSpec ss = SortSpecParsing.parseSortSpec("_docid_ "+dir+", id desc", req);
final CursorMark totem = new CursorMark(schema, ss);
fail("no failure from sort that includes _docid_: " + dir);
} catch (SolrException e) {
@@ -121,7 +121,7 @@ public class CursorMarkTest extends Solr
public void testGarbageParsing() throws IOException {
final SolrQueryRequest req = req();
final IndexSchema schema = req.getSchema();
- final SortSpec ss = QueryParsing.parseSortSpec("str asc, float desc, id asc", req);
+ final SortSpec ss = SortSpecParsing.parseSortSpec("str asc, float desc, id asc", req);
final CursorMark totem = new CursorMark(schema, ss);
// totem string that isn't even valid base64
@@ -153,7 +153,7 @@ public class CursorMarkTest extends Solr
// totem string from sort with diff num clauses
try {
- final SortSpec otherSort = QueryParsing.parseSortSpec("double desc, id asc", req);
+ final SortSpec otherSort = SortSpecParsing.parseSortSpec("double desc, id asc", req);
final CursorMark otherTotem = new CursorMark(schema, otherSort);
otherTotem.setSortValues(Arrays.<Object>asList(buildRandomSortObjects(otherSort)));
@@ -176,7 +176,7 @@ public class CursorMarkTest extends Solr
final int numRandomSorts = atLeast(50);
final int numRandomValIters = atLeast(10);
for (int i = 0; i < numRandomSorts; i++) {
- final SortSpec ss = QueryParsing.parseSortSpec
+ final SortSpec ss = SortSpecParsing.parseSortSpec
(CursorPagingTest.buildRandomSort(allFieldNames), req);
final CursorMark totemIn = new CursorMark(schema, ss);
final CursorMark totemOut = new CursorMark(schema, ss);
Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/QueryParsingTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/QueryParsingTest.java?rev=1715049&r1=1715048&r2=1715049&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/QueryParsingTest.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/QueryParsingTest.java Wed Nov 18 19:48:40 2015
@@ -72,205 +72,6 @@ public class QueryParsingTest extends So
}
}
- @Test
- public void testSort() throws Exception {
- Sort sort;
- SortSpec spec;
- SolrQueryRequest req = req();
-
- sort = QueryParsing.parseSortSpec("score desc", req).getSort();
- assertNull("sort", sort);//only 1 thing in the list, no Sort specified
-
- spec = QueryParsing.parseSortSpec("score desc", req);
- assertNotNull("spec", spec);
- assertNull(spec.getSort());
- assertNotNull(spec.getSchemaFields());
- assertEquals(0, spec.getSchemaFields().size());
-
- // SOLR-4458 - using different case variations of asc and desc
- sort = QueryParsing.parseSortSpec("score aSc", req).getSort();
- SortField[] flds = sort.getSort();
- assertEquals(flds[0].getType(), SortField.Type.SCORE);
- assertTrue(flds[0].getReverse());
-
- spec = QueryParsing.parseSortSpec("score aSc", req);
- flds = spec.getSort().getSort();
- assertEquals(1, flds.length);
- assertEquals(flds[0].getType(), SortField.Type.SCORE);
- assertTrue(flds[0].getReverse());
- assertEquals(1, spec.getSchemaFields().size());
- assertNull(spec.getSchemaFields().get(0));
-
- sort = QueryParsing.parseSortSpec("weight dEsC", req).getSort();
- flds = sort.getSort();
- assertEquals(flds[0].getType(), SortField.Type.FLOAT);
- assertEquals(flds[0].getField(), "weight");
- assertEquals(flds[0].getReverse(), true);
-
- spec = QueryParsing.parseSortSpec("weight dEsC", req);
- flds = spec.getSort().getSort();
- assertEquals(1, flds.length);
- assertEquals(flds[0].getType(), SortField.Type.FLOAT);
- assertEquals(flds[0].getField(), "weight");
- assertEquals(flds[0].getReverse(), true);
- assertEquals(1, spec.getSchemaFields().size());
- assertNotNull(spec.getSchemaFields().get(0));
- assertEquals("weight", spec.getSchemaFields().get(0).getName());
-
- sort = QueryParsing.parseSortSpec("weight desc,bday ASC", req).getSort();
- flds = sort.getSort();
- assertEquals(flds[0].getType(), SortField.Type.FLOAT);
- assertEquals(flds[0].getField(), "weight");
- assertEquals(flds[0].getReverse(), true);
- assertEquals(flds[1].getType(), SortField.Type.LONG);
- assertEquals(flds[1].getField(), "bday");
- assertEquals(flds[1].getReverse(), false);
- //order aliases
- sort = QueryParsing.parseSortSpec("weight top,bday asc", req).getSort();
- flds = sort.getSort();
- assertEquals(flds[0].getType(), SortField.Type.FLOAT);
- assertEquals(flds[0].getField(), "weight");
- assertEquals(flds[0].getReverse(), true);
- assertEquals(flds[1].getType(), SortField.Type.LONG);
- assertEquals(flds[1].getField(), "bday");
- assertEquals(flds[1].getReverse(), false);
- sort = QueryParsing.parseSortSpec("weight top,bday bottom", req).getSort();
- flds = sort.getSort();
- assertEquals(flds[0].getType(), SortField.Type.FLOAT);
- assertEquals(flds[0].getField(), "weight");
- assertEquals(flds[0].getReverse(), true);
- assertEquals(flds[1].getType(), SortField.Type.LONG);
- assertEquals(flds[1].getField(), "bday");
- assertEquals(flds[1].getReverse(), false);
-
- //test weird spacing
- sort = QueryParsing.parseSortSpec("weight DESC, bday asc", req).getSort();
- flds = sort.getSort();
- assertEquals(flds[0].getType(), SortField.Type.FLOAT);
- assertEquals(flds[0].getField(), "weight");
- assertEquals(flds[1].getField(), "bday");
- assertEquals(flds[1].getType(), SortField.Type.LONG);
- //handles trailing commas
- sort = QueryParsing.parseSortSpec("weight desc,", req).getSort();
- flds = sort.getSort();
- assertEquals(flds[0].getType(), SortField.Type.FLOAT);
- assertEquals(flds[0].getField(), "weight");
-
- //test functions
- sort = QueryParsing.parseSortSpec("pow(weight, 2) desc", req).getSort();
- flds = sort.getSort();
- assertEquals(flds[0].getType(), SortField.Type.REWRITEABLE);
- //Not thrilled about the fragility of string matching here, but...
- //the value sources get wrapped, so the out field is different than the input
- assertEquals(flds[0].getField(), "pow(float(weight),const(2))");
-
- //test functions (more deep)
- sort = QueryParsing.parseSortSpec("sum(product(r_f1,sum(d_f1,t_f1,1.0)),a_f1) asc", req).getSort();
- flds = sort.getSort();
- assertEquals(flds[0].getType(), SortField.Type.REWRITEABLE);
- assertEquals(flds[0].getField(), "sum(product(float(r_f1),sum(float(d_f1),float(t_f1),const(1.0))),float(a_f1))");
-
- sort = QueryParsing.parseSortSpec("pow(weight, 2.0) desc", req).getSort();
- flds = sort.getSort();
- assertEquals(flds[0].getType(), SortField.Type.REWRITEABLE);
- //Not thrilled about the fragility of string matching here, but...
- //the value sources get wrapped, so the out field is different than the input
- assertEquals(flds[0].getField(), "pow(float(weight),const(2.0))");
-
-
- spec = QueryParsing.parseSortSpec("pow(weight, 2.0) desc, weight desc, bday asc", req);
- flds = spec.getSort().getSort();
- List<SchemaField> schemaFlds = spec.getSchemaFields();
- assertEquals(3, flds.length);
- assertEquals(3, schemaFlds.size());
-
- assertEquals(flds[0].getType(), SortField.Type.REWRITEABLE);
- //Not thrilled about the fragility of string matching here, but...
- //the value sources get wrapped, so the out field is different than the input
- assertEquals(flds[0].getField(), "pow(float(weight),const(2.0))");
- assertNull(schemaFlds.get(0));
-
- assertEquals(flds[1].getType(), SortField.Type.FLOAT);
- assertEquals(flds[1].getField(), "weight");
- assertNotNull(schemaFlds.get(1));
- assertEquals("weight", schemaFlds.get(1).getName());
-
- assertEquals(flds[2].getField(), "bday");
- assertEquals(flds[2].getType(), SortField.Type.LONG);
- assertNotNull(schemaFlds.get(2));
- assertEquals("bday", schemaFlds.get(2).getName());
-
- //handles trailing commas
- sort = QueryParsing.parseSortSpec("weight desc,", req).getSort();
- flds = sort.getSort();
- assertEquals(flds[0].getType(), SortField.Type.FLOAT);
- assertEquals(flds[0].getField(), "weight");
-
- //Test literals in functions
- sort = QueryParsing.parseSortSpec("strdist(foo_s1, \"junk\", jw) desc", req).getSort();
- flds = sort.getSort();
- assertEquals(flds[0].getType(), SortField.Type.REWRITEABLE);
- //the value sources get wrapped, so the out field is different than the input
- assertEquals(flds[0].getField(), "strdist(str(foo_s1),literal(junk), dist=org.apache.lucene.search.spell.JaroWinklerDistance)");
-
- sort = QueryParsing.parseSortSpec("", req).getSort();
- assertNull(sort);
-
- spec = QueryParsing.parseSortSpec("", req);
- assertNotNull(spec);
- assertNull(spec.getSort());
-
- req.close();
- }
-
- @Test
- public void testBad() throws Exception {
- Sort sort;
- SolrQueryRequest req = req();
-
- //test some bad vals
- try {
- sort = QueryParsing.parseSortSpec("weight, desc", req).getSort();
- assertTrue(false);
- } catch (SolrException e) {
- //expected
- }
- try {
- sort = QueryParsing.parseSortSpec("w", req).getSort();
- assertTrue(false);
- } catch (SolrException e) {
- //expected
- }
- try {
- sort = QueryParsing.parseSortSpec("weight desc, bday", req).getSort();
- assertTrue(false);
- } catch (SolrException e) {
- }
-
- try {
- //bad number of commas
- sort = QueryParsing.parseSortSpec("pow(weight,,2) desc, bday asc", req).getSort();
- assertTrue(false);
- } catch (SolrException e) {
- }
-
- try {
- //bad function
- sort = QueryParsing.parseSortSpec("pow() desc, bday asc", req).getSort();
- assertTrue(false);
- } catch (SolrException e) {
- }
-
- try {
- //bad number of parens
- sort = QueryParsing.parseSortSpec("pow((weight,2) desc, bday asc", req).getSort();
- assertTrue(false);
- } catch (SolrException e) {
- }
-
- req.close();
- }
-
public void testLiteralFunction() throws Exception {
final String NAME = FunctionQParserPlugin.NAME;
Copied: lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/SortSpecParsingTest.java (from r1715019, lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/QueryParsingTest.java)
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/SortSpecParsingTest.java?p2=lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/SortSpecParsingTest.java&p1=lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/QueryParsingTest.java&r1=1715019&r2=1715049&rev=1715049&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/QueryParsingTest.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/SortSpecParsingTest.java Wed Nov 18 19:48:40 2015
@@ -32,68 +32,34 @@ import java.util.List;
*
*
**/
-public class QueryParsingTest extends SolrTestCaseJ4 {
+public class SortSpecParsingTest extends SolrTestCaseJ4 {
@BeforeClass
public static void beforeClass() throws Exception {
initCore("solrconfig.xml","schema.xml");
}
- /**
- * Test that the main QParserPlugins people are likely to use
- * as defaults fail with a consistent exception when the query string
- * is either empty or null.
- * @see <a href="https://issues.apache.org/jira/browse/SOLR-435">SOLR-435</a>
- * @see <a href="https://issues.apache.org/jira/browse/SOLR-2001">SOLR-2001</a>
- */
- public void testQParserEmptyInput() throws Exception {
-
- SolrQueryRequest req = req();
-
- final String[] parsersTested = new String[] {
- OldLuceneQParserPlugin.NAME,
- LuceneQParserPlugin.NAME,
- DisMaxQParserPlugin.NAME,
- ExtendedDismaxQParserPlugin.NAME
- };
-
- for (String defType : parsersTested) {
- for (String qstr : new String[] {null, ""}) {
- QParser parser = null;
- try {
- parser = QParser.getParser(qstr, defType, req);
- } catch (Exception e) {
- throw new RuntimeException("getParser excep using defType=" +
- defType + " with qstr="+qstr, e);
- }
-
- Query q = parser.parse();
- assertNull("expected no query",q);
- }
- }
- }
-
@Test
public void testSort() throws Exception {
Sort sort;
SortSpec spec;
SolrQueryRequest req = req();
- sort = QueryParsing.parseSortSpec("score desc", req).getSort();
+ sort = SortSpecParsing.parseSortSpec("score desc", req).getSort();
assertNull("sort", sort);//only 1 thing in the list, no Sort specified
- spec = QueryParsing.parseSortSpec("score desc", req);
+ spec = SortSpecParsing.parseSortSpec("score desc", req);
assertNotNull("spec", spec);
assertNull(spec.getSort());
assertNotNull(spec.getSchemaFields());
assertEquals(0, spec.getSchemaFields().size());
// SOLR-4458 - using different case variations of asc and desc
- sort = QueryParsing.parseSortSpec("score aSc", req).getSort();
+ sort = SortSpecParsing.parseSortSpec("score aSc", req).getSort();
SortField[] flds = sort.getSort();
assertEquals(flds[0].getType(), SortField.Type.SCORE);
assertTrue(flds[0].getReverse());
- spec = QueryParsing.parseSortSpec("score aSc", req);
+ spec = SortSpecParsing.parseSortSpec("score aSc", req);
flds = spec.getSort().getSort();
assertEquals(1, flds.length);
assertEquals(flds[0].getType(), SortField.Type.SCORE);
@@ -101,13 +67,13 @@ public class QueryParsingTest extends So
assertEquals(1, spec.getSchemaFields().size());
assertNull(spec.getSchemaFields().get(0));
- sort = QueryParsing.parseSortSpec("weight dEsC", req).getSort();
+ sort = SortSpecParsing.parseSortSpec("weight dEsC", req).getSort();
flds = sort.getSort();
assertEquals(flds[0].getType(), SortField.Type.FLOAT);
assertEquals(flds[0].getField(), "weight");
assertEquals(flds[0].getReverse(), true);
- spec = QueryParsing.parseSortSpec("weight dEsC", req);
+ spec = SortSpecParsing.parseSortSpec("weight dEsC", req);
flds = spec.getSort().getSort();
assertEquals(1, flds.length);
assertEquals(flds[0].getType(), SortField.Type.FLOAT);
@@ -117,7 +83,7 @@ public class QueryParsingTest extends So
assertNotNull(spec.getSchemaFields().get(0));
assertEquals("weight", spec.getSchemaFields().get(0).getName());
- sort = QueryParsing.parseSortSpec("weight desc,bday ASC", req).getSort();
+ sort = SortSpecParsing.parseSortSpec("weight desc,bday ASC", req).getSort();
flds = sort.getSort();
assertEquals(flds[0].getType(), SortField.Type.FLOAT);
assertEquals(flds[0].getField(), "weight");
@@ -126,7 +92,7 @@ public class QueryParsingTest extends So
assertEquals(flds[1].getField(), "bday");
assertEquals(flds[1].getReverse(), false);
//order aliases
- sort = QueryParsing.parseSortSpec("weight top,bday asc", req).getSort();
+ sort = SortSpecParsing.parseSortSpec("weight top,bday asc", req).getSort();
flds = sort.getSort();
assertEquals(flds[0].getType(), SortField.Type.FLOAT);
assertEquals(flds[0].getField(), "weight");
@@ -134,7 +100,7 @@ public class QueryParsingTest extends So
assertEquals(flds[1].getType(), SortField.Type.LONG);
assertEquals(flds[1].getField(), "bday");
assertEquals(flds[1].getReverse(), false);
- sort = QueryParsing.parseSortSpec("weight top,bday bottom", req).getSort();
+ sort = SortSpecParsing.parseSortSpec("weight top,bday bottom", req).getSort();
flds = sort.getSort();
assertEquals(flds[0].getType(), SortField.Type.FLOAT);
assertEquals(flds[0].getField(), "weight");
@@ -144,20 +110,20 @@ public class QueryParsingTest extends So
assertEquals(flds[1].getReverse(), false);
//test weird spacing
- sort = QueryParsing.parseSortSpec("weight DESC, bday asc", req).getSort();
+ sort = SortSpecParsing.parseSortSpec("weight DESC, bday asc", req).getSort();
flds = sort.getSort();
assertEquals(flds[0].getType(), SortField.Type.FLOAT);
assertEquals(flds[0].getField(), "weight");
assertEquals(flds[1].getField(), "bday");
assertEquals(flds[1].getType(), SortField.Type.LONG);
//handles trailing commas
- sort = QueryParsing.parseSortSpec("weight desc,", req).getSort();
+ sort = SortSpecParsing.parseSortSpec("weight desc,", req).getSort();
flds = sort.getSort();
assertEquals(flds[0].getType(), SortField.Type.FLOAT);
assertEquals(flds[0].getField(), "weight");
//test functions
- sort = QueryParsing.parseSortSpec("pow(weight, 2) desc", req).getSort();
+ sort = SortSpecParsing.parseSortSpec("pow(weight, 2) desc", req).getSort();
flds = sort.getSort();
assertEquals(flds[0].getType(), SortField.Type.REWRITEABLE);
//Not thrilled about the fragility of string matching here, but...
@@ -165,12 +131,12 @@ public class QueryParsingTest extends So
assertEquals(flds[0].getField(), "pow(float(weight),const(2))");
//test functions (more deep)
- sort = QueryParsing.parseSortSpec("sum(product(r_f1,sum(d_f1,t_f1,1.0)),a_f1) asc", req).getSort();
+ sort = SortSpecParsing.parseSortSpec("sum(product(r_f1,sum(d_f1,t_f1,1.0)),a_f1) asc", req).getSort();
flds = sort.getSort();
assertEquals(flds[0].getType(), SortField.Type.REWRITEABLE);
assertEquals(flds[0].getField(), "sum(product(float(r_f1),sum(float(d_f1),float(t_f1),const(1.0))),float(a_f1))");
- sort = QueryParsing.parseSortSpec("pow(weight, 2.0) desc", req).getSort();
+ sort = SortSpecParsing.parseSortSpec("pow(weight, 2.0) desc", req).getSort();
flds = sort.getSort();
assertEquals(flds[0].getType(), SortField.Type.REWRITEABLE);
//Not thrilled about the fragility of string matching here, but...
@@ -178,7 +144,7 @@ public class QueryParsingTest extends So
assertEquals(flds[0].getField(), "pow(float(weight),const(2.0))");
- spec = QueryParsing.parseSortSpec("pow(weight, 2.0) desc, weight desc, bday asc", req);
+ spec = SortSpecParsing.parseSortSpec("pow(weight, 2.0) desc, weight desc, bday asc", req);
flds = spec.getSort().getSort();
List<SchemaField> schemaFlds = spec.getSchemaFields();
assertEquals(3, flds.length);
@@ -201,22 +167,22 @@ public class QueryParsingTest extends So
assertEquals("bday", schemaFlds.get(2).getName());
//handles trailing commas
- sort = QueryParsing.parseSortSpec("weight desc,", req).getSort();
+ sort = SortSpecParsing.parseSortSpec("weight desc,", req).getSort();
flds = sort.getSort();
assertEquals(flds[0].getType(), SortField.Type.FLOAT);
assertEquals(flds[0].getField(), "weight");
//Test literals in functions
- sort = QueryParsing.parseSortSpec("strdist(foo_s1, \"junk\", jw) desc", req).getSort();
+ sort = SortSpecParsing.parseSortSpec("strdist(foo_s1, \"junk\", jw) desc", req).getSort();
flds = sort.getSort();
assertEquals(flds[0].getType(), SortField.Type.REWRITEABLE);
//the value sources get wrapped, so the out field is different than the input
assertEquals(flds[0].getField(), "strdist(str(foo_s1),literal(junk), dist=org.apache.lucene.search.spell.JaroWinklerDistance)");
- sort = QueryParsing.parseSortSpec("", req).getSort();
+ sort = SortSpecParsing.parseSortSpec("", req).getSort();
assertNull(sort);
- spec = QueryParsing.parseSortSpec("", req);
+ spec = SortSpecParsing.parseSortSpec("", req);
assertNotNull(spec);
assertNull(spec.getSort());
@@ -230,67 +196,44 @@ public class QueryParsingTest extends So
//test some bad vals
try {
- sort = QueryParsing.parseSortSpec("weight, desc", req).getSort();
+ sort = SortSpecParsing.parseSortSpec("weight, desc", req).getSort();
assertTrue(false);
} catch (SolrException e) {
//expected
}
try {
- sort = QueryParsing.parseSortSpec("w", req).getSort();
+ sort = SortSpecParsing.parseSortSpec("w", req).getSort();
assertTrue(false);
} catch (SolrException e) {
//expected
}
try {
- sort = QueryParsing.parseSortSpec("weight desc, bday", req).getSort();
+ sort = SortSpecParsing.parseSortSpec("weight desc, bday", req).getSort();
assertTrue(false);
} catch (SolrException e) {
}
try {
//bad number of commas
- sort = QueryParsing.parseSortSpec("pow(weight,,2) desc, bday asc", req).getSort();
+ sort = SortSpecParsing.parseSortSpec("pow(weight,,2) desc, bday asc", req).getSort();
assertTrue(false);
} catch (SolrException e) {
}
try {
//bad function
- sort = QueryParsing.parseSortSpec("pow() desc, bday asc", req).getSort();
+ sort = SortSpecParsing.parseSortSpec("pow() desc, bday asc", req).getSort();
assertTrue(false);
} catch (SolrException e) {
}
try {
//bad number of parens
- sort = QueryParsing.parseSortSpec("pow((weight,2) desc, bday asc", req).getSort();
+ sort = SortSpecParsing.parseSortSpec("pow((weight,2) desc, bday asc", req).getSort();
assertTrue(false);
} catch (SolrException e) {
}
req.close();
}
-
- public void testLiteralFunction() throws Exception {
-
- final String NAME = FunctionQParserPlugin.NAME;
-
- SolrQueryRequest req = req("variable", "foobar");
-
- assertNotNull(QParser.getParser
- ("literal('a value')",
- NAME, req).getQuery());
- assertNotNull(QParser.getParser
- ("literal('a value')",
- NAME, req).getQuery());
- assertNotNull(QParser.getParser
- ("literal(\"a value\")",
- NAME, req).getQuery());
- assertNotNull(QParser.getParser
- ("literal($variable)",
- NAME, req).getQuery());
- assertNotNull(QParser.getParser
- ("strdist(\"a value\",literal('a value'),edit)",
- NAME, req).getQuery());
- }
}
Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/TestSort.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/TestSort.java?rev=1715049&r1=1715048&r2=1715049&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/TestSort.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/TestSort.java Wed Nov 18 19:48:40 2015
@@ -135,7 +135,7 @@ public class TestSort extends SolrTestCa
SortField[] sorts = null;
List<SchemaField> fields = null;
try {
- SortSpec spec = QueryParsing.parseSortSpec(input.toString(), req);
+ SortSpec spec = SortSpecParsing.parseSortSpec(input.toString(), req);
sorts = spec.getSort().getSort();
fields = spec.getSchemaFields();
} catch (RuntimeException e) {
Modified: lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/SolrQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/SolrQuery.java?rev=1715049&r1=1715048&r2=1715049&view=diff
==============================================================================
--- lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/SolrQuery.java (original)
+++ lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/SolrQuery.java Wed Nov 18 19:48:40 2015
@@ -42,7 +42,7 @@ import java.util.regex.Pattern;
*/
public class SolrQuery extends ModifiableSolrParams
{
- public static final String DOCID = "_docid_"; // duplicate of org.apache.solr.search.QueryParsing.DOCID which is not accessible from here
+ public static final String DOCID = "_docid_"; // duplicate of org.apache.solr.search.SortSpecParsing.DOCID which is not accessible from here
public enum ORDER { desc, asc;
public ORDER reverse() {