Any idea on how to pass string constants to a function? When I do I get: java.lang.RuntimeException: Exception during query at org.apache.solr.util.AbstractSolrTestCase.assertQ(AbstractSolrTestCase.java:218) at org.apache.solr.util.AbstractSolrTestCase.assertQ(AbstractSolrTestCase.java:201) at org.apache.solr.search.function.distance.DistanceFunctionTest.testHaversine(DistanceFunctionTest.java:55) Caused by: org.apache.solr.common.SolrException: undefined field tv8nj9qj92me at org.apache.solr.schema.IndexSchema.getField(IndexSchema.java:1077) at org.apache.solr.search.FunctionQParser.parseValueSource(FunctionQParser.java:249) at org.apache.solr.search.FunctionQParser.parseValueSource(FunctionQParser.java:173) at org.apache.solr.search.ValueSourceParser$20.parse(ValueSourceParser.java:341) at org.apache.solr.search.FunctionQParser.parseValueSource(FunctionQParser.java:245) at org.apache.solr.search.FunctionQParser.parseValueSource(FunctionQParser.java:173) at org.apache.solr.search.FunctionQParser.parse(FunctionQParser.java:40) at org.apache.solr.search.QParser.getQuery(QParser.java:131) at org.apache.solr.handler.component.QueryComponent.prepare(QueryComponent.java:89) at org.apache.solr.handler.component.SearchHandler.handleRequestBody(SearchHandler.java:174) at org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:131)
FWIW, tv8nj9qj92me is a geohash. The code in question is: protected ValueSource parseValueSource(boolean doConsumeDelimiter) throws ParseException { ValueSource valueSource; int ch = sp.peek(); if (ch>='0' && ch<='9' || ch=='.' || ch=='+' || ch=='-') { valueSource = new ConstValueSource(sp.getFloat()); } else { String id = sp.getId(); if (sp.opt("(")) { // a function... look it up. ValueSourceParser argParser = req.getCore().getValueSourceParser(id); if (argParser==null) { throw new ParseException("Unknown function " + id + " in FunctionQuery(" + sp + ")"); } valueSource = argParser.parse(this); sp.expect(")"); } else { SchemaField f = req.getSchema().getField(id); // <<<<<<<<<<<<<<<<<<< Exception here. valueSource = f.getType().getValueSource(f, this); } } if (doConsumeDelimiter) consumeArgumentDelimiter(); return valueSource; } Seems like we could change this to allow the id to be a constant and pass it along if it isn't a field and wrap it in a literal (new function) or constant. Thoughts? -Grant