You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by yo...@apache.org on 2011/01/08 02:17:44 UTC

svn commit: r1056585 - in /lucene/dev/trunk/solr/src: java/org/apache/solr/schema/ java/org/apache/solr/search/ java/org/apache/solr/search/function/ test/org/apache/solr/search/

Author: yonik
Date: Sat Jan  8 01:17:43 2011
New Revision: 1056585

URL: http://svn.apache.org/viewvc?rev=1056585&view=rev
Log:
LUCENE-2831: attempt to use the correct reader context rather than doing getTopReaderContext on a leaf

Modified:
    lucene/dev/trunk/solr/src/java/org/apache/solr/schema/LatLonType.java
    lucene/dev/trunk/solr/src/java/org/apache/solr/search/Grouping.java
    lucene/dev/trunk/solr/src/java/org/apache/solr/search/SolrConstantScoreQuery.java
    lucene/dev/trunk/solr/src/java/org/apache/solr/search/ValueSourceParser.java
    lucene/dev/trunk/solr/src/java/org/apache/solr/search/function/BoostedQuery.java
    lucene/dev/trunk/solr/src/java/org/apache/solr/search/function/FunctionQuery.java
    lucene/dev/trunk/solr/src/java/org/apache/solr/search/function/QueryValueSource.java
    lucene/dev/trunk/solr/src/java/org/apache/solr/search/function/ValueSource.java
    lucene/dev/trunk/solr/src/test/org/apache/solr/search/TestIndexSearcher.java

Modified: lucene/dev/trunk/solr/src/java/org/apache/solr/schema/LatLonType.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/src/java/org/apache/solr/schema/LatLonType.java?rev=1056585&r1=1056584&r2=1056585&view=diff
==============================================================================
--- lucene/dev/trunk/solr/src/java/org/apache/solr/schema/LatLonType.java (original)
+++ lucene/dev/trunk/solr/src/java/org/apache/solr/schema/LatLonType.java Sat Jan  8 01:17:43 2011
@@ -342,8 +342,8 @@ class SpatialDistanceQuery extends Query
 
     public SpatialWeight(IndexSearcher searcher) throws IOException {
       this.searcher = searcher;
-      this.latContext = latSource.newContext();
-      this.lonContext = lonSource.newContext();
+      this.latContext = latSource.newContext(searcher);
+      this.lonContext = lonSource.newContext(searcher);
       latSource.createWeight(latContext, searcher);
       lonSource.createWeight(lonContext, searcher);
     }

