You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by sh...@apache.org on 2013/12/02 09:33:34 UTC

svn commit: r1546926 - in /lucene/dev/trunk: lucene/ lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/ lucene/queries/src/test/org/apache/lucene/queries/function/ solr/ solr/core/src/java/org/apache/solr/search/ solr/core/src/test...

Author: shalin
Date: Mon Dec  2 08:33:33 2013
New Revision: 1546926

URL: http://svn.apache.org/r1546926
Log:
SOLR-1871: The 'map' function query accepts a ValueSource as target and default value

Modified:
    lucene/dev/trunk/lucene/CHANGES.txt
    lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/RangeMapFloatFunction.java
    lucene/dev/trunk/lucene/queries/src/test/org/apache/lucene/queries/function/TestValueSources.java
    lucene/dev/trunk/solr/CHANGES.txt
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/ValueSourceParser.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/function/TestFunctionQuery.java

Modified: lucene/dev/trunk/lucene/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/CHANGES.txt?rev=1546926&r1=1546925&r2=1546926&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/CHANGES.txt (original)
+++ lucene/dev/trunk/lucene/CHANGES.txt Mon Dec  2 08:33:33 2013
@@ -73,6 +73,9 @@ New Features
   (missing the term, weight or payload).  (Areek Zillur via
   Mike McCandless)
 
+* SOLR-1871: The RangeMapFloatFunction accepts an arbitrary ValueSource
+  as target and default values. (Chris Harris, shalin)
+
 Build
 
 * LUCENE-5217: Maven config: get dependencies from Ant+Ivy config; disable

