SOLR-2768: new "mod(x,y)" function for computing the modulus of two value sources

git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1379225 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Chris M. Hostetter 2012-08-30 23:29:00 +00:00
parent 7754d1d105
commit 59847bd6d2
3 changed files with 27 additions and 0 deletions

View File

@ -48,6 +48,9 @@ New Features
* SOLR-3670: New CountFieldValuesUpdateProcessorFactory makes it easy to index * SOLR-3670: New CountFieldValuesUpdateProcessorFactory makes it easy to index
the number of values in another field for later use at query time. (hossman) the number of values in another field for later use at query time. (hossman)
* SOLR-2768: new "mod(x,y)" function for computing the modulus of two value
sources. (hossman)
Optimizations Optimizations
---------------------- ----------------------

View File

@ -177,6 +177,23 @@ public abstract class ValueSourceParser implements NamedListInitializedPlugin {
return new DivFloatFunction(a, b); return new DivFloatFunction(a, b);
} }
}); });
addParser("mod", new ValueSourceParser() {
@Override
public ValueSource parse(FunctionQParser fp) throws ParseException {
ValueSource a = fp.parseValueSource();
ValueSource b = fp.parseValueSource();
return new DualFloatFunction(a, b) {
@Override
protected String name() {
return "mod";
}
@Override
protected float func(int doc, FunctionValues aVals, FunctionValues bVals) {
return aVals.floatVal(doc) % bVals.floatVal(doc);
}
};
}
});
addParser("map", new ValueSourceParser() { addParser("map", new ValueSourceParser() {
@Override @Override
public ValueSource parse(FunctionQParser fp) throws ParseException { public ValueSource parse(FunctionQParser fp) throws ParseException {

View File

@ -329,6 +329,13 @@ public class QueryEqualityTest extends SolrTestCaseJ4 {
"div(field(foo_i), sub(4,bar_i))"); "div(field(foo_i), sub(4,bar_i))");
} }
public void testFuncMod() throws Exception {
assertFuncEquals("mod(5,4)", "mod(5, 4)");
assertFuncEquals("mod(foo_i,4)", "mod(foo_i, 4)",
"mod(field('foo_i'), 4)");
assertFuncEquals("mod(foo_i,sub(4,field('bar_i')))",
"mod(field(foo_i), sub(4,bar_i))");
}
public void testFuncMap() throws Exception { public void testFuncMap() throws Exception {
assertFuncEquals("map(field(foo_i), 0, 45, 100)", assertFuncEquals("map(field(foo_i), 0, 45, 100)",
"map(foo_i, 0.0, 45, 100)"); "map(foo_i, 0.0, 45, 100)");