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());