Modified: lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/RangeMapFloatFunction.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/RangeMapFloatFunction.java?rev=1546926&r1=1546925&r2=1546926&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/RangeMapFloatFunction.java (original)
+++ lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/RangeMapFloatFunction.java Mon Dec  2 08:33:33 2013
@@ -27,8 +27,8 @@ import java.io.IOException;
 import java.util.Map;
 
 /**
- * <code>LinearFloatFunction</code> implements a linear function over
- * another {@link org.apache.lucene.queries.function.ValueSource}.
+ * <code>RangeMapFloatFunction</code> implements a map function over
+ * another {@link ValueSource} whose values fall within min and max inclusive to target.
  * <br>
  * Normally Used as an argument to a {@link org.apache.lucene.queries.function.FunctionQuery}
  *
@@ -38,10 +38,14 @@ public class RangeMapFloatFunction exten
   protected final ValueSource source;
   protected final float min;
   protected final float max;
-  protected final float target;
-  protected final Float defaultVal;
+  protected final ValueSource target;
+  protected final ValueSource defaultVal;
 
   public RangeMapFloatFunction(ValueSource source, float min, float max, float target, Float def) {
+    this(source, min, max, new ConstValueSource(target), def == null ? null : new ConstValueSource(def));
+  }
+
+  public RangeMapFloatFunction(ValueSource source, float min, float max, ValueSource target, ValueSource def) {
     this.source = source;
     this.min = min;
     this.max = max;
@@ -51,21 +55,23 @@ public class RangeMapFloatFunction exten
 
   @Override
   public String description() {
-    return "map(" + source.description() + "," + min + "," + max + "," + target + ")";
+    return "map(" + source.description() + "," + min + "," + max + "," + target.description() + ")";
   }
 
   @Override
   public FunctionValues getValues(Map context, AtomicReaderContext readerContext) throws IOException {
     final FunctionValues vals =  source.getValues(context, readerContext);
+    final FunctionValues targets = target.getValues(context, readerContext);
+    final FunctionValues defaults = (this.defaultVal == null) ? null : defaultVal.getValues(context, readerContext);
     return new FloatDocValues(this) {
       @Override
       public float floatVal(int doc) {
         float val = vals.floatVal(doc);
-        return (val>=min && val<=max) ? target : (defaultVal == null ? val : defaultVal);
+        return (val>=min && val<=max) ? targets.floatVal(doc) : (defaultVal == null ? val : defaults.floatVal(doc));
       }
       @Override
       public String toString(int doc) {
-        return "map(" + vals.toString(doc) + ",min=" + min + ",max=" + max + ",target=" + target + ")";
+        return "map(" + vals.toString(doc) + ",min=" + min + ",max=" + max + ",target=" + targets.toString(doc) + ")";
       }
     };
   }
@@ -82,8 +88,7 @@ public class RangeMapFloatFunction exten
     h += Float.floatToIntBits(min);
     h ^= (h << 14) | (h >>> 19);
     h += Float.floatToIntBits(max);
-    h ^= (h << 13) | (h >>> 20);
-    h += Float.floatToIntBits(target);
+    h += target.hashCode();
     if (defaultVal != null)
       h += defaultVal.hashCode();
     return h;
@@ -95,7 +100,7 @@ public class RangeMapFloatFunction exten
     RangeMapFloatFunction other = (RangeMapFloatFunction)o;
     return  this.min == other.min
          && this.max == other.max
-         && this.target == other.target
+         && this.target.equals(other.target)
          && this.source.equals(other.source)
          && (this.defaultVal == other.defaultVal || (this.defaultVal != null && this.defaultVal.equals(other.defaultVal)));
   }

Modified: lucene/dev/trunk/lucene/queries/src/test/org/apache/lucene/queries/function/TestValueSources.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/queries/src/test/org/apache/lucene/queries/function/TestValueSources.java?rev=1546926&r1=1546925&r2=1546926&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/queries/src/test/org/apache/lucene/queries/function/TestValueSources.java (original)
+++ lucene/dev/trunk/lucene/queries/src/test/org/apache/lucene/queries/function/TestValueSources.java Mon Dec  2 08:33:33 2013
@@ -276,6 +276,10 @@ public class TestValueSources extends Lu
     assertHits(new FunctionQuery(new RangeMapFloatFunction(new FloatFieldSource("float"),
         5, 6, 1, 0f)),
         new float[] { 1f, 0f });
+    assertHits(new FunctionQuery(new RangeMapFloatFunction(new FloatFieldSource("float"),
+        5, 6, new SumFloatFunction(new ValueSource[] {new ConstValueSource(1f), new ConstValueSource(2f)}),
+        new ConstValueSource(11f))),
+        new float[] { 3f, 11f });
   }
   
   public void testReciprocal() throws Exception {
@@ -338,8 +342,8 @@ public class TestValueSources extends Lu
       expectedDocs[i] = i;
       expected[i] = new ScoreDoc(i, scores[i]);
     }
-    TopDocs docs = searcher.search(q, documents.size(), 
-        new Sort(new SortField("id", SortField.Type.STRING)));
+    TopDocs docs = searcher.search(q, null, documents.size(),
+        new Sort(new SortField("id", SortField.Type.STRING)), true, false);
     CheckHits.checkHits(random(), q, "", searcher, expectedDocs);
     CheckHits.checkHitsQuery(q, expected, docs.scoreDocs, expectedDocs);
     CheckHits.checkExplanations(q, "", searcher);

Modified: lucene/dev/trunk/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/CHANGES.txt?rev=1546926&r1=1546925&r2=1546926&view=diff
==============================================================================
--- lucene/dev/trunk/solr/CHANGES.txt (original)
+++ lucene/dev/trunk/solr/CHANGES.txt Mon Dec  2 08:33:33 2013
@@ -112,6 +112,9 @@ New Features
 * SOLR-5023: Add support for deleteInstanceDir to be passed from SolrJ for Core
   Unload action. (Lyubov Romanchuk, shalin)
 
+* SOLR-1871: The 'map' function query accepts a ValueSource as target and
+  default value. (Chris Harris, shalin)
+
 Bug Fixes
 ----------------------
 

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/ValueSourceParser.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/ValueSourceParser.java?rev=1546926&r1=1546925&r2=1546926&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/ValueSourceParser.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/ValueSourceParser.java Mon Dec  2 08:33:33 2013
@@ -198,8 +198,8 @@ public abstract class ValueSourceParser 
         ValueSource source = fp.parseValueSource();
         float min = fp.parseFloat();
         float max = fp.parseFloat();
-        float target = fp.parseFloat();
-        Float def = fp.hasMoreArguments() ? fp.parseFloat() : null;
+        ValueSource target = fp.parseValueSource();
+        ValueSource def = fp.hasMoreArguments() ? fp.parseValueSource() : null;
         return new RangeMapFloatFunction(source, min, max, target, def);
       }
     });

Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/function/TestFunctionQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/function/TestFunctionQuery.java?rev=1546926&r1=1546925&r2=1546926&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/function/TestFunctionQuery.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/function/TestFunctionQuery.java Mon Dec  2 08:33:33 2013
@@ -172,6 +172,9 @@ public class TestFunctionQuery extends S
 
     singleTest(field,"map(\0,0,0,500)",10,10, -4,-4, 0,500);
     singleTest(field,"map(\0,-4,5,500)",100,100, -4,500, 0,500, 5,500, 10,10, 25,25);
+    singleTest(field,"map(\0,0,0,sum(\0,500))",10,10, -4,-4, 0,500);
+    singleTest(field,"map(\0,0,0,sum(\0,500),sum(\0,1))",10,11, -4,-3, 0,500);
+    singleTest(field,"map(\0,-4,5,sum(\0,1))",100,100, -4,-3, 0,1, 5,6, 10,10, 25,25);
 
     singleTest(field,"scale(\0,-1,1)",-4,-1, 100,1, 0,-0.9230769f);
     singleTest(field,"scale(\0,-10,1000)",-4,-10, 100,1000, 0,28.846153f);