You are viewing a plain text version of this content. The canonical link for it is here.
Posted to solr-commits@lucene.apache.org by sh...@apache.org on 2009/03/24 09:09:49 UTC

svn commit: r757682 - in /lucene/solr/trunk/contrib/dataimporthandler: CHANGES.txt src/main/java/org/apache/solr/handler/dataimport/EvaluatorBag.java src/test/java/org/apache/solr/handler/dataimport/TestEvaluatorBag.java

Author: shalin
Date: Tue Mar 24 08:09:49 2009
New Revision: 757682

URL: http://svn.apache.org/viewvc?rev=757682&view=rev
Log:
SOLR-1083 -- An Evaluator for escaping query characters

Modified:
    lucene/solr/trunk/contrib/dataimporthandler/CHANGES.txt
    lucene/solr/trunk/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/EvaluatorBag.java
    lucene/solr/trunk/contrib/dataimporthandler/src/test/java/org/apache/solr/handler/dataimport/TestEvaluatorBag.java

Modified: lucene/solr/trunk/contrib/dataimporthandler/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/contrib/dataimporthandler/CHANGES.txt?rev=757682&r1=757681&r2=757682&view=diff
==============================================================================
--- lucene/solr/trunk/contrib/dataimporthandler/CHANGES.txt (original)
+++ lucene/solr/trunk/contrib/dataimporthandler/CHANGES.txt Tue Mar 24 08:09:49 2009
@@ -117,6 +117,9 @@
               location of the data source.
               (Jason Shepherd, Noble Paul via shalin)
 
+28.SOLR-1083: An Evaluator for escaping query characters.
+              (Noble Paul, shalin)
+
 Optimizations
 ----------------------
 1. SOLR-846:  Reduce memory consumption during delta import by removing keys when used

Modified: lucene/solr/trunk/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/EvaluatorBag.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/EvaluatorBag.java?rev=757682&r1=757681&r2=757682&view=diff
==============================================================================
--- lucene/solr/trunk/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/EvaluatorBag.java (original)
+++ lucene/solr/trunk/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/EvaluatorBag.java Tue Mar 24 08:09:49 2009
@@ -23,6 +23,7 @@
 import static org.apache.solr.handler.dataimport.DataImportHandlerException.wrapAndThrow;
 import static org.apache.solr.handler.dataimport.DocBuilder.loadClass;
 import org.apache.solr.util.DateMathParser;
+import org.apache.solr.client.solrj.util.ClientUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -50,6 +51,8 @@
 
   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";
   static final Pattern FORMAT_METHOD = Pattern
           .compile("^(\\w*?)\\((.*?)\\)$");
@@ -75,6 +78,27 @@
   }
 
   /**
+   * <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
    * using a <code>VariableResolver</code> </p>
    *
@@ -165,6 +189,7 @@
     evaluators.put(DATE_FORMAT_EVALUATOR, getDateFormatEvaluator());
     evaluators.put(SQL_ESCAPE_EVALUATOR, getSqlEscapingEvaluator());
     evaluators.put(URL_ENCODE_EVALUATOR, getUrlEvaluator());
+    evaluators.put(ESCAPE_SOLR_QUERY_CHARS, getSolrQueryEscapingEvaluator());
     SolrCore core = docBuilder == null ? null : docBuilder.dataImporter.getCore();
     for (Map<String, String> map : fn) {
       try {

Modified: lucene/solr/trunk/contrib/dataimporthandler/src/test/java/org/apache/solr/handler/dataimport/TestEvaluatorBag.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/contrib/dataimporthandler/src/test/java/org/apache/solr/handler/dataimport/TestEvaluatorBag.java?rev=757682&r1=757681&r2=757682&view=diff
==============================================================================
--- lucene/solr/trunk/contrib/dataimporthandler/src/test/java/org/apache/solr/handler/dataimport/TestEvaluatorBag.java (original)
+++ lucene/solr/trunk/contrib/dataimporthandler/src/test/java/org/apache/solr/handler/dataimport/TestEvaluatorBag.java Tue Mar 24 08:09:49 2009
@@ -80,6 +80,7 @@
     Evaluator urlEvaluator = EvaluatorBag.getUrlEvaluator();
     runTests(urlTests, urlEvaluator);
   }
+
   @Test
   public void parseParams() {
     Map m = new HashMap();
@@ -91,19 +92,32 @@
     Assert.assertEquals("B",((EvaluatorBag.VariableWrapper)l.get(1)).resolve());
     Assert.assertEquals("hello!",l.get(2));
     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
-  @Ignore
   public void testGetDateFormatEvaluator() {
     Evaluator dateFormatEval = EvaluatorBag.getDateFormatEvaluator();
     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));
 
     Map<String, Object> map = new HashMap<String, Object>();