mirror of https://github.com/apache/lucene.git
SOLR-2335: New field(...) function syntax for refering to complex field names (containing whitespace or special characters)
git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1091516 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
904b8a4b77
commit
5e04c0bab9
|
@ -121,6 +121,8 @@ New Features
|
|||
* SOLR-2338: Add support for using <similarity/> in a schema's fieldType,
|
||||
for customizing scoring on a per-field basis. (hossman, yonik, rmuir)
|
||||
|
||||
* SOLR-2335: New 'field("...")' function syntax for refering to complex
|
||||
field names (containing whitespace or special characters) in functions.
|
||||
|
||||
Optimizations
|
||||
----------------------
|
||||
|
|
|
@ -335,6 +335,15 @@ public abstract class ValueSourceParser implements NamedListInitializedPlugin {
|
|||
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
|
||||
|
|
|
@ -71,16 +71,14 @@ public class TestFunctionQuery extends SolrTestCaseJ4 {
|
|||
|
||||
// replace \0 with the field name and create a parseable string
|
||||
public String func(String field, String template) {
|
||||
StringBuilder sb = new StringBuilder("_val_:\"");
|
||||
StringBuilder sb = new StringBuilder("{!func}");
|
||||
for (char ch : template.toCharArray()) {
|
||||
if (ch=='\0') {
|
||||
sb.append(field);
|
||||
continue;
|
||||
}
|
||||
if (ch=='"') sb.append('\\');
|
||||
sb.append(ch);
|
||||
}
|
||||
sb.append('"');
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
|
@ -520,5 +518,38 @@ public class TestFunctionQuery extends SolrTestCaseJ4 {
|
|||
dofunc("atan2(.25,.5)", Math.atan2(.25,.5));
|
||||
}
|
||||
|
||||
/**
|
||||
* verify that both the field("...") value source parser as well as
|
||||
* ExternalFileField work with esoteric field names
|
||||
*/
|
||||
@Test
|
||||
public void testExternalFieldValueSourceParser() {
|
||||
|
||||
String field = "CoMpleX \" fieldName _extf";
|
||||
String fieldAsFunc = "field(\"CoMpleX \\\" fieldName _extf\")";
|
||||
|
||||
float[] ids = {100,-4,0,10,25,5,77,23,55,-78,-45,-24,63,78,94,22,34,54321,261,-627};
|
||||
|
||||
createIndex(null,ids);
|
||||
|
||||
// Unsorted field, largest first
|
||||
makeExternalFile(field, "54321=543210\n0=-999\n25=250","UTF-8");
|
||||
// test identity (straight field value)
|
||||
singleTest(fieldAsFunc, "\0", 54321, 543210, 0,-999, 25,250, 100, 1);
|
||||
Object orig = FileFloatSource.onlyForTesting;
|
||||
singleTest(fieldAsFunc, "log(\0)");
|
||||
// make sure the values were cached
|
||||
assertTrue(orig == FileFloatSource.onlyForTesting);
|
||||
singleTest(fieldAsFunc, "sqrt(\0)");
|
||||
assertTrue(orig == FileFloatSource.onlyForTesting);
|
||||
|
||||
makeExternalFile(fieldAsFunc, "0=1","UTF-8");
|
||||
assertU(adoc("id", "10000")); // will get same reader if no index change
|
||||
assertU(commit());
|
||||
singleTest(fieldAsFunc, "sqrt(\0)");
|
||||
assertTrue(orig != FileFloatSource.onlyForTesting);
|
||||
|
||||
purgeFieldCache(FieldCache.DEFAULT); // avoid FC insanity
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue