You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ro...@apache.org on 2013/01/18 19:31:23 UTC

svn commit: r1435287 [29/41] - in /lucene/dev/branches/LUCENE-2878: ./ dev-tools/ dev-tools/eclipse/ dev-tools/idea/.idea/libraries/ dev-tools/idea/lucene/analysis/icu/ dev-tools/maven/ dev-tools/maven/lucene/benchmark/ dev-tools/maven/solr/ dev-tools/...

Modified: lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/FacetComponent.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/FacetComponent.java?rev=1435287&r1=1435286&r2=1435287&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/FacetComponent.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/FacetComponent.java Fri Jan 18 18:30:54 2013
@@ -17,7 +17,6 @@
 
 package org.apache.solr.handler.component;
 
-import org.apache.lucene.queryparser.classic.ParseException;
 import org.apache.lucene.util.OpenBitSet;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrException.ErrorCode;
@@ -32,6 +31,7 @@ import org.apache.solr.common.util.StrUt
 import org.apache.solr.request.SimpleFacets;
 import org.apache.solr.schema.FieldType;
 import org.apache.solr.search.QueryParsing;
+import org.apache.solr.search.SyntaxError;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -670,7 +670,7 @@ public class FacetComponent extends Sear
       this.facetStr = facetStr;
       try {
         this.localParams = QueryParsing.getLocalParams(facetStr, rb.req.getParams());
-      } catch (ParseException e) {
+      } catch (SyntaxError e) {
         throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, e);
       }
       this.facetOn = facetStr;
