Extract functions: avoid creating joda objects for each row

Project: http://git-wip-us.apache.org/repos/asf/incubator-drill/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-drill/commit/ef8b59a2
Tree: http://git-wip-us.apache.org/repos/asf/incubator-drill/tree/ef8b59a2
Diff: http://git-wip-us.apache.org/repos/asf/incubator-drill/diff/ef8b59a2

Branch: refs/heads/master
Commit: ef8b59a2cc84bb8ce9ac474239db278abc9e70d9
Parents: 63b0da3
Author: vkorukanti <[email protected]>
Authored: Thu Apr 3 00:46:57 2014 -0700
Committer: Jacques Nadeau <[email protected]>
Committed: Sat Apr 19 18:07:11 2014 -0700

----------------------------------------------------------------------
 .../src/main/codegen/templates/Extract.java     | 99 ++++++++++----------
 1 file changed, 52 insertions(+), 47 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ef8b59a2/exec/java-exec/src/main/codegen/templates/Extract.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/codegen/templates/Extract.java 
b/exec/java-exec/src/main/codegen/templates/Extract.java
index d0e0afe..bef0614 100644
--- a/exec/java-exec/src/main/codegen/templates/Extract.java
+++ b/exec/java-exec/src/main/codegen/templates/Extract.java
@@ -31,8 +31,8 @@ import org.apache.drill.exec.record.RecordBatch;
 
 public class ${className} {
 
-<#list extract.toTypes as toUnit>
 <#list extract.fromTypes as fromUnit>
+<#list extract.toTypes as toUnit>
 <#if fromUnit == "Date" || fromUnit == "Time" || fromUnit == "TimeStamp">
   @FunctionTemplate(name = "extract${toUnit}", scope = 
FunctionTemplate.FunctionScope.SIMPLE,
       nulls = FunctionTemplate.NullHandling.NULL_IF_NULL)
@@ -40,23 +40,26 @@ public class ${className} {
 
     @Param ${fromUnit}Holder in;
     @Output BigIntHolder out;
+    @Workspace org.joda.time.MutableDateTime dateTime;
 
-    public void setup(RecordBatch incoming) { }
+    public void setup(RecordBatch incoming) {
+      dateTime = new 
org.joda.time.MutableDateTime(org.joda.time.DateTimeZone.UTC);
+    }
 
     public void eval() {
-      org.joda.time.MutableDateTime temp = new 
org.joda.time.MutableDateTime(in.value, org.joda.time.DateTimeZone.UTC);
+      dateTime.setMillis(in.value);
     <#if toUnit == "Second">
-      out.value = temp.getSecondOfMinute();
+      out.value = dateTime.getSecondOfMinute();
     <#elseif toUnit = "Minute">
-      out.value = temp.getMinuteOfHour();
+      out.value = dateTime.getMinuteOfHour();
     <#elseif toUnit = "Hour">
-      out.value = temp.getHourOfDay();
+      out.value = dateTime.getHourOfDay();
     <#elseif toUnit = "Day">
-      out.value = temp.getDayOfMonth();
+      out.value = dateTime.getDayOfMonth();
     <#elseif toUnit = "Month">
-      out.value = temp.getMonthOfYear();
+      out.value = dateTime.getMonthOfYear();
     <#elseif toUnit = "Year">
-      out.value = temp.getYear();
+      out.value = dateTime.getYear();
     </#if>
     }
   }
@@ -71,48 +74,50 @@ public class ${className} {
     public void setup(RecordBatch incoming) { }
 
     public void eval() {
-    <#if fromUnit == "Interval">
-
-      int years  = (in.months / 
org.apache.drill.exec.expr.fn.impl.DateUtility.yearsToMonths);
-      int months = (in.months % 
org.apache.drill.exec.expr.fn.impl.DateUtility.yearsToMonths);
-
-      int millis = in.milliSeconds;
-
-      int hours  = millis / 
(org.apache.drill.exec.expr.fn.impl.DateUtility.hoursToMillis);
-      millis     = millis % 
(org.apache.drill.exec.expr.fn.impl.DateUtility.hoursToMillis);
-
-      int minutes = millis / 
(org.apache.drill.exec.expr.fn.impl.DateUtility.minutesToMillis);
-      millis      = millis % 
(org.apache.drill.exec.expr.fn.impl.DateUtility.minutesToMillis);
-
-      int seconds = millis / 
(org.apache.drill.exec.expr.fn.impl.DateUtility.secondsToMillis);
-      millis      = millis % 
(org.apache.drill.exec.expr.fn.impl.DateUtility.secondsToMillis);
-      org.joda.time.Period temp = new org.joda.time.Period(years, months, 0, 
in.days, hours, minutes, seconds, millis);
-
-    <#elseif fromUnit == "IntervalDay">
-
-      int millis = in.milliSeconds;
-
-      int hours  = millis / 
(org.apache.drill.exec.expr.fn.impl.DateUtility.hoursToMillis);
-      millis     = millis % 
(org.apache.drill.exec.expr.fn.impl.DateUtility.hoursToMillis);
-
-      int minutes = millis / 
(org.apache.drill.exec.expr.fn.impl.DateUtility.minutesToMillis);
-      millis      = millis % 
(org.apache.drill.exec.expr.fn.impl.DateUtility.minutesToMillis);
-
-      int seconds = millis / 
(org.apache.drill.exec.expr.fn.impl.DateUtility.secondsToMillis);
-      millis      = millis % 
(org.apache.drill.exec.expr.fn.impl.DateUtility.secondsToMillis);
-      org.joda.time.Period temp = new org.joda.time.Period(0, 0, 0, in.days, 
hours, minutes, seconds, millis);
-
+  <#if fromUnit == "Interval">
+    <#if toUnit == "Year">
+      out.value = (in.months / 
org.apache.drill.exec.expr.fn.impl.DateUtility.yearsToMonths);
+    <#elseif toUnit == "Month">
+      out.value = (in.months % 
org.apache.drill.exec.expr.fn.impl.DateUtility.yearsToMonths);
+    <#elseif toUnit == "Day">
+      out.value = in.days;
+    <#elseif toUnit == "Hour">
+      out.value = 
in.milliSeconds/(org.apache.drill.exec.expr.fn.impl.DateUtility.hoursToMillis);
+    <#elseif toUnit == "Minute">
+      int millis = in.milliSeconds % 
(org.apache.drill.exec.expr.fn.impl.DateUtility.hoursToMillis);
+      out.value = millis / 
(org.apache.drill.exec.expr.fn.impl.DateUtility.minutesToMillis);
+    <#elseif toUnit == "Second">
+      int millis = in.milliSeconds % 
(org.apache.drill.exec.expr.fn.impl.DateUtility.hoursToMillis);
+      millis = millis % 
(org.apache.drill.exec.expr.fn.impl.DateUtility.minutesToMillis);
+      out.value = millis / 
(org.apache.drill.exec.expr.fn.impl.DateUtility.secondsToMillis);
+    </#if>
+  <#elseif fromUnit == "IntervalDay">
+    <#if toUnit == "Year" || toUnit == "Month">
+      out.value = 0;
+    <#elseif toUnit == "Day">
+      out.value = in.days;
+    <#elseif toUnit == "Hour">
+      out.value = 
in.milliSeconds/(org.apache.drill.exec.expr.fn.impl.DateUtility.hoursToMillis);
+    <#elseif toUnit == "Minute">
+      int millis = in.milliSeconds % 
(org.apache.drill.exec.expr.fn.impl.DateUtility.hoursToMillis);
+      out.value = millis / 
(org.apache.drill.exec.expr.fn.impl.DateUtility.minutesToMillis);
+    <#elseif toUnit == "Second">
+      int millis = in.milliSeconds % 
(org.apache.drill.exec.expr.fn.impl.DateUtility.hoursToMillis);
+      millis = millis % 
(org.apache.drill.exec.expr.fn.impl.DateUtility.minutesToMillis);
+      out.value = millis / 
(org.apache.drill.exec.expr.fn.impl.DateUtility.secondsToMillis);
+    </#if>
+  <#else> <#-- IntervalYear type -->
+    <#if toUnit == "Year">
+      out.value = (in.value / 
org.apache.drill.exec.expr.fn.impl.DateUtility.yearsToMonths);
+    <#elseif toUnit == "Month">
+      out.value = (in.value % 
org.apache.drill.exec.expr.fn.impl.DateUtility.yearsToMonths);
     <#else>
-
-      int years  = (in.value / 
org.apache.drill.exec.expr.fn.impl.DateUtility.yearsToMonths);
-      int months = (in.value % 
org.apache.drill.exec.expr.fn.impl.DateUtility.yearsToMonths);
-      org.joda.time.Period temp = new org.joda.time.Period(years, months, 0, 
0, 0, 0, 0, 0);
-
+      out.value = 0;
     </#if>
-      out.value = temp.get${toUnit}s();
+  </#if>
     }
   }
-  </#if>
+</#if>
 </#list>
 </#list>
 }
\ No newline at end of file

Reply via email to