Modified: lucene/dev/trunk/solr/src/java/org/apache/solr/search/Grouping.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/src/java/org/apache/solr/search/Grouping.java?rev=1056585&r1=1056584&r2=1056585&view=diff
==============================================================================
--- lucene/dev/trunk/solr/src/java/org/apache/solr/search/Grouping.java (original)
+++ lucene/dev/trunk/solr/src/java/org/apache/solr/search/Grouping.java Sat Jan  8 01:17:43 2011
@@ -151,7 +151,7 @@ public class Grouping {
     
     @Override
     void prepare() throws IOException {
-        Map context = ValueSource.newContext();
+        Map context = ValueSource.newContext(searcher);
         groupBy.createWeight(context, searcher);
     }
 

Modified: lucene/dev/trunk/solr/src/java/org/apache/solr/search/SolrConstantScoreQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/src/java/org/apache/solr/search/SolrConstantScoreQuery.java?rev=1056585&r1=1056584&r2=1056585&view=diff
==============================================================================
--- lucene/dev/trunk/solr/src/java/org/apache/solr/search/SolrConstantScoreQuery.java (original)
+++ lucene/dev/trunk/solr/src/java/org/apache/solr/search/SolrConstantScoreQuery.java Sat Jan  8 01:17:43 2011
@@ -62,7 +62,7 @@ public class SolrConstantScoreQuery exte
 
     public ConstantWeight(IndexSearcher searcher) throws IOException {
       this.similarity = getSimilarity(searcher);
-      this.context = ValueSource.newContext();
+      this.context = ValueSource.newContext(searcher);
       if (filter instanceof SolrFilter)
         ((SolrFilter)filter).createWeight(context, searcher);
     }

Modified: lucene/dev/trunk/solr/src/java/org/apache/solr/search/ValueSourceParser.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/src/java/org/apache/solr/search/ValueSourceParser.java?rev=1056585&r1=1056584&r2=1056585&view=diff
==============================================================================
--- lucene/dev/trunk/solr/src/java/org/apache/solr/search/ValueSourceParser.java (original)
+++ lucene/dev/trunk/solr/src/java/org/apache/solr/search/ValueSourceParser.java Sat Jan  8 01:17:43 2011
@@ -890,8 +890,6 @@ abstract class Double2Parser extends Nam
 
     @Override
     public void createWeight(Map context, IndexSearcher searcher) throws IOException {
-      a.createWeight(context,searcher);
-      b.createWeight(context,searcher);
     }
 
     public int hashCode() {

Modified: lucene/dev/trunk/solr/src/java/org/apache/solr/search/function/BoostedQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/src/java/org/apache/solr/search/function/BoostedQuery.java?rev=1056585&r1=1056584&r2=1056585&view=diff
==============================================================================
--- lucene/dev/trunk/solr/src/java/org/apache/solr/search/function/BoostedQuery.java (original)
+++ lucene/dev/trunk/solr/src/java/org/apache/solr/search/function/BoostedQuery.java Sat Jan  8 01:17:43 2011
@@ -66,7 +66,7 @@ public class BoostedQuery extends Query 
     public BoostedWeight(IndexSearcher searcher) throws IOException {
       this.searcher = searcher;
       this.qWeight = q.weight(searcher);
-      this.context = boostVal.newContext();
+      this.context = boostVal.newContext(searcher);
       boostVal.createWeight(context,searcher);
     }
 

Modified: lucene/dev/trunk/solr/src/java/org/apache/solr/search/function/FunctionQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/src/java/org/apache/solr/search/function/FunctionQuery.java?rev=1056585&r1=1056584&r2=1056585&view=diff
==============================================================================
--- lucene/dev/trunk/solr/src/java/org/apache/solr/search/function/FunctionQuery.java (original)
+++ lucene/dev/trunk/solr/src/java/org/apache/solr/search/function/FunctionQuery.java Sat Jan  8 01:17:43 2011
@@ -67,7 +67,7 @@ public class FunctionQuery extends Query
 
     public FunctionWeight(IndexSearcher searcher) throws IOException {
       this.searcher = searcher;
-      this.context = func.newContext();
+      this.context = func.newContext(searcher);
       func.createWeight(context, searcher);
     }
 

Modified: lucene/dev/trunk/solr/src/java/org/apache/solr/search/function/QueryValueSource.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/src/java/org/apache/solr/search/function/QueryValueSource.java?rev=1056585&r1=1056584&r2=1056585&view=diff
==============================================================================
--- lucene/dev/trunk/solr/src/java/org/apache/solr/search/function/QueryValueSource.java (original)
+++ lucene/dev/trunk/solr/src/java/org/apache/solr/search/function/QueryValueSource.java Sat Jan  8 01:17:43 2011
@@ -44,8 +44,8 @@ public class QueryValueSource extends Va
   }
 
   @Override
-  public DocValues getValues(Map context, IndexReader reader) throws IOException {
-    return new QueryDocValues(reader, q, defVal, context==null ? null : (Weight)context.get(this));
+  public DocValues getValues(Map fcontext, IndexReader reader) throws IOException {
+    return new QueryDocValues(reader, q, defVal, fcontext);
   }
 
   public int hashCode() {
@@ -71,6 +71,7 @@ class QueryDocValues extends DocValues {
   final IndexReader reader;
   final Weight weight;
   final float defVal;
+  final Map fcontext;
 
   Scorer scorer;
   int scorerDoc; // the document the scorer is on
@@ -79,18 +80,36 @@ class QueryDocValues extends DocValues {
   // to trigger a scorer reset on first access.
   int lastDocRequested=Integer.MAX_VALUE;
 
-  public QueryDocValues(IndexReader reader, Query q, float defVal, Weight w) throws IOException {
+  public QueryDocValues(IndexReader reader, Query q, float defVal, Map fcontext) throws IOException {
     this.reader = reader;
     this.q = q;
     this.defVal = defVal;
-    weight = w!=null ? w : q.weight(new IndexSearcher(reader));
+    this.fcontext = fcontext;
+
+    Weight w = fcontext==null ? null : (Weight)fcontext.get(q);
+    if (w == null) {
+       IndexSearcher weightSearcher = fcontext == null ? new IndexSearcher(reader) : (IndexSearcher)fcontext.get("searcher");
+
+       // TODO: sort by function doesn't weight (SOLR-1297 is open because of this bug)... so weightSearcher will currently be null
+       if (weightSearcher == null) weightSearcher = new IndexSearcher(reader);
+
+       w = q.weight(weightSearcher);
+    }
+    weight = w;
   }
 
   public float floatVal(int doc) {
     try {
       if (doc < lastDocRequested) {
         // out-of-order access.... reset scorer.
-        scorer = weight.scorer(reader.getTopReaderContext(), true, false);
+        IndexReader.AtomicReaderContext ctx = ValueSource.readerToContext(fcontext, reader);
+
+        if (ctx == null) {
+          // TODO: this is because SOLR-1297 does not weight
+          ctx = (IndexReader.AtomicReaderContext)reader.getTopReaderContext();  // this is the incorrect context
+        }
+
+        scorer = weight.scorer(ctx, true, false);
         if (scorer==null) return defVal;
         scorerDoc = -1;
       }

Modified: lucene/dev/trunk/solr/src/java/org/apache/solr/search/function/ValueSource.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/src/java/org/apache/solr/search/function/ValueSource.java?rev=1056585&r1=1056584&r2=1056585&view=diff
==============================================================================
--- lucene/dev/trunk/solr/src/java/org/apache/solr/search/function/ValueSource.java (original)
+++ lucene/dev/trunk/solr/src/java/org/apache/solr/search/function/ValueSource.java Sat Jan  8 01:17:43 2011
@@ -18,6 +18,8 @@
 package org.apache.solr.search.function;
 
 import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.IndexReader.AtomicReaderContext;
+import org.apache.lucene.index.IndexReader.ReaderContext;
 import org.apache.lucene.search.FieldComparator;
 import org.apache.lucene.search.FieldComparatorSource;
 import org.apache.lucene.search.Scorer;
@@ -25,6 +27,7 @@ import org.apache.lucene.search.IndexSea
 import org.apache.lucene.search.SortField;
 import org.apache.lucene.util.Bits;
 import org.apache.lucene.index.MultiFields;
+import org.apache.solr.common.SolrException;
 
 import java.io.IOException;
 import java.io.Serializable;
@@ -90,10 +93,46 @@ public abstract class ValueSource implem
   /**
    * Returns a new non-threadsafe context map.
    */
-  public static Map newContext() {
-    return new IdentityHashMap();
+  public static Map newContext(IndexSearcher searcher) {
+    Map context = new IdentityHashMap();
+    context.put("searcher", searcher);
+    return context;
+  }
+
+  /* @lucene.internal
+   * This will most likely go away in the future.
+   */
+  public static AtomicReaderContext readerToContext(Map fcontext, IndexReader reader) {
+    Object v = fcontext.get(reader);
+    if (v == null) {
+      IndexSearcher searcher = (IndexSearcher)fcontext.get("searcher");
+      if (searcher == null) {
+        return null;
+        // TODO
+        // throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "no searcher found in function context");
+      }
+      ReaderContext rcontext = searcher.getIndexReader().getTopReaderContext();
+      if (rcontext.isAtomic) {
+        assert rcontext.reader == reader;
+        fcontext.put(rcontext.reader, (AtomicReaderContext)rcontext);
+      } else {
+        for (AtomicReaderContext subCtx : rcontext.leaves()) {
+          fcontext.put(subCtx.reader, subCtx);
+        }
+      }
+
+      v = fcontext.get(reader);
+      if (v == null) {
+        return null;
+        // TODO
+        // throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "reader " + reader + " is not from the top reader " + searcher.getIndexReader());
+      }
+    }
+
+    return (AtomicReaderContext)v;
   }
 
+
   class ValueSourceComparatorSource extends FieldComparatorSource {
 
 

Modified: lucene/dev/trunk/solr/src/test/org/apache/solr/search/TestIndexSearcher.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/src/test/org/apache/solr/search/TestIndexSearcher.java?rev=1056585&r1=1056584&r2=1056585&view=diff
==============================================================================
--- lucene/dev/trunk/solr/src/test/org/apache/solr/search/TestIndexSearcher.java (original)
+++ lucene/dev/trunk/solr/src/test/org/apache/solr/search/TestIndexSearcher.java Sat Jan  8 01:17:43 2011
@@ -36,7 +36,7 @@ public class TestIndexSearcher extends S
   private String getStringVal(SolrQueryRequest sqr, String field, int doc) throws IOException {
     SchemaField sf = sqr.getSchema().getField(field);
     ValueSource vs = sf.getType().getValueSource(sf, null);
-    Map context = ValueSource.newContext();
+    Map context = ValueSource.newContext(sqr.getSearcher());
     vs.createWeight(context, sqr.getSearcher());
     SolrIndexReader sr = sqr.getSearcher().getReader();
     int idx = SolrIndexReader.readerIndex(doc, sr.getLeafOffsets());