@@ -818,6 +818,7 @@ public class FacetComponent extends Sear
     public ShardFacetCount[] getLexSorted() {
       ShardFacetCount[] arr = counts.values().toArray(new ShardFacetCount[counts.size()]);
       Arrays.sort(arr, new Comparator<ShardFacetCount>() {
+        @Override
         public int compare(ShardFacetCount o1, ShardFacetCount o2) {
           return o1.indexed.compareTo(o2.indexed);
         }
@@ -829,6 +830,7 @@ public class FacetComponent extends Sear
     public ShardFacetCount[] getCountSorted() {
       ShardFacetCount[] arr = counts.values().toArray(new ShardFacetCount[counts.size()]);
       Arrays.sort(arr, new Comparator<ShardFacetCount>() {
+        @Override
         public int compare(ShardFacetCount o1, ShardFacetCount o2) {
           if (o2.count < o1.count) return -1;
           else if (o1.count < o2.count) return 1;

Modified: lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/HighlightComponent.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/HighlightComponent.java?rev=1435287&r1=1435286&r2=1435287&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/HighlightComponent.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/HighlightComponent.java Fri Jan 18 18:30:54 2013
@@ -17,7 +17,6 @@
 
 package org.apache.solr.handler.component;
 
-import org.apache.lucene.queryparser.classic.ParseException;
 import org.apache.lucene.search.Query;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.params.CommonParams;
@@ -25,10 +24,12 @@ import org.apache.solr.common.params.Hig
 import org.apache.solr.common.params.SolrParams;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.util.SimpleOrderedMap;
+import org.apache.solr.highlight.PostingsSolrHighlighter;
 import org.apache.solr.highlight.SolrHighlighter;
 import org.apache.solr.highlight.DefaultSolrHighlighter;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.search.QParser;
+import org.apache.solr.search.SyntaxError;
 import org.apache.solr.util.SolrPluginUtils;
 import org.apache.solr.util.plugin.PluginInfoInitialized;
 import org.apache.solr.util.plugin.SolrCoreAware;
@@ -57,6 +58,7 @@ public class HighlightComponent extends 
     return hl==null ? null: hl.getHighlighter();    
   }
 
+  @Override
   public void init(PluginInfo info) {
     this.info = info;
   }
@@ -71,13 +73,14 @@ public class HighlightComponent extends 
         try {
           QParser parser = QParser.getParser(hlq, null, rb.req);
           rb.setHighlightQuery(parser.getHighlightQuery());
-        } catch (ParseException e) {
+        } catch (SyntaxError e) {
           throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, e);
         }
       }
     }
   }
 
+  @Override
   public void inform(SolrCore core) {
     List<PluginInfo> children = info.getChildren("highlighting");
     if(children.isEmpty()) {
@@ -126,7 +129,7 @@ public class HighlightComponent extends 
       }
       
       if(highlightQuery != null) {
-        boolean rewrite = !(Boolean.valueOf(params.get(HighlightParams.USE_PHRASE_HIGHLIGHTER, "true")) &&
+        boolean rewrite = (highlighter instanceof PostingsSolrHighlighter == false) && !(Boolean.valueOf(params.get(HighlightParams.USE_PHRASE_HIGHLIGHTER, "true")) &&
             Boolean.valueOf(params.get(HighlightParams.HIGHLIGHT_MULTI_TERM, "true")));
         highlightQuery = rewrite ?  highlightQuery.rewrite(req.getSearcher().getIndexReader()) : highlightQuery;
       }

Modified: lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/HttpShardHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/HttpShardHandler.java?rev=1435287&r1=1435286&r2=1435287&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/HttpShardHandler.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/HttpShardHandler.java Fri Jan 18 18:30:54 2013
@@ -17,6 +17,7 @@ package org.apache.solr.handler.componen
  */
 
 import java.net.ConnectException;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -40,8 +41,8 @@ import org.apache.solr.client.solrj.util
 import org.apache.solr.cloud.CloudDescriptor;
 import org.apache.solr.cloud.ZkController;
 import org.apache.solr.common.SolrException;
-import org.apache.solr.common.SolrException.ErrorCode;
 import org.apache.solr.common.cloud.ClusterState;
+import org.apache.solr.common.cloud.DocCollection;
 import org.apache.solr.common.cloud.Replica;
 import org.apache.solr.common.cloud.Slice;
 import org.apache.solr.common.cloud.ZkCoreNodeProps;
@@ -126,11 +127,13 @@ public class HttpShardHandler extends Sh
   }
 
 
+  @Override
   public void submit(final ShardRequest sreq, final String shard, final ModifiableSolrParams params) {
     // do this outside of the callable for thread safety reasons
     final List<String> urls = getURLs(shard);
 
     Callable<ShardResponse> task = new Callable<ShardResponse>() {
+      @Override
       public ShardResponse call() throws Exception {
 
         ShardResponse srsp = new ShardResponse();
@@ -193,6 +196,7 @@ public class HttpShardHandler extends Sh
   /** returns a ShardResponse of the last response correlated with a ShardRequest.  This won't 
    * return early if it runs into an error.  
    **/
+  @Override
   public ShardResponse takeCompletedIncludingErrors() {
     return take(false);
   }
@@ -201,6 +205,7 @@ public class HttpShardHandler extends Sh
   /** returns a ShardResponse of the last response correlated with a ShardRequest,
    * or immediately returns a ShardResponse if there was an error detected
    */
+  @Override
   public ShardResponse takeCompletedOrError() {
     return take(true);
   }
@@ -233,6 +238,7 @@ public class HttpShardHandler extends Sh
   }
 
 
+  @Override
   public void cancelAll() {
     for (Future<ShardResponse> future : pending) {
       // TODO: any issues with interrupting?  shouldn't be if
@@ -240,6 +246,8 @@ public class HttpShardHandler extends Sh
       future.cancel(true);
     }
   }
+
+  @Override
   public void checkDistributed(ResponseBuilder rb) {
     SolrQueryRequest req = rb.req;
     SolrParams params = req.getParams();
@@ -279,14 +287,17 @@ public class HttpShardHandler extends Sh
           }
         }
       } else if (zkController != null) {
-        // we weren't provided with a list of slices to query, so find the list that will cover the complete index
+        // we weren't provided with an explicit list of slices to query via "shards", so use the cluster state
 
         clusterState =  zkController.getClusterState();
+        String shardKeys = params.get(ShardParams.SHARD_KEYS);
 
-        // This can be more efficient... we only record the name, even though we
-        // have the shard info we need in the next step of mapping slice->shards
-        
-        // Stores the comma-separated list of specified collections.
+        // This will be the complete list of slices we need to query for this request.
+        slices = new HashMap<String,Slice>();
+
+        // we need to find out what collections this request is for.
+
+        // A comma-separated list of specified collections.
         // Eg: "collection1,collection2,collection3"
         String collections = params.get("collection");
         if (collections != null) {
@@ -294,50 +305,60 @@ public class HttpShardHandler extends Sh
           // each parameter and store as a seperate member of a List.
           List<String> collectionList = StrUtils.splitSmart(collections, ",",
               true);
-          
-          // First create an empty HashMap to add the slice info to.
-          slices = new HashMap<String,Slice>();
-          
           // In turn, retrieve the slices that cover each collection from the
           // cloud state and add them to the Map 'slices'.
-          for (int i = 0; i < collectionList.size(); i++) {
-            String collection = collectionList.get(i);
-            ClientUtils.appendMap(collection, slices, clusterState.getSlices(collection));
+          for (String collectionName : collectionList) {
+            // The original code produced <collection-name>_<shard-name> when the collections
+            // parameter was specified (see ClientUtils.appendMap)
+            // Is this necessary if ony one collection is specified?
+            // i.e. should we change multiCollection to collectionList.size() > 1?
+            addSlices(slices, clusterState, params, collectionName,  shardKeys, true);
           }
         } else {
-          // If no collections were specified, default to the collection for
-          // this core.
-          slices = clusterState.getSlices(cloudDescriptor.getCollectionName());
-          if (slices == null) {
-            throw new SolrException(ErrorCode.BAD_REQUEST,
-                "Could not find collection:"
-                    + cloudDescriptor.getCollectionName());
-          }
+          // just this collection
+          String collectionName = cloudDescriptor.getCollectionName();
+          addSlices(slices, clusterState, params, collectionName,  shardKeys, false);
         }
+
         
         // Store the logical slices in the ResponseBuilder and create a new
         // String array to hold the physical shards (which will be mapped
         // later).
         rb.slices = slices.keySet().toArray(new String[slices.size()]);
         rb.shards = new String[rb.slices.length];
-
-        /***
-         rb.slices = new String[slices.size()];
-         for (int i=0; i<rb.slices.length; i++) {
-         rb.slices[i] = slices.get(i).getName();
-         }
-         ***/
       }
 
       //
       // Map slices to shards
       //
       if (zkController != null) {
+
+        // Are we hosting the shard that this request is for, and are we active? If so, then handle it ourselves
+        // and make it a non-distributed request.
+        String ourSlice = cloudDescriptor.getShardId();
+        String ourCollection = cloudDescriptor.getCollectionName();
+        if (rb.slices.length == 1
+            && ( rb.slices[0].equals(ourSlice) || rb.slices[0].equals(ourCollection + "_" + ourSlice) )  // handle the <collection>_<slice> format
+            && ZkStateReader.ACTIVE.equals(cloudDescriptor.getLastPublished()) )
+        {
+          boolean shortCircuit = params.getBool("shortCircuit", true);       // currently just a debugging parameter to check distrib search on a single node
+
+          String targetHandler = params.get(ShardParams.SHARDS_QT);
+          shortCircuit = shortCircuit && targetHandler == null;             // if a different handler is specified, don't short-circuit
+
+          if (shortCircuit) {
+            rb.isDistrib = false;
+            return;
+          }
+          // We shouldn't need to do anything to handle "shard.rows" since it was previously meant to be an optimization?
+        }
+
+
         for (int i=0; i<rb.shards.length; i++) {
           if (rb.shards[i] == null) {
             if (clusterState == null) {
               clusterState =  zkController.getClusterState();
-              slices = clusterState.getSlices(cloudDescriptor.getCollectionName());
+              slices = clusterState.getSlicesMap(cloudDescriptor.getCollectionName());
             }
             String sliceName = rb.slices[i];
 
@@ -388,5 +409,13 @@ public class HttpShardHandler extends Sh
     }
   }
 
-}
 
+  private void addSlices(Map<String,Slice> target, ClusterState state, SolrParams params, String collectionName, String shardKeys, boolean multiCollection) {
+    DocCollection coll = state.getCollection(collectionName);
+    Collection<Slice> slices = coll.getRouter().getSearchSlices(shardKeys, params , coll);
+    ClientUtils.addSlices(target, collectionName, slices, multiCollection);
+  }
+
+
+
+}
\ No newline at end of file

Modified: lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/HttpShardHandlerFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/HttpShardHandlerFactory.java?rev=1435287&r1=1435286&r2=1435287&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/HttpShardHandlerFactory.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/HttpShardHandlerFactory.java Fri Jan 18 18:30:54 2013
@@ -87,6 +87,7 @@ public class HttpShardHandlerFactory ext
   /**
    * Get {@link ShardHandler} that uses the default http client.
    */
+  @Override
   public ShardHandler getShardHandler() {
     return getShardHandler(defaultClient);
   }
@@ -98,6 +99,7 @@ public class HttpShardHandlerFactory ext
     return new HttpShardHandler(this, httpClient);
   }
 
+  @Override
   public void init(PluginInfo info) {
     NamedList args = info.initArgs;
     this.soTimeout = getParameter(args, HttpClientUtil.PROP_SO_TIMEOUT, soTimeout);
@@ -154,19 +156,25 @@ public class HttpShardHandlerFactory ext
   @Override
   public void close() {
     try {
-      defaultClient.getConnectionManager().shutdown();
+      ExecutorUtil.shutdownNowAndAwaitTermination(commExecutor);
     } catch (Throwable e) {
       SolrException.log(log, e);
     }
+    
     try {
-      loadbalancer.shutdown();
+      if(defaultClient != null) {
+        defaultClient.getConnectionManager().shutdown();
+      }
     } catch (Throwable e) {
       SolrException.log(log, e);
     }
     try {
-      ExecutorUtil.shutdownNowAndAwaitTermination(commExecutor);
+      if(loadbalancer != null) {
+        loadbalancer.shutdown();
+      }
     } catch (Throwable e) {
       SolrException.log(log, e);
     }
+
   }
 }

Modified: lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/MoreLikeThisComponent.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/MoreLikeThisComponent.java?rev=1435287&r1=1435286&r2=1435287&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/MoreLikeThisComponent.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/MoreLikeThisComponent.java Fri Jan 18 18:30:54 2013
@@ -19,8 +19,24 @@ package org.apache.solr.handler.componen
 
 import java.io.IOException;
 import java.net.URL;
-
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.TreeMap;
+
+import org.apache.lucene.search.BooleanQuery;
+import org.apache.solr.common.SolrDocument;
+import org.apache.solr.common.SolrDocumentList;
+import org.apache.solr.common.params.CommonParams;
+import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.params.MoreLikeThisParams;
+import org.apache.solr.common.params.ShardParams;
 import org.apache.solr.common.params.SolrParams;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.util.SimpleOrderedMap;
@@ -30,97 +46,358 @@ import org.apache.solr.search.DocIterato
 import org.apache.solr.search.DocList;
 import org.apache.solr.search.DocListAndSet;
 import org.apache.solr.search.SolrIndexSearcher;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * TODO!
  * 
- *
+ * 
  * @since solr 1.3
  */
-public class MoreLikeThisComponent extends SearchComponent
-{
+public class MoreLikeThisComponent extends SearchComponent {
   public static final String COMPONENT_NAME = "mlt";
+  public static final String DIST_DOC_ID = "mlt.dist.id";
+  static final Logger log = LoggerFactory
+      .getLogger(MoreLikeThisComponent.class);
   
   @Override
-  public void prepare(ResponseBuilder rb) throws IOException
-  {
+  public void prepare(ResponseBuilder rb) throws IOException {
     
   }
-
+  
   @Override
-  public void process(ResponseBuilder rb) throws IOException
-  {
-    SolrParams p = rb.req.getParams();
-    if( p.getBool( MoreLikeThisParams.MLT, false ) ) {
+  public void process(ResponseBuilder rb) throws IOException {
+
+    SolrParams params = rb.req.getParams();
+    if (params.getBool(MoreLikeThisParams.MLT, false)) {
+      log.debug("Starting MoreLikeThis.Process.  isShard: "
+          + params.getBool(ShardParams.IS_SHARD));
       SolrIndexSearcher searcher = rb.req.getSearcher();
+
+      int mltcount = params.getInt(MoreLikeThisParams.DOC_COUNT, 5);
+      if (params.getBool(ShardParams.IS_SHARD, false)) {
+        if (params.get(MoreLikeThisComponent.DIST_DOC_ID) == null) {
+          if (rb.getResults().docList.size() == 0) {
+            // return empty response
+            rb.rsp.add("moreLikeThis", new NamedList<DocList>());
+            return;
+          }
+          
+          MoreLikeThisHandler.MoreLikeThisHelper mlt = new MoreLikeThisHandler.MoreLikeThisHelper(
+              params, searcher);
+          
+          NamedList<BooleanQuery> bQuery = mlt.getMoreLikeTheseQuery(rb
+              .getResults().docList);
+          
+          NamedList<String> temp = new NamedList<String>();
+          Iterator<Entry<String,BooleanQuery>> idToQueryIt = bQuery.iterator();
+
+          
+          while (idToQueryIt.hasNext()) {
+            Entry<String,BooleanQuery> idToQuery = idToQueryIt.next();
+            String s = idToQuery.getValue().toString();
+
+            log.debug("MLT Query:" + s);
+            temp.add(idToQuery.getKey(), idToQuery.getValue().toString());
+          }
+
+          rb.rsp.add("moreLikeThis", temp);
+        } else {
+          NamedList<DocList> sim = getMoreLikeThese(rb, rb.req.getSearcher(),
+              rb.getResults().docList, mltcount);
+          rb.rsp.add("moreLikeThis", sim);
+        }
+      } else {
+        // non distrib case
+        NamedList<DocList> sim = getMoreLikeThese(rb, rb.req.getSearcher(), rb.getResults().docList,
+            mltcount);
+        rb.rsp.add("moreLikeThis", sim);
+      }
+    }
+  }
+  
+  @Override
+  public void handleResponses(ResponseBuilder rb, ShardRequest sreq) {
+    if ((sreq.purpose & ShardRequest.PURPOSE_GET_TOP_IDS) != 0
+        && rb.req.getParams().getBool(COMPONENT_NAME, false)) {
+      log.debug("ShardRequest.response.size: " + sreq.responses.size());
+      for (ShardResponse r : sreq.responses) {
+        NamedList<?> moreLikeThisReponse = (NamedList<?>) r.getSolrResponse()
+            .getResponse().get("moreLikeThis");
+        log.debug("ShardRequest.response.shard: " + r.getShard());
+        if (moreLikeThisReponse != null) {
+          for (Entry<String,?> entry : moreLikeThisReponse) {
+            log.debug("id: \"" + entry.getKey() + "\" Query: \""
+                + entry.getValue() + "\"");
+            ShardRequest s = buildShardQuery(rb, (String) entry.getValue(),
+                entry.getKey());
+            rb.addRequest(this, s);
+          }
+        }
+      }
+    }
+    
+    if ((sreq.purpose & ShardRequest.PURPOSE_GET_MLT_RESULTS) != 0) {
+      for (ShardResponse r : sreq.responses) {
+        log.debug("MLT Query returned: "
+            + r.getSolrResponse().getResponse().toString());
+      }
+    }
+  }
+  
+  @Override
+  public void finishStage(ResponseBuilder rb) {
+    
+    // Handling Responses in finishStage, because solrResponse will put
+    // moreLikeThis xml
+    // segment ahead of result/response.
+    if (rb.stage == ResponseBuilder.STAGE_GET_FIELDS
+        && rb.req.getParams().getBool(COMPONENT_NAME, false)) {
+      Map<Object,SolrDocumentList> tempResults = new LinkedHashMap<Object,SolrDocumentList>();
+      
+      int mltcount = rb.req.getParams().getInt(MoreLikeThisParams.DOC_COUNT, 5);
+      String keyName = rb.req.getSchema().getUniqueKeyField().getName();
       
-      NamedList<DocList> sim = getMoreLikeThese( rb, searcher,
-          rb.getResults().docList, rb.getFieldFlags() );
+      for (ShardRequest sreq : rb.finished) {
+        if ((sreq.purpose & ShardRequest.PURPOSE_GET_MLT_RESULTS) != 0) {
+          for (ShardResponse r : sreq.responses) {
+            log.debug("ShardRequest.response.shard: " + r.getShard());
+            String key = r.getShardRequest().params
+                .get(MoreLikeThisComponent.DIST_DOC_ID);
+            SolrDocumentList shardDocList =  (SolrDocumentList) r.getSolrResponse().getResponse().get("response");
+
+            if (shardDocList == null) {
+              continue;
+            }
+ 
+            log.info("MLT: results added for key: " + key + " documents: "
+                + shardDocList.toString());
+//            if (log.isDebugEnabled()) {
+//              for (SolrDocument doc : shardDocList) {
+//                doc.addField("shard", "=" + r.getShard());
+//              }
+//            }
+            SolrDocumentList mergedDocList = tempResults.get(key);
+ 
+            if (mergedDocList == null) {
+              mergedDocList = new SolrDocumentList();
+              mergedDocList.addAll(shardDocList);
+              mergedDocList.setNumFound(shardDocList.getNumFound());
+              mergedDocList.setStart(shardDocList.getStart());
+              mergedDocList.setMaxScore(shardDocList.getMaxScore());
+            } else {
+              mergedDocList = mergeSolrDocumentList(mergedDocList,
+                  shardDocList, mltcount, keyName);
+            }
+            log.debug("Adding docs for key: " + key);
+            tempResults.put(key, mergedDocList);
+          }
+        }
+      }
 
-      // TODO ???? add this directly to the response?
-      rb.rsp.add( "moreLikeThis", sim );
+      NamedList<SolrDocumentList> list = buildMoreLikeThisNamed(tempResults,
+          rb.resultIds);
+     
+      rb.rsp.add("moreLikeThis", list);
+      
+    }
+    super.finishStage(rb);
+  }
+  
+  /**
+   * Returns NamedList based on the order of
+   * resultIds.shardDoc.positionInResponse
+   */
+  NamedList<SolrDocumentList> buildMoreLikeThisNamed(
+      Map<Object,SolrDocumentList> allMlt, Map<Object,ShardDoc> resultIds) {
+    NamedList<SolrDocumentList> result = new NamedList<SolrDocumentList>();
+    TreeMap<Integer,Object> sortingMap = new TreeMap<Integer,Object>();
+    for (Entry<Object,ShardDoc> next : resultIds.entrySet()) {
+      sortingMap.put(next.getValue().positionInResponse, next.getKey());
+    }
+    for (Object key : sortingMap.values()) {
+      SolrDocumentList sdl = allMlt.get(key);
+      if (sdl == null) {
+        sdl = new SolrDocumentList();
+        sdl.setNumFound(0);
+        sdl.setStart(0);
+      }
+      result.add(key.toString(), sdl);
+    }
+    return result;
+  }
+  
+  public SolrDocumentList mergeSolrDocumentList(SolrDocumentList one,
+      SolrDocumentList two, int maxSize, String idField) {
+
+    List<SolrDocument> l = new ArrayList<SolrDocument>();
+    
+    // De-dup records sets. Shouldn't happen if indexed correctly.
+    Map<String,SolrDocument> map = new HashMap<String,SolrDocument>();
+    for (SolrDocument doc : one) {
+      Object id = doc.getFieldValue(idField);
+      assert id != null : doc.toString();
+      map.put(id.toString(), doc);
+    }
+    for (SolrDocument doc : two) {
+      map.put(doc.getFieldValue(idField).toString(), doc);
     }
+    
+    l = new ArrayList<SolrDocument>(map.values());
+    
+    // Comparator to sort docs based on score. null scores/docs are set to 0.
+    
+    // hmm...we are ordering by scores that are not really comparable...
+    Comparator<SolrDocument> c = new Comparator<SolrDocument>() {
+      public int compare(SolrDocument o1, SolrDocument o2) {
+        Float f1 = getFloat(o1);
+        Float f2 = getFloat(o2);
+        return f2.compareTo(f1);
+      }
+      
+      private Float getFloat(SolrDocument doc) {
+        Float f = 0f;
+        if (doc != null) {
+          Object o = doc.getFieldValue("score");
+          if (o != null && o instanceof Float) {
+            f = (Float) o;
+          }
+        }
+        return f;
+      }
+    };
+    
+    Collections.sort(l, c);
+    
+    // Truncate list to maxSize
+    if (l.size() > maxSize) {
+      l = l.subList(0, maxSize);
+    }
+    
+    // Create SolrDocumentList Attributes from originals
+    SolrDocumentList result = new SolrDocumentList();
+    result.addAll(l);
+    result.setMaxScore(Math.max(one.getMaxScore(), two.getMaxScore()));
+    result.setNumFound(one.getNumFound() + two.getNumFound());
+    result.setStart(Math.min(one.getStart(), two.getStart()));
+
+    return result;
+  }
+  
+  ShardRequest buildShardQuery(ResponseBuilder rb, String q, String key) {
+    ShardRequest s = new ShardRequest();
+    s.params = new ModifiableSolrParams(rb.req.getParams());
+    s.purpose |= ShardRequest.PURPOSE_GET_MLT_RESULTS;
+    // Maybe unnecessary, but safe.
+    s.purpose |= ShardRequest.PURPOSE_PRIVATE;
+    
+    s.params.remove(ShardParams.SHARDS);
+    // s.params.remove(MoreLikeThisComponent.COMPONENT_NAME);
+    
+    // needed to correlate results
+    s.params.set(MoreLikeThisComponent.DIST_DOC_ID, key);
+    s.params.set(CommonParams.START, 0);
+    int mltcount = s.params.getInt(MoreLikeThisParams.DOC_COUNT, 20); // overrequest
+    s.params.set(CommonParams.ROWS, mltcount);
+    
+    // adding score to rank moreLikeThis
+    s.params.remove(CommonParams.FL);
+    
+    // Should probably add something like this:
+    // String fl = s.params.get(MoreLikeThisParams.RETURN_FL, "*");
+    // if(fl != null){
+    // s.params.set(CommonParams.FL, fl + ",score");
+    // }
+    String id = rb.req.getSchema().getUniqueKeyField()
+    .getName();
+    s.params.set(CommonParams.FL, "score," + id);
+    s.params.set("sort", "score desc");
+    // MLT Query is submitted as normal query to shards.
+    s.params.set(CommonParams.Q, q);
+    
+    return s;
   }
+  
+  ShardRequest buildMLTQuery(ResponseBuilder rb, String q) {
+    ShardRequest s = new ShardRequest();
+    s.params = new ModifiableSolrParams();
+    
+
+    s.params.set(CommonParams.START, 0);
 
-  NamedList<DocList> getMoreLikeThese( ResponseBuilder rb, SolrIndexSearcher searcher,
-      DocList docs, int flags ) throws IOException {
+    String id = rb.req.getSchema().getUniqueKeyField().getName();
+
+    s.params.set(CommonParams.FL, "score," + id);
+    // MLT Query is submitted as normal query to shards.
+    s.params.set(CommonParams.Q, q);
+    
+    s.shards = ShardRequest.ALL_SHARDS;
+    return s;
+  }
+  
+  NamedList<DocList> getMoreLikeThese(ResponseBuilder rb,
+      SolrIndexSearcher searcher, DocList docs, int flags) throws IOException {
     SolrParams p = rb.req.getParams();
     IndexSchema schema = searcher.getSchema();
-    MoreLikeThisHandler.MoreLikeThisHelper mltHelper 
-      = new MoreLikeThisHandler.MoreLikeThisHelper( p, searcher );
+    MoreLikeThisHandler.MoreLikeThisHelper mltHelper = new MoreLikeThisHandler.MoreLikeThisHelper(
+        p, searcher);
     NamedList<DocList> mlt = new SimpleOrderedMap<DocList>();
     DocIterator iterator = docs.iterator();
-
+    
     SimpleOrderedMap<Object> dbg = null;
-    if( rb.isDebug() ){
+    if (rb.isDebug()) {
       dbg = new SimpleOrderedMap<Object>();
     }
-
-    while( iterator.hasNext() ) {
+    
+    while (iterator.hasNext()) {
       int id = iterator.nextDoc();
-      int rows = p.getInt( MoreLikeThisParams.DOC_COUNT, 5 );
-      DocListAndSet sim = mltHelper.getMoreLikeThis( id, 0, rows, null, null, flags );
-      String name = schema.printableUniqueKey( searcher.doc( id ) );
+      int rows = p.getInt(MoreLikeThisParams.DOC_COUNT, 5);
+      DocListAndSet sim = mltHelper.getMoreLikeThis(id, 0, rows, null, null,
+          flags);
+      String name = schema.printableUniqueKey(searcher.doc(id));
       mlt.add(name, sim.docList);
       
-      if( dbg != null ){
+      if (dbg != null) {
         SimpleOrderedMap<Object> docDbg = new SimpleOrderedMap<Object>();
-        docDbg.add( "rawMLTQuery", mltHelper.getRawMLTQuery().toString() );
-        docDbg.add( "boostedMLTQuery", mltHelper.getBoostedMLTQuery().toString() );
-        docDbg.add( "realMLTQuery", mltHelper.getRealMLTQuery().toString() );
+        docDbg.add("rawMLTQuery", mltHelper.getRawMLTQuery().toString());
+        docDbg
+            .add("boostedMLTQuery", mltHelper.getBoostedMLTQuery().toString());
+        docDbg.add("realMLTQuery", mltHelper.getRealMLTQuery().toString());
         SimpleOrderedMap<Object> explains = new SimpleOrderedMap<Object>();
         DocIterator mltIte = sim.docList.iterator();
-        while( mltIte.hasNext() ){
+        while (mltIte.hasNext()) {
           int mltid = mltIte.nextDoc();
-          String key = schema.printableUniqueKey( searcher.doc( mltid ) );
-          explains.add( key, searcher.explain( mltHelper.getRealMLTQuery(), mltid ) );
+          String key = schema.printableUniqueKey(searcher.doc(mltid));
+          explains.add(key,
+              searcher.explain(mltHelper.getRealMLTQuery(), mltid));
         }
-        docDbg.add( "explain", explains );
-        dbg.add( name, docDbg );
+        docDbg.add("explain", explains);
+        dbg.add(name, docDbg);
       }
     }
-
+    
     // add debug information
-    if( dbg != null ){
-      rb.addDebugInfo( "moreLikeThis", dbg );
+    if (dbg != null) {
+      rb.addDebugInfo("moreLikeThis", dbg);
     }
     return mlt;
   }
   
-  /////////////////////////////////////////////
-  ///  SolrInfoMBean
-  ////////////////////////////////////////////
-
+  // ///////////////////////////////////////////
+  // / SolrInfoMBean
+  // //////////////////////////////////////////
+  
   @Override
   public String getDescription() {
     return "More Like This";
   }
-
+  
   @Override
   public String getSource() {
     return "$URL$";
   }
-
+  
   @Override
   public URL[] getDocs() {
     return null;

Modified: lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/PivotFacetHelper.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/PivotFacetHelper.java?rev=1435287&r1=1435286&r2=1435287&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/PivotFacetHelper.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/PivotFacetHelper.java Fri Jan 18 18:30:54 2013
@@ -17,7 +17,6 @@
 
 package org.apache.solr.handler.component;
 
-import org.apache.lucene.queryparser.classic.ParseException;
 import org.apache.lucene.util.BytesRef;
 import org.apache.solr.schema.SchemaField;
 import org.apache.solr.search.SolrIndexSearcher;
@@ -35,6 +34,7 @@ import org.apache.lucene.search.Query;
 import org.apache.lucene.search.TermQuery;
 import org.apache.lucene.search.TermRangeQuery;
 import org.apache.lucene.index.Term;
+import org.apache.solr.search.SyntaxError;
 
 import java.io.IOException;
 import java.util.ArrayList;
@@ -65,7 +65,7 @@ public class PivotFacetHelper extends Si
       //ex: pivot == "features,cat" or even "{!ex=mytag}features,cat"
       try {
         this.parseParams(FacetParams.FACET_PIVOT, pivot);
-      } catch (ParseException e) {
+      } catch (SyntaxError e) {
         throw new SolrException(ErrorCode.BAD_REQUEST, e);
       }
       pivot = facetValue;//facetValue potentially modified from parseParams()

Modified: lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java?rev=1435287&r1=1435286&r2=1435287&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java Fri Jan 18 18:30:54 2013
@@ -23,7 +23,6 @@ import org.apache.lucene.index.AtomicRea
 import org.apache.lucene.index.IndexReaderContext;
 import org.apache.lucene.index.ReaderUtil;
 import org.apache.lucene.index.Term;
-import org.apache.lucene.queryparser.classic.ParseException;
 import org.apache.lucene.search.*;
 import org.apache.lucene.search.grouping.GroupDocs;
 import org.apache.lucene.search.grouping.SearchGroup;
@@ -94,7 +93,7 @@ public class QueryComponent extends Sear
     SolrQueryResponse rsp = rb.rsp;
 
     // Set field flags    
-    ReturnFields returnFields = new ReturnFields( req );
+    ReturnFields returnFields = new SolrReturnFields( req );
     rsp.setReturnFields( returnFields );
     int flags = 0;
     if (returnFields.wantsScore()) {
@@ -144,7 +143,7 @@ public class QueryComponent extends Sear
           rb.setFilters( filters );
         }
       }
-    } catch (ParseException e) {
+    } catch (SyntaxError e) {
       throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, e);
     }
 
@@ -402,7 +401,7 @@ public class QueryComponent extends Sear
           rsp.getToLog().add("hits", grouping.getCommands().get(0).getMatches());
         }
         return;
-      } catch (ParseException e) {
+      } catch (SyntaxError e) {
         throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, e);
       }
     }
@@ -659,6 +658,7 @@ public class QueryComponent extends Sear
 
     EndResultTransformer.SolrDocumentSource solrDocumentSource = new EndResultTransformer.SolrDocumentSource() {
 
+      @Override
       public SolrDocument retrieve(ScoreDoc doc) {
         ShardDoc solrDoc = (ShardDoc) doc;
         return rb.retrievedDocuments.get(solrDoc.id);

Modified: lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/QueryElevationComponent.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/QueryElevationComponent.java?rev=1435287&r1=1435286&r2=1435287&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/QueryElevationComponent.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/QueryElevationComponent.java Fri Jan 18 18:30:54 2013
@@ -137,6 +137,7 @@ public class QueryElevationComponent ext
     this.initArgs = SolrParams.toSolrParams(args);
   }
 
+  @Override
   public void inform(SolrCore core) {
     String a = initArgs.get(FIELD_TYPE);
     if (a != null) {
@@ -540,7 +541,7 @@ public class QueryElevationComponent ext
         for (String id : elevations.ids) {
           term.copyChars(id);
           if (seen.contains(id) == false  && termsEnum.seekExact(term, false)) {
-            docsEnum = termsEnum.docs(liveDocs, docsEnum, 0);
+            docsEnum = termsEnum.docs(liveDocs, docsEnum, DocsEnum.FLAG_NONE);
             if (docsEnum != null) {
               int docId = docsEnum.nextDoc();
               if (docId == DocIdSetIterator.NO_MORE_DOCS ) continue;  // must have been deleted

Modified: lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/RealTimeGetComponent.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/RealTimeGetComponent.java?rev=1435287&r1=1435286&r2=1435287&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/RealTimeGetComponent.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/RealTimeGetComponent.java Fri Jan 18 18:30:54 2013
@@ -38,6 +38,8 @@ import org.apache.solr.common.SolrDocume
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.common.cloud.ClusterState;
+import org.apache.solr.common.cloud.DocCollection;
+import org.apache.solr.common.cloud.Slice;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.params.ShardParams;
 import org.apache.solr.common.params.SolrParams;
@@ -54,6 +56,7 @@ import org.apache.solr.schema.IndexSchem
 import org.apache.solr.schema.SchemaField;
 import org.apache.solr.search.ReturnFields;
 import org.apache.solr.search.SolrIndexSearcher;
+import org.apache.solr.search.SolrReturnFields;
 import org.apache.solr.update.DocumentBuilder;
 import org.apache.solr.update.PeerSync;
 import org.apache.solr.update.UpdateLog;
@@ -70,7 +73,7 @@ public class RealTimeGetComponent extend
   @Override
   public void prepare(ResponseBuilder rb) throws IOException {
     // Set field flags
-    ReturnFields returnFields = new ReturnFields( rb.req );
+    ReturnFields returnFields = new SolrReturnFields( rb.req );
     rb.rsp.setReturnFields( returnFields );
   }
 
@@ -356,23 +359,23 @@ public class RealTimeGetComponent extend
       CloudDescriptor cloudDescriptor = rb.req.getCore().getCoreDescriptor().getCloudDescriptor();
 
       String collection = cloudDescriptor.getCollectionName();
-
       ClusterState clusterState = zkController.getClusterState();
-      
-      Map<String, List<String>> shardToId = new HashMap<String, List<String>>();
+      DocCollection coll = clusterState.getCollection(collection);
+
+
+      Map<String, List<String>> sliceToId = new HashMap<String, List<String>>();
       for (String id : allIds) {
-        int hash = Hash.murmurhash3_x86_32(id, 0, id.length(), 0);
-        String shard = clusterState.getShard(hash,  collection);
+        Slice slice = coll.getRouter().getTargetSlice(id, null, params, coll);
 
-        List<String> idsForShard = shardToId.get(shard);
+        List<String> idsForShard = sliceToId.get(slice.getName());
         if (idsForShard == null) {
           idsForShard = new ArrayList<String>(2);
-          shardToId.put(shard, idsForShard);
+          sliceToId.put(slice.getName(), idsForShard);
         }
         idsForShard.add(id);
       }
 
-      for (Map.Entry<String,List<String>> entry : shardToId.entrySet()) {
+      for (Map.Entry<String,List<String>> entry : sliceToId.entrySet()) {
         String shard = entry.getKey();
         String shardIdList = StrUtils.join(entry.getValue(), ',');
 

Modified: lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/SearchComponent.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/SearchComponent.java?rev=1435287&r1=1435286&r2=1435287&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/SearchComponent.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/SearchComponent.java Fri Jan 18 18:30:54 2013
@@ -21,7 +21,6 @@ import java.io.IOException;
 import java.net.URL;
 
 import org.apache.solr.common.util.NamedList;
-import org.apache.solr.common.util.SimpleOrderedMap;
 import org.apache.solr.core.SolrInfoMBean;
 import org.apache.solr.util.plugin.NamedListInitializedPlugin;
 
@@ -34,6 +33,10 @@ import org.apache.solr.util.plugin.Named
 public abstract class SearchComponent implements SolrInfoMBean, NamedListInitializedPlugin
 {
   /**
+   * The name given to this component in solrconfig.xml file
+   */
+  private String name = this.getClass().getName();
+  /**
    * Prepare the response.  Guaranteed to be called before any SearchComponent {@link #process(org.apache.solr.handler.component.ResponseBuilder)} method.
    * Called for every incoming request.
    *
@@ -71,9 +74,18 @@ public abstract class SearchComponent im
    */
   public void finishStage(ResponseBuilder rb) {
   }
+  
+  /**
+   * Sets the name of the SearchComponent. The name of the component is usually
+   * the name defined for it in the configuration.
+   */
+  public void setName(String name) {
+    this.name = name;
+  }
 
 
   //////////////////////// NamedListInitializedPlugin methods //////////////////////
+  @Override
   public void init( NamedList args )
   {
     // By default do nothing
@@ -81,25 +93,32 @@ public abstract class SearchComponent im
   
   //////////////////////// SolrInfoMBeans methods //////////////////////
 
+  @Override
   public String getName() {
-    return this.getClass().getName();
+    return name;
   }
 
+  @Override
   public abstract String getDescription();
+  @Override
   public abstract String getSource();
   
+  @Override
   public String getVersion() {
     return getClass().getPackage().getSpecificationVersion();
   }
   
+  @Override
   public Category getCategory() {
     return Category.OTHER;
   }
 
+  @Override
   public URL[] getDocs() {
     return null;  // this can be overridden, but not required
   }
 
+  @Override
   public NamedList getStatistics() {
     return null;
   }

Modified: lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/SearchHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/SearchHandler.java?rev=1435287&r1=1435286&r2=1435287&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/SearchHandler.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/SearchHandler.java Fri Jan 18 18:30:54 2013
@@ -72,6 +72,7 @@ public class SearchHandler extends Reque
     return names;
   }
 
+  @Override
   public void init(PluginInfo info) {
     init(info.initArgs);
     for (PluginInfo child : info.children) {
@@ -87,6 +88,7 @@ public class SearchHandler extends Reque
    * then the {@link DebugComponent} will always occur last.  If this is not desired, then one must explicitly declare all components using
    * the <code>INIT_COMPONENTS</code> syntax.
    */
+  @Override
   @SuppressWarnings("unchecked")
   public void inform(SolrCore core)
   {

Modified: lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/ShardDoc.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/ShardDoc.java?rev=1435287&r1=1435286&r2=1435287&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/ShardDoc.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/ShardDoc.java Fri Jan 18 18:30:54 2013
@@ -218,6 +218,7 @@ class ShardFieldSortedHitQueue extends P
       return lst.get(shardDoc.orderInShard);
     }
 
+    @Override
     public int compare(Object o1, Object o2) {
       return 0;
     }
@@ -225,6 +226,7 @@ class ShardFieldSortedHitQueue extends P
 
   static Comparator comparatorScore(final String fieldName) {
     return new Comparator() {
+      @Override
       public final int compare(final Object o1, final Object o2) {
         ShardDoc e1 = (ShardDoc) o1;
         ShardDoc e2 = (ShardDoc) o2;

Modified: lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/ShardRequest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/ShardRequest.java?rev=1435287&r1=1435286&r2=1435287&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/ShardRequest.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/ShardRequest.java Fri Jan 18 18:30:54 2013
@@ -38,6 +38,7 @@ public class ShardRequest {
   public final static int PURPOSE_GET_STATS       =0x200;
   public final static int PURPOSE_GET_TERMS       =0x400;
   public final static int PURPOSE_GET_TOP_GROUPS  =0x800;
+  public final static int PURPOSE_GET_MLT_RESULTS =0x1000;
 
   public int purpose;  // the purpose of this request
 

Modified: lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/SpellCheckComponent.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/SpellCheckComponent.java?rev=1435287&r1=1435286&r2=1435287&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/SpellCheckComponent.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/SpellCheckComponent.java Fri Jan 18 18:30:54 2013
@@ -578,6 +578,7 @@ public class SpellCheckComponent extends
     return result;
   }
 
+  @Override
   public void inform(SolrCore core) {
     if (initParams != null) {
       LOG.info("Initializing spell checkers");
@@ -660,9 +661,11 @@ public class SpellCheckComponent extends
       this.buildOnOptimize = buildOnOptimize;
     }
 
+    @Override
     public void init(NamedList args) {
     }
 
+    @Override
     public void newSearcher(SolrIndexSearcher newSearcher,
                             SolrIndexSearcher currentSearcher) {
       if (currentSearcher == null) {
@@ -699,6 +702,7 @@ public class SpellCheckComponent extends
       }
     }
 
+    @Override
     public void postCommit() {
     }
 

Modified: lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/StatsValuesFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/StatsValuesFactory.java?rev=1435287&r1=1435286&r2=1435287&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/StatsValuesFactory.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/StatsValuesFactory.java Fri Jan 18 18:30:54 2013
@@ -89,6 +89,7 @@ abstract class AbstractStatsValues<T> im
   /**
    * {@inheritDoc}
    */
+  @Override
   public void accumulate(NamedList stv) {
     count += (Long) stv.get("count");
     missing += (Long) stv.get("missing");
@@ -124,6 +125,7 @@ abstract class AbstractStatsValues<T> im
   /**
    * {@inheritDoc}
    */
+  @Override
   public void accumulate(BytesRef value) {
     count++;
     T typedValue = (T)ft.toObject(sf, value);
@@ -134,6 +136,7 @@ abstract class AbstractStatsValues<T> im
   /**
    * {@inheritDoc}
    */
+  @Override
   public void accumulate(BytesRef value, int count) {
     this.count += count;
     T typedValue = (T)ft.toObject(sf, value);
@@ -144,6 +147,7 @@ abstract class AbstractStatsValues<T> im
   /**
    * {@inheritDoc}
    */
+  @Override
   public void missing() {
     missing++;
   }
@@ -151,6 +155,7 @@ abstract class AbstractStatsValues<T> im
   /**
    * {@inheritDoc}
    */
+  @Override
   public void addMissing(int count) {
     missing += count;
   }
@@ -158,6 +163,7 @@ abstract class AbstractStatsValues<T> im
   /**
    * {@inheritDoc}
    */
+  @Override
   public void addFacet(String facetName, Map<String, StatsValues> facetValues) {
     facets.put(facetName, facetValues);
   }
@@ -165,6 +171,7 @@ abstract class AbstractStatsValues<T> im
   /**
    * {@inheritDoc}
    */
+  @Override
   public NamedList<?> getStatsValues() {
     NamedList<Object> res = new SimpleOrderedMap<Object>();
 
@@ -242,6 +249,7 @@ class NumericStatsValues extends Abstrac
   /**
    * {@inheritDoc}
    */
+  @Override
   public void updateTypeSpecificStats(NamedList stv) {
     sum += ((Number)stv.get("sum")).doubleValue();
     sumOfSquares += ((Number)stv.get("sumOfSquares")).doubleValue();
@@ -250,6 +258,7 @@ class NumericStatsValues extends Abstrac
   /**
    * {@inheritDoc}
    */
+  @Override
   public void updateTypeSpecificStats(Number v) {
     double value = v.doubleValue();
     sumOfSquares += (value * value); // for std deviation
@@ -259,6 +268,7 @@ class NumericStatsValues extends Abstrac
   /**
    * {@inheritDoc}
    */
+  @Override
   public void updateTypeSpecificStats(Number v, int count) {
     double value = v.doubleValue();
     sumOfSquares += (value * value * count); // for std deviation
@@ -268,6 +278,7 @@ class NumericStatsValues extends Abstrac
    /**
    * {@inheritDoc}
    */
+  @Override
   protected void updateMinMax(Number min, Number max) {
     this.min = Math.min(this.min.doubleValue(), min.doubleValue());
     this.max = Math.max(this.max.doubleValue(), max.doubleValue());
@@ -278,6 +289,7 @@ class NumericStatsValues extends Abstrac
    *
    * @param res NamedList to add the type specific statistics too
    */
+  @Override
   protected void addTypeSpecificStats(NamedList<Object> res) {
     res.add("sum", sum);
     res.add("sumOfSquares", sumOfSquares);
@@ -314,6 +326,7 @@ class DateStatsValues extends AbstractSt
   /**
    * {@inheritDoc}
    */
+  @Override
   protected void updateTypeSpecificStats(NamedList stv) {
     sum += ((Date) stv.get("sum")).getTime();
     sumOfSquares += ((Number)stv.get("sumOfSquares")).doubleValue();
@@ -342,6 +355,7 @@ class DateStatsValues extends AbstractSt
    /**
    * {@inheritDoc}
    */
+  @Override
   protected void updateMinMax(Date min, Date max) {
     if(this.min==null || this.min.after(min)) {
       this.min = min;
@@ -356,6 +370,7 @@ class DateStatsValues extends AbstractSt
    *
    * @param res NamedList to add the type specific statistics too
    */
+  @Override
   protected void addTypeSpecificStats(NamedList<Object> res) {
     if(sum<=0) {
       return; // date==0 is meaningless
@@ -395,6 +410,7 @@ class StringStatsValues extends Abstract
   /**
    * {@inheritDoc}
    */
+  @Override
   protected void updateTypeSpecificStats(NamedList stv) {
     // No type specific stats
   }
@@ -402,6 +418,7 @@ class StringStatsValues extends Abstract
   /**
    * {@inheritDoc}
    */
+  @Override
   protected void updateTypeSpecificStats(String value) {
     // No type specific stats
   }
@@ -409,6 +426,7 @@ class StringStatsValues extends Abstract
   /**
    * {@inheritDoc}
    */
+  @Override
   protected void updateTypeSpecificStats(String value, int count) {
     // No type specific stats
   }
@@ -416,6 +434,7 @@ class StringStatsValues extends Abstract
    /**
    * {@inheritDoc}
    */
+  @Override
   protected void updateMinMax(String min, String max) {
     this.max = max(this.max, max);
     this.min = min(this.min, min);
@@ -424,6 +443,7 @@ class StringStatsValues extends Abstract
   /**
    * Adds no type specific statistics
    */
+  @Override
   protected void addTypeSpecificStats(NamedList<Object> res) {
     // Add no statistics
   }

Modified: lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/TermVectorComponent.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/TermVectorComponent.java?rev=1435287&r1=1435286&r2=1435287&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/TermVectorComponent.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/TermVectorComponent.java Fri Jan 18 18:30:54 2013
@@ -36,6 +36,7 @@ import org.apache.solr.search.ReturnFiel
 import org.apache.solr.search.DocList;
 import org.apache.solr.search.DocListAndSet;
 import org.apache.solr.search.SolrIndexSearcher;
+import org.apache.solr.search.SolrReturnFields;
 import org.apache.solr.util.SolrPluginUtils;
 import org.apache.solr.util.plugin.SolrCoreAware;
 
@@ -111,7 +112,7 @@ public class TermVectorComponent extends
         (1 == fldLst.length && 0 == fldLst[0].length())) {
 
       // no tv.fl, parse the main fl
-      ReturnFields rf = new ReturnFields
+      ReturnFields rf = new SolrReturnFields
         (params.getParams(CommonParams.FL), rb.req);
 
       if (rf.wantsAllFields()) {
@@ -462,6 +463,7 @@ public class TermVectorComponent extends
     this.initParams = args;
   }
 
+  @Override
   public void inform(SolrCore core) {
 
   }

Modified: lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/TermsComponent.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/TermsComponent.java?rev=1435287&r1=1435286&r2=1435287&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/TermsComponent.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/component/TermsComponent.java Fri Jan 18 18:30:54 2013
@@ -441,6 +441,7 @@ public class TermsComponent extends Sear
       TermsResponse.Term[] arr = data.values().toArray(new TermsResponse.Term[data.size()]);
 
       Arrays.sort(arr, new Comparator<TermsResponse.Term>() {
+        @Override
         public int compare(TermsResponse.Term o1, TermsResponse.Term o2) {
           return o1.getTerm().compareTo(o2.getTerm());
         }
@@ -454,6 +455,7 @@ public class TermsComponent extends Sear
       TermsResponse.Term[] arr = data.values().toArray(new TermsResponse.Term[data.size()]);
 
       Arrays.sort(arr, new Comparator<TermsResponse.Term>() {
+        @Override
         public int compare(TermsResponse.Term o1, TermsResponse.Term o2) {
           long freq1 = o1.getFrequency();
           long freq2 = o2.getFrequency();

Modified: lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/loader/JsonLoader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/loader/JsonLoader.java?rev=1435287&r1=1435286&r2=1435287&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/loader/JsonLoader.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/loader/JsonLoader.java Fri Jan 18 18:30:54 2013
@@ -49,6 +49,7 @@ import org.slf4j.LoggerFactory;
 public class JsonLoader extends ContentStreamLoader {
   final static Logger log = LoggerFactory.getLogger( JsonLoader.class );
   
+  @Override
   public String getDefaultWT() {
     return "json";
   }

Modified: lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/loader/XMLLoader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/loader/XMLLoader.java?rev=1435287&r1=1435286&r2=1435287&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/loader/XMLLoader.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/handler/loader/XMLLoader.java Fri Jan 18 18:30:54 2013
@@ -59,7 +59,9 @@ import javax.xml.parsers.SAXParserFactor
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 
@@ -110,6 +112,7 @@ public class XMLLoader extends ContentSt
     return this;
   }
 
+  @Override
   public String getDefaultWT() {
     return "xml";
   }
@@ -378,8 +381,9 @@ public class XMLLoader extends ContentSt
     float boost = 1.0f;
     boolean isNull = false;
     String update = null;
-
-    while (true) {
+    Map<String, Map<String, Object>> updateMap = null;
+    boolean complete = false;
+    while (!complete) {
       int event = parser.next();
       switch (event) {
         // Add everything to the text
@@ -391,13 +395,33 @@ public class XMLLoader extends ContentSt
 
         case XMLStreamConstants.END_ELEMENT:
           if ("doc".equals(parser.getLocalName())) {
-            return doc;
+            complete = true;
+            break;
           } else if ("field".equals(parser.getLocalName())) {
             Object v = isNull ? null : text.toString();
             if (update != null) {
-              Map<String,Object> extendedValue = new HashMap<String,Object>(1);
-              extendedValue.put(update, v);
-              v = extendedValue;
+              if (updateMap == null) updateMap = new HashMap<String, Map<String, Object>>();
+              Map<String, Object> extendedValues = updateMap.get(name);
+              if (extendedValues == null) {
+                extendedValues = new HashMap<String, Object>(1);
+                updateMap.put(name, extendedValues);
+              }
+              Object val = extendedValues.get(update);
+              if (val == null) {
+                extendedValues.put(update, v);
+              } else {
+                // multiple val are present
+                if (val instanceof List) {
+                  List list = (List) val;
+                  list.add(v);
+                } else {
+                  List<Object> values = new ArrayList<Object>();
+                  values.add(val);
+                  values.add(v);
+                  extendedValues.put(update, values);
+                }
+              }
+              break;
             }
             doc.addField(name, v, boost);
             boost = 1.0f;
@@ -433,5 +457,15 @@ public class XMLLoader extends ContentSt
           break;
       }
     }
+
+    if (updateMap != null)  {
+      for (Map.Entry<String, Map<String, Object>> entry : updateMap.entrySet()) {
+        name = entry.getKey();
+        Map<String, Object> value = entry.getValue();
+        doc.addField(name, value, 1.0f);
+      }
+    }
+
+    return doc;
   }
 }

Modified: lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/DefaultEncoder.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/DefaultEncoder.java?rev=1435287&r1=1435286&r2=1435287&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/DefaultEncoder.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/DefaultEncoder.java Fri Jan 18 18:30:54 2013
@@ -27,6 +27,7 @@ import org.apache.solr.common.params.Sol
 public class DefaultEncoder extends HighlightingPluginBase implements
     SolrEncoder {
 
+  @Override
   public Encoder getEncoder(String fieldName, SolrParams params) {
     return new org.apache.lucene.search.highlight.DefaultEncoder();
   }

Modified: lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/DefaultSolrHighlighter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/DefaultSolrHighlighter.java?rev=1435287&r1=1435286&r2=1435287&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/DefaultSolrHighlighter.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/DefaultSolrHighlighter.java Fri Jan 18 18:30:54 2013
@@ -69,6 +69,7 @@ public class DefaultSolrHighlighter exte
     this.solrCore = solrCore;
   }
 
+  @Override
   public void init(PluginInfo info) {
     formatters.clear();
     encoders.clear();
@@ -515,6 +516,7 @@ public class DefaultSolrHighlighter exte
     // sort such that the fragments with the highest score come first
      if(!preserveMulti){
         Collections.sort(frags, new Comparator<TextFragment>() {
+                @Override
                 public int compare(TextFragment arg0, TextFragment arg1) {
                  return Math.round(arg1.getScore() - arg0.getScore());
         }

Modified: lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/GapFragmenter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/GapFragmenter.java?rev=1435287&r1=1435286&r2=1435287&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/GapFragmenter.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/GapFragmenter.java Fri Jan 18 18:30:54 2013
@@ -27,6 +27,7 @@ import org.apache.solr.common.params.Sol
 
 public class GapFragmenter extends HighlightingPluginBase implements SolrFragmenter
 {
+  @Override
   public Fragmenter getFragmenter(String fieldName, SolrParams params )
   {
     numRequests++;

Modified: lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/HighlightingPluginBase.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/HighlightingPluginBase.java?rev=1435287&r1=1435286&r2=1435287&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/HighlightingPluginBase.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/HighlightingPluginBase.java Fri Jan 18 18:30:54 2013
@@ -44,26 +44,33 @@ public abstract class HighlightingPlugin
 
   //////////////////////// SolrInfoMBeans methods //////////////////////
 
+  @Override
   public String getName() {
     return this.getClass().getName();
   }
 
+  @Override
   public abstract String getDescription();
+  @Override
   public abstract String getSource();
   
+  @Override
   public String getVersion() {
     return getClass().getPackage().getSpecificationVersion();
   }
   
+  @Override
   public Category getCategory()
   {
     return Category.HIGHLIGHTING;
   }
 
+  @Override
   public URL[] getDocs() {
     return null;  // this can be overridden, but not required
   }
 
+  @Override
   public NamedList getStatistics() {
     NamedList<Long> lst = new SimpleOrderedMap<Long>();
     lst.add("requests", numRequests);

Modified: lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/HtmlEncoder.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/HtmlEncoder.java?rev=1435287&r1=1435286&r2=1435287&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/HtmlEncoder.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/HtmlEncoder.java Fri Jan 18 18:30:54 2013
@@ -27,6 +27,7 @@ import org.apache.solr.common.params.Sol
  */
 public class HtmlEncoder extends HighlightingPluginBase implements SolrEncoder {
 
+  @Override
   public Encoder getEncoder(String fieldName, SolrParams params) {
     return new SimpleHTMLEncoder();
   }

Modified: lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/HtmlFormatter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/HtmlFormatter.java?rev=1435287&r1=1435286&r2=1435287&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/HtmlFormatter.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/HtmlFormatter.java Fri Jan 18 18:30:54 2013
@@ -26,6 +26,7 @@ import org.apache.solr.common.params.Sol
  */
 public class HtmlFormatter extends HighlightingPluginBase implements SolrFormatter 
 {
+  @Override
   public Formatter getFormatter(String fieldName, SolrParams params ) 
   {
     numRequests++;

Modified: lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/RegexFragmenter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/RegexFragmenter.java?rev=1435287&r1=1435286&r2=1435287&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/RegexFragmenter.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/RegexFragmenter.java Fri Jan 18 18:30:54 2013
@@ -63,6 +63,7 @@ public class RegexFragmenter extends Hig
     defaultPattern = Pattern.compile(defaultPatternRaw);
   }
 
+  @Override
   public Fragmenter getFragmenter(String fieldName, SolrParams params )
   { 
     numRequests++;
@@ -187,6 +188,7 @@ class LuceneRegexFragmenter implements F
   /* (non-Javadoc)
    * @see org.apache.lucene.search.highlight.TextFragmenter#start(java.lang.String)
    */
+  @Override
   public void start(String originalText, TokenStream tokenStream) {
     currentNumFrags = 1;
     currentOffset = 0;
@@ -227,6 +229,7 @@ class LuceneRegexFragmenter implements F
   /* (non-Javadoc)
    * @see org.apache.lucene.search.highlight.TextFragmenter#isNewFragment(org.apache.lucene.analysis.Token)
    */
+  @Override
   public boolean isNewFragment()
   {
     boolean isNewFrag = false;

Modified: lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/SimpleFragListBuilder.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/SimpleFragListBuilder.java?rev=1435287&r1=1435286&r2=1435287&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/SimpleFragListBuilder.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/SimpleFragListBuilder.java Fri Jan 18 18:30:54 2013
@@ -23,6 +23,7 @@ import org.apache.solr.common.params.Sol
 public class SimpleFragListBuilder extends HighlightingPluginBase implements
     SolrFragListBuilder {
 
+  @Override
   public FragListBuilder getFragListBuilder(SolrParams params) {
     // NOTE: This class (currently) makes no use of params
     // If that ever changes, it should wrap them with defaults...

Modified: lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/SingleFragListBuilder.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/SingleFragListBuilder.java?rev=1435287&r1=1435286&r2=1435287&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/SingleFragListBuilder.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/SingleFragListBuilder.java Fri Jan 18 18:30:54 2013
@@ -23,6 +23,7 @@ import org.apache.solr.common.params.Sol
 public class SingleFragListBuilder extends HighlightingPluginBase implements
     SolrFragListBuilder {
 
+  @Override
   public FragListBuilder getFragListBuilder(SolrParams params) {
     // NOTE: This class (currently) makes no use of params
     // If that ever changes, it should wrap them with defaults...

Modified: lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/SolrEncoder.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/SolrEncoder.java?rev=1435287&r1=1435286&r2=1435287&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/SolrEncoder.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/SolrEncoder.java Fri Jan 18 18:30:54 2013
@@ -30,6 +30,7 @@ public interface SolrEncoder extends Sol
    * may be specified when declaring a request handler in
    * solrconfig.xml
    */
+  @Override
   public void init(NamedList args);
 
   /**

Modified: lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/SolrFormatter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/SolrFormatter.java?rev=1435287&r1=1435286&r2=1435287&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/SolrFormatter.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/SolrFormatter.java Fri Jan 18 18:30:54 2013
@@ -30,6 +30,7 @@ public interface SolrFormatter extends S
    * may be specified when declaring a request handler in
    * solrconfig.xml
    */
+  @Override
   public void init(NamedList args);
 
   /**

Modified: lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/SolrFragListBuilder.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/SolrFragListBuilder.java?rev=1435287&r1=1435286&r2=1435287&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/SolrFragListBuilder.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/SolrFragListBuilder.java Fri Jan 18 18:30:54 2013
@@ -30,6 +30,7 @@ public interface SolrFragListBuilder ext
    * may be specified when declaring a request handler in
    * solrconfig.xml
    */
+  @Override
   public void init( NamedList args);
 
   /**

Modified: lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/SolrFragmenter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/SolrFragmenter.java?rev=1435287&r1=1435286&r2=1435287&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/SolrFragmenter.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/highlight/SolrFragmenter.java Fri Jan 18 18:30:54 2013
@@ -30,6 +30,7 @@ public interface SolrFragmenter extends 
    * may be specified when declaring a request handler in
    * solrconfig.xml
    */
+  @Override
   public void init(NamedList args);
 
   /**

Modified: lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/internal/csv/CSVStrategy.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/internal/csv/CSVStrategy.java?rev=1435287&r1=1435286&r2=1435287&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/internal/csv/CSVStrategy.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/internal/csv/CSVStrategy.java Fri Jan 18 18:30:54 2013
@@ -140,6 +140,7 @@ public class CSVStrategy implements Clon
       return this.printerNewline;
     }
 
+    @Override
     public Object clone() {
       try {
         return super.clone();

Modified: lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/internal/csv/CharBuffer.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/internal/csv/CharBuffer.java?rev=1435287&r1=1435286&r2=1435287&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/internal/csv/CharBuffer.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/internal/csv/CharBuffer.java Fri Jan 18 18:30:54 2013
@@ -201,6 +201,7 @@ public class CharBuffer {
      * Converts the contents of the buffer into a StringBuffer.
      * This method involves copying the new data once!
      */
+    @Override
     public String toString() {
         return new String(c, 0, length);
     }

Modified: lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/internal/csv/ExtendedBufferedReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/internal/csv/ExtendedBufferedReader.java?rev=1435287&r1=1435286&r2=1435287&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/internal/csv/ExtendedBufferedReader.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/internal/csv/ExtendedBufferedReader.java Fri Jan 18 18:30:54 2013
@@ -75,6 +75,7 @@ class ExtendedBufferedReader extends Buf
    * Reads the next char from the input stream.
    * @return the next char or END_OF_STREAM if end of stream has been reached.
    */
+  @Override
   public int read() throws IOException {
     // initalize the lookahead
     if (lookaheadChar == UNDEFINED) {
@@ -113,6 +114,7 @@ class ExtendedBufferedReader extends Buf
    * 
    * @return nof chars actually read or END_OF_STREAM
    */
+  @Override
   public int read(char[] buf, int off, int len) throws IOException {
     // do not claim if len == 0
     if (len == 0) {
@@ -178,6 +180,7 @@ class ExtendedBufferedReader extends Buf
   *         including any line-termination characters, or null 
   *         if the end of the stream has been reached
   */
+  @Override
   public String readLine() throws IOException {
     
     if (lookaheadChar == UNDEFINED) {
@@ -223,6 +226,7 @@ class ExtendedBufferedReader extends Buf
    * 
    * @return nof skiped chars
    */
+  @Override
   public long skip(long n) throws IllegalArgumentException, IOException  {
     
     if (lookaheadChar == UNDEFINED) {
@@ -300,6 +304,7 @@ class ExtendedBufferedReader extends Buf
       return -1;
     }
   }
+  @Override
   public boolean markSupported() {
     /* note uh: marking is not supported, cause we cannot
      *          see into the future...

Modified: lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/internal/csv/writer/CSVConfig.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/internal/csv/writer/CSVConfig.java?rev=1435287&r1=1435286&r2=1435287&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/internal/csv/writer/CSVConfig.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/internal/csv/writer/CSVConfig.java Fri Jan 18 18:30:54 2013
@@ -246,6 +246,7 @@ public class CSVConfig {
      * TODO..
      * @see java.lang.Object#equals(java.lang.Object)
      */
+    @Override
     public boolean equals(Object obj) {
         if (obj == null && !(obj instanceof CSVConfig)) {
             return false;

Modified: lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/request/PerSegmentSingleValuedFaceting.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/request/PerSegmentSingleValuedFaceting.java?rev=1435287&r1=1435286&r2=1435287&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/request/PerSegmentSingleValuedFaceting.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/request/PerSegmentSingleValuedFaceting.java Fri Jan 18 18:30:54 2013
@@ -94,6 +94,7 @@ class PerSegmentSingleValuedFaceting {
       final SegFacet segFacet = new SegFacet(leave);
 
       Callable<SegFacet> task = new Callable<SegFacet>() {
+        @Override
         public SegFacet call() throws Exception {
           segFacet.countTerms();
           return segFacet;

Modified: lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/request/SimpleFacets.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/request/SimpleFacets.java?rev=1435287&r1=1435286&r2=1435287&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/request/SimpleFacets.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/request/SimpleFacets.java Fri Jan 18 18:30:54 2013
@@ -18,7 +18,6 @@
 package org.apache.solr.request;
 
 import org.apache.lucene.index.*;
-import org.apache.lucene.queryparser.classic.ParseException;
 import org.apache.lucene.search.*;
 import org.apache.lucene.search.grouping.AbstractAllGroupHeadsCollector;
 import org.apache.lucene.search.grouping.term.TermGroupFacetCollector;
@@ -95,7 +94,7 @@ public class SimpleFacets {
   }
 
 
-  protected void parseParams(String type, String param) throws ParseException, IOException {
+  protected void parseParams(String type, String param) throws SyntaxError, IOException {
     localParams = QueryParsing.getLocalParams(param, req.getParams());
     docs = docsOrig;
     facetValue = param;
@@ -209,7 +208,7 @@ public class SimpleFacets {
 
     } catch (IOException e) {
       throw new SolrException(ErrorCode.SERVER_ERROR, e);
-    } catch (ParseException e) {
+    } catch (SyntaxError e) {
       throw new SolrException(ErrorCode.BAD_REQUEST, e);
     }
     return facetResponse;
@@ -221,7 +220,7 @@ public class SimpleFacets {
    *
    * @see FacetParams#FACET_QUERY
    */
-  public NamedList<Integer> getFacetQueryCounts() throws IOException,ParseException {
+  public NamedList<Integer> getFacetQueryCounts() throws IOException,SyntaxError {
 
     NamedList<Integer> res = new SimpleOrderedMap<Integer>();
 
@@ -387,6 +386,7 @@ public class SimpleFacets {
 
 
   static final Executor directExecutor = new Executor() {
+    @Override
     public void execute(Runnable r) {
       r.run();
     }
@@ -409,7 +409,7 @@ public class SimpleFacets {
    * @see #getFacetTermEnumCounts
    */
   public NamedList<Object> getFacetFieldCounts()
-          throws IOException, ParseException {
+          throws IOException, SyntaxError {
 
     NamedList<Object> res = new SimpleOrderedMap<Object>();
     String[] facetFs = params.getParams(FacetParams.FACET_FIELD);
@@ -756,7 +756,7 @@ public class SimpleFacets {
             // TODO: specialize when base docset is a bitset or hash set (skipDocs)?  or does it matter for this?
             // TODO: do this per-segment for better efficiency (MultiDocsEnum just uses base class impl)
             // TODO: would passing deleted docs lead to better efficiency over checking the fastForRandomSet?
-            docsEnum = termsEnum.docs(null, docsEnum, 0);
+            docsEnum = termsEnum.docs(null, docsEnum, DocsEnum.FLAG_NONE);
             c=0;
 
             if (docsEnum instanceof MultiDocsEnum) {
@@ -826,7 +826,7 @@ public class SimpleFacets {
    */
   @Deprecated
   public NamedList<Object> getFacetDateCounts()
-    throws IOException, ParseException {
+    throws IOException, SyntaxError {
 
     final NamedList<Object> resOuter = new SimpleOrderedMap<Object>();
     final String[] fields = params.getParams(FacetParams.FACET_DATE);
@@ -845,7 +845,7 @@ public class SimpleFacets {
    */
   @Deprecated
   public void getFacetDateCounts(String dateFacet, NamedList<Object> resOuter)
-      throws IOException, ParseException {
+      throws IOException, SyntaxError {
 
     final IndexSchema schema = searcher.getSchema();
 
@@ -1008,7 +1008,7 @@ public class SimpleFacets {
    * @see FacetParams#FACET_RANGE
    */
 
-  public NamedList<Object> getFacetRangeCounts() throws IOException, ParseException {
+  public NamedList<Object> getFacetRangeCounts() throws IOException, SyntaxError {
     final NamedList<Object> resOuter = new SimpleOrderedMap<Object>();
     final String[] fields = params.getParams(FacetParams.FACET_RANGE);
 
@@ -1022,7 +1022,7 @@ public class SimpleFacets {
   }
 
   void getFacetRangeCounts(String facetRange, NamedList<Object> resOuter)
-      throws IOException, ParseException {
+      throws IOException, SyntaxError {
 
     final IndexSchema schema = searcher.getSchema();
 
@@ -1249,6 +1249,7 @@ public class SimpleFacets {
       CountPair<?,?> that = (CountPair<?,?>) o;
       return (this.key.equals(that.key) && this.val.equals(that.val));
     }
+    @Override
     public int compareTo(CountPair<K,V> o) {
       int vc = o.val.compareTo(val);
       return (0 != vc ? vc : key.compareTo(o.key));

Modified: lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/request/SolrQueryRequestBase.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/request/SolrQueryRequestBase.java?rev=1435287&r1=1435286&r2=1435287&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/request/SolrQueryRequestBase.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/request/SolrQueryRequestBase.java Fri Jan 18 18:30:54 2013
@@ -52,32 +52,38 @@ public abstract class SolrQueryRequestBa
     this.params = this.origParams = params;
   }
 
+  @Override
   public Map<Object,Object> getContext() {
     // SolrQueryRequest as a whole isn't thread safe, and this isn't either.
     if (context==null) context = new HashMap<Object,Object>();
     return context;
   }
 
+  @Override
   public SolrParams getParams() {
     return params;
   }
 
+  @Override
   public SolrParams getOriginalParams() {
     return origParams;
   }
 
+  @Override
   public void setParams(SolrParams params) {
     this.params = params;
   }
 
   protected final long startTime=System.currentTimeMillis();
   // Get the start time of this request in milliseconds
+  @Override
   public long getStartTime() {
     return startTime;
   }
 
   // The index searcher associated with this request
   protected RefCounted<SolrIndexSearcher> searcherHolder;
+  @Override
   public SolrIndexSearcher getSearcher() {
     if(core == null) return null;//a request for a core admin will no have a core
     // should this reach out and get a searcher from the core singleton, or
@@ -92,11 +98,13 @@ public abstract class SolrQueryRequestBa
   }
 
   // The solr core (coordinator, etc) associated with this request
+  @Override
   public SolrCore getCore() {
     return core;
   }
 
   // The index schema associated with this request
+  @Override
   public IndexSchema getSchema() {
     //a request for a core admin will no have a core
     return core == null? null: core.getSchema();
@@ -106,6 +114,7 @@ public abstract class SolrQueryRequestBa
    * Frees resources associated with this request, this method <b>must</b>
    * be called when the object is no longer in use.
    */
+  @Override
   public void close() {
     if (searcherHolder!=null) {
       searcherHolder.decref();
@@ -115,6 +124,7 @@ public abstract class SolrQueryRequestBa
 
   /** A Collection of ContentStreams passed to the request
    */
+  @Override
   public Iterable<ContentStream> getContentStreams() {
     return streams; 
   }
@@ -123,6 +133,7 @@ public abstract class SolrQueryRequestBa
     streams = s; 
   }
 
+  @Override
   public String getParamString() {
     return origParams.toString();
   }

Modified: lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/response/BinaryResponseWriter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/response/BinaryResponseWriter.java?rev=1435287&r1=1435286&r2=1435287&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/response/BinaryResponseWriter.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/core/src/java/org/apache/solr/response/BinaryResponseWriter.java Fri Jan 18 18:30:54 2013
@@ -43,6 +43,7 @@ public class BinaryResponseWriter implem
   private static final Logger LOG = LoggerFactory.getLogger(BinaryResponseWriter.class);
   public static final Set<Class> KNOWN_TYPES = new HashSet<Class>();
 
+  @Override
   public void write(OutputStream out, SolrQueryRequest req, SolrQueryResponse response) throws IOException {
     Resolver resolver = new Resolver(req, response.getReturnFields());
     Boolean omitHeader = req.getParams().getBool(CommonParams.OMIT_HEADER);
@@ -51,14 +52,17 @@ public class BinaryResponseWriter implem
     codec.marshal(response.getValues(), out);
   }
 
+  @Override
   public void write(Writer writer, SolrQueryRequest request, SolrQueryResponse response) throws IOException {
     throw new RuntimeException("This is a binary writer , Cannot write to a characterstream");
   }
 
+  @Override
   public String getContentType(SolrQueryRequest request, SolrQueryResponse response) {
     return "application/octet-stream";
   }
 
+  @Override
   public void init(NamedList args) {
     /* NOOP */
   }
@@ -78,6 +82,7 @@ public class BinaryResponseWriter implem
       this.returnFields = returnFields;
     }
 
+    @Override
     public Object resolve(Object o, JavaBinCodec codec) throws IOException {
       if (o instanceof ResultContext) {
         writeResults((ResultContext) o, codec);