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 2013/10/01 20:14:00 UTC
svn commit: r1528167 - in /lucene/dev/trunk/lucene:
expressions/src/java/org/apache/lucene/expressions/
expressions/src/test/org/apache/lucene/expressions/
queries/src/java/org/apache/lucene/queries/function/docvalues/
queries/src/java/org/apache/lucen...
Author: rmuir
Date: Tue Oct 1 18:14:00 2013
New Revision: 1528167
URL: http://svn.apache.org/r1528167
Log:
LUCENE-5247: expressions should use DoubleDocValues not FunctionValues directly
Added:
lucene/dev/trunk/lucene/expressions/src/test/org/apache/lucene/expressions/TestExpressionValueSource.java (with props)
Modified:
lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/ExpressionComparator.java
lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/ExpressionFunctionValues.java
lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/ExpressionValueSource.java
lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/ScoreFunctionValues.java
lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/ScoreValueSource.java
lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/DoubleDocValues.java
lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/IntDocValues.java
lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/LongDocValues.java
lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/DoubleFieldSource.java
lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/IntFieldSource.java
lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/LongFieldSource.java
Modified: lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/ExpressionComparator.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/ExpressionComparator.java?rev=1528167&r1=1528166&r2=1528167&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/ExpressionComparator.java (original)
+++ lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/ExpressionComparator.java Tue Oct 1 18:14:00 2013
@@ -49,7 +49,7 @@ class ExpressionComparator extends Field
try {
Map<String,Object> context = new HashMap<String,Object>();
assert scorer != null;
- context.put("scorer", new ScoreFunctionValues(scorer));
+ context.put("scorer", scorer);
scores = source.getValues(context, readerContext);
} catch (IOException e) {
throw new RuntimeException(e);
Modified: lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/ExpressionFunctionValues.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/ExpressionFunctionValues.java?rev=1528167&r1=1528166&r2=1528167&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/ExpressionFunctionValues.java (original)
+++ lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/ExpressionFunctionValues.java Tue Oct 1 18:14:00 2013
@@ -17,16 +17,19 @@ package org.apache.lucene.expressions;
*/
import org.apache.lucene.queries.function.FunctionValues;
+import org.apache.lucene.queries.function.ValueSource;
+import org.apache.lucene.queries.function.docvalues.DoubleDocValues;
/** A {@link FunctionValues} which evaluates an expression */
-class ExpressionFunctionValues extends FunctionValues {
+class ExpressionFunctionValues extends DoubleDocValues {
final Expression expression;
final FunctionValues[] functionValues;
int currentDocument = -1;
double currentValue;
- public ExpressionFunctionValues(Expression expression, FunctionValues[] functionValues) {
+ ExpressionFunctionValues(ValueSource parent, Expression expression, FunctionValues[] functionValues) {
+ super(parent);
if (expression == null) {
throw new NullPointerException();
}
@@ -46,14 +49,4 @@ class ExpressionFunctionValues extends F
return currentValue;
}
-
- @Override
- public Object objectVal(int doc) {
- return doubleVal(doc);
- }
-
- @Override
- public String toString(int document) {
- return "ExpressionFunctionValues(" + document + ": " + objectVal(document) + ")";
- }
}
Modified: lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/ExpressionValueSource.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/ExpressionValueSource.java?rev=1528167&r1=1528166&r2=1528167&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/ExpressionValueSource.java (original)
+++ lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/ExpressionValueSource.java Tue Oct 1 18:14:00 2013
@@ -17,6 +17,7 @@ package org.apache.lucene.expressions;
*/
import java.io.IOException;
+import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
@@ -79,7 +80,7 @@ final class ExpressionValueSource extend
externalValues[i] = values;
}
- return new ExpressionFunctionValues(expression, externalValues);
+ return new ExpressionFunctionValues(this, expression, externalValues);
}
@Override
@@ -89,19 +90,48 @@ final class ExpressionValueSource extend
@Override
public String description() {
- return "ExpressionValueSource(" + expression.sourceText + ")";
+ return "expr(" + expression.sourceText + ")";
}
-
+
@Override
public int hashCode() {
- return System.identityHashCode(this);
+ final int prime = 31;
+ int result = 1;
+ result = prime * result
+ + ((expression == null) ? 0 : expression.hashCode());
+ result = prime * result + (needsScores ? 1231 : 1237);
+ result = prime * result + Arrays.hashCode(variables);
+ return result;
}
-
+
@Override
public boolean equals(Object obj) {
- return obj == this;
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ ExpressionValueSource other = (ExpressionValueSource) obj;
+ if (expression == null) {
+ if (other.expression != null) {
+ return false;
+ }
+ } else if (!expression.equals(other.expression)) {
+ return false;
+ }
+ if (needsScores != other.needsScores) {
+ return false;
+ }
+ if (!Arrays.equals(variables, other.variables)) {
+ return false;
+ }
+ return true;
}
-
+
boolean needsScores() {
return needsScores;
}
Modified: lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/ScoreFunctionValues.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/ScoreFunctionValues.java?rev=1528167&r1=1528166&r2=1528167&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/ScoreFunctionValues.java (original)
+++ lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/ScoreFunctionValues.java Tue Oct 1 18:14:00 2013
@@ -19,15 +19,18 @@ package org.apache.lucene.expressions;
import java.io.IOException;
import org.apache.lucene.queries.function.FunctionValues;
+import org.apache.lucene.queries.function.ValueSource;
+import org.apache.lucene.queries.function.docvalues.DoubleDocValues;
import org.apache.lucene.search.Scorer;
/**
* A utility class to allow expressions to access the score as a {@link FunctionValues}.
*/
-class ScoreFunctionValues extends FunctionValues {
+class ScoreFunctionValues extends DoubleDocValues {
final Scorer scorer;
- ScoreFunctionValues(Scorer scorer) {
+ ScoreFunctionValues(ValueSource parent, Scorer scorer) {
+ super(parent);
this.scorer = scorer;
}
@@ -40,9 +43,4 @@ class ScoreFunctionValues extends Functi
throw new RuntimeException(exception);
}
}
-
- @Override
- public String toString(int document) {
- return "ScoreFunctionValues(" + document + ": " + doubleVal(document) + ")";
- }
}
Modified: lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/ScoreValueSource.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/ScoreValueSource.java?rev=1528167&r1=1528166&r2=1528167&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/ScoreValueSource.java (original)
+++ lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/ScoreValueSource.java Tue Oct 1 18:14:00 2013
@@ -20,27 +20,28 @@ package org.apache.lucene.expressions;
import org.apache.lucene.index.AtomicReaderContext;
import org.apache.lucene.queries.function.FunctionValues;
import org.apache.lucene.queries.function.ValueSource;
+import org.apache.lucene.search.Scorer;
import java.io.IOException;
import java.util.Map;
/**
- * A {@link ValueSource} which uses the {@link ScoreFunctionValues} passed through
+ * A {@link ValueSource} which uses the {@link Scorer} passed through
* the context map by {@link ExpressionComparator}.
*/
@SuppressWarnings({"rawtypes"})
class ScoreValueSource extends ValueSource {
/**
- * <code>context</code> must contain a key "scorer" which is a {@link FunctionValues}.
+ * <code>context</code> must contain a key "scorer" which is a {@link Scorer}.
*/
@Override
public FunctionValues getValues(Map context, AtomicReaderContext readerContext) throws IOException {
- FunctionValues v = (FunctionValues) context.get("scorer");
+ Scorer v = (Scorer) context.get("scorer");
if (v == null) {
throw new IllegalStateException("Expressions referencing the score can only be used for sorting");
}
- return v;
+ return new ScoreFunctionValues(this, v);
}
@Override
@@ -55,6 +56,6 @@ class ScoreValueSource extends ValueSour
@Override
public String description() {
- return "ValueSource to expose scorer passed by ExpressionComparator";
+ return "score()";
}
}
Added: lucene/dev/trunk/lucene/expressions/src/test/org/apache/lucene/expressions/TestExpressionValueSource.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/expressions/src/test/org/apache/lucene/expressions/TestExpressionValueSource.java?rev=1528167&view=auto
==============================================================================
--- lucene/dev/trunk/lucene/expressions/src/test/org/apache/lucene/expressions/TestExpressionValueSource.java (added)
+++ lucene/dev/trunk/lucene/expressions/src/test/org/apache/lucene/expressions/TestExpressionValueSource.java Tue Oct 1 18:14:00 2013
@@ -0,0 +1,177 @@
+package org.apache.lucene.expressions;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.util.HashMap;
+
+import org.apache.lucene.analysis.MockAnalyzer;
+import org.apache.lucene.document.Document;
+import org.apache.lucene.document.Field;
+import org.apache.lucene.document.NumericDocValuesField;
+import org.apache.lucene.expressions.js.JavascriptCompiler;
+import org.apache.lucene.index.AtomicReaderContext;
+import org.apache.lucene.index.DirectoryReader;
+import org.apache.lucene.index.IndexWriterConfig;
+import org.apache.lucene.index.RandomIndexWriter;
+import org.apache.lucene.queries.function.FunctionValues;
+import org.apache.lucene.queries.function.ValueSource;
+import org.apache.lucene.queries.function.ValueSourceScorer;
+import org.apache.lucene.search.DocIdSetIterator;
+import org.apache.lucene.search.SortField;
+import org.apache.lucene.store.Directory;
+import org.apache.lucene.util.LuceneTestCase;
+import org.apache.lucene.util.LuceneTestCase.SuppressCodecs;
+
+@SuppressCodecs("Lucene3x")
+public class TestExpressionValueSource extends LuceneTestCase {
+ DirectoryReader reader;
+ Directory dir;
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ dir = newDirectory();
+ IndexWriterConfig iwc = newIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(random()));
+ iwc.setMergePolicy(newLogMergePolicy());
+ RandomIndexWriter iw = new RandomIndexWriter(random(), dir, iwc);
+
+ Document doc = new Document();
+ doc.add(newStringField("id", "1", Field.Store.YES));
+ doc.add(newTextField("body", "some contents and more contents", Field.Store.NO));
+ doc.add(new NumericDocValuesField("popularity", 5));
+ iw.addDocument(doc);
+
+ doc = new Document();
+ doc.add(newStringField("id", "2", Field.Store.YES));
+ doc.add(newTextField("body", "another document with different contents", Field.Store.NO));
+ doc.add(new NumericDocValuesField("popularity", 20));
+ iw.addDocument(doc);
+
+ doc = new Document();
+ doc.add(newStringField("id", "3", Field.Store.YES));
+ doc.add(newTextField("body", "crappy contents", Field.Store.NO));
+ doc.add(new NumericDocValuesField("popularity", 2));
+ iw.addDocument(doc);
+ iw.forceMerge(1);
+
+ reader = iw.getReader();
+ iw.close();
+ }
+
+ @Override
+ public void tearDown() throws Exception {
+ reader.close();
+ dir.close();
+ super.tearDown();
+ }
+
+ public void testTypes() throws Exception {
+ Expression expr = JavascriptCompiler.compile("2*popularity");
+ SimpleBindings bindings = new SimpleBindings();
+ bindings.add(new SortField("popularity", SortField.Type.LONG));
+ ValueSource vs = expr.getValueSource(bindings);
+
+ assertEquals(1, reader.leaves().size());
+ AtomicReaderContext leaf = reader.leaves().get(0);
+ FunctionValues values = vs.getValues(new HashMap<String,Object>(), leaf);
+
+ assertEquals(10, values.doubleVal(0), 0);
+ assertEquals(10, values.floatVal(0), 0);
+ assertEquals(10, values.longVal(0));
+ assertEquals(10, values.intVal(0));
+ assertEquals(10, values.shortVal(0));
+ assertEquals(10, values.byteVal(0));
+ assertEquals("10.0", values.strVal(0));
+ assertEquals(new Double(10), values.objectVal(0));
+
+ assertEquals(40, values.doubleVal(1), 0);
+ assertEquals(40, values.floatVal(1), 0);
+ assertEquals(40, values.longVal(1));
+ assertEquals(40, values.intVal(1));
+ assertEquals(40, values.shortVal(1));
+ assertEquals(40, values.byteVal(1));
+ assertEquals("40.0", values.strVal(1));
+ assertEquals(new Double(40), values.objectVal(1));
+
+ assertEquals(4, values.doubleVal(2), 0);
+ assertEquals(4, values.floatVal(2), 0);
+ assertEquals(4, values.longVal(2));
+ assertEquals(4, values.intVal(2));
+ assertEquals(4, values.shortVal(2));
+ assertEquals(4, values.byteVal(2));
+ assertEquals("4.0", values.strVal(2));
+ assertEquals(new Double(4), values.objectVal(2));
+ }
+
+ public void testRangeScorer() throws Exception {
+ Expression expr = JavascriptCompiler.compile("2*popularity");
+ SimpleBindings bindings = new SimpleBindings();
+ bindings.add(new SortField("popularity", SortField.Type.LONG));
+ ValueSource vs = expr.getValueSource(bindings);
+
+ assertEquals(1, reader.leaves().size());
+ AtomicReaderContext leaf = reader.leaves().get(0);
+ FunctionValues values = vs.getValues(new HashMap<String,Object>(), leaf);
+
+ // everything
+ ValueSourceScorer scorer = values.getRangeScorer(leaf.reader(), "4", "40", true, true);
+ assertEquals(-1, scorer.docID());
+ assertEquals(0, scorer.nextDoc());
+ assertEquals(1, scorer.nextDoc());
+ assertEquals(2, scorer.nextDoc());
+ assertEquals(DocIdSetIterator.NO_MORE_DOCS, scorer.nextDoc());
+
+ // just the first doc
+ scorer = values.getRangeScorer(leaf.reader(), "4", "40", false, false);
+ assertEquals(-1, scorer.docID());
+ assertEquals(0, scorer.nextDoc());
+ assertEquals(DocIdSetIterator.NO_MORE_DOCS, scorer.nextDoc());
+ }
+
+ public void testEquals() throws Exception {
+ Expression expr = JavascriptCompiler.compile("sqrt(a) + ln(b)");
+
+ SimpleBindings bindings = new SimpleBindings();
+ bindings.add(new SortField("a", SortField.Type.INT));
+ bindings.add(new SortField("b", SortField.Type.INT));
+
+ ValueSource vs1 = expr.getValueSource(bindings);
+ // same instance
+ assertEquals(vs1, vs1);
+ // null
+ assertFalse(vs1.equals(null));
+ // other object
+ assertFalse(vs1.equals("foobar"));
+ // same bindings and expression instances
+ ValueSource vs2 = expr.getValueSource(bindings);
+ assertEquals(vs1.hashCode(), vs2.hashCode());
+ assertEquals(vs1, vs2);
+ // equiv bindings (different instance)
+ SimpleBindings bindings2 = new SimpleBindings();
+ bindings2.add(new SortField("a", SortField.Type.INT));
+ bindings2.add(new SortField("b", SortField.Type.INT));
+ ValueSource vs3 = expr.getValueSource(bindings2);
+ assertEquals(vs1, vs3);
+ // different bindings (same names, different types)
+ SimpleBindings bindings3 = new SimpleBindings();
+ bindings3.add(new SortField("a", SortField.Type.LONG));
+ bindings3.add(new SortField("b", SortField.Type.INT));
+ ValueSource vs4 = expr.getValueSource(bindings3);
+ assertFalse(vs1.equals(vs4));
+ }
+}
Modified: lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/DoubleDocValues.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/DoubleDocValues.java?rev=1528167&r1=1528166&r2=1528167&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/DoubleDocValues.java (original)
+++ lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/DoubleDocValues.java Tue Oct 1 18:14:00 2013
@@ -17,8 +17,10 @@ package org.apache.lucene.queries.functi
* limitations under the License.
*/
+import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queries.function.FunctionValues;
import org.apache.lucene.queries.function.ValueSource;
+import org.apache.lucene.queries.function.ValueSourceScorer;
import org.apache.lucene.util.mutable.MutableValue;
import org.apache.lucene.util.mutable.MutableValueDouble;
@@ -80,6 +82,64 @@ public abstract class DoubleDocValues ex
public String toString(int doc) {
return vs.description() + '=' + strVal(doc);
}
+
+ @Override
+ public ValueSourceScorer getRangeScorer(IndexReader reader, String lowerVal, String upperVal, boolean includeLower, boolean includeUpper) {
+ double lower,upper;
+
+ if (lowerVal==null) {
+ lower = Double.NEGATIVE_INFINITY;
+ } else {
+ lower = Double.parseDouble(lowerVal);
+ }
+
+ if (upperVal==null) {
+ upper = Double.POSITIVE_INFINITY;
+ } else {
+ upper = Double.parseDouble(upperVal);
+ }
+
+ final double l = lower;
+ final double u = upper;
+
+
+ if (includeLower && includeUpper) {
+ return new ValueSourceScorer(reader, this) {
+ @Override
+ public boolean matchesValue(int doc) {
+ double docVal = doubleVal(doc);
+ return docVal >= l && docVal <= u;
+ }
+ };
+ }
+ else if (includeLower && !includeUpper) {
+ return new ValueSourceScorer(reader, this) {
+ @Override
+ public boolean matchesValue(int doc) {
+ double docVal = doubleVal(doc);
+ return docVal >= l && docVal < u;
+ }
+ };
+ }
+ else if (!includeLower && includeUpper) {
+ return new ValueSourceScorer(reader, this) {
+ @Override
+ public boolean matchesValue(int doc) {
+ double docVal = doubleVal(doc);
+ return docVal > l && docVal <= u;
+ }
+ };
+ }
+ else {
+ return new ValueSourceScorer(reader, this) {
+ @Override
+ public boolean matchesValue(int doc) {
+ double docVal = doubleVal(doc);
+ return docVal > l && docVal < u;
+ }
+ };
+ }
+ }
@Override
public ValueFiller getValueFiller() {
Modified: lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/IntDocValues.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/IntDocValues.java?rev=1528167&r1=1528166&r2=1528167&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/IntDocValues.java (original)
+++ lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/IntDocValues.java Tue Oct 1 18:14:00 2013
@@ -17,8 +17,10 @@ package org.apache.lucene.queries.functi
* limitations under the License.
*/
+import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queries.function.FunctionValues;
import org.apache.lucene.queries.function.ValueSource;
+import org.apache.lucene.queries.function.ValueSourceScorer;
import org.apache.lucene.util.mutable.MutableValue;
import org.apache.lucene.util.mutable.MutableValueInt;
@@ -75,6 +77,40 @@ public abstract class IntDocValues exten
public String toString(int doc) {
return vs.description() + '=' + strVal(doc);
}
+
+ @Override
+ public ValueSourceScorer getRangeScorer(IndexReader reader, String lowerVal, String upperVal, boolean includeLower, boolean includeUpper) {
+ int lower,upper;
+
+ // instead of using separate comparison functions, adjust the endpoints.
+
+ if (lowerVal==null) {
+ lower = Integer.MIN_VALUE;
+ } else {
+ lower = Integer.parseInt(lowerVal);
+ if (!includeLower && lower < Integer.MAX_VALUE) lower++;
+ }
+
+ if (upperVal==null) {
+ upper = Integer.MAX_VALUE;
+ } else {
+ upper = Integer.parseInt(upperVal);
+ if (!includeUpper && upper > Integer.MIN_VALUE) upper--;
+ }
+
+ final int ll = lower;
+ final int uu = upper;
+
+ return new ValueSourceScorer(reader, this) {
+ @Override
+ public boolean matchesValue(int doc) {
+ int val = intVal(doc);
+ // only check for deleted if it's the default value
+ // if (val==0 && reader.isDeleted(doc)) return false;
+ return val >= ll && val <= uu;
+ }
+ };
+ }
@Override
public ValueFiller getValueFiller() {
Modified: lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/LongDocValues.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/LongDocValues.java?rev=1528167&r1=1528166&r2=1528167&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/LongDocValues.java (original)
+++ lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/LongDocValues.java Tue Oct 1 18:14:00 2013
@@ -17,8 +17,10 @@ package org.apache.lucene.queries.functi
* limitations under the License.
*/
+import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queries.function.FunctionValues;
import org.apache.lucene.queries.function.ValueSource;
+import org.apache.lucene.queries.function.ValueSourceScorer;
import org.apache.lucene.util.mutable.MutableValue;
import org.apache.lucene.util.mutable.MutableValueLong;
@@ -80,6 +82,44 @@ public abstract class LongDocValues exte
public String toString(int doc) {
return vs.description() + '=' + strVal(doc);
}
+
+ protected long externalToLong(String extVal) {
+ return Long.parseLong(extVal);
+ }
+
+ @Override
+ public ValueSourceScorer getRangeScorer(IndexReader reader, String lowerVal, String upperVal, boolean includeLower, boolean includeUpper) {
+ long lower,upper;
+
+ // instead of using separate comparison functions, adjust the endpoints.
+
+ if (lowerVal==null) {
+ lower = Long.MIN_VALUE;
+ } else {
+ lower = externalToLong(lowerVal);
+ if (!includeLower && lower < Long.MAX_VALUE) lower++;
+ }
+
+ if (upperVal==null) {
+ upper = Long.MAX_VALUE;
+ } else {
+ upper = externalToLong(upperVal);
+ if (!includeUpper && upper > Long.MIN_VALUE) upper--;
+ }
+
+ final long ll = lower;
+ final long uu = upper;
+
+ return new ValueSourceScorer(reader, this) {
+ @Override
+ public boolean matchesValue(int doc) {
+ long val = longVal(doc);
+ // only check for deleted if it's the default value
+ // if (val==0 && reader.isDeleted(doc)) return false;
+ return val >= ll && val <= uu;
+ }
+ };
+ }
@Override
public ValueFiller getValueFiller() {
Modified: lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/DoubleFieldSource.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/DoubleFieldSource.java?rev=1528167&r1=1528166&r2=1528167&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/DoubleFieldSource.java (original)
+++ lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/DoubleFieldSource.java Tue Oct 1 18:14:00 2013
@@ -68,64 +68,6 @@ public class DoubleFieldSource extends F
}
@Override
- public ValueSourceScorer getRangeScorer(IndexReader reader, String lowerVal, String upperVal, boolean includeLower, boolean includeUpper) {
- double lower,upper;
-
- if (lowerVal==null) {
- lower = Double.NEGATIVE_INFINITY;
- } else {
- lower = Double.parseDouble(lowerVal);
- }
-
- if (upperVal==null) {
- upper = Double.POSITIVE_INFINITY;
- } else {
- upper = Double.parseDouble(upperVal);
- }
-
- final double l = lower;
- final double u = upper;
-
-
- if (includeLower && includeUpper) {
- return new ValueSourceScorer(reader, this) {
- @Override
- public boolean matchesValue(int doc) {
- double docVal = doubleVal(doc);
- return docVal >= l && docVal <= u;
- }
- };
- }
- else if (includeLower && !includeUpper) {
- return new ValueSourceScorer(reader, this) {
- @Override
- public boolean matchesValue(int doc) {
- double docVal = doubleVal(doc);
- return docVal >= l && docVal < u;
- }
- };
- }
- else if (!includeLower && includeUpper) {
- return new ValueSourceScorer(reader, this) {
- @Override
- public boolean matchesValue(int doc) {
- double docVal = doubleVal(doc);
- return docVal > l && docVal <= u;
- }
- };
- }
- else {
- return new ValueSourceScorer(reader, this) {
- @Override
- public boolean matchesValue(int doc) {
- double docVal = doubleVal(doc);
- return docVal > l && docVal < u;
- }
- };
- }
- }
-
- @Override
public ValueFiller getValueFiller() {
return new ValueFiller() {
private final MutableValueDouble mval = new MutableValueDouble();
Modified: lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/IntFieldSource.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/IntFieldSource.java?rev=1528167&r1=1528166&r2=1528167&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/IntFieldSource.java (original)
+++ lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/IntFieldSource.java Tue Oct 1 18:14:00 2013
@@ -101,40 +101,6 @@ public class IntFieldSource extends Fiel
}
@Override
- public ValueSourceScorer getRangeScorer(IndexReader reader, String lowerVal, String upperVal, boolean includeLower, boolean includeUpper) {
- int lower,upper;
-
- // instead of using separate comparison functions, adjust the endpoints.
-
- if (lowerVal==null) {
- lower = Integer.MIN_VALUE;
- } else {
- lower = Integer.parseInt(lowerVal);
- if (!includeLower && lower < Integer.MAX_VALUE) lower++;
- }
-
- if (upperVal==null) {
- upper = Integer.MAX_VALUE;
- } else {
- upper = Integer.parseInt(upperVal);
- if (!includeUpper && upper > Integer.MIN_VALUE) upper--;
- }
-
- final int ll = lower;
- final int uu = upper;
-
- return new ValueSourceScorer(reader, this) {
- @Override
- public boolean matchesValue(int doc) {
- int val = arr.get(doc);
- // only check for deleted if it's the default value
- // if (val==0 && reader.isDeleted(doc)) return false;
- return val >= ll && val <= uu;
- }
- };
- }
-
- @Override
public ValueFiller getValueFiller() {
return new ValueFiller() {
private final MutableValueInt mval = new MutableValueInt();
Modified: lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/LongFieldSource.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/LongFieldSource.java?rev=1528167&r1=1528166&r2=1528167&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/LongFieldSource.java (original)
+++ lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/LongFieldSource.java Tue Oct 1 18:14:00 2013
@@ -91,37 +91,8 @@ public class LongFieldSource extends Fie
}
@Override
- public ValueSourceScorer getRangeScorer(IndexReader reader, String lowerVal, String upperVal, boolean includeLower, boolean includeUpper) {
- long lower,upper;
-
- // instead of using separate comparison functions, adjust the endpoints.
-
- if (lowerVal==null) {
- lower = Long.MIN_VALUE;
- } else {
- lower = externalToLong(lowerVal);
- if (!includeLower && lower < Long.MAX_VALUE) lower++;
- }
-
- if (upperVal==null) {
- upper = Long.MAX_VALUE;
- } else {
- upper = externalToLong(upperVal);
- if (!includeUpper && upper > Long.MIN_VALUE) upper--;
- }
-
- final long ll = lower;
- final long uu = upper;
-
- return new ValueSourceScorer(reader, this) {
- @Override
- public boolean matchesValue(int doc) {
- long val = arr.get(doc);
- // only check for deleted if it's the default value
- // if (val==0 && reader.isDeleted(doc)) return false;
- return val >= ll && val <= uu;
- }
- };
+ protected long externalToLong(String extVal) {
+ return LongFieldSource.this.externalToLong(extVal);
}
@Override