You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by rm...@apache.org on 2014/05/13 17:49:11 UTC
svn commit: r1594254 - in /lucene/dev/branches/lucene5666:
lucene/misc/src/java/org/apache/lucene/uninverting/
solr/contrib/analysis-extras/src/java/org/apache/solr/schema/
solr/core/src/java/org/apache/solr/core/
solr/core/src/java/org/apache/solr/req...
Author: rmuir
Date: Tue May 13 15:49:10 2014
New Revision: 1594254
URL: http://svn.apache.org/r1594254
Log:
LUCENE-5666: get solr started
Modified:
lucene/dev/branches/lucene5666/lucene/misc/src/java/org/apache/lucene/uninverting/UninvertingReader.java
lucene/dev/branches/lucene5666/solr/contrib/analysis-extras/src/java/org/apache/solr/schema/ICUCollationField.java
lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/core/SolrCore.java
lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/request/DocValuesFacets.java
lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/request/SimpleFacets.java
lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/AbstractSpatialFieldType.java
lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/BinaryField.java
lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/BoolField.java
lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/CollationField.java
lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/CurrencyField.java
lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/EnumField.java
lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/ExternalFileField.java
lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/FieldType.java
lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/GeoHashField.java
lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/IndexSchema.java
lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/LatLonType.java
lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/PointType.java
lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/PreAnalyzedField.java
lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/RandomSortField.java
lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/StrField.java
lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/TextField.java
lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/TrieDateField.java
lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/TrieField.java
lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java
lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/update/SolrIndexSplitter.java
lucene/dev/branches/lucene5666/solr/core/src/test-files/solr/collection1/conf/schema.xml
lucene/dev/branches/lucene5666/solr/core/src/test/org/apache/solr/core/TestMergePolicyConfig.java
lucene/dev/branches/lucene5666/solr/core/src/test/org/apache/solr/search/function/SortByFunctionTest.java
Modified: lucene/dev/branches/lucene5666/lucene/misc/src/java/org/apache/lucene/uninverting/UninvertingReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5666/lucene/misc/src/java/org/apache/lucene/uninverting/UninvertingReader.java?rev=1594254&r1=1594253&r2=1594254&view=diff
==============================================================================
--- lucene/dev/branches/lucene5666/lucene/misc/src/java/org/apache/lucene/uninverting/UninvertingReader.java (original)
+++ lucene/dev/branches/lucene5666/lucene/misc/src/java/org/apache/lucene/uninverting/UninvertingReader.java Tue May 13 15:49:10 2014
@@ -220,11 +220,13 @@ public class UninvertingReader extends F
public NumericDocValues getNumericDocValues(String field) throws IOException {
Type v = mapping.get(field);
if (v != null) {
- switch (mapping.get(field)) {
+ switch (v) {
case INTEGER: return FieldCache.DEFAULT.getNumerics(in, field, FieldCache.NUMERIC_UTILS_INT_PARSER, true);
case FLOAT: return FieldCache.DEFAULT.getNumerics(in, field, FieldCache.NUMERIC_UTILS_FLOAT_PARSER, true);
case LONG: return FieldCache.DEFAULT.getNumerics(in, field, FieldCache.NUMERIC_UTILS_LONG_PARSER, true);
case DOUBLE: return FieldCache.DEFAULT.getNumerics(in, field, FieldCache.NUMERIC_UTILS_DOUBLE_PARSER, true);
+ default:
+ throw new IllegalStateException("Type mismatch: " + field + " was indexed as " + v);
}
}
return super.getNumericDocValues(field);
@@ -232,8 +234,11 @@ public class UninvertingReader extends F
@Override
public BinaryDocValues getBinaryDocValues(String field) throws IOException {
- if (mapping.get(field) == Type.BINARY) {
+ Type v = mapping.get(field);
+ if (v == Type.BINARY) {
return FieldCache.DEFAULT.getTerms(in, field, true);
+ } else if (v != null && v != Type.SORTED) {
+ throw new IllegalStateException("Type mismatch: " + field + " was indexed as " + v);
} else {
return in.getBinaryDocValues(field);
}
@@ -241,8 +246,11 @@ public class UninvertingReader extends F
@Override
public SortedDocValues getSortedDocValues(String field) throws IOException {
- if (mapping.get(field) == Type.SORTED) {
+ Type v = mapping.get(field);
+ if (v == Type.SORTED) {
return FieldCache.DEFAULT.getTermsIndex(in, field);
+ } else if (v != null) {
+ throw new IllegalStateException("Type mismatch: " + field + " was indexed as " + v);
} else {
return in.getSortedDocValues(field);
}
@@ -252,7 +260,7 @@ public class UninvertingReader extends F
public SortedSetDocValues getSortedSetDocValues(String field) throws IOException {
Type v = mapping.get(field);
if (v != null) {
- switch (mapping.get(field)) {
+ switch (v) {
case SORTED_SET_INTEGER:
case SORTED_SET_FLOAT:
return FieldCache.DEFAULT.getDocTermOrds(in, field, FieldCache.INT32_TERM_PREFIX);
@@ -261,6 +269,10 @@ public class UninvertingReader extends F
return FieldCache.DEFAULT.getDocTermOrds(in, field, FieldCache.INT64_TERM_PREFIX);
case SORTED_SET_BINARY:
return FieldCache.DEFAULT.getDocTermOrds(in, field, null);
+ default:
+ if (v != Type.SORTED) {
+ throw new IllegalStateException("Type mismatch: " + field + " was indexed as " + v);
+ }
}
}
return in.getSortedSetDocValues(field);
Modified: lucene/dev/branches/lucene5666/solr/contrib/analysis-extras/src/java/org/apache/solr/schema/ICUCollationField.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5666/solr/contrib/analysis-extras/src/java/org/apache/solr/schema/ICUCollationField.java?rev=1594254&r1=1594253&r2=1594254&view=diff
==============================================================================
--- lucene/dev/branches/lucene5666/solr/contrib/analysis-extras/src/java/org/apache/solr/schema/ICUCollationField.java (original)
+++ lucene/dev/branches/lucene5666/solr/contrib/analysis-extras/src/java/org/apache/solr/schema/ICUCollationField.java Tue May 13 15:49:10 2014
@@ -38,6 +38,7 @@ import org.apache.lucene.search.FieldCac
import org.apache.lucene.search.Query;
import org.apache.lucene.search.SortField;
import org.apache.lucene.search.TermRangeQuery;
+import org.apache.lucene.uninverting.UninvertingReader.Type;
import org.apache.lucene.util.BytesRef;
import org.apache.lucene.util.Version;
import org.apache.lucene.analysis.util.ResourceLoader;
@@ -224,6 +225,15 @@ public class ICUCollationField extends F
public SortField getSortField(SchemaField field, boolean top) {
return getStringSort(field, top);
}
+
+ @Override
+ public Type getUninversionType(SchemaField sf) {
+ if (sf.multiValued()) {
+ return Type.SORTED_SET_BINARY;
+ } else {
+ return Type.SORTED;
+ }
+ }
@Override
public Analyzer getIndexAnalyzer() {
Modified: lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/core/SolrCore.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/core/SolrCore.java?rev=1594254&r1=1594253&r2=1594254&view=diff
==============================================================================
--- lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/core/SolrCore.java (original)
+++ lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/core/SolrCore.java Tue May 13 15:49:10 2014
@@ -1461,7 +1461,7 @@ public final class SolrCore implements S
if (newestSearcher != null && (nrt || indexDirFile.equals(newIndexDirFile))) {
DirectoryReader newReader;
- DirectoryReader currentReader = newestSearcher.get().getIndexReader();
+ DirectoryReader currentReader = newestSearcher.get().getRawReader();
// SolrCore.verbose("start reopen from",previousSearcher,"writer=",writer);
Modified: lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/request/DocValuesFacets.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/request/DocValuesFacets.java?rev=1594254&r1=1594253&r2=1594254&view=diff
==============================================================================
--- lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/request/DocValuesFacets.java (original)
+++ lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/request/DocValuesFacets.java Tue May 13 15:49:10 2014
@@ -60,10 +60,13 @@ public class DocValuesFacets {
SchemaField schemaField = searcher.getSchema().getField(fieldName);
FieldType ft = schemaField.getType();
NamedList<Integer> res = new NamedList<>();
+
+ // TODO: remove multiValuedFieldCache(), check dv type / uninversion type?
+ final boolean multiValued = schemaField.multiValued() || ft.multiValuedFieldCache();
final SortedSetDocValues si; // for term lookups only
OrdinalMap ordinalMap = null; // for mapping per-segment ords to global ones
- if (schemaField.multiValued()) {
+ if (multiValued) {
si = searcher.getAtomicReader().getSortedSetDocValues(fieldName);
if (si instanceof MultiSortedSetDocValues) {
ordinalMap = ((MultiSortedSetDocValues)si).mapping;
@@ -126,7 +129,7 @@ public class DocValuesFacets {
disi = dis.iterator();
}
if (disi != null) {
- if (schemaField.multiValued()) {
+ if (multiValued) {
SortedSetDocValues sub = leaf.reader().getSortedSetDocValues(fieldName);
if (sub == null) {
sub = DocValues.EMPTY_SORTED_SET;
Modified: lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/request/SimpleFacets.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/request/SimpleFacets.java?rev=1594254&r1=1594253&r2=1594254&view=diff
==============================================================================
--- lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/request/SimpleFacets.java (original)
+++ lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/request/SimpleFacets.java Tue May 13 15:49:10 2014
@@ -378,18 +378,13 @@ public class SimpleFacets {
final boolean multiToken = sf.multiValued() || ft.multiValuedFieldCache();
- if (method == null && ft.getNumericType() != null && !sf.multiValued()) {
+ if (ft.getNumericType() != null && !sf.multiValued()) {
// the per-segment approach is optimal for numeric field types since there
// are no global ords to merge and no need to create an expensive
// top-level reader
method = FacetMethod.FCS;
}
- if (ft.getNumericType() != null && sf.hasDocValues()) {
- // only fcs is able to leverage the numeric field caches
- method = FacetMethod.FCS;
- }
-
if (method == null) {
// TODO: default to per-segment or not?
method = FacetMethod.FC;
@@ -430,14 +425,7 @@ public class SimpleFacets {
}
break;
case FC:
- if (sf.hasDocValues()) {
- counts = DocValuesFacets.getCounts(searcher, base, field, offset,limit, mincount, missing, sort, prefix);
- } else if (multiToken || TrieField.getMainValuePrefix(ft) != null) {
- UnInvertedField uif = UnInvertedField.getUnInvertedField(field, searcher);
- counts = uif.getCounts(searcher, base, offset, limit, mincount,missing,sort,prefix);
- } else {
- counts = getFieldCacheCounts(searcher, base, field, offset,limit, mincount, missing, sort, prefix);
- }
+ counts = DocValuesFacets.getCounts(searcher, base, field, offset,limit, mincount, missing, sort, prefix);
break;
default:
throw new AssertionError();
@@ -622,152 +610,6 @@ public class SimpleFacets {
return docs.andNotSize(hasVal);
}
-
- /**
- * Use the Lucene FieldCache to get counts for each unique field value in <code>docs</code>.
- * The field must have at most one indexed token per document.
- */
- public static NamedList<Integer> getFieldCacheCounts(SolrIndexSearcher searcher, DocSet docs, String fieldName, int offset, int limit, int mincount, boolean missing, String sort, String prefix) throws IOException {
- // TODO: If the number of terms is high compared to docs.size(), and zeros==false,
- // we should use an alternate strategy to avoid
- // 1) creating another huge int[] for the counts
- // 2) looping over that huge int[] looking for the rare non-zeros.
- //
- // Yet another variation: if docs.size() is small and termvectors are stored,
- // then use them instead of the FieldCache.
- //
-
- // TODO: this function is too big and could use some refactoring, but
- // we also need a facet cache, and refactoring of SimpleFacets instead of
- // trying to pass all the various params around.
-
- FieldType ft = searcher.getSchema().getFieldType(fieldName);
- NamedList<Integer> res = new NamedList<>();
-
- SortedDocValues si = DocValues.getSorted(searcher.getAtomicReader(), fieldName);
-
- final BytesRef br = new BytesRef();
-
- final BytesRef prefixRef;
- if (prefix == null) {
- prefixRef = null;
- } else if (prefix.length()==0) {
- prefix = null;
- prefixRef = null;
- } else {
- prefixRef = new BytesRef(prefix);
- }
-
- int startTermIndex, endTermIndex;
- if (prefix!=null) {
- startTermIndex = si.lookupTerm(prefixRef);
- if (startTermIndex<0) startTermIndex=-startTermIndex-1;
- prefixRef.append(UnicodeUtil.BIG_TERM);
- endTermIndex = si.lookupTerm(prefixRef);
- assert endTermIndex < 0;
- endTermIndex = -endTermIndex-1;
- } else {
- startTermIndex=-1;
- endTermIndex=si.getValueCount();
- }
-
- final int nTerms=endTermIndex-startTermIndex;
- int missingCount = -1;
- final CharsRef charsRef = new CharsRef(10);
- if (nTerms>0 && docs.size() >= mincount) {
-
- // count collection array only needs to be as big as the number of terms we are
- // going to collect counts for.
- final int[] counts = new int[nTerms];
-
- DocIterator iter = docs.iterator();
-
- while (iter.hasNext()) {
- int term = si.getOrd(iter.nextDoc());
- int arrIdx = term-startTermIndex;
- if (arrIdx>=0 && arrIdx<nTerms) counts[arrIdx]++;
- }
-
- if (startTermIndex == -1) {
- missingCount = counts[0];
- }
-
- // IDEA: we could also maintain a count of "other"... everything that fell outside
- // of the top 'N'
-
- int off=offset;
- int lim=limit>=0 ? limit : Integer.MAX_VALUE;
-
- if (sort.equals(FacetParams.FACET_SORT_COUNT) || sort.equals(FacetParams.FACET_SORT_COUNT_LEGACY)) {
- int maxsize = limit>0 ? offset+limit : Integer.MAX_VALUE-1;
- maxsize = Math.min(maxsize, nTerms);
- LongPriorityQueue queue = new LongPriorityQueue(Math.min(maxsize,1000), maxsize, Long.MIN_VALUE);
-
- int min=mincount-1; // the smallest value in the top 'N' values
- for (int i=(startTermIndex==-1)?1:0; i<nTerms; i++) {
- int c = counts[i];
- if (c>min) {
- // NOTE: we use c>min rather than c>=min as an optimization because we are going in
- // index order, so we already know that the keys are ordered. This can be very
- // important if a lot of the counts are repeated (like zero counts would be).
-
- // smaller term numbers sort higher, so subtract the term number instead
- long pair = (((long)c)<<32) + (Integer.MAX_VALUE - i);
- boolean displaced = queue.insert(pair);
- if (displaced) min=(int)(queue.top() >>> 32);
- }
- }
-
- // if we are deep paging, we don't have to order the highest "offset" counts.
- int collectCount = Math.max(0, queue.size() - off);
- assert collectCount <= lim;
-
- // the start and end indexes of our list "sorted" (starting with the highest value)
- int sortedIdxStart = queue.size() - (collectCount - 1);
- int sortedIdxEnd = queue.size() + 1;
- final long[] sorted = queue.sort(collectCount);
-
- for (int i=sortedIdxStart; i<sortedIdxEnd; i++) {
- long pair = sorted[i];
- int c = (int)(pair >>> 32);
- int tnum = Integer.MAX_VALUE - (int)pair;
- si.lookupOrd(startTermIndex+tnum, br);
- ft.indexedToReadable(br, charsRef);
- res.add(charsRef.toString(), c);
- }
-
- } else {
- // add results in index order
- int i=(startTermIndex==-1)?1:0;
- if (mincount<=0) {
- // if mincount<=0, then we won't discard any terms and we know exactly
- // where to start.
- i+=off;
- off=0;
- }
-
- for (; i<nTerms; i++) {
- int c = counts[i];
- if (c<mincount || --off>=0) continue;
- if (--lim<0) break;
- si.lookupOrd(startTermIndex+i, br);
- ft.indexedToReadable(br, charsRef);
- res.add(charsRef.toString(), c);
- }
- }
- }
-
- if (missing) {
- if (missingCount < 0) {
- missingCount = getFieldMissingCount(searcher,docs,fieldName);
- }
- res.add(null, missingCount);
- }
-
- return res;
- }
-
-
/**
* Returns a list of terms in the specified field along with the
* corresponding count of documents in the set that match that constraint.
Modified: lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/AbstractSpatialFieldType.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/AbstractSpatialFieldType.java?rev=1594254&r1=1594253&r2=1594254&view=diff
==============================================================================
--- lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/AbstractSpatialFieldType.java (original)
+++ lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/AbstractSpatialFieldType.java Tue May 13 15:49:10 2014
@@ -40,6 +40,7 @@ import org.apache.lucene.spatial.Spatial
import org.apache.lucene.spatial.query.SpatialArgs;
import org.apache.lucene.spatial.query.SpatialArgsParser;
import org.apache.lucene.spatial.query.SpatialOperation;
+import org.apache.lucene.uninverting.UninvertingReader.Type;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.params.SolrParams;
import org.apache.solr.response.TextResponseWriter;
@@ -129,6 +130,11 @@ public abstract class AbstractSpatialFie
}
@Override
+ public Type getUninversionType(SchemaField sf) {
+ return null;
+ }
+
+ @Override
public List<StorableField> createFields(SchemaField field, Object val, float boost) {
String shapeStr = null;
Shape shape = null;
Modified: lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/BinaryField.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/BinaryField.java?rev=1594254&r1=1594253&r2=1594254&view=diff
==============================================================================
--- lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/BinaryField.java (original)
+++ lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/BinaryField.java Tue May 13 15:49:10 2014
@@ -23,6 +23,7 @@ import java.nio.ByteBuffer;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.StorableField;
import org.apache.lucene.search.SortField;
+import org.apache.lucene.uninverting.UninvertingReader.Type;
import org.apache.lucene.util.BytesRef;
import org.apache.solr.common.util.Base64;
import org.apache.solr.response.TextResponseWriter;
@@ -44,6 +45,15 @@ public class BinaryField extends FieldTy
throw new RuntimeException("Cannot sort on a Binary field");
}
+ @Override
+ public Type getUninversionType(SchemaField sf) {
+ // TODO: maybe just return null?
+ if (sf.multiValued()) {
+ return Type.SORTED_SET_BINARY;
+ } else {
+ return Type.BINARY;
+ }
+ }
@Override
public String toExternal(StorableField f) {
Modified: lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/BoolField.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/BoolField.java?rev=1594254&r1=1594253&r2=1594254&view=diff
==============================================================================
--- lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/BoolField.java (original)
+++ lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/BoolField.java Tue May 13 15:49:10 2014
@@ -34,6 +34,7 @@ import org.apache.lucene.queries.functio
import org.apache.lucene.queries.function.docvalues.BoolDocValues;
import org.apache.lucene.queries.function.valuesource.OrdFieldSource;
import org.apache.lucene.search.SortField;
+import org.apache.lucene.uninverting.UninvertingReader.Type;
import org.apache.lucene.util.BytesRef;
import org.apache.lucene.util.CharsRef;
import org.apache.lucene.util.mutable.MutableValue;
@@ -52,6 +53,15 @@ public class BoolField extends Primitive
}
@Override
+ public Type getUninversionType(SchemaField sf) {
+ if (sf.multiValued()) {
+ return Type.SORTED_SET_BINARY;
+ } else {
+ return Type.SORTED;
+ }
+ }
+
+ @Override
public ValueSource getValueSource(SchemaField field, QParser qparser) {
field.checkFieldCacheSource(qparser);
return new BoolFieldSource(field.name);
Modified: lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/CollationField.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/CollationField.java?rev=1594254&r1=1594253&r2=1594254&view=diff
==============================================================================
--- lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/CollationField.java (original)
+++ lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/CollationField.java Tue May 13 15:49:10 2014
@@ -42,6 +42,7 @@ import org.apache.lucene.search.FieldCac
import org.apache.lucene.search.Query;
import org.apache.lucene.search.SortField;
import org.apache.lucene.search.TermRangeQuery;
+import org.apache.lucene.uninverting.UninvertingReader.Type;
import org.apache.lucene.util.BytesRef;
import org.apache.lucene.util.Version;
import org.apache.lucene.analysis.util.ResourceLoader;
@@ -199,6 +200,15 @@ public class CollationField extends Fiel
public SortField getSortField(SchemaField field, boolean top) {
return getStringSort(field, top);
}
+
+ @Override
+ public Type getUninversionType(SchemaField sf) {
+ if (sf.multiValued()) {
+ return Type.SORTED_SET_BINARY;
+ } else {
+ return Type.SORTED;
+ }
+ }
@Override
public Analyzer getIndexAnalyzer() {
Modified: lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/CurrencyField.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/CurrencyField.java?rev=1594254&r1=1594253&r2=1594254&view=diff
==============================================================================
--- lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/CurrencyField.java (original)
+++ lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/CurrencyField.java Tue May 13 15:49:10 2014
@@ -26,6 +26,7 @@ import org.apache.lucene.search.Query;
import org.apache.lucene.search.SortField;
import org.apache.lucene.search.Filter;
import org.apache.lucene.search.FieldValueFilter;
+import org.apache.lucene.uninverting.UninvertingReader.Type;
import org.apache.lucene.queries.ChainedFilter;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.SolrException.ErrorCode;
@@ -343,6 +344,11 @@ public class CurrencyField extends Field
// Convert all values to default currency for sorting.
return (new RawCurrencyValueSource(field, defaultCurrency, null)).getSortField(reverse);
}
+
+ @Override
+ public Type getUninversionType(SchemaField sf) {
+ return null;
+ }
@Override
public void write(TextResponseWriter writer, String name, StorableField field) throws IOException {
Modified: lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/EnumField.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/EnumField.java?rev=1594254&r1=1594253&r2=1594254&view=diff
==============================================================================
--- lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/EnumField.java (original)
+++ lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/EnumField.java Tue May 13 15:49:10 2014
@@ -22,6 +22,7 @@ import org.apache.lucene.index.StorableF
import org.apache.lucene.queries.function.ValueSource;
import org.apache.lucene.queries.function.valuesource.EnumFieldSource;
import org.apache.lucene.search.*;
+import org.apache.lucene.uninverting.UninvertingReader.Type;
import org.apache.lucene.util.BytesRef;
import org.apache.lucene.util.CharsRef;
import org.apache.lucene.util.NumericUtils;
@@ -182,6 +183,15 @@ public class EnumField extends Primitive
sf.setMissingValue(missingValue);
return sf;
}
+
+ @Override
+ public Type getUninversionType(SchemaField sf) {
+ if (sf.multiValued()) {
+ return Type.SORTED_SET_INTEGER;
+ } else {
+ return Type.INTEGER;
+ }
+ }
/**
* {@inheritDoc}
Modified: lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/ExternalFileField.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/ExternalFileField.java?rev=1594254&r1=1594253&r2=1594254&view=diff
==============================================================================
--- lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/ExternalFileField.java (original)
+++ lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/ExternalFileField.java Tue May 13 15:49:10 2014
@@ -19,6 +19,7 @@ package org.apache.solr.schema;
import org.apache.lucene.index.StorableField;
import org.apache.lucene.queries.function.ValueSource;
import org.apache.lucene.search.SortField;
+import org.apache.lucene.uninverting.UninvertingReader.Type;
import org.apache.solr.common.SolrException;
import org.apache.solr.response.TextResponseWriter;
import org.apache.solr.search.QParser;
@@ -90,6 +91,11 @@ public class ExternalFileField extends F
FileFloatSource source = getFileFloatSource(field);
return source.getSortField(reverse);
}
+
+ @Override
+ public Type getUninversionType(SchemaField sf) {
+ return null;
+ }
@Override
public ValueSource getValueSource(SchemaField field, QParser parser) {
Modified: lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/FieldType.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/FieldType.java?rev=1594254&r1=1594253&r2=1594254&view=diff
==============================================================================
--- lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/FieldType.java (original)
+++ lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/FieldType.java Tue May 13 15:49:10 2014
@@ -41,6 +41,7 @@ import org.apache.lucene.search.SortFiel
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TermRangeQuery;
import org.apache.lucene.search.similarities.Similarity;
+import org.apache.lucene.uninverting.UninvertingReader;
import org.apache.lucene.util.BytesRef;
import org.apache.lucene.util.CharsRef;
import org.apache.lucene.util.UnicodeUtil;
@@ -446,6 +447,16 @@ public abstract class FieldType extends
query.setRewriteMethod(sf.getType().getRewriteMethod(parser, sf));
return query;
}
+
+ /**
+ * DocValues is not enabled for a field, but its indexed, docvalues can be constructed
+ * on the fly (uninverted, aka fieldcache) on the first request to sort, facet, etc.
+ * This specifies the structure to use.
+ *
+ * @param sf field instance
+ * @return type to uninvert, or {@code null} (to disallow uninversion for the field)
+ */
+ public abstract UninvertingReader.Type getUninversionType(SchemaField sf);
/**
* Default analyzer for types that only produce 1 verbatim token...
Modified: lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/GeoHashField.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/GeoHashField.java?rev=1594254&r1=1594253&r2=1594254&view=diff
==============================================================================
--- lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/GeoHashField.java (original)
+++ lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/GeoHashField.java Tue May 13 15:49:10 2014
@@ -22,6 +22,8 @@ import org.apache.lucene.queries.functio
import org.apache.lucene.index.StorableField;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.SortField;
+import org.apache.lucene.uninverting.UninvertingReader.Type;
+
import com.spatial4j.core.context.SpatialContext;
import com.spatial4j.core.io.GeohashUtils;
import com.spatial4j.core.shape.Point;
@@ -47,6 +49,15 @@ public class GeoHashField extends FieldT
public SortField getSortField(SchemaField field, boolean top) {
return getStringSort(field, top);
}
+
+ @Override
+ public Type getUninversionType(SchemaField sf) {
+ if (sf.multiValued()) {
+ return Type.SORTED_SET_BINARY;
+ } else {
+ return Type.SORTED;
+ }
+ }
//QUESTION: Should we do a fast and crude one? Or actually check distances
//Fast and crude could use EdgeNGrams, but that would require a different
Modified: lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/IndexSchema.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/IndexSchema.java?rev=1594254&r1=1594253&r2=1594254&view=diff
==============================================================================
--- lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/IndexSchema.java (original)
+++ lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/IndexSchema.java Tue May 13 15:49:10 2014
@@ -19,10 +19,14 @@ package org.apache.solr.schema;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.AnalyzerWrapper;
+import org.apache.lucene.index.DirectoryReader;
+import org.apache.lucene.index.FieldInfo;
import org.apache.lucene.index.IndexableField;
+import org.apache.lucene.index.MultiFields;
import org.apache.lucene.index.StorableField;
import org.apache.lucene.index.StoredDocument;
import org.apache.lucene.search.similarities.Similarity;
+import org.apache.lucene.uninverting.UninvertingReader;
import org.apache.lucene.util.Version;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.SolrException.ErrorCode;
@@ -357,6 +361,22 @@ public class IndexSchema {
indexAnalyzer = new SolrIndexAnalyzer();
queryAnalyzer = new SolrQueryAnalyzer();
}
+
+ public Map<String,UninvertingReader.Type> getUninversionMap(DirectoryReader reader) {
+ Map<String,UninvertingReader.Type> map = new HashMap<>();
+ for (FieldInfo f : MultiFields.getMergedFieldInfos(reader)) {
+ if (f.hasDocValues() == false && f.isIndexed()) {
+ SchemaField sf = getFieldOrNull(f.name);
+ if (sf != null) {
+ UninvertingReader.Type type = sf.getType().getUninversionType(sf);
+ if (type != null) {
+ map.put(f.name, type);
+ }
+ }
+ }
+ }
+ return map;
+ }
/**
* Writes the schema in schema.xml format to the given writer
Modified: lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/LatLonType.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/LatLonType.java?rev=1594254&r1=1594253&r2=1594254&view=diff
==============================================================================
--- lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/LatLonType.java (original)
+++ lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/LatLonType.java Tue May 13 15:49:10 2014
@@ -41,6 +41,7 @@ import org.apache.lucene.search.Query;
import org.apache.lucene.search.Scorer;
import org.apache.lucene.search.SortField;
import org.apache.lucene.search.Weight;
+import org.apache.lucene.uninverting.UninvertingReader.Type;
import org.apache.lucene.util.Bits;
import org.apache.solr.common.SolrException;
import org.apache.solr.response.TextResponseWriter;
@@ -241,6 +242,11 @@ public class LatLonType extends Abstract
public SortField getSortField(SchemaField field, boolean top) {
throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "Sorting not supported on LatLonType " + field.getName());
}
+
+ @Override
+ public Type getUninversionType(SchemaField sf) {
+ return null;
+ }
Modified: lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/PointType.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/PointType.java?rev=1594254&r1=1594253&r2=1594254&view=diff
==============================================================================
--- lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/PointType.java (original)
+++ lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/PointType.java Tue May 13 15:49:10 2014
@@ -25,6 +25,7 @@ import org.apache.lucene.search.BooleanC
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.SortField;
+import org.apache.lucene.uninverting.UninvertingReader.Type;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.params.MapSolrParams;
import org.apache.solr.common.params.SolrParams;
@@ -119,6 +120,11 @@ public class PointType extends Coordinat
public SortField getSortField(SchemaField field, boolean top) {
throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "Sorting not supported on PointType " + field.getName());
}
+
+ @Override
+ public Type getUninversionType(SchemaField sf) {
+ return null;
+ }
@Override
/**
Modified: lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/PreAnalyzedField.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/PreAnalyzedField.java?rev=1594254&r1=1594253&r2=1594254&view=diff
==============================================================================
--- lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/PreAnalyzedField.java (original)
+++ lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/PreAnalyzedField.java Tue May 13 15:49:10 2014
@@ -30,12 +30,17 @@ import org.apache.lucene.analysis.Tokeni
import org.apache.lucene.document.Field;
import org.apache.lucene.index.StorableField;
import org.apache.lucene.index.FieldInfo.IndexOptions;
+import org.apache.lucene.queries.function.ValueSource;
+import org.apache.lucene.queries.function.valuesource.SortedSetFieldSource;
import org.apache.lucene.search.SortField;
+import org.apache.lucene.search.SortedSetSortField;
+import org.apache.lucene.uninverting.UninvertingReader.Type;
import org.apache.lucene.util.AttributeFactory;
import org.apache.lucene.util.AttributeSource;
import org.apache.lucene.util.AttributeSource.State;
import org.apache.solr.analysis.SolrAnalyzer;
import org.apache.solr.response.TextResponseWriter;
+import org.apache.solr.search.QParser;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -112,10 +117,20 @@ public class PreAnalyzedField extends Fi
}
return f;
}
-
+
@Override
public SortField getSortField(SchemaField field, boolean top) {
- return getStringSort(field, top);
+ return new SortedSetSortField(field.getName(), top);
+ }
+
+ @Override
+ public ValueSource getValueSource(SchemaField field, QParser parser) {
+ return new SortedSetFieldSource(field.getName());
+ }
+
+ @Override
+ public Type getUninversionType(SchemaField sf) {
+ return Type.SORTED_SET_BINARY;
}
@Override
Modified: lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/RandomSortField.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/RandomSortField.java?rev=1594254&r1=1594253&r2=1594254&view=diff
==============================================================================
--- lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/RandomSortField.java (original)
+++ lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/RandomSortField.java Tue May 13 15:49:10 2014
@@ -30,6 +30,7 @@ import org.apache.lucene.queries.functio
import org.apache.lucene.queries.function.ValueSource;
import org.apache.lucene.queries.function.docvalues.IntDocValues;
import org.apache.lucene.search.*;
+import org.apache.lucene.uninverting.UninvertingReader.Type;
import org.apache.solr.response.TextResponseWriter;
import org.apache.solr.search.QParser;
@@ -92,6 +93,11 @@ public class RandomSortField extends Fie
public SortField getSortField(SchemaField field, boolean reverse) {
return new SortField(field.getName(), randomComparatorSource, reverse);
}
+
+ @Override
+ public Type getUninversionType(SchemaField sf) {
+ return null;
+ }
@Override
public ValueSource getValueSource(SchemaField field, QParser qparser) {
Modified: lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/StrField.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/StrField.java?rev=1594254&r1=1594253&r2=1594254&view=diff
==============================================================================
--- lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/StrField.java (original)
+++ lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/StrField.java Tue May 13 15:49:10 2014
@@ -28,6 +28,7 @@ import org.apache.lucene.document.Sorted
import org.apache.lucene.index.StorableField;
import org.apache.lucene.queries.function.ValueSource;
import org.apache.lucene.search.SortField;
+import org.apache.lucene.uninverting.UninvertingReader.Type;
import org.apache.lucene.util.BytesRef;
import org.apache.solr.response.TextResponseWriter;
import org.apache.solr.search.QParser;
@@ -63,6 +64,15 @@ public class StrField extends PrimitiveF
}
@Override
+ public Type getUninversionType(SchemaField sf) {
+ if (sf.multiValued()) {
+ return Type.SORTED_SET_BINARY;
+ } else {
+ return Type.SORTED;
+ }
+ }
+
+ @Override
public void write(TextResponseWriter writer, String name, StorableField f) throws IOException {
writer.writeStr(name, f.stringValue(), true);
}
Modified: lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/TextField.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/TextField.java?rev=1594254&r1=1594253&r2=1594254&view=diff
==============================================================================
--- lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/TextField.java (original)
+++ lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/TextField.java Tue May 13 15:49:10 2014
@@ -18,10 +18,13 @@
package org.apache.solr.schema;
import org.apache.lucene.analysis.tokenattributes.TermToBytesRefAttribute;
+import org.apache.lucene.queries.function.ValueSource;
+import org.apache.lucene.queries.function.valuesource.SortedSetFieldSource;
import org.apache.lucene.search.*;
import org.apache.lucene.index.StorableField;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.Analyzer;
+import org.apache.lucene.uninverting.UninvertingReader.Type;
import org.apache.lucene.util.BytesRef;
import org.apache.lucene.util.QueryBuilder;
import org.apache.solr.common.SolrException;
@@ -93,7 +96,17 @@ public class TextField extends FieldType
@Override
public SortField getSortField(SchemaField field, boolean reverse) {
/* :TODO: maybe warn if isTokenized(), but doesn't use LimitTokenCountFilter in it's chain? */
- return getStringSort(field, reverse);
+ return new SortedSetSortField(field.getName(), reverse);
+ }
+
+ @Override
+ public ValueSource getValueSource(SchemaField field, QParser parser) {
+ return new SortedSetFieldSource(field.getName());
+ }
+
+ @Override
+ public Type getUninversionType(SchemaField sf) {
+ return Type.SORTED_SET_BINARY;
}
@Override
Modified: lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/TrieDateField.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/TrieDateField.java?rev=1594254&r1=1594253&r2=1594254&view=diff
==============================================================================
--- lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/TrieDateField.java (original)
+++ lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/TrieDateField.java Tue May 13 15:49:10 2014
@@ -30,6 +30,7 @@ import org.apache.lucene.queries.functio
import org.apache.lucene.search.SortField;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.NumericRangeQuery;
+import org.apache.lucene.uninverting.UninvertingReader.Type;
import org.apache.lucene.util.BytesRef;
import org.apache.lucene.util.CharsRef;
@@ -365,6 +366,11 @@ public class TrieDateField extends Primi
}
@Override
+ public Type getUninversionType(SchemaField sf) {
+ return wrappedField.getUninversionType(sf);
+ }
+
+ @Override
public Object marshalSortValue(Object value) {
return value;
}
Modified: lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/TrieField.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/TrieField.java?rev=1594254&r1=1594253&r2=1594254&view=diff
==============================================================================
--- lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/TrieField.java (original)
+++ lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/schema/TrieField.java Tue May 13 15:49:10 2014
@@ -43,6 +43,7 @@ import org.apache.lucene.search.FieldCac
import org.apache.lucene.search.NumericRangeQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.SortField;
+import org.apache.lucene.uninverting.UninvertingReader.Type;
import org.apache.lucene.util.BytesRef;
import org.apache.lucene.util.CharsRef;
import org.apache.lucene.util.NumericUtils;
@@ -194,6 +195,39 @@ public class TrieField extends Primitive
throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Unknown type for trie field: " + field.name);
}
}
+
+ @Override
+ public Type getUninversionType(SchemaField sf) {
+ if (sf.multiValued()) {
+ switch (type) {
+ case INTEGER:
+ return Type.SORTED_SET_INTEGER;
+ case LONG:
+ case DATE:
+ return Type.SORTED_SET_LONG;
+ case FLOAT:
+ return Type.SORTED_SET_FLOAT;
+ case DOUBLE:
+ return Type.SORTED_SET_DOUBLE;
+ default:
+ throw new AssertionError();
+ }
+ } else {
+ switch (type) {
+ case INTEGER:
+ return Type.INTEGER;
+ case LONG:
+ case DATE:
+ return Type.LONG;
+ case FLOAT:
+ return Type.FLOAT;
+ case DOUBLE:
+ return Type.DOUBLE;
+ default:
+ throw new AssertionError();
+ }
+ }
+ }
@Override
public ValueSource getValueSource(SchemaField field, QParser qparser) {
Modified: lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java?rev=1594254&r1=1594253&r2=1594254&view=diff
==============================================================================
--- lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java (original)
+++ lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java Tue May 13 15:49:10 2014
@@ -89,6 +89,7 @@ import org.apache.lucene.search.TopScore
import org.apache.lucene.search.TotalHitCountCollector;
import org.apache.lucene.search.Weight;
import org.apache.lucene.store.Directory;
+import org.apache.lucene.uninverting.UninvertingReader;
import org.apache.lucene.util.Bits;
import org.apache.lucene.util.BytesRef;
import org.apache.lucene.util.FixedBitSet;
@@ -169,6 +170,9 @@ public class SolrIndexSearcher extends I
private DirectoryFactory directoryFactory;
private final AtomicReader atomicReader;
+ // only for addIndexes etc (no fieldcache)
+ private final DirectoryReader rawReader;
+
private String path;
private final boolean reserveDirectory;
private final boolean createdDirectory;
@@ -184,18 +188,27 @@ public class SolrIndexSearcher extends I
}
return reader;
}
+
+ // TODO: wrap elsewhere and return a "map" from the schema that overrides get() ?
+ // this reader supports reopen
+ private static DirectoryReader wrapReader(SolrCore core, DirectoryReader reader) {
+ assert reader != null;
+ assert !reader.getClass().getSimpleName().startsWith("Uninverting"); // nocommit
+ return UninvertingReader.wrap(reader, core.getLatestSchema().getUninversionMap(reader));
+ }
public SolrIndexSearcher(SolrCore core, String path, IndexSchema schema, SolrIndexConfig config, String name, boolean enableCache, DirectoryFactory directoryFactory) throws IOException {
// we don't need to reserve the directory because we get it from the factory
- this(core, path, schema, config, name, null, true, enableCache, false, directoryFactory);
+ this(core, path, schema, config, name, getReader(core, config, directoryFactory, path), true, enableCache, false, directoryFactory);
}
public SolrIndexSearcher(SolrCore core, String path, IndexSchema schema, SolrIndexConfig config, String name, DirectoryReader r, boolean closeReader, boolean enableCache, boolean reserveDirectory, DirectoryFactory directoryFactory) throws IOException {
- super(r == null ? getReader(core, config, directoryFactory, path) : r);
+ super(wrapReader(core, r));
this.path = path;
this.directoryFactory = directoryFactory;
this.reader = (DirectoryReader) super.readerContext.reader();
+ this.rawReader = r;
this.atomicReader = SlowCompositeReaderWrapper.wrap(this.reader);
this.core = core;
this.schema = schema;
@@ -303,6 +316,11 @@ public class SolrIndexSearcher extends I
return atomicReader;
}
+ /** Raw reader (no fieldcaches etc). Useful for operations like addIndexes */
+ public final DirectoryReader getRawReader() {
+ return rawReader;
+ }
+
@Override
public final DirectoryReader getIndexReader() {
assert reader == super.getIndexReader();
Modified: lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/update/SolrIndexSplitter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/update/SolrIndexSplitter.java?rev=1594254&r1=1594253&r2=1594254&view=diff
==============================================================================
--- lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/update/SolrIndexSplitter.java (original)
+++ lucene/dev/branches/lucene5666/solr/core/src/java/org/apache/solr/update/SolrIndexSplitter.java Tue May 13 15:49:10 2014
@@ -89,7 +89,7 @@ public class SolrIndexSplitter {
public void split() throws IOException {
- List<AtomicReaderContext> leaves = searcher.getTopReaderContext().leaves();
+ List<AtomicReaderContext> leaves = searcher.getRawReader().leaves();
List<FixedBitSet[]> segmentDocSets = new ArrayList<>(leaves.size());
log.info("SolrIndexSplitter: partitions=" + numPieces + " segments="+leaves.size());
Modified: lucene/dev/branches/lucene5666/solr/core/src/test-files/solr/collection1/conf/schema.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5666/solr/core/src/test-files/solr/collection1/conf/schema.xml?rev=1594254&r1=1594253&r2=1594254&view=diff
==============================================================================
--- lucene/dev/branches/lucene5666/solr/core/src/test-files/solr/collection1/conf/schema.xml (original)
+++ lucene/dev/branches/lucene5666/solr/core/src/test-files/solr/collection1/conf/schema.xml Tue May 13 15:49:10 2014
@@ -500,7 +500,7 @@
<field name="cat" type="string" indexed="true" stored="true" multiValued="true"/>
- <field name="price" type="float" indexed="true" stored="true"/>
+ <field name="price" type="float" indexed="true" stored="true" multiValued="false"/>
<field name="inStock" type="boolean" indexed="true" stored="true" />
<field name="subword" type="subword" indexed="true" stored="true"/>
Modified: lucene/dev/branches/lucene5666/solr/core/src/test/org/apache/solr/core/TestMergePolicyConfig.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5666/solr/core/src/test/org/apache/solr/core/TestMergePolicyConfig.java?rev=1594254&r1=1594253&r2=1594254&view=diff
==============================================================================
--- lucene/dev/branches/lucene5666/solr/core/src/test/org/apache/solr/core/TestMergePolicyConfig.java (original)
+++ lucene/dev/branches/lucene5666/solr/core/src/test/org/apache/solr/core/TestMergePolicyConfig.java Tue May 13 15:49:10 2014
@@ -196,7 +196,7 @@ public class TestMergePolicyConfig exten
public static void assertCompoundSegments(SolrCore core, boolean compound) {
RefCounted<SolrIndexSearcher> searcherRef = core.getRegisteredSearcher();
try {
- assertCompoundSegments(searcherRef.get().getIndexReader(), compound);
+ assertCompoundSegments(searcherRef.get().getRawReader(), compound);
} finally {
searcherRef.decref();
}
Modified: lucene/dev/branches/lucene5666/solr/core/src/test/org/apache/solr/search/function/SortByFunctionTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5666/solr/core/src/test/org/apache/solr/search/function/SortByFunctionTest.java?rev=1594254&r1=1594253&r2=1594254&view=diff
==============================================================================
--- lucene/dev/branches/lucene5666/solr/core/src/test/org/apache/solr/search/function/SortByFunctionTest.java (original)
+++ lucene/dev/branches/lucene5666/solr/core/src/test/org/apache/solr/search/function/SortByFunctionTest.java Tue May 13 15:49:10 2014
@@ -99,11 +99,11 @@ public class SortByFunctionTest extends
public void testSortJoinDocFreq() throws Exception
{
- assertU(adoc("id", "4", "id_s", "D", "links_mfacet", "A", "links_mfacet", "B", "links_mfacet", "C" ) );
- assertU(adoc("id", "3", "id_s", "C", "links_mfacet", "A", "links_mfacet", "B" ) );
+ assertU(adoc("id", "4", "id_s1", "D", "links_mfacet", "A", "links_mfacet", "B", "links_mfacet", "C" ) );
+ assertU(adoc("id", "3", "id_s1", "C", "links_mfacet", "A", "links_mfacet", "B" ) );
assertU(commit()); // Make sure it uses two readers
- assertU(adoc("id", "2", "id_s", "B", "links_mfacet", "A" ) );
- assertU(adoc("id", "1", "id_s", "A" ) );
+ assertU(adoc("id", "2", "id_s1", "B", "links_mfacet", "A" ) );
+ assertU(adoc("id", "1", "id_s1", "A" ) );
assertU(commit());
assertQ(req("q", "links_mfacet:B", "fl", "id", "sort", "id asc"),
@@ -112,7 +112,7 @@ public class SortByFunctionTest extends
"//result/doc[2]/int[@name='id'][.='4']"
);
- assertQ(req("q", "*:*", "fl", "id", "sort", "joindf(id_s, links_mfacet) desc"),
+ assertQ(req("q", "*:*", "fl", "id", "sort", "joindf(id_s1, links_mfacet) desc"),
"//*[@numFound='4']",
"//result/doc[1]/int[@name='id'][.='1']",
"//result/doc[2]/int[@name='id'][.='2']",
@@ -120,7 +120,7 @@ public class SortByFunctionTest extends
"//result/doc[4]/int[@name='id'][.='4']"
);
- assertQ(req("q", "*:*", "fl", "id", "sort", "joindf(id_s, links_mfacet) asc"),
+ assertQ(req("q", "*:*", "fl", "id", "sort", "joindf(id_s1, links_mfacet) asc"),
"//*[@numFound='4']",
"//result/doc[1]/int[@name='id'][.='4']",
"//result/doc[2]/int[@name='id'][.='3']",