You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by si...@apache.org on 2011/05/02 15:51:22 UTC
svn commit: r1098566 [20/22] - in /lucene/dev/branches/docvalues: ./
dev-tools/eclipse/ dev-tools/idea/.idea/ dev-tools/idea/lucene/contrib/ant/
dev-tools/idea/lucene/contrib/db/bdb-je/
dev-tools/idea/lucene/contrib/db/bdb/ dev-tools/idea/lucene/contri...
Modified: lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/schema/IndexSchema.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/schema/IndexSchema.java?rev=1098566&r1=1098565&r2=1098566&view=diff
==============================================================================
--- lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/schema/IndexSchema.java (original)
+++ lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/schema/IndexSchema.java Mon May 2 13:50:57 2011
@@ -20,7 +20,9 @@ package org.apache.solr.schema;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.document.Fieldable;
+import org.apache.lucene.search.DefaultSimilarity;
import org.apache.lucene.search.IndexSearcher;
+import org.apache.lucene.search.Similarity;
import org.apache.lucene.search.SimilarityProvider;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.util.Version;
@@ -28,6 +30,7 @@ import org.apache.solr.common.ResourceLo
import org.apache.solr.common.SolrException;
import org.apache.solr.common.params.SolrParams;
import org.apache.solr.common.util.DOMUtil;
+import org.apache.solr.common.util.NamedList;
import org.apache.solr.common.util.SystemIdResolver;
import org.apache.solr.core.SolrConfig;
import org.apache.solr.core.Config;
@@ -37,6 +40,7 @@ import org.apache.solr.analysis.TokenFil
import org.apache.solr.analysis.TokenizerChain;
import org.apache.solr.analysis.TokenizerFactory;
import org.apache.solr.search.SolrQueryParser;
+import org.apache.solr.search.SolrSimilarityProvider;
import org.apache.solr.util.plugin.AbstractPluginLoader;
import org.apache.solr.util.plugin.SolrCoreAware;
import org.w3c.dom.*;
@@ -185,19 +189,22 @@ public final class IndexSchema {
*/
public Collection<SchemaField> getRequiredFields() { return requiredFields; }
- private SimilarityFactory similarityFactory;
+ private SimilarityProviderFactory similarityProviderFactory;
/**
- * Returns the Similarity used for this index
+ * Returns the SimilarityProvider used for this index
*/
- public SimilarityProvider getSimilarityProvider() { return similarityFactory.getSimilarityProvider(); }
+ public SimilarityProvider getSimilarityProvider() { return similarityProviderFactory.getSimilarityProvider(this); }
/**
- * Returns the SimilarityFactory used for this index
+ * Returns the SimilarityProviderFactory used for this index
*/
- public SimilarityFactory getSimilarityFactory() { return similarityFactory; }
-
+ public SimilarityProviderFactory getSimilarityProviderFactory() { return similarityProviderFactory; }
+ private Similarity fallbackSimilarity;
+
+ /** fallback similarity, in the case a field doesnt specify */
+ public Similarity getFallbackSimilarity() { return fallbackSimilarity; }
/**
* Returns the Analyzer used when indexing documents for this index
@@ -387,6 +394,11 @@ public final class IndexSchema {
expression = "./analyzer[not(@type)] | ./analyzer[@type='index']";
anode = (Node)xpath.evaluate(expression, node, XPathConstants.NODE);
Analyzer analyzer = readAnalyzer(anode);
+
+ // a custom similarity[Factory]
+ expression = "./similarity";
+ anode = (Node)xpath.evaluate(expression, node, XPathConstants.NODE);
+ Similarity similarity = readSimilarity(anode);
if (queryAnalyzer==null) queryAnalyzer=analyzer;
if (analyzer==null) analyzer=queryAnalyzer;
@@ -394,6 +406,9 @@ public final class IndexSchema {
ft.setAnalyzer(analyzer);
ft.setQueryAnalyzer(queryAnalyzer);
}
+ if (similarity!=null) {
+ ft.setSimilarity(similarity);
+ }
if (ft instanceof SchemaAware){
schemaAware.add((SchemaAware) ft);
}
@@ -491,36 +506,31 @@ public final class IndexSchema {
// stuff it in a normal array for faster access
dynamicFields = dFields.toArray(new DynamicField[dFields.size()]);
-
Node node = (Node) xpath.evaluate("/schema/similarity", document, XPathConstants.NODE);
+ Similarity similarity = readSimilarity(node);
+ fallbackSimilarity = similarity == null ? new DefaultSimilarity() : similarity;
+
+ node = (Node) xpath.evaluate("/schema/similarityProvider", document, XPathConstants.NODE);
if (node==null) {
- similarityFactory = new SimilarityFactory() {
+ final SolrSimilarityProvider provider = new SolrSimilarityProvider(this);
+ similarityProviderFactory = new SimilarityProviderFactory() {
@Override
- public SimilarityProvider getSimilarityProvider() {
- return IndexSearcher.getDefaultSimilarityProvider();
+ public SolrSimilarityProvider getSimilarityProvider(IndexSchema schema) {
+ return provider;
}
};
- log.debug("using default similarity");
+ log.debug("using default similarityProvider");
} else {
final Object obj = loader.newInstance(((Element) node).getAttribute("class"));
- if (obj instanceof SimilarityFactory) {
- // configure a factory, get a similarity back
- SolrParams params = SolrParams.toSolrParams(DOMUtil.childNodesToNamedList(node));
- similarityFactory = (SimilarityFactory)obj;
- similarityFactory.init(params);
- } else {
- // just like always, assume it's a SimilarityProvider and get a ClassCastException - reasonable error handling
- similarityFactory = new SimilarityFactory() {
- @Override
- public SimilarityProvider getSimilarityProvider() {
- return (SimilarityProvider) obj;
- }
- };
- }
- if (similarityFactory instanceof SchemaAware){
- schemaAware.add((SchemaAware) similarityFactory);
+ // just like always, assume it's a SimilarityProviderFactory and get a ClassCastException - reasonable error handling
+ // configure a factory, get a similarity back
+ NamedList<?> args = DOMUtil.childNodesToNamedList(node);
+ similarityProviderFactory = (SimilarityProviderFactory)obj;
+ similarityProviderFactory.init(args);
+ if (similarityProviderFactory instanceof SchemaAware){
+ schemaAware.add((SchemaAware) similarityProviderFactory);
}
- log.debug("using similarity factory" + similarityFactory.getClass().getName());
+ log.debug("using similarityProvider factory" + similarityProviderFactory.getClass().getName());
}
node = (Node) xpath.evaluate("/schema/defaultSearchField/text()", document, XPathConstants.NODE);
@@ -750,6 +760,30 @@ public final class IndexSchema {
return newArr;
}
+ private Similarity readSimilarity(Node node) throws XPathExpressionException {
+ if (node==null) {
+ return null;
+ } else {
+ SimilarityFactory similarityFactory;
+ final Object obj = loader.newInstance(((Element) node).getAttribute("class"));
+ if (obj instanceof SimilarityFactory) {
+ // configure a factory, get a similarity back
+ SolrParams params = SolrParams.toSolrParams(DOMUtil.childNodesToNamedList(node));
+ similarityFactory = (SimilarityFactory)obj;
+ similarityFactory.init(params);
+ } else {
+ // just like always, assume it's a Similarity and get a ClassCastException - reasonable error handling
+ similarityFactory = new SimilarityFactory() {
+ @Override
+ public Similarity getSimilarity() {
+ return (Similarity) obj;
+ }
+ };
+ }
+ return similarityFactory.getSimilarity();
+ }
+ }
+
//
// <analyzer><tokenizer class="...."/><tokenizer class="...." arg="....">
//
Modified: lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/schema/RandomSortField.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/schema/RandomSortField.java?rev=1098566&r1=1098565&r2=1098566&view=diff
==============================================================================
--- lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/schema/RandomSortField.java (original)
+++ lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/schema/RandomSortField.java Mon May 2 13:50:57 2011
@@ -28,6 +28,7 @@ import org.apache.lucene.util.ReaderUtil
import org.apache.solr.response.TextResponseWriter;
import org.apache.solr.search.QParser;
import org.apache.solr.search.function.DocValues;
+import org.apache.solr.search.function.IntDocValues;
import org.apache.solr.search.function.ValueSource;
/**
@@ -157,37 +158,12 @@ public class RandomSortField extends Fie
@Override
public DocValues getValues(Map context, final AtomicReaderContext readerContext) throws IOException {
- return new DocValues() {
+ return new IntDocValues(this) {
private final int seed = getSeed(field, readerContext);
@Override
- public float floatVal(int doc) {
- return (float)hash(doc+seed);
- }
-
- @Override
public int intVal(int doc) {
return hash(doc+seed);
}
-
- @Override
- public long longVal(int doc) {
- return (long)hash(doc+seed);
- }
-
- @Override
- public double doubleVal(int doc) {
- return (double)hash(doc+seed);
- }
-
- @Override
- public String strVal(int doc) {
- return Integer.toString(hash(doc+seed));
- }
-
- @Override
- public String toString(int doc) {
- return description() + '=' + intVal(doc);
- }
};
}
Modified: lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/schema/SimilarityFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/schema/SimilarityFactory.java?rev=1098566&r1=1098565&r2=1098566&view=diff
==============================================================================
--- lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/schema/SimilarityFactory.java (original)
+++ lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/schema/SimilarityFactory.java Mon May 2 13:50:57 2011
@@ -16,7 +16,7 @@ package org.apache.solr.schema;
* limitations under the License.
*/
-import org.apache.lucene.search.SimilarityProvider;
+import org.apache.lucene.search.Similarity;
import org.apache.solr.common.params.SolrParams;
public abstract class SimilarityFactory {
@@ -25,5 +25,5 @@ public abstract class SimilarityFactory
public void init(SolrParams params) { this.params = params; }
public SolrParams getParams() { return params; }
- public abstract SimilarityProvider getSimilarityProvider();
+ public abstract Similarity getSimilarity();
}
Modified: lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/schema/SortableDoubleField.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/schema/SortableDoubleField.java?rev=1098566&r1=1098565&r2=1098566&view=diff
==============================================================================
--- lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/schema/SortableDoubleField.java (original)
+++ lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/schema/SortableDoubleField.java Mon May 2 13:50:57 2011
@@ -149,6 +149,12 @@ class SortableDoubleFieldSource extends
}
@Override
+ public Object objectVal(int doc) {
+ int ord=termsIndex.getOrd(doc);
+ return ord==0 ? null : NumberUtils.SortableStr2double(termsIndex.lookup(ord, spare));
+ }
+
+ @Override
public String toString(int doc) {
return description() + '=' + doubleVal(doc);
}
Modified: lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/schema/SortableFloatField.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/schema/SortableFloatField.java?rev=1098566&r1=1098565&r2=1098566&view=diff
==============================================================================
--- lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/schema/SortableFloatField.java (original)
+++ lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/schema/SortableFloatField.java Mon May 2 13:50:57 2011
@@ -154,6 +154,12 @@ class SortableFloatFieldSource extends F
}
@Override
+ public Object objectVal(int doc) {
+ int ord=termsIndex.getOrd(doc);
+ return ord==0 ? null : NumberUtils.SortableStr2float(termsIndex.lookup(ord, spare));
+ }
+
+ @Override
public ValueFiller getValueFiller() {
return new ValueFiller() {
private final MutableValueFloat mval = new MutableValueFloat();
Modified: lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/schema/SortableIntField.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/schema/SortableIntField.java?rev=1098566&r1=1098565&r2=1098566&view=diff
==============================================================================
--- lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/schema/SortableIntField.java (original)
+++ lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/schema/SortableIntField.java Mon May 2 13:50:57 2011
@@ -156,6 +156,12 @@ class SortableIntFieldSource extends Fie
}
@Override
+ public Object objectVal(int doc) {
+ int ord=termsIndex.getOrd(doc);
+ return ord==0 ? null : NumberUtils.SortableStr2int(termsIndex.lookup(ord, spare));
+ }
+
+ @Override
public ValueFiller getValueFiller() {
return new ValueFiller() {
private final MutableValueInt mval = new MutableValueInt();
Modified: lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/schema/SortableLongField.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/schema/SortableLongField.java?rev=1098566&r1=1098565&r2=1098566&view=diff
==============================================================================
--- lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/schema/SortableLongField.java (original)
+++ lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/schema/SortableLongField.java Mon May 2 13:50:57 2011
@@ -150,6 +150,12 @@ class SortableLongFieldSource extends Fi
}
@Override
+ public Object objectVal(int doc) {
+ int ord=termsIndex.getOrd(doc);
+ return ord==0 ? null : NumberUtils.SortableStr2long(termsIndex.lookup(ord, spare));
+ }
+
+ @Override
public String toString(int doc) {
return description() + '=' + longVal(doc);
}
Modified: lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/schema/StrFieldSource.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/schema/StrFieldSource.java?rev=1098566&r1=1098565&r2=1098566&view=diff
==============================================================================
--- lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/schema/StrFieldSource.java (original)
+++ lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/schema/StrFieldSource.java Mon May 2 13:50:57 2011
@@ -19,9 +19,11 @@ package org.apache.solr.schema;
import org.apache.lucene.index.IndexReader.AtomicReaderContext;
import org.apache.lucene.util.BytesRef;
+import org.apache.noggit.CharArr;
import org.apache.solr.search.function.DocValues;
import org.apache.solr.search.function.FieldCacheSource;
import org.apache.solr.search.function.StringIndexDocValues;
+import org.apache.solr.util.ByteUtils;
import java.io.IOException;
import java.util.Map;
@@ -40,33 +42,13 @@ public class StrFieldSource extends Fiel
@Override
public DocValues getValues(Map context, AtomicReaderContext readerContext) throws IOException {
return new StringIndexDocValues(this, readerContext, field) {
+
@Override
protected String toTerm(String readableValue) {
return readableValue;
}
@Override
- public float floatVal(int doc) {
- return (float)intVal(doc);
- }
-
- @Override
- public int intVal(int doc) {
- int ord=termsIndex.getOrd(doc);
- return ord;
- }
-
- @Override
- public long longVal(int doc) {
- return (long)intVal(doc);
- }
-
- @Override
- public double doubleVal(int doc) {
- return (double)intVal(doc);
- }
-
- @Override
public int ordVal(int doc) {
return termsIndex.getOrd(doc);
}
@@ -77,13 +59,8 @@ public class StrFieldSource extends Fiel
}
@Override
- public String strVal(int doc) {
- int ord=termsIndex.getOrd(doc);
- if (ord == 0) {
- return null;
- } else {
- return termsIndex.lookup(ord, new BytesRef()).utf8ToString();
- }
+ public Object objectVal(int doc) {
+ return strVal(doc);
}
@Override
Modified: lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/schema/TrieDateField.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/schema/TrieDateField.java?rev=1098566&r1=1098565&r2=1098566&view=diff
==============================================================================
--- lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/schema/TrieDateField.java (original)
+++ lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/schema/TrieDateField.java Mon May 2 13:50:57 2011
@@ -68,7 +68,7 @@ public class TrieDateField extends DateF
public Date toObject(Fieldable f) {
byte[] arr = f.getBinaryValue();
if (arr==null) throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,TrieField.badFieldString(f));
- return new Date(TrieField.toLong(arr));
+ return new Date(TrieFieldHelper.toLong(arr));
}
@Override
@@ -107,7 +107,7 @@ public class TrieDateField extends DateF
return;
}
- writer.writeDate(name,new Date(TrieField.toLong(arr)));
+ writer.writeDate(name,new Date(TrieFieldHelper.toLong(arr)));
}
@Override
@@ -146,7 +146,7 @@ public class TrieDateField extends DateF
public String toExternal(Fieldable f) {
byte[] arr = f.getBinaryValue();
if (arr==null) return TrieField.badFieldString(f);
- return super.toExternal(new Date(TrieField.toLong(arr)));
+ return super.toExternal(new Date(TrieFieldHelper.toLong(arr)));
}
@Override
@@ -187,7 +187,7 @@ public class TrieDateField extends DateF
? ((Date)value).getTime()
: super.parseMath(null, value.toString()).getTime();
- if (stored) arr = TrieField.toArr(time);
+ if (stored) arr = TrieFieldHelper.toArr(time);
if (indexed) ts = new NumericTokenStream(ps).setLongValue(time);
Field f;
Modified: lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/schema/TrieField.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/schema/TrieField.java?rev=1098566&r1=1098565&r2=1098566&view=diff
==============================================================================
--- lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/schema/TrieField.java (original)
+++ lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/schema/TrieField.java Mon May 2 13:50:57 2011
@@ -17,7 +17,6 @@
package org.apache.solr.schema;
import org.apache.lucene.document.Fieldable;
-import org.apache.lucene.document.Field;
import org.apache.lucene.search.*;
import org.apache.lucene.search.cache.CachedArrayCreator;
import org.apache.lucene.search.cache.DoubleValuesCreator;
@@ -26,8 +25,6 @@ import org.apache.lucene.search.cache.In
import org.apache.lucene.search.cache.LongValuesCreator;
import org.apache.lucene.util.BytesRef;
import org.apache.lucene.util.NumericUtils;
-import org.apache.lucene.analysis.TokenStream;
-import org.apache.lucene.analysis.NumericTokenStream;
import org.apache.noggit.CharArr;
import org.apache.solr.analysis.*;
import org.apache.solr.common.SolrException;
@@ -68,6 +65,7 @@ public class TrieField extends FieldType
protected TrieTypes type;
protected Object missingValue;
+
/**
* Used for handling date types following the same semantics as DateField
*/
@@ -107,15 +105,15 @@ public class TrieField extends FieldType
if (arr==null) return badFieldString(f);
switch (type) {
case INTEGER:
- return toInt(arr);
+ return TrieFieldHelper.toInt(arr);
case FLOAT:
- return toFloat(arr);
+ return TrieFieldHelper.toFloat(arr);
case LONG:
- return toLong(arr);
+ return TrieFieldHelper.toLong(arr);
case DOUBLE:
- return toDouble(arr);
+ return TrieFieldHelper.toDouble(arr);
case DATE:
- return new Date(toLong(arr));
+ return new Date(TrieFieldHelper.toLong(arr));
default:
throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Unknown type for trie field: " + f.name());
}
@@ -207,19 +205,19 @@ public class TrieField extends FieldType
}
switch (type) {
case INTEGER:
- writer.writeInt(name,toInt(arr));
+ writer.writeInt(name,TrieFieldHelper.toInt(arr));
break;
case FLOAT:
- writer.writeFloat(name,toFloat(arr));
+ writer.writeFloat(name,TrieFieldHelper.toFloat(arr));
break;
case LONG:
- writer.writeLong(name,toLong(arr));
+ writer.writeLong(name,TrieFieldHelper.toLong(arr));
break;
case DOUBLE:
- writer.writeDouble(name,toDouble(arr));
+ writer.writeDouble(name,TrieFieldHelper.toDouble(arr));
break;
case DATE:
- writer.writeDate(name,new Date(toLong(arr)));
+ writer.writeDate(name,new Date(TrieFieldHelper.toLong(arr)));
break;
default:
throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Unknown type for trie field: " + f.name());
@@ -293,55 +291,6 @@ public class TrieField extends FieldType
}
- static int toInt(byte[] arr) {
- return (arr[0]<<24) | ((arr[1]&0xff)<<16) | ((arr[2]&0xff)<<8) | (arr[3]&0xff);
- }
-
- static long toLong(byte[] arr) {
- int high = (arr[0]<<24) | ((arr[1]&0xff)<<16) | ((arr[2]&0xff)<<8) | (arr[3]&0xff);
- int low = (arr[4]<<24) | ((arr[5]&0xff)<<16) | ((arr[6]&0xff)<<8) | (arr[7]&0xff);
- return (((long)high)<<32) | (low&0x0ffffffffL);
- }
-
- static float toFloat(byte[] arr) {
- return Float.intBitsToFloat(toInt(arr));
- }
-
- static double toDouble(byte[] arr) {
- return Double.longBitsToDouble(toLong(arr));
- }
-
- static byte[] toArr(int val) {
- byte[] arr = new byte[4];
- arr[0] = (byte)(val>>>24);
- arr[1] = (byte)(val>>>16);
- arr[2] = (byte)(val>>>8);
- arr[3] = (byte)(val);
- return arr;
- }
-
- static byte[] toArr(long val) {
- byte[] arr = new byte[8];
- arr[0] = (byte)(val>>>56);
- arr[1] = (byte)(val>>>48);
- arr[2] = (byte)(val>>>40);
- arr[3] = (byte)(val>>>32);
- arr[4] = (byte)(val>>>24);
- arr[5] = (byte)(val>>>16);
- arr[6] = (byte)(val>>>8);
- arr[7] = (byte)(val);
- return arr;
- }
-
- static byte[] toArr(float val) {
- return toArr(Float.floatToRawIntBits(val));
- }
-
- static byte[] toArr(double val) {
- return toArr(Double.doubleToRawLongBits(val));
- }
-
-
@Override
public String storedToReadable(Fieldable f) {
return toExternal(f);
@@ -396,15 +345,15 @@ public class TrieField extends FieldType
if (arr==null) return badFieldString(f);
switch (type) {
case INTEGER:
- return Integer.toString(toInt(arr));
+ return Integer.toString(TrieFieldHelper.toInt(arr));
case FLOAT:
- return Float.toString(toFloat(arr));
+ return Float.toString(TrieFieldHelper.toFloat(arr));
case LONG:
- return Long.toString(toLong(arr));
+ return Long.toString(TrieFieldHelper.toLong(arr));
case DOUBLE:
- return Double.toString(toDouble(arr));
+ return Double.toString(TrieFieldHelper.toDouble(arr));
case DATE:
- return dateField.formatDate(new Date(toLong(arr)));
+ return dateField.formatDate(new Date(TrieFieldHelper.toLong(arr)));
default:
throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Unknown type for trie field: " + f.name());
}
@@ -483,75 +432,53 @@ public class TrieField extends FieldType
@Override
public Fieldable createField(SchemaField field, Object value, float boost) {
- boolean indexed = field.indexed();
- boolean stored = field.stored();
-
- if (!indexed && !stored) {
+ TrieFieldHelper.FieldInfo info = new TrieFieldHelper.FieldInfo();
+ info.index = field.indexed();
+ info.store = field.stored();
+ info.precisionStep = precisionStep;
+ info.omitNorms = field.omitNorms();
+ info.omitTF = field.omitTf();
+
+ if (!info.index && !info.store) {
if (log.isTraceEnabled())
log.trace("Ignoring unindexed/unstored field: " + field);
return null;
}
- int ps = precisionStep;
-
- byte[] arr=null;
- TokenStream ts=null;
- // String indexedVal = indexed && precisionStep==0 ? readableToIndexed(externalVal) : null;
-
switch (type) {
case INTEGER:
int i = (value instanceof Number)
? ((Number)value).intValue()
: Integer.parseInt(value.toString());
- if (stored) arr = toArr(i);
- if (indexed) ts = new NumericTokenStream(ps).setIntValue(i);
- break;
+ return TrieFieldHelper.createIntField(field.getName(), i, info, boost);
+
case FLOAT:
float f = (value instanceof Number)
? ((Number)value).floatValue()
: Float.parseFloat(value.toString());
- if (stored) arr = toArr(f);
- if (indexed) ts = new NumericTokenStream(ps).setFloatValue(f);
- break;
+ return TrieFieldHelper.createFloatField(field.getName(), f, info, boost);
+
case LONG:
long l = (value instanceof Number)
? ((Number)value).longValue()
: Long.parseLong(value.toString());
- if (stored) arr = toArr(l);
- if (indexed) ts = new NumericTokenStream(ps).setLongValue(l);
- break;
+ return TrieFieldHelper.createLongField(field.getName(), l, info, boost);
+
case DOUBLE:
double d = (value instanceof Number)
? ((Number)value).doubleValue()
: Double.parseDouble(value.toString());
- if (stored) arr = toArr(d);
- if (indexed) ts = new NumericTokenStream(ps).setDoubleValue(d);
- break;
+ return TrieFieldHelper.createDoubleField(field.getName(), d, info, boost);
+
case DATE:
- long time = (value instanceof Date)
- ? ((Date)value).getTime()
- : dateField.parseMath(null, value.toString()).getTime();
- if (stored) arr = toArr(time);
- if (indexed) ts = new NumericTokenStream(ps).setLongValue(time);
- break;
+ Date date = (value instanceof Date)
+ ? ((Date)value)
+ : dateField.parseMath(null, value.toString());
+ return TrieFieldHelper.createDateField(field.getName(), date, info, boost);
+
default:
throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Unknown type for trie field: " + type);
}
-
- Field f;
- if (stored) {
- f = new Field(field.getName(), arr);
- if (indexed) f.setTokenStream(ts);
- } else {
- f = new Field(field.getName(), ts);
- }
-
- // term vectors aren't supported
-
- f.setOmitNorms(field.omitNorms());
- f.setOmitTermFreqAndPositions(field.omitTf());
- f.setBoost(boost);
- return f;
}
public enum TrieTypes {
@@ -612,6 +539,11 @@ class TrieDateFieldSource extends LongFi
}
@Override
+ public Object longToObject(long val) {
+ return new Date(val);
+ }
+
+ @Override
public long externalToLong(String extVal) {
return TrieField.dateField.parseMath(null, extVal).getTime();
}
Modified: lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/BitDocSet.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/BitDocSet.java?rev=1098566&r1=1098565&r2=1098566&view=diff
==============================================================================
--- lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/BitDocSet.java (original)
+++ lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/BitDocSet.java Mon May 2 13:50:57 2011
@@ -161,6 +161,16 @@ public class BitDocSet extends DocSetBas
}
@Override
+ public boolean intersects(DocSet other) {
+ if (other instanceof BitDocSet) {
+ return bits.intersects(((BitDocSet)other).bits);
+ } else {
+ // they had better not call us back!
+ return other.intersects(this);
+ }
+ }
+
+ @Override
public int unionSize(DocSet other) {
if (other instanceof BitDocSet) {
// if we don't know our current size, this is faster than
@@ -184,6 +194,11 @@ public class BitDocSet extends DocSetBas
}
@Override
+ public void setBitsOn(OpenBitSet target) {
+ target.union(bits);
+ }
+
+ @Override
public DocSet andNot(DocSet other) {
OpenBitSet newbits = (OpenBitSet)(bits.clone());
if (other instanceof BitDocSet) {
@@ -211,4 +226,9 @@ public class BitDocSet extends DocSetBas
public long memSize() {
return (bits.getBits().length << 3) + 16;
}
+
+ @Override
+ protected BitDocSet clone() {
+ return new BitDocSet((OpenBitSet)bits.clone(), size);
+ }
}
Modified: lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/DocSet.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/DocSet.java?rev=1098566&r1=1098565&r2=1098566&view=diff
==============================================================================
--- lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/DocSet.java (original)
+++ lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/DocSet.java Mon May 2 13:50:57 2011
@@ -115,6 +115,9 @@ public interface DocSet /* extends Colle
*/
public int intersectionSize(DocSet other);
+ /** Returns true if these sets have any elements in common */
+ public boolean intersects(DocSet other);
+
/**
* Returns the union of this set with another set. Neither set is modified - a new DocSet is
* created and returned.
@@ -146,6 +149,14 @@ public interface DocSet /* extends Colle
* methods will be invoked with.
*/
public Filter getTopFilter();
+
+ /**
+ * Takes the docs from this set and sets those bits on the target OpenBitSet.
+ * The target should be sized large enough to accommodate all of the documents before calling this method.
+ */
+ public void setBitsOn(OpenBitSet target);
+
+ public static DocSet EMPTY = new SortedIntDocSet(new int[0], 0);
}
/** A base class that may be usefull for implementing DocSets */
@@ -213,6 +224,17 @@ abstract class DocSetBase implements Doc
return new BitDocSet(newbits);
}
+ public boolean intersects(DocSet other) {
+ // intersection is overloaded in the smaller DocSets to be more
+ // efficient, so dispatch off of it instead.
+ if (!(other instanceof BitDocSet)) {
+ return other.intersects(this);
+ }
+ // less efficient way: get the intersection size
+ return intersectionSize(other) > 0;
+ }
+
+
public DocSet union(DocSet other) {
OpenBitSet newbits = (OpenBitSet)(this.getBits().clone());
newbits.or(other.getBits());
@@ -295,6 +317,14 @@ abstract class DocSetBase implements Doc
}
};
}
+
+ public void setBitsOn(OpenBitSet target) {
+ DocIterator iter = iterator();
+ while (iter.hasNext()) {
+ target.fastSet(iter.nextDoc());
+ }
+ }
+
}
Modified: lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/DocSlice.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/DocSlice.java?rev=1098566&r1=1098565&r2=1098566&view=diff
==============================================================================
--- lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/DocSlice.java (original)
+++ lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/DocSlice.java Mon May 2 13:50:57 2011
@@ -17,6 +17,8 @@
package org.apache.solr.search;
+import java.util.Arrays;
+
/**
* <code>DocSlice</code> implements DocList as an array of docids and optional scores.
*
@@ -141,4 +143,22 @@ public class DocSlice extends DocSetBase
HashDocSet h = new HashDocSet(docs,offset,len);
return h.intersectionSize(other);
}
+
+ @Override
+ public boolean intersects(DocSet other) {
+ if (other instanceof SortedIntDocSet || other instanceof HashDocSet) {
+ return other.intersects(this);
+ }
+ HashDocSet h = new HashDocSet(docs,offset,len);
+ return h.intersects(other);
+ }
+
+ @Override
+ protected DocSlice clone() {
+ try {
+ // DocSlice is not currently mutable
+ DocSlice slice = (DocSlice) super.clone();
+ } catch (CloneNotSupportedException e) {}
+ return null;
+ }
}
Modified: lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/ExtendedDismaxQParserPlugin.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/ExtendedDismaxQParserPlugin.java?rev=1098566&r1=1098565&r2=1098566&view=diff
==============================================================================
--- lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/ExtendedDismaxQParserPlugin.java (original)
+++ lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/ExtendedDismaxQParserPlugin.java Mon May 2 13:50:57 2011
@@ -238,6 +238,7 @@ class ExtendedDismaxQParser extends QPar
try {
up.setRemoveStopFilter(!stopwords);
+ up.exceptions = true;
parsedUserQuery = up.parse(mainUserQuery);
if (stopwords && isEmpty(parsedUserQuery)) {
@@ -247,6 +248,7 @@ class ExtendedDismaxQParser extends QPar
}
} catch (Exception e) {
// ignore failure and reparse later after escaping reserved chars
+ up.exceptions = false;
}
if (parsedUserQuery != null && doMinMatched) {
@@ -785,12 +787,19 @@ class ExtendedDismaxQParser extends QPar
RANGE
}
+
+ static final RuntimeException unknownField = new RuntimeException("UnknownField");
+ static {
+ unknownField.fillInStackTrace();
+ }
+
/**
* A subclass of SolrQueryParser that supports aliasing fields for
* constructing DisjunctionMaxQueries.
*/
class ExtendedSolrQueryParser extends SolrQueryParser {
+
/** A simple container for storing alias info
*/
protected class Alias {
@@ -803,6 +812,7 @@ class ExtendedDismaxQParser extends QPar
boolean allowWildcard=true;
int minClauseSize = 0; // minimum number of clauses per phrase query...
// used when constructing boosting part of query via sloppy phrases
+ boolean exceptions; // allow exceptions to be thrown (for example on a missing field)
ExtendedAnalyzer analyzer;
@@ -982,6 +992,15 @@ class ExtendedDismaxQParser extends QPar
return q;
}
} else {
+
+ // verify that a fielded query is actually on a field that exists... if not,
+ // then throw an exception to get us out of here, and we'll treat it like a
+ // literal when we try the escape+re-parse.
+ if (exceptions) {
+ FieldType ft = schema.getFieldTypeNoEx(field);
+ if (ft == null) throw unknownField;
+ }
+
return getQuery();
}
}
Modified: lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/HashDocSet.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/HashDocSet.java?rev=1098566&r1=1098565&r2=1098566&view=diff
==============================================================================
--- lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/HashDocSet.java (original)
+++ lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/HashDocSet.java Mon May 2 13:50:57 2011
@@ -48,6 +48,12 @@ public final class HashDocSet extends Do
private final int mask;
+ public HashDocSet(HashDocSet set) {
+ this.table = set.table.clone();
+ this.size = set.size;
+ this.mask = set.mask;
+ }
+
/** Create a HashDocSet from a list of *unique* ids */
public HashDocSet(int[] docs, int offset, int len) {
this(docs, offset, len, DEFAULT_INVERSE_LOAD_FACTOR);
@@ -207,6 +213,31 @@ public final class HashDocSet extends Do
}
+ @Override
+ public boolean intersects(DocSet other) {
+ if (other instanceof HashDocSet) {
+ // set "a" to the smallest doc set for the most efficient
+ // intersection.
+ final HashDocSet a = size()<=other.size() ? this : (HashDocSet)other;
+ final HashDocSet b = size()<=other.size() ? (HashDocSet)other : this;
+
+ for (int i=0; i<a.table.length; i++) {
+ int id=a.table[i];
+ if (id >= 0 && b.exists(id)) {
+ return true;
+ }
+ }
+ return false;
+ } else {
+ for (int i=0; i<table.length; i++) {
+ int id=table[i];
+ if (id >= 0 && other.exists(id)) {
+ return true;
+ }
+ }
+ return false;
+ }
+ }
@Override
public DocSet andNot(DocSet other) {
@@ -249,6 +280,10 @@ public final class HashDocSet extends Do
}
}
+ @Override
+ protected HashDocSet clone() {
+ return new HashDocSet(this);
+ }
// don't implement andNotSize() and unionSize() on purpose... they are implemented
// in BaseDocSet in terms of intersectionSize().
Modified: lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/QParserPlugin.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/QParserPlugin.java?rev=1098566&r1=1098565&r2=1098566&view=diff
==============================================================================
--- lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/QParserPlugin.java (original)
+++ lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/QParserPlugin.java Mon May 2 13:50:57 2011
@@ -40,6 +40,7 @@ public abstract class QParserPlugin impl
FunctionRangeQParserPlugin.NAME, FunctionRangeQParserPlugin.class,
SpatialFilterQParserPlugin.NAME, SpatialFilterQParserPlugin.class,
SpatialBoxQParserPlugin.NAME, SpatialBoxQParserPlugin.class,
+ JoinQParserPlugin.NAME, JoinQParserPlugin.class,
};
/** return a {@link QParser} */
Modified: lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/QueryParsing.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/QueryParsing.java?rev=1098566&r1=1098565&r2=1098566&view=diff
==============================================================================
--- lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/QueryParsing.java (original)
+++ lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/QueryParsing.java Mon May 2 13:50:57 2011
@@ -306,7 +306,7 @@ public class QueryParsing {
Boolean top = sp.getSortDirection();
if (null == top) {
throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
- "Can't determine Sort Order: " + sp);
+ "Can't determine a Sort Order (asc or desc) in sort spec " + sp);
}
if (SCORE.equals(field)) {
@@ -638,7 +638,11 @@ public class QueryParsing {
}
String v = val.substring(start,pos);
- return flt ? Double.parseDouble(v) : Long.parseLong(v);
+ if (flt) {
+ return Double.parseDouble(v);
+ } else {
+ return Long.parseLong(v);
+ }
}
double getDouble() throws ParseException {
@@ -693,7 +697,8 @@ public class QueryParsing {
pos++;
while (pos < end) {
ch = val.charAt(pos);
- if (!Character.isJavaIdentifierPart(ch) && ch != '.' && ch != ':') {
+// if (!Character.isJavaIdentifierPart(ch) && ch != '.' && ch != ':') {
+ if (!Character.isJavaIdentifierPart(ch) && ch != '.') {
break;
}
pos++;
Modified: lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/ReturnFields.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/ReturnFields.java?rev=1098566&r1=1098565&r2=1098566&view=diff
==============================================================================
--- lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/ReturnFields.java (original)
+++ lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/ReturnFields.java Mon May 2 13:50:57 2011
@@ -90,12 +90,10 @@ public class ReturnFields
parseFieldList( new String[]{fl}, req);
}
}
- SolrCore.log.info("fields=" + fields + "\t globs="+globs + "\t transformer="+transformer);
}
public ReturnFields(String[] fl, SolrQueryRequest req) {
parseFieldList(fl, req);
- SolrCore.log.info("fields=" + fields + "\t globs="+globs + "\t transformer="+transformer);
}
private void parseFieldList(String[] fl, SolrQueryRequest req) {
@@ -162,7 +160,7 @@ public class ReturnFields
char ch = sp.ch();
if (field != null) {
- if (sp.opt('=')) {
+ if (sp.opt(':')) {
// this was a key, not a field name
key = field;
field = null;
@@ -180,7 +178,7 @@ public class ReturnFields
}
if (key != null) {
- // we read "key = "
+ // we read "key : "
field = sp.getId(null);
ch = sp.ch();
if (field != null && (ch==' ' || ch == ',' || ch==0)) {
@@ -195,7 +193,7 @@ public class ReturnFields
if (field == null) {
// We didn't find a simple name, so let's see if it's a globbed field name.
- // Globbing only works with recommended field names.
+ // Globbing only works with field names of the recommended form (roughly like java identifiers)
field = sp.getGlobbedId(null);
ch = sp.ch();
@@ -260,6 +258,18 @@ public class ReturnFields
}
if (key==null) {
+ SolrParams localParams = parser.getLocalParams();
+ if (localParams != null) {
+ key = localParams.get("key");
+ }
+ if (key == null) {
+ // use the function name itself as the field name
+ key = sp.val.substring(start, sp.pos);
+ }
+ }
+
+
+ if (key==null) {
key = funcStr;
}
okFieldNames.add( key );
@@ -293,7 +303,7 @@ public class ReturnFields
private void addField( String field, String key, DocTransformers augmenters, SolrQueryRequest req )
{
String disp = (key==null) ? field : key;
- fields.add( field ); // need to put in the map to maintain order for things like CSVResponseWriter
+ fields.add(field); // need to put in the map to maintain order for things like CSVResponseWriter
okFieldNames.add( field );
okFieldNames.add( key );
// a valid field name
@@ -315,7 +325,7 @@ public class ReturnFields
TransformerFactory factory = req.getCore().getTransformerFactory( name );
if( factory != null ) {
- augmenters.addTransformer( factory.create(disp, args) );
+ augmenters.addTransformer( factory.create(disp, args, req) );
}
else {
// unknown field?
Modified: lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/SolrIndexSearcher.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/SolrIndexSearcher.java?rev=1098566&r1=1098565&r2=1098566&view=diff
==============================================================================
--- lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/SolrIndexSearcher.java (original)
+++ lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/SolrIndexSearcher.java Mon May 2 13:50:57 2011
@@ -28,12 +28,17 @@ import org.apache.lucene.store.FSDirecto
import org.apache.lucene.util.Bits;
import org.apache.lucene.util.BytesRef;
import org.apache.lucene.util.OpenBitSet;
+import org.apache.solr.common.params.ModifiableSolrParams;
import org.apache.solr.common.util.NamedList;
import org.apache.solr.common.util.SimpleOrderedMap;
import org.apache.solr.core.SolrConfig;
import org.apache.solr.core.SolrCore;
import org.apache.solr.core.SolrInfoMBean;
+import org.apache.solr.request.LocalSolrQueryRequest;
+import org.apache.solr.request.SolrQueryRequest;
+import org.apache.solr.request.SolrRequestInfo;
import org.apache.solr.request.UnInvertedField;
+import org.apache.solr.response.SolrQueryResponse;
import org.apache.solr.schema.IndexSchema;
import org.apache.solr.schema.SchemaField;
import org.slf4j.Logger;
@@ -189,6 +194,10 @@ public class SolrIndexSearcher extends I
return name;
}
+ public SolrCore getCore() {
+ return core;
+ }
+
/** Register sub-objects such as caches
*/
@@ -576,32 +585,6 @@ public class SolrIndexSearcher extends I
return answer;
}
- /** lucene.internal */
- public DocSet getDocSet(Query query, DocsEnumState deState) throws IOException {
- // Get the absolute value (positive version) of this query. If we
- // get back the same reference, we know it's positive.
- Query absQ = QueryUtils.getAbs(query);
- boolean positive = query==absQ;
-
- if (filterCache != null) {
- DocSet absAnswer = filterCache.get(absQ);
- if (absAnswer!=null) {
- if (positive) return absAnswer;
- else return getPositiveDocSet(matchAllDocsQuery).andNot(absAnswer);
- }
- }
-
- DocSet absAnswer = getDocSetNC(absQ, null, deState);
- DocSet answer = positive ? absAnswer : getPositiveDocSet(matchAllDocsQuery, deState).andNot(absAnswer);
-
- if (filterCache != null) {
- // cache negative queries as positive
- filterCache.put(absQ, absAnswer);
- }
-
- return answer;
- }
-
// only handle positive (non negative) queries
DocSet getPositiveDocSet(Query q) throws IOException {
DocSet answer;
@@ -614,18 +597,6 @@ public class SolrIndexSearcher extends I
return answer;
}
- // only handle positive (non negative) queries
- DocSet getPositiveDocSet(Query q, DocsEnumState deState) throws IOException {
- DocSet answer;
- if (filterCache != null) {
- answer = filterCache.get(q);
- if (answer!=null) return answer;
- }
- answer = getDocSetNC(q,null,deState);
- if (filterCache != null) filterCache.put(q,answer);
- return answer;
- }
-
private static Query matchAllDocsQuery = new MatchAllDocsQuery();
/**
@@ -756,21 +727,31 @@ public class SolrIndexSearcher extends I
}
- // query must be positive
- protected DocSet getDocSetNC(Query query, DocSet filter, DocsEnumState deState) throws IOException {
- if (filter != null) return getDocSetNC(query, filter, null);
+ /** lucene.internal */
+ public DocSet getDocSet(DocsEnumState deState) throws IOException {
+ int largestPossible = deState.termsEnum.docFreq();
+ boolean useCache = filterCache != null && largestPossible >= deState.minSetSizeCached;
+ TermQuery key = null;
+
+ if (useCache) {
+ key = new TermQuery(new Term(deState.fieldName, new BytesRef(deState.termsEnum.term()), false));
+ DocSet result = filterCache.get(key);
+ if (result != null) return result;
+ }
int smallSetSize = maxDoc()>>6;
- int largestPossible = deState.termsEnum.docFreq();
+ int scratchSize = Math.min(smallSetSize, largestPossible);
+ if (deState.scratch == null || deState.scratch.length < scratchSize)
+ deState.scratch = new int[scratchSize];
- int[] docs = new int[Math.min(smallSetSize, largestPossible)];
+ final int[] docs = deState.scratch;
int upto = 0;
int bitsSet = 0;
OpenBitSet obs = null;
- DocsEnum docsEnum = deState.termsEnum.docs(deState.deletedDocs, deState.reuse);
- if (deState.reuse == null) {
- deState.reuse = docsEnum;
+ DocsEnum docsEnum = deState.termsEnum.docs(deState.deletedDocs, deState.docsEnum);
+ if (deState.docsEnum == null) {
+ deState.docsEnum = docsEnum;
}
if (docsEnum instanceof MultiDocsEnum) {
@@ -822,15 +803,22 @@ public class SolrIndexSearcher extends I
}
}
+ DocSet result;
if (obs != null) {
for (int i=0; i<upto; i++) {
obs.fastSet(docs[i]);
}
bitsSet += upto;
- return new BitDocSet(obs, bitsSet);
+ result = new BitDocSet(obs, bitsSet);
+ } else {
+ result = new SortedIntDocSet(Arrays.copyOf(docs, upto));
}
- return new SortedIntDocSet(docs, upto);
+ if (useCache) {
+ filterCache.put(key, result);
+ }
+
+ return result;
}
// query must be positive
@@ -1593,14 +1581,12 @@ public class SolrIndexSearcher extends I
DocIterator iter = set.iterator();
int base=0;
int end=0;
- int readerIndex = -1;
-
- AtomicReaderContext leaf = null;
+ int readerIndex = 0;
- for (int i = 0; i < leafContexts.length; i++) {
+ while (iter.hasNext()) {
int doc = iter.nextDoc();
while (doc>=end) {
- leaf = leafContexts[i++];
+ AtomicReaderContext leaf = leafContexts[readerIndex++];
base = leaf.docBase;
end = base + leaf.reader.maxDoc();
topCollector.setNextReader(leaf);
@@ -1642,17 +1628,20 @@ public class SolrIndexSearcher extends I
}
/** @lucene.internal */
- public int numDocs(Query a, DocSet b, DocsEnumState deState) throws IOException {
+ public int numDocs(DocSet a, DocsEnumState deState) throws IOException {
// Negative query if absolute value different from original
- Query absQ = QueryUtils.getAbs(a);
- DocSet positiveA = getPositiveDocSet(absQ, deState);
- return a==absQ ? b.intersectionSize(positiveA) : b.andNotSize(positiveA);
+ return a.intersectionSize(getDocSet(deState));
}
public static class DocsEnumState {
+ public String fieldName; // currently interned for as long as lucene requires it
public TermsEnum termsEnum;
public Bits deletedDocs;
- public DocsEnum reuse;
+ public DocsEnum docsEnum;
+
+ public int minSetSizeCached;
+
+ public int[] scratch;
}
/**
@@ -1708,9 +1697,29 @@ public class SolrIndexSearcher extends I
boolean logme = log.isInfoEnabled();
long warmingStartTime = System.currentTimeMillis();
// warm the caches in order...
+ ModifiableSolrParams params = new ModifiableSolrParams();
+ params.add("warming","true");
for (int i=0; i<cacheList.length; i++) {
if (logme) log.info("autowarming " + this + " from " + old + "\n\t" + old.cacheList[i]);
- this.cacheList[i].warm(this, old.cacheList[i]);
+
+
+ SolrQueryRequest req = new LocalSolrQueryRequest(core,params) {
+ @Override public SolrIndexSearcher getSearcher() { return SolrIndexSearcher.this; }
+ @Override public void close() { }
+ };
+
+ SolrQueryResponse rsp = new SolrQueryResponse();
+ SolrRequestInfo.setRequestInfo(new SolrRequestInfo(req, rsp));
+ try {
+ this.cacheList[i].warm(this, old.cacheList[i]);
+ } finally {
+ try {
+ req.close();
+ } finally {
+ SolrRequestInfo.clearRequestInfo();
+ }
+ }
+
if (logme) log.info("autowarming result for " + this + "\n\t" + this.cacheList[i]);
}
warmupTime = System.currentTimeMillis() - warmingStartTime;
Modified: lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/SolrQueryParser.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/SolrQueryParser.java?rev=1098566&r1=1098565&r2=1098566&view=diff
==============================================================================
--- lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/SolrQueryParser.java (original)
+++ lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/SolrQueryParser.java Mon May 2 13:50:57 2011
@@ -122,9 +122,9 @@ public class SolrQueryParser extends Que
SchemaField sf = schema.getFieldOrNull(field);
if (sf != null) {
FieldType ft = sf.getType();
- // delegate to type for everything except TextField
- if (ft instanceof TextField) {
- return super.getFieldQuery(field, queryText, quoted || ((TextField)ft).getAutoGeneratePhraseQueries());
+ // delegate to type for everything except tokenized fields
+ if (ft.isTokenized()) {
+ return super.getFieldQuery(field, queryText, quoted || (ft instanceof TextField && ((TextField)ft).getAutoGeneratePhraseQueries()));
} else {
return sf.getType().getFieldQuery(parser, sf, queryText);
}
Modified: lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/SortedIntDocSet.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/SortedIntDocSet.java?rev=1098566&r1=1098565&r2=1098566&view=diff
==============================================================================
--- lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/SortedIntDocSet.java (original)
+++ lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/SortedIntDocSet.java Mon May 2 13:50:57 2011
@@ -166,6 +166,59 @@ public class SortedIntDocSet extends Doc
return icount;
}
+
+ public static boolean intersects(int[] smallerSortedList, int[] biggerSortedList) {
+ // see intersectionSize for more in-depth comments of this algorithm
+
+ final int a[] = smallerSortedList;
+ final int b[] = biggerSortedList;
+
+ int step = (b.length/a.length)+1;
+
+ step = step + step;
+
+ int low = 0;
+ int max = b.length-1;
+
+ for (int i=0; i<a.length; i++) {
+ int doca = a[i];
+ int high = max;
+ int probe = low + step;
+ if (probe<high) {
+ if (b[probe]>=doca) {
+ high=probe;
+ } else {
+ low=probe+1;
+ probe = low + step;
+ if (probe<high) {
+ if (b[probe]>=doca) {
+ high=probe;
+ } else {
+ low=probe+1;
+ }
+ }
+ }
+ }
+
+ while (low <= high) {
+ int mid = (low+high) >>> 1;
+ int docb = b[mid];
+
+ if (docb < doca) {
+ low = mid+1;
+ }
+ else if (docb > doca) {
+ high = mid-1;
+ }
+ else {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
public int intersectionSize(DocSet other) {
if (!(other instanceof SortedIntDocSet)) {
// assume other implementations are better at random access than we are,
@@ -215,6 +268,49 @@ public class SortedIntDocSet extends Doc
return icount;
}
+ @Override
+ public boolean intersects(DocSet other) {
+ if (!(other instanceof SortedIntDocSet)) {
+ // assume other implementations are better at random access than we are,
+ // true of BitDocSet and HashDocSet.
+ for (int i=0; i<docs.length; i++) {
+ if (other.exists(docs[i])) return true;
+ }
+ return false;
+ }
+
+ // make "a" the smaller set.
+ int[] otherDocs = ((SortedIntDocSet)other).docs;
+ final int[] a = docs.length < otherDocs.length ? docs : otherDocs;
+ final int[] b = docs.length < otherDocs.length ? otherDocs : docs;
+
+ if (a.length==0) return false;
+
+ // if b is 8 times bigger than a, use the modified binary search.
+ if ((b.length>>3) >= a.length) {
+ return intersects(a,b);
+ }
+
+ // if they are close in size, just do a linear walk of both.
+ int i=0,j=0;
+ int doca=a[i],docb=b[j];
+ for(;;) {
+ // switch on the sign bit somehow? Hopefull JVM is smart enough to just test once.
+
+ // Since set a is less dense then set b, doca is likely to be greater than docb so
+ // check that case first. This resulted in a 13% speedup.
+ if (doca > docb) {
+ if (++j >= b.length) break;
+ docb=b[j];
+ } else if (doca < docb) {
+ if (++i >= a.length) break;
+ doca=a[i];
+ } else {
+ return true;
+ }
+ }
+ return false;
+ }
/** puts the intersection of a and b into the target array and returns the size */
public static int intersection(int a[], int lena, int b[], int lenb, int[] target) {
@@ -463,6 +559,13 @@ public class SortedIntDocSet extends Doc
return new SortedIntDocSet(arr,sz);
}
+ @Override
+ public void setBitsOn(OpenBitSet target) {
+ for (int doc : docs) {
+ target.fastSet(doc);
+ }
+ }
+
public boolean exists(int doc) {
// this could be faster by estimating where in the list the doc is likely to appear,
@@ -653,4 +756,8 @@ public class SortedIntDocSet extends Doc
};
}
+ @Override
+ protected SortedIntDocSet clone() {
+ return new SortedIntDocSet(docs.clone());
+ }
}
Modified: lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/ValueSourceParser.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/ValueSourceParser.java?rev=1098566&r1=1098565&r2=1098566&view=diff
==============================================================================
--- lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/ValueSourceParser.java (original)
+++ lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/ValueSourceParser.java Mon May 2 13:50:57 2011
@@ -335,6 +335,15 @@ public abstract class ValueSourceParser
return new StringDistanceFunction(str1, str2, dist);
}
});
+ addParser("field", new ValueSourceParser() {
+ @Override
+ public ValueSource parse(FunctionQParser fp) throws ParseException {
+
+ String fieldName = fp.parseArg();
+ SchemaField f = fp.getReq().getSchema().getField(fieldName);
+ return f.getType().getValueSource(f, fp);
+ }
+ });
addParser(new DoubleParser("rad") {
@Override
@@ -784,7 +793,7 @@ class LongConstValueSource extends Const
@Override
public DocValues getValues(Map context, AtomicReaderContext readerContext) throws IOException {
- return new DocValues() {
+ return new LongDocValues(this) {
@Override
public float floatVal(int doc) {
return fv;
@@ -806,11 +815,6 @@ class LongConstValueSource extends Const
}
@Override
- public String strVal(int doc) {
- return Long.toString(constant);
- }
-
- @Override
public String toString(int doc) {
return description();
}
@@ -892,28 +896,12 @@ abstract class DoubleParser extends Name
@Override
public DocValues getValues(Map context, AtomicReaderContext readerContext) throws IOException {
final DocValues vals = source.getValues(context, readerContext);
- return new DocValues() {
- @Override
- public float floatVal(int doc) {
- return (float)doubleVal(doc);
- }
- @Override
- public int intVal(int doc) {
- return (int)doubleVal(doc);
- }
- @Override
- public long longVal(int doc) {
- return (long)doubleVal(doc);
- }
+ return new DoubleDocValues(this) {
@Override
public double doubleVal(int doc) {
return func(doc, vals);
}
@Override
- public String strVal(int doc) {
- return Double.toString(doubleVal(doc));
- }
- @Override
public String toString(int doc) {
return name() + '(' + vals.toString(doc) + ')';
}
@@ -957,28 +945,12 @@ abstract class Double2Parser extends Nam
public DocValues getValues(Map context, AtomicReaderContext readerContext) throws IOException {
final DocValues aVals = a.getValues(context, readerContext);
final DocValues bVals = b.getValues(context, readerContext);
- return new DocValues() {
- @Override
- public float floatVal(int doc) {
- return (float)doubleVal(doc);
- }
- @Override
- public int intVal(int doc) {
- return (int)doubleVal(doc);
- }
- @Override
- public long longVal(int doc) {
- return (long)doubleVal(doc);
- }
- @Override
+ return new DoubleDocValues(this) {
+ @Override
public double doubleVal(int doc) {
return func(doc, aVals, bVals);
}
@Override
- public String strVal(int doc) {
- return Double.toString(doubleVal(doc));
- }
- @Override
public String toString(int doc) {
return name() + '(' + aVals.toString(doc) + ',' + bVals.toString(doc) + ')';
}
Modified: lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/ByteFieldSource.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/ByteFieldSource.java?rev=1098566&r1=1098565&r2=1098566&view=diff
==============================================================================
--- lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/ByteFieldSource.java (original)
+++ lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/ByteFieldSource.java Mon May 2 13:50:57 2011
@@ -88,6 +88,11 @@ public class ByteFieldSource extends Num
return description() + '=' + byteVal(doc);
}
+ @Override
+ public Object objectVal(int doc) {
+ return arr[doc]; // TODO: valid?
+ }
+
};
}
}
Modified: lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/ConstValueSource.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/ConstValueSource.java?rev=1098566&r1=1098565&r2=1098566&view=diff
==============================================================================
--- lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/ConstValueSource.java (original)
+++ lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/ConstValueSource.java Mon May 2 13:50:57 2011
@@ -41,7 +41,7 @@ public class ConstValueSource extends Co
@Override
public DocValues getValues(Map context, AtomicReaderContext readerContext) throws IOException {
- return new DocValues() {
+ return new FloatDocValues(this) {
@Override
public float floatVal(int doc) {
return constant;
@@ -59,13 +59,13 @@ public class ConstValueSource extends Co
return dv;
}
@Override
- public String strVal(int doc) {
- return Float.toString(constant);
- }
- @Override
public String toString(int doc) {
return description();
}
+ @Override
+ public Object objectVal(int doc) {
+ return constant;
+ }
};
}
Modified: lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/DocFreqValueSource.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/DocFreqValueSource.java?rev=1098566&r1=1098565&r2=1098566&view=diff
==============================================================================
--- lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/DocFreqValueSource.java (original)
+++ lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/DocFreqValueSource.java Mon May 2 13:50:57 2011
@@ -21,14 +21,13 @@ import org.apache.lucene.index.IndexRead
import org.apache.lucene.index.Term;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.util.BytesRef;
-import org.apache.solr.search.MutableValueInt;
-import org.apache.solr.search.MutableValue;
+import org.apache.solr.search.*;
import java.io.IOException;
import java.util.Map;
-class ConstIntDocValues extends DocValues {
+class ConstIntDocValues extends IntDocValues {
final int ival;
final float fval;
final double dval;
@@ -37,6 +36,7 @@ class ConstIntDocValues extends DocValue
final ValueSource parent;
ConstIntDocValues(int val, ValueSource parent) {
+ super(parent);
ival = val;
fval = val;
dval = val;
@@ -71,7 +71,7 @@ class ConstIntDocValues extends DocValue
}
}
-class ConstDoubleDocValues extends DocValues {
+class ConstDoubleDocValues extends DoubleDocValues {
final int ival;
final float fval;
final double dval;
@@ -80,6 +80,7 @@ class ConstDoubleDocValues extends DocVa
final ValueSource parent;
ConstDoubleDocValues(double val, ValueSource parent) {
+ super(parent);
ival = (int)val;
fval = (float)val;
dval = val;
@@ -114,115 +115,6 @@ class ConstDoubleDocValues extends DocVa
}
}
-abstract class FloatDocValues extends DocValues {
- protected final ValueSource vs;
-
- public FloatDocValues(ValueSource vs) {
- this.vs = vs;
- }
-
- @Override
- public byte byteVal(int doc) {
- return (byte)floatVal(doc);
- }
-
- @Override
- public short shortVal(int doc) {
- return (short)floatVal(doc);
- }
-
- @Override
- public abstract float floatVal(int doc);
-
- @Override
- public int intVal(int doc) {
- return (int)floatVal(doc);
- }
-
- @Override
- public long longVal(int doc) {
- return (long)floatVal(doc);
- }
-
- @Override
- public double doubleVal(int doc) {
- return (double)floatVal(doc);
- }
-
- @Override
- public String strVal(int doc) {
- return Float.toString(floatVal(doc));
- }
-
- @Override
- public String toString(int doc) {
- return vs.description() + '=' + strVal(doc);
- }
-}
-
-abstract class IntDocValues extends DocValues {
- protected final ValueSource vs;
-
- public IntDocValues(ValueSource vs) {
- this.vs = vs;
- }
-
- @Override
- public byte byteVal(int doc) {
- return (byte)intVal(doc);
- }
-
- @Override
- public short shortVal(int doc) {
- return (short)intVal(doc);
- }
-
- @Override
- public float floatVal(int doc) {
- return (float)intVal(doc);
- }
-
- @Override
- public abstract int intVal(int doc);
-
- @Override
- public long longVal(int doc) {
- return (long)intVal(doc);
- }
-
- @Override
- public double doubleVal(int doc) {
- return (double)intVal(doc);
- }
-
- @Override
- public String strVal(int doc) {
- return Integer.toString(intVal(doc));
- }
-
- @Override
- public String toString(int doc) {
- return vs.description() + '=' + strVal(doc);
- }
-
- @Override
- public ValueFiller getValueFiller() {
- return new ValueFiller() {
- private final MutableValueInt mval = new MutableValueInt();
-
- @Override
- public MutableValue getValue() {
- return mval;
- }
-
- @Override
- public void fillValue(int doc) {
- mval.value = intVal(doc);
- }
- };
- }
-}
-
/**
* <code>DocFreqValueSource</code> returns the number of documents containing the term.
Modified: lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/DocValues.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/DocValues.java?rev=1098566&r1=1098565&r2=1098566&view=diff
==============================================================================
--- lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/DocValues.java (original)
+++ lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/DocValues.java Mon May 2 13:50:57 2011
@@ -19,6 +19,7 @@ package org.apache.solr.search.function;
import org.apache.lucene.search.*;
import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.util.BytesRef;
import org.apache.solr.search.MutableValue;
import org.apache.solr.search.MutableValueFloat;
@@ -47,6 +48,28 @@ public abstract class DocValues {
// TODO: should we make a termVal, returns BytesRef?
public String strVal(int doc) { throw new UnsupportedOperationException(); }
+ /** returns the bytes representation of the string val - TODO: should this return the indexed raw bytes not? */
+ public boolean bytesVal(int doc, BytesRef target) {
+ String s = strVal(doc);
+ if (s==null) {
+ target.length = 0;
+ return false;
+ }
+ target.copy(s);
+ return true;
+ };
+
+ /** Native Java Object representation of the value */
+ public Object objectVal(int doc) {
+ // most DocValues are functions, so by default return a Float()
+ return floatVal(doc);
+ }
+
+ /** Returns true if there is a value for this document */
+ public boolean exists(int doc) {
+ return true;
+ }
+
/**
* @param doc The doc to retrieve to sort ordinal for
* @return the sort ordinal for the specified doc
Modified: lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/DoubleConstValueSource.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/DoubleConstValueSource.java?rev=1098566&r1=1098565&r2=1098566&view=diff
==============================================================================
--- lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/DoubleConstValueSource.java (original)
+++ lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/DoubleConstValueSource.java Mon May 2 13:50:57 2011
@@ -40,7 +40,7 @@ public class DoubleConstValueSource exte
@Override
public DocValues getValues(Map context, AtomicReaderContext readerContext) throws IOException {
- return new DocValues() {
+ return new DoubleDocValues(this) {
@Override
public float floatVal(int doc) {
return fv;
@@ -67,6 +67,11 @@ public class DoubleConstValueSource exte
}
@Override
+ public Object objectVal(int doc) {
+ return constant;
+ }
+
+ @Override
public String toString(int doc) {
return description();
}
Modified: lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/DoubleFieldSource.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/DoubleFieldSource.java?rev=1098566&r1=1098565&r2=1098566&view=diff
==============================================================================
--- lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/DoubleFieldSource.java (original)
+++ lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/DoubleFieldSource.java Mon May 2 13:50:57 2011
@@ -51,7 +51,7 @@ public class DoubleFieldSource extends N
public DocValues getValues(Map context, AtomicReaderContext readerContext) throws IOException {
final DoubleValues vals = cache.getDoubles(readerContext.reader, field, creator);
final double[] arr = vals.values;
- final Bits valid = vals.valid;
+ final Bits valid = vals.valid;
return new DocValues() {
@Override
@@ -80,6 +80,11 @@ public class DoubleFieldSource extends N
}
@Override
+ public Object objectVal(int doc) {
+ return valid.get(doc) ? arr[doc] : null;
+ }
+
+ @Override
public String toString(int doc) {
return description() + '=' + doubleVal(doc);
}
Modified: lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/DualFloatFunction.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/DualFloatFunction.java?rev=1098566&r1=1098565&r2=1098566&view=diff
==============================================================================
--- lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/DualFloatFunction.java (original)
+++ lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/DualFloatFunction.java Mon May 2 13:50:57 2011
@@ -48,28 +48,12 @@ public abstract class DualFloatFunction
public DocValues getValues(Map context, AtomicReaderContext readerContext) throws IOException {
final DocValues aVals = a.getValues(context, readerContext);
final DocValues bVals = b.getValues(context, readerContext);
- return new DocValues() {
+ return new FloatDocValues(this) {
@Override
public float floatVal(int doc) {
return func(doc, aVals, bVals);
}
@Override
- public int intVal(int doc) {
- return (int)floatVal(doc);
- }
- @Override
- public long longVal(int doc) {
- return (long)floatVal(doc);
- }
- @Override
- public double doubleVal(int doc) {
- return floatVal(doc);
- }
- @Override
- public String strVal(int doc) {
- return Float.toString(floatVal(doc));
- }
- @Override
public String toString(int doc) {
return name() + '(' + aVals.toString(doc) + ',' + bVals.toString(doc) + ')';
}
Modified: lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/FileFloatSource.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/FileFloatSource.java?rev=1098566&r1=1098565&r2=1098566&view=diff
==============================================================================
--- lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/FileFloatSource.java (original)
+++ lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/FileFloatSource.java Mon May 2 13:50:57 2011
@@ -65,35 +65,15 @@ public class FileFloatSource extends Val
final int off = offset;
final float[] arr = getCachedFloats(topLevelContext.reader);
- return new DocValues() {
+ return new FloatDocValues(this) {
@Override
public float floatVal(int doc) {
return arr[doc + off];
}
@Override
- public int intVal(int doc) {
- return (int)arr[doc + off];
- }
-
- @Override
- public long longVal(int doc) {
- return (long)arr[doc + off];
- }
-
- @Override
- public double doubleVal(int doc) {
- return (double)arr[doc + off];
- }
-
- @Override
- public String strVal(int doc) {
- return Float.toString(arr[doc + off]);
- }
-
- @Override
- public String toString(int doc) {
- return description() + '=' + floatVal(doc);
+ public Object objectVal(int doc) {
+ return floatVal(doc); // TODO: keep track of missing values
}
};
}
Modified: lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/FloatFieldSource.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/FloatFieldSource.java?rev=1098566&r1=1098565&r2=1098566&view=diff
==============================================================================
--- lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/FloatFieldSource.java (original)
+++ lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/FloatFieldSource.java Mon May 2 13:50:57 2011
@@ -50,37 +50,22 @@ public class FloatFieldSource extends Nu
public DocValues getValues(Map context, AtomicReaderContext readerContext) throws IOException {
final FloatValues vals = cache.getFloats(readerContext.reader, field, creator);
final float[] arr = vals.values;
- final Bits valid = vals.valid;
+ final Bits valid = vals.valid;
- return new DocValues() {
+ return new FloatDocValues(this) {
@Override
public float floatVal(int doc) {
return arr[doc];
}
@Override
- public int intVal(int doc) {
- return (int)arr[doc];
+ public Object objectVal(int doc) {
+ return valid.get(doc) ? arr[doc] : null;
}
@Override
- public long longVal(int doc) {
- return (long)arr[doc];
- }
-
- @Override
- public double doubleVal(int doc) {
- return (double)arr[doc];
- }
-
- @Override
- public String strVal(int doc) {
- return Float.toString(arr[doc]);
- }
-
- @Override
- public String toString(int doc) {
- return description() + '=' + floatVal(doc);
+ public boolean exists(int doc) {
+ return valid.get(doc);
}
@Override
Modified: lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/IntFieldSource.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/IntFieldSource.java?rev=1098566&r1=1098565&r2=1098566&view=diff
==============================================================================
--- lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/IntFieldSource.java (original)
+++ lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/IntFieldSource.java Mon May 2 13:50:57 2011
@@ -51,9 +51,9 @@ public class IntFieldSource extends Nume
public DocValues getValues(Map context, AtomicReaderContext readerContext) throws IOException {
final IntValues vals = cache.getInts(readerContext.reader, field, creator);
final int[] arr = vals.values;
- final Bits valid = vals.valid;
+ final Bits valid = vals.valid;
- return new DocValues() {
+ return new IntDocValues(this) {
final MutableValueInt val = new MutableValueInt();
@Override
@@ -82,6 +82,16 @@ public class IntFieldSource extends Nume
}
@Override
+ public Object objectVal(int doc) {
+ return valid.get(doc) ? arr[doc] : null;
+ }
+
+ @Override
+ public boolean exists(int doc) {
+ return valid.get(doc);
+ }
+
+ @Override
public String toString(int doc) {
return description() + '=' + intVal(doc);
}
Modified: lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/JoinDocFreqValueSource.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/JoinDocFreqValueSource.java?rev=1098566&r1=1098565&r2=1098566&view=diff
==============================================================================
--- lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/JoinDocFreqValueSource.java (original)
+++ lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/JoinDocFreqValueSource.java Mon May 2 13:50:57 2011
@@ -54,7 +54,7 @@ public class JoinDocFreqValueSource exte
final DocTerms terms = cache.getTerms(readerContext.reader, field, true );
final IndexReader top = ReaderUtil.getTopLevelContext(readerContext).reader;
- return new DocValues() {
+ return new IntDocValues(this) {
BytesRef ref = new BytesRef();
@Override
@@ -70,31 +70,6 @@ public class JoinDocFreqValueSource exte
throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "caught exception in function "+description()+" : doc="+doc, e);
}
}
-
- @Override
- public float floatVal(int doc) {
- return (float)intVal(doc);
- }
-
- @Override
- public long longVal(int doc) {
- return (long)intVal(doc);
- }
-
- @Override
- public double doubleVal(int doc) {
- return (double)intVal(doc);
- }
-
- @Override
- public String strVal(int doc) {
- return intVal(doc) + "";
- }
-
- @Override
- public String toString(int doc) {
- return description() + '=' + intVal(doc);
- }
};
}
Modified: lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/LinearFloatFunction.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/LinearFloatFunction.java?rev=1098566&r1=1098565&r2=1098566&view=diff
==============================================================================
--- lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/LinearFloatFunction.java (original)
+++ lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/LinearFloatFunction.java Mon May 2 13:50:57 2011
@@ -50,28 +50,12 @@ public class LinearFloatFunction extends
@Override
public DocValues getValues(Map context, AtomicReaderContext readerContext) throws IOException {
final DocValues vals = source.getValues(context, readerContext);
- return new DocValues() {
+ return new FloatDocValues(this) {
@Override
public float floatVal(int doc) {
return vals.floatVal(doc) * slope + intercept;
}
@Override
- public int intVal(int doc) {
- return (int)floatVal(doc);
- }
- @Override
- public long longVal(int doc) {
- return (long)floatVal(doc);
- }
- @Override
- public double doubleVal(int doc) {
- return (double)floatVal(doc);
- }
- @Override
- public String strVal(int doc) {
- return Float.toString(floatVal(doc));
- }
- @Override
public String toString(int doc) {
return slope + "*float(" + vals.toString(doc) + ")+" + intercept;
}
Modified: lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/LiteralValueSource.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/LiteralValueSource.java?rev=1098566&r1=1098565&r2=1098566&view=diff
==============================================================================
--- lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/LiteralValueSource.java (original)
+++ lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/LiteralValueSource.java Mon May 2 13:50:57 2011
@@ -17,19 +17,23 @@ package org.apache.solr.search.function;
*/
import org.apache.lucene.index.IndexReader.AtomicReaderContext;
+import org.apache.lucene.util.BytesRef;
import java.util.Map;
import java.io.IOException;
/**
- * Pass a the field value through as a String, no matter the type
+ * Pass a the field value through as a String, no matter the type // Q: doesn't this mean it's a "string"?
*
**/
public class LiteralValueSource extends ValueSource {
protected final String string;
+ protected final BytesRef bytesRef;
+
public LiteralValueSource(String string) {
this.string = string;
+ this.bytesRef = new BytesRef(string);
}
/** returns the literal value */
@@ -40,13 +44,19 @@ public class LiteralValueSource extends
@Override
public DocValues getValues(Map context, AtomicReaderContext readerContext) throws IOException {
- return new DocValues() {
+ return new StrDocValues(this) {
@Override
public String strVal(int doc) {
return string;
}
@Override
+ public boolean bytesVal(int doc, BytesRef target) {
+ target.copy(bytesRef);
+ return true;
+ }
+
+ @Override
public String toString(int doc) {
return string;
}
Modified: lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/LongFieldSource.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/LongFieldSource.java?rev=1098566&r1=1098565&r2=1098566&view=diff
==============================================================================
--- lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/LongFieldSource.java (original)
+++ lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/LongFieldSource.java Mon May 2 13:50:57 2011
@@ -52,41 +52,30 @@ public class LongFieldSource extends Num
return Long.parseLong(extVal);
}
+ public Object longToObject(long val) {
+ return val;
+ }
+
@Override
public DocValues getValues(Map context, AtomicReaderContext readerContext) throws IOException {
final LongValues vals = cache.getLongs(readerContext.reader, field, creator);
final long[] arr = vals.values;
- final Bits valid = vals.valid;
+ final Bits valid = vals.valid;
- return new DocValues() {
- @Override
- public float floatVal(int doc) {
- return (float) arr[doc];
- }
-
- @Override
- public int intVal(int doc) {
- return (int) arr[doc];
- }
-
+ return new LongDocValues(this) {
@Override
public long longVal(int doc) {
return arr[doc];
}
@Override
- public double doubleVal(int doc) {
- return arr[doc];
+ public boolean exists(int doc) {
+ return valid.get(doc);
}
@Override
- public String strVal(int doc) {
- return Long.toString(arr[doc]);
- }
-
- @Override
- public String toString(int doc) {
- return description() + '=' + longVal(doc);
+ public Object objectVal(int doc) {
+ return valid.get(doc) ? longToObject(arr[doc]) : null;
}
@Override
@@ -142,8 +131,6 @@ public class LongFieldSource extends Num
};
}
-
-
};
}
Modified: lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/MultiFloatFunction.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/MultiFloatFunction.java?rev=1098566&r1=1098565&r2=1098566&view=diff
==============================================================================
--- lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/MultiFloatFunction.java (original)
+++ lucene/dev/branches/docvalues/solr/src/java/org/apache/solr/search/function/MultiFloatFunction.java Mon May 2 13:50:57 2011
@@ -62,28 +62,12 @@ public abstract class MultiFloatFunction
valsArr[i] = sources[i].getValues(context, readerContext);
}
- return new DocValues() {
+ return new FloatDocValues(this) {
@Override
public float floatVal(int doc) {
return func(doc, valsArr);
}
- @Override
- public int intVal(int doc) {
- return (int)floatVal(doc);
- }
- @Override
- public long longVal(int doc) {
- return (long)floatVal(doc);
- }
- @Override
- public double doubleVal(int doc) {
- return (double)floatVal(doc);
- }
- @Override
- public String strVal(int doc) {
- return Float.toString(floatVal(doc));
- }
- @Override
+ @Override
public String toString(int doc) {
StringBuilder sb = new StringBuilder();
sb.append(name()).append('(');