mirror of https://github.com/apache/lucene.git
SOLR-1083 -- An Evaluator for escaping query characters
git-svn-id: https://svn.apache.org/repos/asf/lucene/solr/trunk@757682 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
6bd4909102
commit
dfdc5a80e1
|
@ -117,6 +117,9 @@ New Features
|
||||||
location of the data source.
|
location of the data source.
|
||||||
(Jason Shepherd, Noble Paul via shalin)
|
(Jason Shepherd, Noble Paul via shalin)
|
||||||
|
|
||||||
|
28.SOLR-1083: An Evaluator for escaping query characters.
|
||||||
|
(Noble Paul, shalin)
|
||||||
|
|
||||||
Optimizations
|
Optimizations
|
||||||
----------------------
|
----------------------
|
||||||
1. SOLR-846: Reduce memory consumption during delta import by removing keys when used
|
1. SOLR-846: Reduce memory consumption during delta import by removing keys when used
|
||||||
|
|
|
@ -23,6 +23,7 @@ import static org.apache.solr.handler.dataimport.DataImportHandlerException.SEVE
|
||||||
import static org.apache.solr.handler.dataimport.DataImportHandlerException.wrapAndThrow;
|
import static org.apache.solr.handler.dataimport.DataImportHandlerException.wrapAndThrow;
|
||||||
import static org.apache.solr.handler.dataimport.DocBuilder.loadClass;
|
import static org.apache.solr.handler.dataimport.DocBuilder.loadClass;
|
||||||
import org.apache.solr.util.DateMathParser;
|
import org.apache.solr.util.DateMathParser;
|
||||||
|
import org.apache.solr.client.solrj.util.ClientUtils;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
@ -50,6 +51,8 @@ public class EvaluatorBag {
|
||||||
|
|
||||||
public static final String URL_ENCODE_EVALUATOR = "encodeUrl";
|
public static final String URL_ENCODE_EVALUATOR = "encodeUrl";
|
||||||
|
|
||||||
|
public static final String ESCAPE_SOLR_QUERY_CHARS = "escapeQueryChars";
|
||||||
|
|
||||||
public static final String SQL_ESCAPE_EVALUATOR = "escapeSql";
|
public static final String SQL_ESCAPE_EVALUATOR = "escapeSql";
|
||||||
static final Pattern FORMAT_METHOD = Pattern
|
static final Pattern FORMAT_METHOD = Pattern
|
||||||
.compile("^(\\w*?)\\((.*?)\\)$");
|
.compile("^(\\w*?)\\((.*?)\\)$");
|
||||||
|
@ -74,6 +77,27 @@ public class EvaluatorBag {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p/>Returns an <code>Evaluator</code> instance meant to be used for escaping reserved characters in Solr
|
||||||
|
* queries</p>
|
||||||
|
*
|
||||||
|
* @return an <code>Evaluator</code> instance capable of escaping reserved characters in solr queries.
|
||||||
|
*
|
||||||
|
* @see org.apache.solr.client.solrj.util.ClientUtils#escapeQueryChars(String)
|
||||||
|
*/
|
||||||
|
public static Evaluator getSolrQueryEscapingEvaluator() {
|
||||||
|
return new Evaluator() {
|
||||||
|
public String evaluate(String expression, Context context) {
|
||||||
|
List l = parseParams(expression, context.getVariableResolver());
|
||||||
|
if (l.size() != 1) {
|
||||||
|
throw new DataImportHandlerException(SEVERE, "'escapeQueryChars' must have at least one parameter ");
|
||||||
|
}
|
||||||
|
String s = l.get(0).toString();
|
||||||
|
return ClientUtils.escapeQueryChars(s);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p/> Returns an <code>Evaluator</code> instance capable of URL-encoding expressions. The expressions are evaluated
|
* <p/> Returns an <code>Evaluator</code> instance capable of URL-encoding expressions. The expressions are evaluated
|
||||||
* using a <code>VariableResolver</code> </p>
|
* using a <code>VariableResolver</code> </p>
|
||||||
|
@ -165,6 +189,7 @@ public class EvaluatorBag {
|
||||||
evaluators.put(DATE_FORMAT_EVALUATOR, getDateFormatEvaluator());
|
evaluators.put(DATE_FORMAT_EVALUATOR, getDateFormatEvaluator());
|
||||||
evaluators.put(SQL_ESCAPE_EVALUATOR, getSqlEscapingEvaluator());
|
evaluators.put(SQL_ESCAPE_EVALUATOR, getSqlEscapingEvaluator());
|
||||||
evaluators.put(URL_ENCODE_EVALUATOR, getUrlEvaluator());
|
evaluators.put(URL_ENCODE_EVALUATOR, getUrlEvaluator());
|
||||||
|
evaluators.put(ESCAPE_SOLR_QUERY_CHARS, getSolrQueryEscapingEvaluator());
|
||||||
SolrCore core = docBuilder == null ? null : docBuilder.dataImporter.getCore();
|
SolrCore core = docBuilder == null ? null : docBuilder.dataImporter.getCore();
|
||||||
for (Map<String, String> map : fn) {
|
for (Map<String, String> map : fn) {
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -80,6 +80,7 @@ public class TestEvaluatorBag {
|
||||||
Evaluator urlEvaluator = EvaluatorBag.getUrlEvaluator();
|
Evaluator urlEvaluator = EvaluatorBag.getUrlEvaluator();
|
||||||
runTests(urlTests, urlEvaluator);
|
runTests(urlTests, urlEvaluator);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void parseParams() {
|
public void parseParams() {
|
||||||
Map m = new HashMap();
|
Map m = new HashMap();
|
||||||
|
@ -91,19 +92,32 @@ public class TestEvaluatorBag {
|
||||||
Assert.assertEquals("B",((EvaluatorBag.VariableWrapper)l.get(1)).resolve());
|
Assert.assertEquals("B",((EvaluatorBag.VariableWrapper)l.get(1)).resolve());
|
||||||
Assert.assertEquals("hello!",l.get(2));
|
Assert.assertEquals("hello!",l.get(2));
|
||||||
Assert.assertEquals("ds,o,u'za",l.get(3));
|
Assert.assertEquals("ds,o,u'za",l.get(3));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testEscapeSolrQueryFunction() {
|
||||||
|
final VariableResolverImpl resolver = new VariableResolverImpl();
|
||||||
|
ContextImpl context = new ContextImpl(null, resolver, null, 0, Collections.EMPTY_MAP, null, null);
|
||||||
|
resolver.context = context;
|
||||||
|
Map m= new HashMap();
|
||||||
|
m.put("query","c:t");
|
||||||
|
resolver.addNamespace("dataimporter.functions", EvaluatorBag
|
||||||
|
.getFunctionsNamespace(Collections.EMPTY_LIST, null));
|
||||||
|
resolver.addNamespace("e",m);
|
||||||
|
String s = resolver
|
||||||
|
.replaceTokens("${dataimporter.functions.escapeQueryChars(e.query)}");
|
||||||
|
org.junit.Assert.assertEquals("c\\:t", s);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test method for {@link EvaluatorBag#getDateFormatEvaluator()}.
|
* Test method for {@link EvaluatorBag#getDateFormatEvaluator()}.
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
@Ignore
|
|
||||||
public void testGetDateFormatEvaluator() {
|
public void testGetDateFormatEvaluator() {
|
||||||
Evaluator dateFormatEval = EvaluatorBag.getDateFormatEvaluator();
|
Evaluator dateFormatEval = EvaluatorBag.getDateFormatEvaluator();
|
||||||
resolver.context = new ContextImpl(null, resolver, null, 0, Collections.EMPTY_MAP, null, null);
|
resolver.context = new ContextImpl(null, resolver, null, 0, Collections.EMPTY_MAP, null, null);
|
||||||
|
|
||||||
assertEquals(new SimpleDateFormat("yyyy-MM-dd").format(new Date()),
|
assertEquals(new SimpleDateFormat("yyyy-MM-dd HH:mm").format(new Date()),
|
||||||
dateFormatEval.evaluate("'NOW','yyyy-MM-dd HH:mm'", resolver.context));
|
dateFormatEval.evaluate("'NOW','yyyy-MM-dd HH:mm'", resolver.context));
|
||||||
|
|
||||||
Map<String, Object> map = new HashMap<String, Object>();
|
Map<String, Object> map = new HashMap<String, Object>();
|
||||||
|
|
Loading…
Reference in New Issue