You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by mi...@apache.org on 2012/07/19 17:59:32 UTC

svn commit: r1363400 [26/31] - in /lucene/dev/branches/pforcodec_3892: ./ dev-tools/ dev-tools/eclipse/ dev-tools/idea/.idea/ dev-tools/idea/.idea/copyright/ dev-tools/idea/.idea/libraries/ dev-tools/idea/lucene/ dev-tools/maven/ dev-tools/maven/lucene...

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/DocSetBase.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/DocSetBase.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/DocSetBase.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/DocSetBase.java Thu Jul 19 15:58:54 2012
@@ -27,8 +27,6 @@ import org.apache.lucene.search.DocIdSet
 import org.apache.lucene.search.BitsFilteredDocIdSet;
 import org.apache.lucene.index.AtomicReaderContext;
 
-import java.io.IOException;
-
 /** A base class that may be usefull for implementing DocSets */
 abstract class DocSetBase implements DocSet {
 
@@ -140,7 +138,7 @@ abstract class DocSetBase implements Doc
 
     return new Filter() {
       @Override
-      public DocIdSet getDocIdSet(final AtomicReaderContext context, Bits acceptDocs) throws IOException {
+      public DocIdSet getDocIdSet(final AtomicReaderContext context, Bits acceptDocs) {
         AtomicReader reader = context.reader();
         // all Solr DocSets that are used as filters only include live docs
         final Bits acceptDocs2 = acceptDocs == null ? null : (reader.getLiveDocs() == acceptDocs ? null : acceptDocs);
@@ -155,7 +153,7 @@ abstract class DocSetBase implements Doc
 
         return BitsFilteredDocIdSet.wrap(new DocIdSet() {
           @Override
-          public DocIdSetIterator iterator() throws IOException {
+          public DocIdSetIterator iterator() {
             return new DocIdSetIterator() {
               int pos=base-1;
               int adjustedDoc=-1;
@@ -166,13 +164,13 @@ abstract class DocSetBase implements Doc
               }
 
               @Override
-              public int nextDoc() throws IOException {
+              public int nextDoc() {
                 pos = bs.nextSetBit(pos+1);
                 return adjustedDoc = (pos>=0 && pos<max) ? pos-base : NO_MORE_DOCS;
               }
 
               @Override
-              public int advance(int target) throws IOException {
+              public int advance(int target) {
                 if (target==NO_MORE_DOCS) return adjustedDoc=NO_MORE_DOCS;
                 pos = bs.nextSetBit(target+base);
                 return adjustedDoc = (pos>=0 && pos<max) ? pos-base : NO_MORE_DOCS;
@@ -186,7 +184,7 @@ abstract class DocSetBase implements Doc
           }
 
           @Override
-          public Bits bits() throws IOException {
+          public Bits bits() {
             // sparse filters should not use random access
             return null;
           }

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/ExtendedDismaxQParserPlugin.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/ExtendedDismaxQParserPlugin.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/ExtendedDismaxQParserPlugin.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/ExtendedDismaxQParserPlugin.java Thu Jul 19 15:58:54 2012
@@ -15,11 +15,6 @@
  * limitations under the License.
  */
 
-/*
- * This parser was originally derived from DismaxQParser from Solr.
- * All changes are Copyright 2008, Lucid Imagination, Inc.
- */
-
 package org.apache.solr.search;
 
 import java.util.ArrayList;
@@ -52,7 +47,8 @@ import org.apache.solr.schema.FieldType;
 import org.apache.solr.util.SolrPluginUtils;
 
 /**
- * An advanced multi-field query parser.
+ * An advanced multi-field query parser based on the DisMax parser.
+ * See Wiki page http://wiki.apache.org/solr/ExtendedDisMax
  * @lucene.experimental
  */
 public class ExtendedDismaxQParserPlugin extends QParserPlugin {
@@ -134,21 +130,26 @@ class ExtendedDismaxQParser extends QPar
     userFields = new UserFields(U.parseFieldBoosts(solrParams.getParams(DMP.UF)));
     
     queryFields = DisMaxQParser.parseQueryFields(req.getSchema(), solrParams);
+
+    // Phrase slop array
+    int pslop[] = new int[4];
+    pslop[0] = solrParams.getInt(DisMaxParams.PS, 0);
+    pslop[2] = solrParams.getInt(DisMaxParams.PS2, pslop[0]);
+    pslop[3] = solrParams.getInt(DisMaxParams.PS3, pslop[0]);
+
     
     // Boosted phrase of the full query string
     List<FieldParams> phraseFields = 
-      U.parseFieldBoostsAndSlop(solrParams.getParams(DMP.PF),0);
+      U.parseFieldBoostsAndSlop(solrParams.getParams(DMP.PF),0,pslop[0]);
     // Boosted Bi-Term Shingles from the query string
     List<FieldParams> phraseFields2 = 
-      U.parseFieldBoostsAndSlop(solrParams.getParams("pf2"),2);
+      U.parseFieldBoostsAndSlop(solrParams.getParams(DMP.PF2),2,pslop[2]);
     // Boosted Tri-Term Shingles from the query string
     List<FieldParams> phraseFields3 = 
-      U.parseFieldBoostsAndSlop(solrParams.getParams("pf3"),3);
-
+      U.parseFieldBoostsAndSlop(solrParams.getParams(DMP.PF3),3,pslop[3]);
 
     float tiebreaker = solrParams.getFloat(DisMaxParams.TIE, 0.0f);
 
-    int pslop = solrParams.getInt(DisMaxParams.PS, 0);
     int qslop = solrParams.getInt(DisMaxParams.QS, 0);
 
     // remove stopwords from mandatory "matching" component?
@@ -226,7 +227,7 @@ class ExtendedDismaxQParser extends QPar
         Clause clause = clauses.get(i);
         String s = clause.raw;
         // and and or won't be operators at the start or end
-        if (i>0 && i+1<clauses.size()) {
+        if (lowercaseOperators && i>0 && i+1<clauses.size()) {
           if ("AND".equalsIgnoreCase(s)) {
             s="AND";
           } else if ("OR".equalsIgnoreCase(s)) {
@@ -332,11 +333,10 @@ class ExtendedDismaxQParser extends QPar
 
         // full phrase and shingles
         for (FieldParams phraseField: allPhraseFields) {
-          int slop = (phraseField.getSlop() == 0) ? pslop : phraseField.getSlop();
           Map<String,Float> pf = new HashMap<String,Float>(1);
           pf.put(phraseField.getField(),phraseField.getBoost());
           addShingledPhraseQueries(query, normalClauses, pf,   
-				   phraseField.getWordGrams(),tiebreaker, slop);
+          phraseField.getWordGrams(),tiebreaker, phraseField.getSlop());
         }
         
       }
@@ -420,9 +420,8 @@ class ExtendedDismaxQParser extends QPar
    * Extracts all the alised fields from the requests and adds them to up
    * @param up
    * @param tiebreaker
-   * @throws ParseException 
    */
-  private void addAliasesFromRequest(ExtendedSolrQueryParser up, float tiebreaker) throws ParseException {
+  private void addAliasesFromRequest(ExtendedSolrQueryParser up, float tiebreaker) {
     Iterator<String> it = solrParams.getParameterNamesIterator();
     while(it.hasNext()) {
       String param = it.next();
@@ -541,81 +540,81 @@ class ExtendedDismaxQParser extends QPar
   }
 
 
-  
-  public static CharSequence partialEscape(CharSequence s) {
-    StringBuilder sb = new StringBuilder();
-
-    int len = s.length();
-    for (int i = 0; i < len; i++) {
-      char c = s.charAt(i);
-      if (c == ':') {
-        // look forward to make sure it's something that won't
-        // cause a parse exception (something that won't be escaped... like
-        // +,-,:, whitespace
-        if (i+1<len && i>0) {
-          char ch = s.charAt(i+1);
-          if (!(Character.isWhitespace(ch) || ch=='+' || ch=='-' || ch==':')) {
-            // OK, at this point the chars after the ':' will be fine.
-            // now look back and try to determine if this is a fieldname
-            // [+,-]? [letter,_] [letter digit,_,-,.]*
-            // This won't cover *all* possible lucene fieldnames, but we should
-            // only pick nice names to begin with
-            int start, pos;
-            for (start=i-1; start>=0; start--) {
-              ch = s.charAt(start);
-              if (Character.isWhitespace(ch)) break;
-            }
-
-            // skip whitespace
-            pos = start+1;
-
-            // skip leading + or -
-            ch = s.charAt(pos);
-            if (ch=='+' || ch=='-') {
-              pos++;
-            }
-
-            // we don't need to explicitly check for end of string
-            // since ':' will act as our sentinal
-
-              // first char can't be '-' or '.'
-              ch = s.charAt(pos++);
-              if (Character.isJavaIdentifierPart(ch)) {
-
-                for(;;) {
-                  ch = s.charAt(pos++);
-                  if (!(Character.isJavaIdentifierPart(ch) || ch=='-' || ch=='.')) {
-                    break;
-                  }
-                }
-
-                if (pos<=i) {
-                  // OK, we got to the ':' and everything looked like a valid fieldname, so
-                  // don't escape the ':'
-                  sb.append(':');
-                  continue;  // jump back to start of outer-most loop
-                }
-
-              }
-
-
-          }
-        }
-
-        // we fell through to here, so we should escape this like other reserved chars.
-        sb.append('\\');
-      }
-      else if (c == '\\' || c == '!' || c == '(' || c == ')' ||
-          c == '^' || c == '[' || c == ']' ||
-          c == '{'  || c == '}' || c == '~' || c == '*' || c == '?'
-          )
-      {
-        sb.append('\\');
-      }
-      sb.append(c);
-    }
-    return sb;
-  }
+// FIXME: Not in use
+//  public static CharSequence partialEscape(CharSequence s) {
+//    StringBuilder sb = new StringBuilder();
+//
+//    int len = s.length();
+//    for (int i = 0; i < len; i++) {
+//      char c = s.charAt(i);
+//      if (c == ':') {
+//        // look forward to make sure it's something that won't
+//        // cause a parse exception (something that won't be escaped... like
+//        // +,-,:, whitespace
+//        if (i+1<len && i>0) {
+//          char ch = s.charAt(i+1);
+//          if (!(Character.isWhitespace(ch) || ch=='+' || ch=='-' || ch==':')) {
+//            // OK, at this point the chars after the ':' will be fine.
+//            // now look back and try to determine if this is a fieldname
+//            // [+,-]? [letter,_] [letter digit,_,-,.]*
+//            // This won't cover *all* possible lucene fieldnames, but we should
+//            // only pick nice names to begin with
+//            int start, pos;
+//            for (start=i-1; start>=0; start--) {
+//              ch = s.charAt(start);
+//              if (Character.isWhitespace(ch)) break;
+//            }
+//
+//            // skip whitespace
+//            pos = start+1;
+//
+//            // skip leading + or -
+//            ch = s.charAt(pos);
+//            if (ch=='+' || ch=='-') {
+//              pos++;
+//            }
+//
+//            // we don't need to explicitly check for end of string
+//            // since ':' will act as our sentinal
+//
+//              // first char can't be '-' or '.'
+//              ch = s.charAt(pos++);
+//              if (Character.isJavaIdentifierPart(ch)) {
+//
+//                for(;;) {
+//                  ch = s.charAt(pos++);
+//                  if (!(Character.isJavaIdentifierPart(ch) || ch=='-' || ch=='.')) {
+//                    break;
+//                  }
+//                }
+//
+//                if (pos<=i) {
+//                  // OK, we got to the ':' and everything looked like a valid fieldname, so
+//                  // don't escape the ':'
+//                  sb.append(':');
+//                  continue;  // jump back to start of outer-most loop
+//                }
+//
+//              }
+//
+//
+//          }
+//        }
+//
+//        // we fell through to here, so we should escape this like other reserved chars.
+//        sb.append('\\');
+//      }
+//      else if (c == '\\' || c == '!' || c == '(' || c == ')' ||
+//          c == '^' || c == '[' || c == ']' ||
+//          c == '{'  || c == '}' || c == '~' || c == '*' || c == '?'
+//          )
+//      {
+//        sb.append('\\');
+//      }
+//      sb.append(c);
+//    }
+//    return sb;
+//  }
 
 
   static class Clause {
@@ -625,6 +624,7 @@ class ExtendedDismaxQParser extends QPar
     }
 
     String field;
+    String rawField;  // if the clause is +(foo:bar) then rawField=(foo
     boolean isPhrase;
     boolean hasWhitespace;
     boolean hasSpecialSyntax;
@@ -668,7 +668,9 @@ class ExtendedDismaxQParser extends QPar
       }
       if (clause.field != null) {
         disallowUserField = false;
-        pos += clause.field.length(); // skip the field name
+        int colon = s.indexOf(':',pos);
+        clause.rawField = s.substring(pos, colon);
+        pos += colon - pos; // skip the field name
         pos++;  // skip the ':'
       }
 
@@ -726,6 +728,10 @@ class ExtendedDismaxQParser extends QPar
             case '"':
             case '+':
             case '-':
+            case '\\':
+            case '|':
+            case '&':
+            case '/':
               clause.hasSpecialSyntax = true;
               sb.append('\\');
           }
@@ -795,6 +801,10 @@ class ExtendedDismaxQParser extends QPar
     // make sure there is space after the colon, but not whitespace
     if (colon<=pos || colon+1>=end || Character.isWhitespace(s.charAt(colon+1))) return null;
     char ch = s.charAt(p++);
+    while ((ch=='(' || ch=='+' || ch=='-') && (pos<end)) {
+      ch = s.charAt(p++);
+      pos++;
+    }
     if (!Character.isJavaIdentifierPart(ch)) return null;
     while (p<colon) {
       ch = s.charAt(p++);
@@ -1151,7 +1161,7 @@ class ExtendedDismaxQParser extends QPar
        return lst;
      }
 
-    private Query getQuery() throws ParseException {
+    private Query getQuery() {
       try {
 
         switch (type) {

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/FastLRUCache.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/FastLRUCache.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/FastLRUCache.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/FastLRUCache.java Thu Jul 19 15:58:54 2012
@@ -20,9 +20,7 @@ import org.apache.solr.common.SolrExcept
 import org.apache.solr.util.ConcurrentLRUCache;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.util.SimpleOrderedMap;
-import org.apache.solr.core.SolrCore;
 
-import java.io.IOException;
 import java.io.Serializable;
 import java.util.List;
 import java.util.Map;
@@ -136,7 +134,7 @@ public class FastLRUCache<K,V> extends S
     cache.setAlive(state == State.LIVE);
   }
 
-  public void warm(SolrIndexSearcher searcher, SolrCache old) throws IOException {
+  public void warm(SolrIndexSearcher searcher, SolrCache old) {
     if (regenerator == null) return;
     long warmingStartTime = System.currentTimeMillis();
     FastLRUCache other = (FastLRUCache) old;

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/FieldParams.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/FieldParams.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/FieldParams.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/FieldParams.java Thu Jul 19 15:58:54 2012
@@ -21,7 +21,7 @@ package org.apache.solr.search;
  **/
 public class FieldParams {
   private final int wordGrams;  // make bigrams if 2, trigrams if 3, or all if 0
-  private final int slop;  // null defaults to ps parameter
+  private final int slop;
   private final float boost;
   private final String field;
   public FieldParams(String field, int wordGrams, int slop, float boost) {

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/FieldQParserPlugin.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/FieldQParserPlugin.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/FieldQParserPlugin.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/FieldQParserPlugin.java Thu Jul 19 15:58:54 2012
@@ -16,8 +16,7 @@
  */
 package org.apache.solr.search;
 
-import org.apache.lucene.queryparser.classic.ParseException;
-import org.apache.lucene.search.*;
+import org.apache.lucene.search.Query;
 import org.apache.solr.common.params.SolrParams;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.request.SolrQueryRequest;
@@ -42,7 +41,7 @@ public class FieldQParserPlugin extends 
   public QParser createParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) {
     return new QParser(qstr, localParams, params, req) {
       @Override
-      public Query parse() throws ParseException {
+      public Query parse() {
         String field = localParams.get(QueryParsing.F);
         String queryText = localParams.get(QueryParsing.V);
         SchemaField sf = req.getSchema().getField(field);

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/Grouping.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/Grouping.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/Grouping.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/Grouping.java Thu Jul 19 15:58:54 2012
@@ -376,7 +376,7 @@ public class Grouping {
             cachedCollector.replay(secondPhaseCollectors);
           } else {
             signalCacheWarning = true;
-            logger.warn(String.format("The grouping cache is active, but not used because it exceeded the max cache limit of %d percent", maxDocsPercentageToCache));
+            logger.warn(String.format(Locale.ROOT, "The grouping cache is active, but not used because it exceeded the max cache limit of %d percent", maxDocsPercentageToCache));
             logger.warn("Please increase cache size or disable group caching.");
             searchWithTimeLimiter(luceneFilter, secondPhaseCollectors);
           }

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/JoinQParserPlugin.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/JoinQParserPlugin.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/JoinQParserPlugin.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/JoinQParserPlugin.java Thu Jul 19 15:58:54 2012
@@ -135,7 +135,7 @@ class JoinQuery extends Query {
     private float queryWeight;
     ResponseBuilder rb;
 
-    public JoinQueryWeight(SolrIndexSearcher searcher) throws IOException {
+    public JoinQueryWeight(SolrIndexSearcher searcher) {
       this.fromSearcher = searcher;
       SolrRequestInfo info = SolrRequestInfo.getRequestInfo();
       if (info != null) {
@@ -175,7 +175,7 @@ class JoinQuery extends Query {
           final RefCounted<SolrIndexSearcher> ref = fromRef;
           info.addCloseHook(new Closeable() {
             @Override
-            public void close() throws IOException {
+            public void close() {
               ref.decref();
             }
           });
@@ -183,7 +183,7 @@ class JoinQuery extends Query {
 
         info.addCloseHook(new Closeable() {
           @Override
-          public void close() throws IOException {
+          public void close() {
             fromCore.close();
           }
         });
@@ -532,6 +532,11 @@ class JoinQuery extends Query {
     public float score() throws IOException {
       return score;
     }
+    
+    @Override
+    public float freq() throws IOException {
+      return 1;
+    }
 
     @Override
     public int advance(int target) throws IOException {

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/LFUCache.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/LFUCache.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/LFUCache.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/LFUCache.java Thu Jul 19 15:58:54 2012
@@ -22,7 +22,6 @@ import org.apache.solr.common.util.Simpl
 import org.apache.solr.core.SolrCore;
 import org.apache.solr.util.ConcurrentLFUCache;
 
-import java.io.IOException;
 import java.io.Serializable;
 import java.net.URL;
 import java.util.List;
@@ -155,7 +154,7 @@ public class LFUCache<K, V> implements S
     return state;
   }
 
-  public void warm(SolrIndexSearcher searcher, SolrCache old) throws IOException {
+  public void warm(SolrIndexSearcher searcher, SolrCache old) {
     if (regenerator == null) return;
     long warmingStartTime = System.currentTimeMillis();
     LFUCache other = (LFUCache) old;

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/LRUCache.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/LRUCache.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/LRUCache.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/LRUCache.java Thu Jul 19 15:58:54 2012
@@ -17,7 +17,6 @@
 
 package org.apache.solr.search;
 
-import java.io.IOException;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.Map;
@@ -144,7 +143,7 @@ public class LRUCache<K,V> extends SolrC
     }
   }
 
-  public void warm(SolrIndexSearcher searcher, SolrCache<K,V> old) throws IOException {
+  public void warm(SolrIndexSearcher searcher, SolrCache<K,V> old) {
     if (regenerator==null) return;
     long warmingStartTime = System.currentTimeMillis();
     LRUCache<K,V> other = (LRUCache<K,V>)old;

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/PrefixQParserPlugin.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/PrefixQParserPlugin.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/PrefixQParserPlugin.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/PrefixQParserPlugin.java Thu Jul 19 15:58:54 2012
@@ -17,7 +17,6 @@
 package org.apache.solr.search;
 
 import org.apache.lucene.index.Term;
-import org.apache.lucene.queryparser.classic.ParseException;
 import org.apache.lucene.search.PrefixQuery;
 import org.apache.lucene.search.Query;
 import org.apache.solr.common.params.SolrParams;
@@ -40,7 +39,7 @@ public class PrefixQParserPlugin extends
   public QParser createParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) {
     return new QParser(qstr, localParams, params, req) {
       @Override
-      public Query parse() throws ParseException {
+      public Query parse() {
         return new PrefixQuery(new Term(localParams.get(QueryParsing.F), localParams.get(QueryParsing.V)));
       }
     };

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/QParser.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/QParser.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/QParser.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/QParser.java Thu Jul 19 15:58:54 2012
@@ -300,15 +300,15 @@ public abstract class QParser {
   }
 
   /** Create a <code>QParser</code> to parse <code>qstr</code>,
-   * assuming that the default query type is <code>defaultType</code>.
-   * The query type may be overridden by local parameters in the query
-   * string itself.  For example if defaultType=<code>"dismax"</code>
+   * assuming that the default query parser is <code>defaultParser</code>.
+   * The query parser may be overridden by local parameters in the query
+   * string itself.  For example if defaultParser=<code>"dismax"</code>
    * and qstr=<code>foo</code>, then the dismax query parser will be used
    * to parse and construct the query object.  However
    * if qstr=<code>{!prefix f=myfield}foo</code>
    * then the prefix query parser will be used.
    */
-  public static QParser getParser(String qstr, String defaultType, SolrQueryRequest req) throws ParseException {
+  public static QParser getParser(String qstr, String defaultParser, SolrQueryRequest req) throws ParseException {
     // SolrParams localParams = QueryParsing.getLocalParams(qstr, req.getParams());
 
     String stringIncludingLocalParams = qstr;
@@ -335,18 +335,18 @@ public abstract class QParser {
     }
 
 
-    String type;
+    String parserName;
     
     if (localParams == null) {
-      type = defaultType;
+      parserName = defaultParser;
     } else {
-      type = localParams.get(QueryParsing.TYPE,defaultType);
+      parserName = localParams.get(QueryParsing.TYPE,defaultParser);
       qstr = localParams.get("v");
     }
 
-    type = type==null ? QParserPlugin.DEFAULT_QTYPE : type;
+    parserName = parserName==null ? QParserPlugin.DEFAULT_QTYPE : parserName;
 
-    QParserPlugin qplug = req.getCore().getQueryPlugin(type);
+    QParserPlugin qplug = req.getCore().getQueryPlugin(parserName);
     QParser parser =  qplug.createParser(qstr, localParams, req.getParams(), req);
 
     parser.stringIncludingLocalParams = stringIncludingLocalParams;

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/QueryParsing.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/QueryParsing.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/QueryParsing.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/QueryParsing.java Thu Jul 19 15:58:54 2012
@@ -58,8 +58,8 @@ 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";// type of this query or command
-  public static final String DEFTYPE = "defType"; // default type for any direct subqueries
+  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 static final String DOCID = "_docid_";
@@ -637,7 +637,7 @@ public class QueryParsing {
       }
     }
 
-    float getFloat() throws ParseException {
+    float getFloat() {
       eatws();
       char[] arr = new char[end - pos];
       int i;
@@ -657,7 +657,7 @@ public class QueryParsing {
       return Float.parseFloat(new String(arr, 0, i));
     }
 
-    Number getNumber() throws ParseException {
+    Number getNumber() {
       eatws();
       int start = pos;
       boolean flt = false;
@@ -682,7 +682,7 @@ public class QueryParsing {
       }
     }
 
-    double getDouble() throws ParseException {
+    double getDouble() {
       eatws();
       char[] arr = new char[end - pos];
       int i;
@@ -702,7 +702,7 @@ public class QueryParsing {
       return Double.parseDouble(new String(arr, 0, i));
     }
 
-    int getInt() throws ParseException {
+    int getInt() {
       eatws();
       char[] arr = new char[end - pos];
       int i;

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/QueryResultKey.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/QueryResultKey.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/QueryResultKey.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/QueryResultKey.java Thu Jul 19 15:58:54 2012
@@ -20,7 +20,6 @@ package org.apache.solr.search;
 import org.apache.lucene.search.Query;
 import org.apache.lucene.search.Sort;
 import org.apache.lucene.search.SortField;
-import java.io.IOException;
 import java.util.List;
 
 /** A hash key encapsulating a query, a list of filters, and a sort
@@ -38,7 +37,7 @@ public final class QueryResultKey {
   private static SortField[] defaultSort = new SortField[0];
 
 
-  public QueryResultKey(Query query, List<Query> filters, Sort sort, int nc_flags) throws IOException {
+  public QueryResultKey(Query query, List<Query> filters, Sort sort, int nc_flags) {
     this.query = query;
     this.sort = sort;
     this.filters = filters;

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/RawQParserPlugin.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/RawQParserPlugin.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/RawQParserPlugin.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/RawQParserPlugin.java Thu Jul 19 15:58:54 2012
@@ -17,7 +17,6 @@
 package org.apache.solr.search;
 
 import org.apache.lucene.index.Term;
-import org.apache.lucene.queryparser.classic.ParseException;
 import org.apache.lucene.search.Query;
 import org.apache.lucene.search.TermQuery;
 import org.apache.solr.common.params.SolrParams;
@@ -44,7 +43,7 @@ public class RawQParserPlugin extends QP
   public QParser createParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) {
     return new QParser(qstr, localParams, params, req) {
       @Override
-      public Query parse() throws ParseException {
+      public Query parse() {
         return new TermQuery(new Term(localParams.get(QueryParsing.F), localParams.get(QueryParsing.V)));
       }
     };

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/ReturnFields.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/ReturnFields.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/ReturnFields.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/ReturnFields.java Thu Jul 19 15:58:54 2012
@@ -155,7 +155,7 @@ public class ReturnFields
 
 
   // like getId, but also accepts dashes for legacy fields
-  String getFieldName(QueryParsing.StrParser sp) throws ParseException {
+  String getFieldName(QueryParsing.StrParser sp) {
     sp.eatws();
     int id_start = sp.pos;
     char ch;

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/SolrCache.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/SolrCache.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/SolrCache.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/SolrCache.java Thu Jul 19 15:58:54 2012
@@ -22,7 +22,6 @@ import org.apache.solr.core.SolrInfoMBea
 import java.util.Map;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import java.io.IOException;
 
 
 /**
@@ -125,7 +124,7 @@ public interface SolrCache<K,V> extends 
    * Warm this cache associated with <code>searcher</code> using the <code>old</code>
    * cache object.  <code>this</code> and <code>old</code> will have the same concrete type.
    */
-  void warm(SolrIndexSearcher searcher, SolrCache<K,V> old) throws IOException;
+  void warm(SolrIndexSearcher searcher, SolrCache<K,V> old);
   // Q: an alternative to passing the searcher here would be to pass it in
   // init and have the cache implementation save it.
 

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/SolrConstantScoreQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/SolrConstantScoreQuery.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/SolrConstantScoreQuery.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/SolrConstantScoreQuery.java Thu Jul 19 15:58:54 2012
@@ -186,6 +186,11 @@ public class SolrConstantScoreQuery exte
     public float score() throws IOException {
       return theScore;
     }
+    
+    @Override
+    public float freq() throws IOException {
+      return 1;
+    }
 
     @Override
     public int advance(int target) throws IOException {

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java Thu Jul 19 15:58:54 2012
@@ -37,6 +37,7 @@ import org.apache.lucene.index.*;
 import org.apache.lucene.search.*;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.store.FSDirectory;
+import org.apache.lucene.store.NRTCachingDirectory;
 import org.apache.lucene.util.Bits;
 import org.apache.lucene.util.BytesRef;
 import org.apache.lucene.util.OpenBitSet;
@@ -118,6 +119,18 @@ public class SolrIndexSearcher extends I
     this(core, schema,name, core.getIndexReaderFactory().newReader(directoryFactory.get(path, config.lockType), core), true, enableCache, false, directoryFactory);
   }
 
+  private static String getIndexDir(Directory dir) {
+    if (dir instanceof FSDirectory) {
+      return ((FSDirectory)dir).getDirectory().getAbsolutePath();
+    } else if (dir instanceof NRTCachingDirectory) {
+      // recurse on the delegate
+      return getIndexDir(((NRTCachingDirectory) dir).getDelegate());
+    } else {
+      log.warn("WARNING: Directory impl does not support setting indexDir: " + dir.getClass().getName());
+      return null;
+    }
+  }
+
   public SolrIndexSearcher(SolrCore core, IndexSchema schema, String name, DirectoryReader r, boolean closeReader, boolean enableCache, boolean reserveDirectory, DirectoryFactory directoryFactory) throws IOException {
     super(r);
     this.directoryFactory = directoryFactory;
@@ -134,13 +147,8 @@ public class SolrIndexSearcher extends I
       // keep the directory from being released while we use it
       directoryFactory.incRef(dir);
     }
-    
-    if (dir instanceof FSDirectory) {
-      FSDirectory fsDirectory = (FSDirectory) dir;
-      indexDir = fsDirectory.getDirectory().getAbsolutePath();
-    } else {
-      log.warn("WARNING: Directory impl does not support setting indexDir: " + dir.getClass().getName());
-    }
+
+    this.indexDir = getIndexDir(dir);
 
     this.closeReader = closeReader;
     setSimilarity(schema.getSimilarity());
@@ -1300,14 +1308,14 @@ public class SolrIndexSearcher extends I
       if (!needScores) {
         collector = new Collector () {
           @Override
-          public void setScorer(Scorer scorer) throws IOException {
+          public void setScorer(Scorer scorer) {
           }
           @Override
-          public void collect(int doc) throws IOException {
+          public void collect(int doc) {
             numHits[0]++;
           }
           @Override
-          public void setNextReader(AtomicReaderContext context) throws IOException {
+          public void setNextReader(AtomicReaderContext context) {
           }
           @Override
           public boolean acceptsDocsOutOfOrder() {
@@ -1318,7 +1326,7 @@ public class SolrIndexSearcher extends I
         collector = new Collector() {
           Scorer scorer;
           @Override
-          public void setScorer(Scorer scorer) throws IOException {
+          public void setScorer(Scorer scorer) {
             this.scorer = scorer;
           }
           @Override
@@ -1328,7 +1336,7 @@ public class SolrIndexSearcher extends I
             if (score > topscore[0]) topscore[0]=score;            
           }
           @Override
-          public void setNextReader(AtomicReaderContext context) throws IOException {
+          public void setNextReader(AtomicReaderContext context) {
           }
           @Override
           public boolean acceptsDocsOutOfOrder() {
@@ -1441,7 +1449,7 @@ public class SolrIndexSearcher extends I
          collector = setCollector = new DocSetDelegateCollector(smallSetSize, maxDoc, new Collector() {
            Scorer scorer;
            @Override
-          public void setScorer(Scorer scorer) throws IOException {
+          public void setScorer(Scorer scorer) {
              this.scorer = scorer;
            }
            @Override
@@ -1450,7 +1458,7 @@ public class SolrIndexSearcher extends I
              if (score > topscore[0]) topscore[0]=score;
            }
            @Override
-          public void setNextReader(AtomicReaderContext context) throws IOException {
+          public void setNextReader(AtomicReaderContext context) {
            }
            @Override
           public boolean acceptsDocsOutOfOrder() {

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/SortedIntDocSet.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/SortedIntDocSet.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/SortedIntDocSet.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/SortedIntDocSet.java Thu Jul 19 15:58:54 2012
@@ -24,11 +24,8 @@ import org.apache.lucene.search.BitsFilt
 import org.apache.lucene.search.DocIdSet;
 import org.apache.lucene.search.DocIdSetIterator;
 import org.apache.lucene.search.Filter;
-import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.index.AtomicReaderContext;
 
-import java.io.IOException;
-
 /**
  * <code>SortedIntDocSet</code> represents a sorted set of Lucene Document Ids.
  */
@@ -658,7 +655,7 @@ public class SortedIntDocSet extends Doc
       int lastEndIdx = 0;
 
       @Override
-      public DocIdSet getDocIdSet(final AtomicReaderContext context, final Bits acceptDocs) throws IOException {
+      public DocIdSet getDocIdSet(final AtomicReaderContext context, final Bits acceptDocs) {
         AtomicReader reader = context.reader();
         // all Solr DocSets that are used as filters only include live docs
         final Bits acceptDocs2 = acceptDocs == null ? null : (reader.getLiveDocs() == acceptDocs ? null : acceptDocs);
@@ -695,7 +692,7 @@ public class SortedIntDocSet extends Doc
 
         return BitsFilteredDocIdSet.wrap(new DocIdSet() {
           @Override
-          public DocIdSetIterator iterator() throws IOException {
+          public DocIdSetIterator iterator() {
             return new DocIdSetIterator() {
               int idx = startIdx;
               int adjustedDoc = -1;
@@ -706,12 +703,12 @@ public class SortedIntDocSet extends Doc
               }
 
               @Override
-              public int nextDoc() throws IOException {
+              public int nextDoc() {
                 return adjustedDoc = (idx > endIdx) ? NO_MORE_DOCS : (docs[idx++] - base);
               }
 
               @Override
-              public int advance(int target) throws IOException {
+              public int advance(int target) {
                 if (idx > endIdx || target==NO_MORE_DOCS) return adjustedDoc=NO_MORE_DOCS;
                 target += base;
 
@@ -757,7 +754,7 @@ public class SortedIntDocSet extends Doc
           }
 
           @Override
-          public Bits bits() throws IOException {
+          public Bits bits() {
             // random access is expensive for this set
             return null;
           }

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/TermQParserPlugin.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/TermQParserPlugin.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/TermQParserPlugin.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/TermQParserPlugin.java Thu Jul 19 15:58:54 2012
@@ -17,7 +17,6 @@
 package org.apache.solr.search;
 
 import org.apache.lucene.index.Term;
-import org.apache.lucene.queryparser.classic.ParseException;
 import org.apache.lucene.search.Query;
 import org.apache.lucene.search.TermQuery;
 import org.apache.lucene.util.BytesRef;
@@ -51,7 +50,7 @@ public class TermQParserPlugin extends Q
   public QParser createParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) {
     return new QParser(qstr, localParams, params, req) {
       @Override
-      public Query parse() throws ParseException {
+      public Query parse() {
         String fname = localParams.get(QueryParsing.F);
         FieldType ft = req.getSchema().getFieldTypeNoEx(fname);
         String val = localParams.get(QueryParsing.V);

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/ValueSourceParser.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/ValueSourceParser.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/ValueSourceParser.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/ValueSourceParser.java Thu Jul 19 15:58:54 2012
@@ -529,13 +529,13 @@ public abstract class ValueSourceParser 
     
     addParser("pi", new ValueSourceParser() {
       @Override
-      public ValueSource parse(FunctionQParser fp) throws ParseException {
+      public ValueSource parse(FunctionQParser fp) {
         return new DoubleConstValueSource(Math.PI);
       }
     });
     addParser("e", new ValueSourceParser() {
       @Override
-      public ValueSource parse(FunctionQParser fp) throws ParseException {
+      public ValueSource parse(FunctionQParser fp) {
         return new DoubleConstValueSource(Math.E);
       }
     });
@@ -601,28 +601,28 @@ public abstract class ValueSourceParser 
 
     addParser("maxdoc", new ValueSourceParser() {
       @Override
-      public ValueSource parse(FunctionQParser fp) throws ParseException {
+      public ValueSource parse(FunctionQParser fp) {
         return new MaxDocValueSource();
       }
     });
 
     addParser("numdocs", new ValueSourceParser() {
       @Override
-      public ValueSource parse(FunctionQParser fp) throws ParseException {
+      public ValueSource parse(FunctionQParser fp) {
         return new NumDocsValueSource();
       }
     });
 
     addParser("true", new ValueSourceParser() {
       @Override
-      public ValueSource parse(FunctionQParser fp) throws ParseException {
+      public ValueSource parse(FunctionQParser fp) {
         return new BoolConstValueSource(true);
       }
     });
 
     addParser("false", new ValueSourceParser() {
       @Override
-      public ValueSource parse(FunctionQParser fp) throws ParseException {
+      public ValueSource parse(FunctionQParser fp) {
         return new BoolConstValueSource(false);
       }
     });

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/function/FileFloatSource.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/function/FileFloatSource.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/function/FileFloatSource.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/function/FileFloatSource.java Thu Jul 19 15:58:54 2012
@@ -31,6 +31,7 @@ import org.apache.lucene.index.DocsEnum;
 import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.index.MultiFields;
 import org.apache.lucene.index.IndexReaderContext;
+import org.apache.lucene.index.ReaderUtil;
 import org.apache.lucene.index.TermsEnum;
 import org.apache.lucene.index.AtomicReaderContext;
 import org.apache.lucene.queries.function.FunctionValues;
@@ -38,7 +39,7 @@ import org.apache.lucene.queries.functio
 import org.apache.lucene.queries.function.docvalues.FloatDocValues;
 import org.apache.lucene.search.DocIdSetIterator;
 import org.apache.lucene.util.BytesRef;
-import org.apache.lucene.util.ReaderUtil;
+import org.apache.lucene.util.IOUtils;
 import org.apache.solr.core.SolrCore;
 import org.apache.solr.handler.RequestHandlerBase;
 import org.apache.solr.handler.RequestHandlerUtils;
@@ -224,7 +225,7 @@ public class FileFloatSource extends Val
       return vals;
     }
 
-    BufferedReader r = new BufferedReader(new InputStreamReader(is));
+    BufferedReader r = new BufferedReader(new InputStreamReader(is, IOUtils.CHARSET_UTF_8));
 
     String idName = ffs.keyField.getName();
     FieldType idType = ffs.keyField.getType();

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/function/ValueSourceRangeFilter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/function/ValueSourceRangeFilter.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/function/ValueSourceRangeFilter.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/function/ValueSourceRangeFilter.java Thu Jul 19 15:58:54 2012
@@ -81,7 +81,7 @@ public class ValueSourceRangeFilter exte
          return valueSource.getValues(context, readerContext).getRangeScorer(readerContext.reader(), lowerVal, upperVal, includeLower, includeUpper);
        }
        @Override
-       public Bits bits() throws IOException {
+       public Bits bits() {
          return null;  // don't use random access
        }
      }, acceptDocs);

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/grouping/collector/FilterCollector.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/grouping/collector/FilterCollector.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/grouping/collector/FilterCollector.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/grouping/collector/FilterCollector.java Thu Jul 19 15:58:54 2012
@@ -36,7 +36,7 @@ public class FilterCollector extends Col
   private int docBase;
   private int matches;
 
-  public FilterCollector(DocSet filter, Collector delegate) throws IOException {
+  public FilterCollector(DocSet filter, Collector delegate) {
     this.filter = filter;
     this.delegate = delegate;
   }

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/grouping/distributed/shardresultserializer/SearchGroupsResultTransformer.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/grouping/distributed/shardresultserializer/SearchGroupsResultTransformer.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/grouping/distributed/shardresultserializer/SearchGroupsResultTransformer.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/grouping/distributed/shardresultserializer/SearchGroupsResultTransformer.java Thu Jul 19 15:58:54 2012
@@ -74,7 +74,7 @@ public class SearchGroupsResultTransform
   /**
    * {@inheritDoc}
    */
-  public Map<String, Pair<Integer, Collection<SearchGroup<BytesRef>>>> transformToNative(NamedList<NamedList> shardResponse, Sort groupSort, Sort sortWithinGroup, String shard) throws IOException {
+  public Map<String, Pair<Integer, Collection<SearchGroup<BytesRef>>>> transformToNative(NamedList<NamedList> shardResponse, Sort groupSort, Sort sortWithinGroup, String shard) {
     Map<String, Pair<Integer, Collection<SearchGroup<BytesRef>>>> result = new HashMap<String, Pair<Integer, Collection<SearchGroup<BytesRef>>>>();
     for (Map.Entry<String, NamedList> command : shardResponse) {
       List<SearchGroup<BytesRef>> searchGroups = new ArrayList<SearchGroup<BytesRef>>();

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/grouping/distributed/shardresultserializer/ShardResultTransformer.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/grouping/distributed/shardresultserializer/ShardResultTransformer.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/grouping/distributed/shardresultserializer/ShardResultTransformer.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/grouping/distributed/shardresultserializer/ShardResultTransformer.java Thu Jul 19 15:58:54 2012
@@ -48,8 +48,7 @@ public interface ShardResultTransformer<
    * @param sortWithinGroup The sort inside a group
    * @param shard The shard address where the response originated from
    * @return native structure of the data
-   * @throws IOException If I/O related errors occur during transforming
    */
-  R transformToNative(NamedList<NamedList> shardResponse, Sort groupSort, Sort sortWithinGroup, String shard) throws IOException;
+  R transformToNative(NamedList<NamedList> shardResponse, Sort groupSort, Sort sortWithinGroup, String shard);
 
 }

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/similarities/SchemaSimilarityFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/similarities/SchemaSimilarityFactory.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/similarities/SchemaSimilarityFactory.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/similarities/SchemaSimilarityFactory.java Thu Jul 19 15:58:54 2012
@@ -26,9 +26,21 @@ import org.apache.solr.schema.SchemaAwar
 import org.apache.solr.schema.SimilarityFactory;
 
 /**
- * SimilarityFactory that returns a PerFieldSimilarityWrapper
- * that delegates to the fieldtype, if its configured, otherwise
+ * SimilarityFactory that returns a {@link PerFieldSimilarityWrapper}
+ * that delegates to the field type, if its configured, otherwise
  * {@link DefaultSimilarity}.
+ *
+ * <p>
+ * <b>NOTE:</b> Users should be aware that in addition to supporting 
+ * <code>Similarity</code> configurations specified on individual 
+ * field types, this factory also differs in behavior from 
+ * {@link DefaultSimilarityFactory} because of other differences in the 
+ * implementations of <code>PerFieldSimilarityWrapper</code> and 
+ * <code>DefaultSimilarity</code> - notably in methods such as 
+ * {@link Similarity#coord} and {@link Similarity#queryNorm}.  
+ * </p>
+ *
+ * @see FieldType#getSimilarity
  */
 public class SchemaSimilarityFactory extends SimilarityFactory implements SchemaAware {
   private Similarity similarity;

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/servlet/LoadAdminUiServlet.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/servlet/LoadAdminUiServlet.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/servlet/LoadAdminUiServlet.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/servlet/LoadAdminUiServlet.java Thu Jul 19 15:58:54 2012
@@ -21,7 +21,6 @@ import java.io.InputStream;
 import java.io.IOException;
 import java.io.PrintWriter;
 
-import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -42,7 +41,7 @@ public final class LoadAdminUiServlet ex
   @Override
   public void doGet(HttpServletRequest request,
                     HttpServletResponse response)
-      throws IOException, ServletException {
+      throws IOException {
     response.setCharacterEncoding("UTF-8");
     response.setContentType("text/html");
 
@@ -76,7 +75,7 @@ public final class LoadAdminUiServlet ex
   @Override
   public void doPost(HttpServletRequest request,
                      HttpServletResponse response)
-      throws IOException, ServletException {
+      throws IOException {
     doGet(request, response);
   }
 }

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java Thu Jul 19 15:58:54 2012
@@ -17,23 +17,18 @@
 
 package org.apache.solr.servlet;
 
+import java.io.ByteArrayInputStream;
 import java.io.IOException;
-import java.io.Writer;
+import java.io.OutputStreamWriter;
 import java.io.PrintWriter;
 import java.io.StringWriter;
-import java.io.OutputStreamWriter;
-import java.io.ByteArrayInputStream;
+import java.io.Writer;
 import java.nio.charset.Charset;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
 import java.util.WeakHashMap;
 
-import org.apache.solr.handler.ContentStreamHandlerBase;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.xml.sax.InputSource;
-
 import javax.servlet.Filter;
 import javax.servlet.FilterChain;
 import javax.servlet.FilterConfig;
@@ -44,23 +39,33 @@ import javax.servlet.http.HttpServletReq
 import javax.servlet.http.HttpServletResponse;
 
 import org.apache.solr.common.SolrException;
-import org.apache.solr.common.util.NamedList;
-import org.apache.solr.common.util.SimpleOrderedMap;
 import org.apache.solr.common.cloud.CloudState;
 import org.apache.solr.common.cloud.Slice;
 import org.apache.solr.common.cloud.ZkNodeProps;
 import org.apache.solr.common.cloud.ZkStateReader;
 import org.apache.solr.common.params.CommonParams;
-import org.apache.solr.util.FastWriter;
 import org.apache.solr.common.util.ContentStreamBase;
-import org.apache.solr.core.*;
-import org.apache.solr.handler.component.SearchHandler;
-import org.apache.solr.request.*;
+import org.apache.solr.common.util.NamedList;
+import org.apache.solr.common.util.SimpleOrderedMap;
+import org.apache.solr.core.Config;
+import org.apache.solr.core.CoreContainer;
+import org.apache.solr.core.SolrConfig;
+import org.apache.solr.core.SolrCore;
+import org.apache.solr.handler.ContentStreamHandlerBase;
+import org.apache.solr.request.ServletSolrParams;
+import org.apache.solr.request.SolrQueryRequest;
+import org.apache.solr.request.SolrQueryRequestBase;
+import org.apache.solr.request.SolrRequestHandler;
+import org.apache.solr.request.SolrRequestInfo;
 import org.apache.solr.response.BinaryQueryResponseWriter;
 import org.apache.solr.response.QueryResponseWriter;
 import org.apache.solr.response.SolrQueryResponse;
 import org.apache.solr.servlet.cache.HttpCacheHeaderUtil;
 import org.apache.solr.servlet.cache.Method;
+import org.apache.solr.util.FastWriter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.xml.sax.InputSource;
 
 /**
  * This filter looks at the incoming URL maps them to handlers defined in solrconfig.xml
@@ -175,6 +180,13 @@ public class SolrDispatchFilter implemen
           handleAdminRequest(req, response, handler, solrReq);
           return;
         }
+        // Check for the core admin collections url
+        if( path.equals( "/admin/collections" ) ) {
+          handler = cores.getCollectionsHandler();
+          solrReq =  adminRequestParser.parse(null,path, req);
+          handleAdminRequest(req, response, handler, solrReq);
+          return;
+        }
         else {
           //otherwise, we should find a core from the path
           idx = path.indexOf( "/", 1 );

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/servlet/SolrRequestParsers.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/servlet/SolrRequestParsers.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/servlet/SolrRequestParsers.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/servlet/SolrRequestParsers.java Thu Jul 19 15:58:54 2012
@@ -246,7 +246,7 @@ class HttpRequestContentStream extends C
 {
   private final HttpServletRequest req;
   
-  public HttpRequestContentStream( HttpServletRequest req ) throws IOException {
+  public HttpRequestContentStream( HttpServletRequest req ) {
     this.req = req;
     
     contentType = req.getContentType();
@@ -379,7 +379,7 @@ class StandardRequestParser implements S
   public SolrParams parseParamsAndFillStreams( 
       final HttpServletRequest req, ArrayList<ContentStream> streams ) throws Exception
   {
-    String method = req.getMethod().toUpperCase(Locale.ENGLISH);
+    String method = req.getMethod().toUpperCase(Locale.ROOT);
     if( "GET".equals( method ) || "HEAD".equals( method )) {
       return new ServletSolrParams(req);
     }
@@ -390,7 +390,7 @@ class StandardRequestParser implements S
         if( idx > 0 ) { // remove the charset definition "; charset=utf-8"
           contentType = contentType.substring( 0, idx );
         }
-        if( "application/x-www-form-urlencoded".equals( contentType.toLowerCase(Locale.ENGLISH) ) ) {
+        if( "application/x-www-form-urlencoded".equals( contentType.toLowerCase(Locale.ROOT) ) ) {
           return new ServletSolrParams(req); // just get the params from parameterMap
         }
         if( ServletFileUpload.isMultipartContent(req) ) {

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/servlet/ZookeeperInfoServlet.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/servlet/ZookeeperInfoServlet.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/servlet/ZookeeperInfoServlet.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/servlet/ZookeeperInfoServlet.java Thu Jul 19 15:58:54 2012
@@ -28,7 +28,6 @@ import org.apache.zookeeper.data.Stat;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -49,13 +48,13 @@ public final class ZookeeperInfoServlet 
   static final Logger log = LoggerFactory.getLogger(ZookeeperInfoServlet.class);
 
   @Override
-  public void init() throws ServletException {
+  public void init() {
   }
 
   @Override
   public void doGet(HttpServletRequest request,
                     HttpServletResponse response)
-      throws IOException, ServletException {
+      throws IOException {
     response.setCharacterEncoding("UTF-8");
     response.setContentType("application/json");
 
@@ -92,7 +91,7 @@ public final class ZookeeperInfoServlet 
   @Override
   public void doPost(HttpServletRequest request,
                      HttpServletResponse response)
-      throws IOException, ServletException {
+      throws IOException {
     doGet(request, response);
   }
 
@@ -363,7 +362,7 @@ public final class ZookeeperInfoServlet 
       json.write(v);
     }
 
-    boolean printZnode(JSONWriter json, String path) throws IOException {
+    boolean printZnode(JSONWriter json, String path) {
       try {
         Stat stat = new Stat();
         // Trickily, the call to zkClient.getData fills in the stat variable

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/servlet/cache/HttpCacheHeaderUtil.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/servlet/cache/HttpCacheHeaderUtil.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/servlet/cache/HttpCacheHeaderUtil.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/servlet/cache/HttpCacheHeaderUtil.java Thu Jul 19 15:58:54 2012
@@ -27,8 +27,6 @@ import java.util.List;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import org.apache.lucene.index.IndexReader;
-
 import org.apache.solr.core.IndexDeletionPolicyWrapper;
 import org.apache.solr.core.SolrCore;
 import org.apache.solr.core.SolrConfig;
@@ -43,13 +41,11 @@ import org.apache.commons.codec.binary.B
 
 public final class HttpCacheHeaderUtil {
   
-  public static void sendNotModified(HttpServletResponse res)
-    throws IOException {
+  public static void sendNotModified(HttpServletResponse res) {
     res.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
   }
 
-  public static void sendPreconditionFailed(HttpServletResponse res)
-    throws IOException {
+  public static void sendPreconditionFailed(HttpServletResponse res) {
     res.setStatus(HttpServletResponse.SC_PRECONDITION_FAILED);
   }
   
@@ -81,7 +77,7 @@ public final class HttpCacheHeaderUtil {
           etagCache = "\""
            + new String(Base64.encodeBase64((Long.toHexString
                                              (Long.reverse(indexVersionCache))
-                                             + etagSeed).getBytes()), "US-ASCII")
+                                             + etagSeed).getBytes("US-ASCII")), "US-ASCII")
            + "\"";
         } catch (UnsupportedEncodingException e) {
           throw new RuntimeException(e); // may not happen
@@ -215,8 +211,7 @@ public final class HttpCacheHeaderUtil {
   public static boolean doCacheHeaderValidation(final SolrQueryRequest solrReq,
                                                 final HttpServletRequest req,
                                                 final Method reqMethod,
-                                                final HttpServletResponse resp)
-    throws IOException {
+                                                final HttpServletResponse resp) {
     
     if (Method.POST==reqMethod || Method.OTHER==reqMethod) {
       return false;
@@ -244,14 +239,12 @@ public final class HttpCacheHeaderUtil {
    * Check for etag related conditional headers and set status 
    * 
    * @return true if no request processing is necessary and HTTP response status has been set, false otherwise.
-   * @throws IOException
    */
   @SuppressWarnings("unchecked")
   public static boolean checkETagValidators(final HttpServletRequest req,
                                             final HttpServletResponse resp,
                                             final Method reqMethod,
-                                            final String etag)
-    throws IOException {
+                                            final String etag) {
     
     // First check If-None-Match because this is the common used header
     // element by HTTP clients
@@ -281,12 +274,10 @@ public final class HttpCacheHeaderUtil {
    * Check for modify time related conditional headers and set status 
    * 
    * @return true if no request processing is necessary and HTTP response status has been set, false otherwise.
-   * @throws IOException
    */
   public static boolean checkLastModValidators(final HttpServletRequest req,
                                                final HttpServletResponse resp,
-                                               final long lastMod)
-    throws IOException {
+                                               final long lastMod) {
 
     try {
       // First check for If-Modified-Since because this is the common

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/servlet/cache/Method.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/servlet/cache/Method.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/servlet/cache/Method.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/servlet/cache/Method.java Thu Jul 19 15:58:54 2012
@@ -24,7 +24,7 @@ public enum Method {
 
   public static Method getMethod(String method) {
     try {
-      return Method.valueOf(method.toUpperCase(Locale.ENGLISH));
+      return Method.valueOf(method.toUpperCase(Locale.ROOT));
     } catch (Exception e) {
       return OTHER;
     }

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/spelling/WordBreakSolrSpellChecker.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/spelling/WordBreakSolrSpellChecker.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/spelling/WordBreakSolrSpellChecker.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/spelling/WordBreakSolrSpellChecker.java Thu Jul 19 15:58:54 2012
@@ -22,6 +22,7 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Locale;
 import java.util.regex.Pattern;
 
 import org.apache.lucene.analysis.Token;
@@ -126,7 +127,7 @@ public class WordBreakSolrSpellChecker e
     wbsp = new WordBreakSpellChecker();
     String bstb = strParam(config, PARAM_BREAK_SUGGESTION_TIE_BREAKER);
     if (bstb != null) {
-      bstb = bstb.toUpperCase();
+      bstb = bstb.toUpperCase(Locale.ROOT);
       if (bstb.equals(BreakSuggestionTieBreaker.SUM_FREQ.name())) {
         sortMethod = BreakSuggestionSortMethod.NUM_CHANGES_THEN_SUMMED_FREQUENCY;
       } else if (bstb.equals(BreakSuggestionTieBreaker.MAX_FREQ.name())) {

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/update/AddUpdateCommand.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/update/AddUpdateCommand.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/update/AddUpdateCommand.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/update/AddUpdateCommand.java Thu Jul 19 15:58:54 2012
@@ -19,6 +19,7 @@ package org.apache.solr.update;
 
 import org.apache.lucene.document.Document;
 import org.apache.lucene.index.Term;
+import org.apache.lucene.search.Query;
 import org.apache.lucene.util.BytesRef;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrInputDocument;
@@ -27,6 +28,8 @@ import org.apache.solr.request.SolrQuery
 import org.apache.solr.schema.IndexSchema;
 import org.apache.solr.schema.SchemaField;
 
+import java.util.List;
+
 /**
  *
  */
@@ -42,6 +45,7 @@ public class AddUpdateCommand extends Up
    public boolean overwrite = true;
    
    public Term updateTerm;
+
    public int commitWithin = -1;
    
    public AddUpdateCommand(SolrQueryRequest req) {

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/update/DefaultSolrCoreState.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/update/DefaultSolrCoreState.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/update/DefaultSolrCoreState.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/update/DefaultSolrCoreState.java Thu Jul 19 15:58:54 2012
@@ -25,6 +25,7 @@ import org.apache.solr.common.SolrExcept
 import org.apache.solr.core.CoreContainer;
 import org.apache.solr.core.DirectoryFactory;
 import org.apache.solr.core.SolrCore;
+import org.apache.solr.util.RefCounted;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -41,30 +42,79 @@ public final class DefaultSolrCoreState 
   private boolean recoveryRunning;
   private RecoveryStrategy recoveryStrat;
   private boolean closed = false;
+
+  private RefCounted<IndexWriter> refCntWriter;
+
+  private boolean pauseWriter;
+  private boolean writerFree = true;
   
   public DefaultSolrCoreState(DirectoryFactory directoryFactory) {
     this.directoryFactory = directoryFactory;
   }
   
   @Override
-  public synchronized IndexWriter getIndexWriter(SolrCore core) throws IOException {
+  public synchronized RefCounted<IndexWriter> getIndexWriter(SolrCore core)
+      throws IOException {
+    while (pauseWriter) {
+      try {
+        wait();
+      } catch (InterruptedException e) {}
+    }
+    
     if (indexWriter == null) {
-      indexWriter = createMainIndexWriter(core, "DirectUpdateHandler2", false, false);
+      indexWriter = createMainIndexWriter(core, "DirectUpdateHandler2", false,
+          false);
     }
-    return indexWriter;
+    if (refCntWriter == null) {
+      refCntWriter = new RefCounted<IndexWriter>(indexWriter) {
+        @Override
+        public void close() {
+          synchronized (DefaultSolrCoreState.this) {
+            writerFree = true;
+            DefaultSolrCoreState.this.notifyAll();
+          }
+        }
+      };
+    }
+    writerFree = false;
+    notifyAll();
+    refCntWriter.incref();
+    return refCntWriter;
   }
 
   @Override
   public synchronized void newIndexWriter(SolrCore core) throws IOException {
-    if (indexWriter != null) {
-      indexWriter.close();
+    // we need to wait for the Writer to fall out of use
+    // first lets stop it from being lent out
+    pauseWriter = true;
+    // then lets wait until its out of use
+    while(!writerFree) {
+      try {
+        wait();
+      } catch (InterruptedException e) {}
+    }
+    
+    try {
+      if (indexWriter != null) {
+        try {
+          indexWriter.close();
+        } catch (Throwable t) {
+          SolrException.log(log, "Error closing old IndexWriter", t);
+        }
+      }
+      
+      indexWriter = createMainIndexWriter(core, "DirectUpdateHandler2", false,
+          true);
+      // we need to null this so it picks up the new writer next get call
+      refCntWriter = null;
+    } finally {
+      pauseWriter = false;
+      notifyAll();
     }
-    indexWriter = createMainIndexWriter(core, "DirectUpdateHandler2",
-        false, true);
   }
 
   @Override
-  public  void decref(IndexWriterCloser closer) throws IOException {
+  public void decref(IndexWriterCloser closer) {
     synchronized (this) {
       refCnt--;
       if (refCnt == 0) {
@@ -126,6 +176,11 @@ public final class DefaultSolrCoreState 
       return;
     }
     
+    if (cc.isShutDown()) {
+      log.warn("Skipping recovery because Solr is shutdown");
+      return;
+    }
+    
     cancelRecovery();
     synchronized (recoveryLock) {
       while (recoveryRunning) {
@@ -134,6 +189,11 @@ public final class DefaultSolrCoreState 
         } catch (InterruptedException e) {
 
         }
+        // check again for those that were waiting
+        if (cc.isShutDown()) {
+          log.warn("Skipping recovery because Solr is shutdown");
+          return;
+        }
         if (closed) return;
       }