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 ::= &lt;fieldname|function&gt; 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 &amp; 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() {