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));
+
+ }
+
}