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
