You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by jd...@apache.org on 2013/01/07 19:54:21 UTC

svn commit: r1429957 - in /lucene/dev/trunk/solr: ./ contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/ contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/

Author: jdyer
Date: Mon Jan  7 18:54:21 2013
New Revision: 1429957

URL: http://svn.apache.org/viewvc?rev=1429957&view=rev
Log:
SOLR-2201:  DIH "formatDate" evaluator timezone support

Modified:
    lucene/dev/trunk/solr/CHANGES.txt
    lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DateFormatEvaluator.java
    lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/FileListEntityProcessor.java
    lucene/dev/trunk/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestBuiltInEvaluators.java

Modified: lucene/dev/trunk/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/CHANGES.txt?rev=1429957&r1=1429956&r2=1429957&view=diff
==============================================================================
--- lucene/dev/trunk/solr/CHANGES.txt (original)
+++ lucene/dev/trunk/solr/CHANGES.txt Mon Jan  7 18:54:21 2013
@@ -204,6 +204,9 @@ New Features
   solrconfig.xml (defaults to 2 MiB). Solr now works out of the box with
   e.g. Tomcat, JBoss,...  (Uwe Schindler, Dawid Weiss, Alex Rocher)
 
+* SOLR-2201: DIH's "formatDate" function now supports a timezone as an optional
+  fourth parameter (James Dyer, Mark Waddle)
+
 Optimizations
 ----------------------
 

Modified: lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DateFormatEvaluator.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DateFormatEvaluator.java?rev=1429957&r1=1429956&r2=1429957&view=diff
==============================================================================
--- lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DateFormatEvaluator.java (original)
+++ lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DateFormatEvaluator.java Mon Jan  7 18:54:21 2013
@@ -7,9 +7,11 @@ import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.Set;
 import java.util.TimeZone;
 import java.util.WeakHashMap;
 
@@ -52,13 +54,16 @@ public class DateFormatEvaluator extends
   public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
   Map<DateFormatCacheKey, SimpleDateFormat> cache = new WeakHashMap<DateFormatCacheKey, SimpleDateFormat>();
   Map<String, Locale> availableLocales = new HashMap<String, Locale>();
+  Set<String> availableTimezones = new HashSet<String>();
   
   class DateFormatCacheKey {
-    DateFormatCacheKey(Locale l, String df) {
+    DateFormatCacheKey(Locale l, TimeZone tz, String df) {
       this.locale = l;
+      this.timezone = tz;
       this.dateFormat = df;
     }
     Locale locale;
+    TimeZone timezone;
     String dateFormat;
   }
   
@@ -66,12 +71,16 @@ public class DateFormatEvaluator extends
     for (Locale locale : Locale.getAvailableLocales()) {
       availableLocales.put(locale.toString(), locale);
     }
+    for (String tz : TimeZone.getAvailableIDs()) {
+      availableTimezones.add(tz);
+    }
   }
