From 275b34706960c3052374a671bfe2a496470df648 Mon Sep 17 00:00:00 2001 From: Vaclav Loffelmann Date: Mon, 9 Mar 2015 15:50:22 +0100 Subject: [PATCH] PHOENIX-1722 Speedup CONVERT_TZ function --- .../function/ConvertTimezoneFunction.java | 40 +++++++++---------- pom.xml | 2 +- 2 files changed, 20 insertions(+), 22 deletions(-) diff --git a/phoenix-core/src/main/java/org/apache/phoenix/expression/function/ConvertTimezoneFunction.java b/phoenix-core/src/main/java/org/apache/phoenix/expression/function/ConvertTimezoneFunction.java index dcde31f186d..bfe4c8736f9 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/expression/function/ConvertTimezoneFunction.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/expression/function/ConvertTimezoneFunction.java @@ -15,12 +15,10 @@ */ package org.apache.phoenix.expression.function; -import java.sql.Date; import java.sql.SQLException; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.TimeZone; import org.apache.hadoop.hbase.io.ImmutableBytesWritable; import org.apache.hadoop.hbase.util.Bytes; import org.apache.phoenix.expression.Expression; @@ -30,6 +28,8 @@ import org.apache.phoenix.schema.types.PDate; import org.apache.phoenix.schema.types.PVarchar; import org.apache.phoenix.schema.tuple.Tuple; +import org.joda.time.DateTimeZone; +import org.joda.time.tz.CachedDateTimeZone; /** * Build in function CONVERT_TZ(date, 'timezone_from', 'timezone_to). Convert date from one timezone to @@ -43,7 +43,7 @@ public class ConvertTimezoneFunction extends ScalarFunction { public static final String NAME = "CONVERT_TZ"; - private final Map cachedTimeZones = new HashMap(); + private static final Map cachedJodaTimeZones = new HashMap<>(); public ConvertTimezoneFunction() { } @@ -62,38 +62,36 @@ public boolean evaluate(Tuple tuple, ImmutableBytesWritable ptr) { if (!children.get(0).evaluate(tuple, ptr)) { return false; } - - Date dateo = (Date) PDate.INSTANCE.toObject(ptr, children.get(0).getSortOrder()); - Long date = dateo.getTime(); + long date = PDate.INSTANCE.getCodec().decodeLong(ptr, children.get(0).getSortOrder()); if (!children.get(1).evaluate(tuple, ptr)) { return false; } - TimeZone timezoneFrom = getTimezoneFromCache(Bytes.toString(ptr.get(), ptr.getOffset(), ptr.getLength())); + DateTimeZone timezoneFrom = getJodaTimezoneFromCache(ptr.copyBytes()); if (!children.get(2).evaluate(tuple, ptr)) { return false; } - TimeZone timezoneTo = TimeZone.getTimeZone(Bytes.toString(ptr.get(), ptr.getOffset(), ptr.getLength())); - - long dateInUtc = date - timezoneFrom.getOffset(date); - long dateInTo = dateInUtc + timezoneTo.getOffset(dateInUtc); - - ptr.set(PDate.INSTANCE.toBytes(new Date(dateInTo))); + DateTimeZone timezoneTo = getJodaTimezoneFromCache(ptr.copyBytes()); + long convertedDate = date - timezoneFrom.getOffset(date) + timezoneTo.getOffset(date); + PDate.INSTANCE.getCodec().encodeLong(convertedDate, ptr); return true; } - private TimeZone getTimezoneFromCache(String timezone) throws IllegalDataException { - if (!cachedTimeZones.containsKey(timezone)) { - TimeZone tz = TimeZone.getTimeZone(timezone); - if (!tz.getID().equals(timezone)) { - throw new IllegalDataException("Invalid timezone " + timezone); + private static DateTimeZone getJodaTimezoneFromCache(byte[] timezone) { + DateTimeZone jodaTimezone = cachedJodaTimeZones.get(timezone); + if (jodaTimezone == null) { + try { + //cache timezone instance + DateTimeZone tz = CachedDateTimeZone.forID(Bytes.toString(timezone)); + cachedJodaTimeZones.put(timezone, tz); + return tz; + } catch (IllegalArgumentException e) { + throw new IllegalDataException("Unknown timezone " + Bytes.toString(timezone), e); } - cachedTimeZones.put(timezone, tz); - return tz; } - return cachedTimeZones.get(timezone); + return jodaTimezone; } @Override diff --git a/pom.xml b/pom.xml index 9194dc06384..0ccfd540c89 100644 --- a/pom.xml +++ b/pom.xml @@ -102,7 +102,7 @@ 1.7 2.04 3.2.1 - 2.3 + 2.7 1.8.5