-  private SimpleDateFormat getDateFormat(String pattern, Locale locale) {
-    DateFormatCacheKey dfck = new DateFormatCacheKey(locale, pattern);
+  private SimpleDateFormat getDateFormat(String pattern, TimeZone timezone, Locale locale) {
+    DateFormatCacheKey dfck = new DateFormatCacheKey(locale, timezone, pattern);
     SimpleDateFormat sdf = cache.get(dfck);
     if(sdf == null) {
       sdf = new SimpleDateFormat(pattern, locale);
+      sdf.setTimeZone(timezone);
       cache.put(dfck, sdf);
     }
     return sdf;
@@ -81,8 +90,8 @@ public class DateFormatEvaluator extends
   @Override
   public String evaluate(String expression, Context context) {
     List<Object> l = parseParams(expression, context.getVariableResolver());
-    if (l.size() < 2 || l.size() > 3) {
-      throw new DataImportHandlerException(SEVERE, "'formatDate()' must have two or three parameters ");
+    if (l.size() < 2 || l.size() > 4) {
+      throw new DataImportHandlerException(SEVERE, "'formatDate()' must have two, three or four parameters ");
     }
     Object o = l.get(0);
     Object format = l.get(1);
@@ -92,7 +101,7 @@ public class DateFormatEvaluator extends
       format = o.toString();
     }    
     Locale locale = Locale.ROOT;
-    if(l.size()==3) {
+    if(l.size()>2) {
       Object localeObj = l.get(2);
       String localeStr = null;
       if (localeObj  instanceof VariableWrapper) {
@@ -104,9 +113,24 @@ public class DateFormatEvaluator extends
       if(locale==null) {
         throw new DataImportHandlerException(SEVERE, "Unsupported locale: " + localeStr);
       }
-    }    
+    }
+    TimeZone tz = TimeZone.getDefault();
+    if(l.size()==4) {
+      Object tzObj = l.get(3);
+      String tzStr = null;
+      if (tzObj  instanceof VariableWrapper) {
+        tzStr = ((VariableWrapper) tzObj).resolve().toString();        
+      } else {
+        tzStr = tzObj.toString();
+      }
+      if(availableTimezones.contains(tzStr)) {
+        tz = TimeZone.getTimeZone(tzStr);
+      } else {
+        throw new DataImportHandlerException(SEVERE, "Unsupported Timezone: " + tzStr);
+      }
+    }
     String dateFmt = format.toString();
-    SimpleDateFormat fmt = getDateFormat(dateFmt, locale);
+    SimpleDateFormat fmt = getDateFormat(dateFmt, tz, locale);
     Date date = null;
     if (o instanceof VariableWrapper) {
       VariableWrapper variableWrapper = (VariableWrapper) o;
@@ -116,7 +140,7 @@ public class DateFormatEvaluator extends
       } else {
         String s = variableval.toString();
         try {
-          date = getDateFormat(DEFAULT_DATE_FORMAT, locale).parse(s);
+          date = getDateFormat(DEFAULT_DATE_FORMAT, tz, locale).parse(s);
         } catch (ParseException exp) {
           wrapAndThrow(SEVERE, exp, "Invalid expression for date");
         }
@@ -125,15 +149,15 @@ public class DateFormatEvaluator extends
       String datemathfmt = o.toString();
       datemathfmt = datemathfmt.replaceAll("NOW", "");
       try {
-        date = getDateMathParser(locale).parseMath(datemathfmt);
+        date = getDateMathParser(locale, tz).parseMath(datemathfmt);
       } catch (ParseException e) {
         wrapAndThrow(SEVERE, e, "Invalid expression for date");
       }
     }
     return fmt.format(date);
   }
-  static DateMathParser getDateMathParser(Locale l) {
-    return new DateMathParser(TimeZone.getDefault(), l) {
+  static DateMathParser getDateMathParser(Locale l, TimeZone tz) {
+    return new DateMathParser(tz, l) {
       @Override
       public Date getNow() {
         return new Date();

Modified: lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/FileListEntityProcessor.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/FileListEntityProcessor.java?rev=1429957&r1=1429956&r2=1429957&view=diff
==============================================================================
--- lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/FileListEntityProcessor.java (original)
+++ lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/FileListEntityProcessor.java Mon Jan  7 18:54:21 2013
@@ -157,7 +157,7 @@ public class FileListEntityProcessor ext
       String expr = null;
       expr = m.group(1).replaceAll("NOW", "");
       try {
-        return DateFormatEvaluator.getDateMathParser(Locale.ROOT).parseMath(expr);
+        return DateFormatEvaluator.getDateMathParser(Locale.ROOT, TimeZone.getDefault()).parseMath(expr);
       } catch (ParseException exp) {
         throw new DataImportHandlerException(DataImportHandlerException.SEVERE,
                 "Invalid expression for date", exp);

Modified: lucene/dev/trunk/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestBuiltInEvaluators.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestBuiltInEvaluators.java?rev=1429957&r1=1429956&r2=1429957&view=diff
==============================================================================
--- lucene/dev/trunk/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestBuiltInEvaluators.java (original)
+++ lucene/dev/trunk/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestBuiltInEvaluators.java Mon Jan  7 18:54:21 2013
@@ -107,7 +107,13 @@ public class TestBuiltInEvaluators exten
     org.junit.Assert.assertEquals("c\\:t", s);
     
   }
-
+  
+  private Date getNow() {
+    Calendar calendar = new GregorianCalendar(TimeZone.getTimeZone("GMT"),
+        Locale.ROOT);
+    calendar.add(Calendar.DAY_OF_YEAR, -2);
+    return calendar.getTime();
+  }
   
   @Test
   public void testDateFormatEvaluator() {
@@ -116,23 +122,26 @@ public class TestBuiltInEvaluators exten
         Context.FULL_DUMP, Collections.<String,Object> emptyMap(), null, null);
     String currentLocale = Locale.getDefault().toString();
     {
-      Calendar calendar = new GregorianCalendar(TimeZone.getTimeZone("GMT"),
-          Locale.ROOT);
-      calendar.add(Calendar.DAY_OF_YEAR, -2);
-      Date d = calendar.getTime();
       {
-        String sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.ROOT).format(d);
-        String dfe = dateFormatEval.evaluate("'NOW-2DAYS','yyyy-MM-dd HH:mm'", context);
+        SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd HH", Locale.ROOT);
+        String sdf = sdfDate.format(getNow());
+        String dfe = dateFormatEval.evaluate("'NOW-2DAYS','yyyy-MM-dd HH'", context);
         assertEquals(sdf,dfe);
       }
       {
-        String sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.getDefault()).format(d);
-        String dfe = dateFormatEval.evaluate("'NOW-2DAYS','yyyy-MM-dd HH:mm','"+ currentLocale + "'", context);
+        SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd HH", Locale.getDefault());
+        String sdf = sdfDate.format(getNow());
+        String dfe = dateFormatEval.evaluate("'NOW-2DAYS','yyyy-MM-dd HH','"+ currentLocale + "'", context);
         assertEquals(sdf,dfe);
+        for(String tz : TimeZone.getAvailableIDs()) {          
+          sdfDate.setTimeZone(TimeZone.getTimeZone(tz));
+          sdf = sdfDate.format(getNow());
+          dfe = dateFormatEval.evaluate("'NOW-2DAYS','yyyy-MM-dd HH','" + currentLocale + "','" + tz + "'", context);
+          assertEquals(sdf,dfe);          
+        }
       }
     }
-    Date d = new Date();
-    
+    Date d = new Date();    
     Map<String,Object> map = new HashMap<String,Object>();
     map.put("key", d);
     resolver.addNamespace("A", map);
@@ -144,6 +153,15 @@ public class TestBuiltInEvaluators exten
         new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.getDefault()).format(d),
         dateFormatEval.evaluate("A.key, 'yyyy-MM-dd HH:mm','" + currentLocale
             + "'", context));
+    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.getDefault());
+    for(String tz : TimeZone.getAvailableIDs()) {
+      sdf.setTimeZone(TimeZone.getTimeZone(tz));
+      assertEquals(
+          sdf.format(d),
+          dateFormatEval.evaluate("A.key, 'yyyy-MM-dd HH:mm','" + currentLocale + "', '" + tz + "'", context));     
+      
+    }
+    
     
   }