Repository: incubator-drill Updated Branches: refs/heads/master 894037ab6 -> efa3274bd
DRILL-993: Remove redundant comparison in comparison operator generated by FreeMarker template. Project: http://git-wip-us.apache.org/repos/asf/incubator-drill/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-drill/commit/27d3e714 Tree: http://git-wip-us.apache.org/repos/asf/incubator-drill/tree/27d3e714 Diff: http://git-wip-us.apache.org/repos/asf/incubator-drill/diff/27d3e714 Branch: refs/heads/master Commit: 27d3e7145a7b1a43015fd4cb745e425443411b8c Parents: 894037a Author: Jinfeng Ni <[email protected]> Authored: Tue Jun 17 15:02:32 2014 -0700 Committer: Jinfeng Ni <[email protected]> Committed: Wed Jun 18 07:13:16 2014 -0700 ---------------------------------------------------------------------- .../codegen/templates/ComparisonFunctions.java | 56 ++++++++++-- .../templates/DateIntervalFunctions.java | 91 +++++++++----------- 2 files changed, 94 insertions(+), 53 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/27d3e714/exec/java-exec/src/main/codegen/templates/ComparisonFunctions.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/codegen/templates/ComparisonFunctions.java b/exec/java-exec/src/main/codegen/templates/ComparisonFunctions.java index 9b0028c..b57a37f 100644 --- a/exec/java-exec/src/main/codegen/templates/ComparisonFunctions.java +++ b/exec/java-exec/src/main/codegen/templates/ComparisonFunctions.java @@ -141,10 +141,15 @@ public class GCompare${left}${right}{ break sout; } </#if> - + + <#if type.mode == "var" > int cmp; <@compareBlock mode=type.mode left=left right=right output="cmp" nullCompare=false/> out.value = cmp == -1 ? 1 : 0; + <#else> + out.value = left.value < right.value ? 1 : 0; + </#if> + } } } @@ -173,9 +178,14 @@ public class GCompare${left}${right}{ } </#if> + <#if type.mode == "var" > int cmp; <@compareBlock mode=type.mode left=left right=right output="cmp" nullCompare=false/> out.value = cmp < 1 ? 1 : 0; + <#else> + out.value = left.value <= right.value ? 1 : 0; + </#if> + } } } @@ -204,9 +214,14 @@ public class GCompare${left}${right}{ } </#if> + <#if type.mode == "var" > int cmp; <@compareBlock mode=type.mode left=left right=right output="cmp" nullCompare=false/> out.value = cmp == 1 ? 1 : 0; + <#else> + out.value = left.value > right.value ? 1 : 0; + </#if> + } } } @@ -235,9 +250,14 @@ public class GCompare${left}${right}{ } </#if> + <#if type.mode == "var" > int cmp; <@compareBlock mode=type.mode left=left right=right output="cmp" nullCompare=false/> out.value = cmp > -1 ? 1 : 0; + <#else> + out.value = left.value >= right.value ? 1 : 0; + </#if> + } } } @@ -265,10 +285,31 @@ public class GCompare${left}${right}{ break sout; } </#if> - - int cmp; - <@compareBlock mode=type.mode left=left right=right output="cmp" nullCompare=false/> - out.value = cmp == 0 ? 1 : 0; + + <#if type.mode == "var" > +outside: + { + if (left.end - left.start == right.end - right.start) { + int n = left.end - left.start; + int l = left.start; + int r = right.start; + while (n-- !=0) { + byte leftByte = left.buffer.getByte(l++); + byte rightByte = right.buffer.getByte(r++); + if (leftByte != rightByte) { + out.value = 0; + break outside; + } + } + out.value = 1; + } else { + out.value = 0; + } + } + <#else> + out.value = left.value == right.value ? 1 : 0; + </#if> + } } } @@ -297,9 +338,14 @@ public class GCompare${left}${right}{ } </#if> + <#if type.mode == "var" > int cmp; <@compareBlock mode=type.mode left=left right=right output="cmp" nullCompare=false/> out.value = cmp == 0 ? 0 : 1; + <#else> + out.value = left.value != right.value ? 1 : 0; + </#if> + } } http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/27d3e714/exec/java-exec/src/main/codegen/templates/DateIntervalFunctions.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/codegen/templates/DateIntervalFunctions.java b/exec/java-exec/src/main/codegen/templates/DateIntervalFunctions.java index 7afbcfc..a4bea61 100644 --- a/exec/java-exec/src/main/codegen/templates/DateIntervalFunctions.java +++ b/exec/java-exec/src/main/codegen/templates/DateIntervalFunctions.java @@ -27,6 +27,8 @@ package org.apache.drill.exec.expr.fn.impl; +import javax.xml.ws.Holder; + import org.apache.drill.exec.expr.DrillSimpleFunc; import org.apache.drill.exec.expr.annotations.FunctionTemplate; import org.apache.drill.exec.expr.annotations.FunctionTemplate.NullHandling; @@ -63,9 +65,7 @@ public class GCompare${type.name}Functions { public void setup(RecordBatch b) {} public void eval() { - - int cmp = (left.value > right.value) ? 1 : ((left.value < right.value) ? -1 : 0); - out.value = (cmp == -1) ? 1 : 0; + out.value = left.value < right.value ? 1 : 0; } } @@ -79,9 +79,7 @@ public class GCompare${type.name}Functions { public void setup(RecordBatch b) {} public void eval() { - - int cmp = (left.value > right.value) ? 1 : ((left.value < right.value) ? -1 : 0); - out.value = (cmp < 1) ? 1 : 0; + out.value = left.value <= right.value ? 1 : 0; } } @@ -95,9 +93,7 @@ public class GCompare${type.name}Functions { public void setup(RecordBatch b) {} public void eval() { - - int cmp = (left.value > right.value) ? 1 : ((left.value < right.value) ? -1 : 0); - out.value = (cmp == 1) ? 1 : 0; + out.value = left.value > right.value ? 1 : 0; } } @@ -111,8 +107,7 @@ public class GCompare${type.name}Functions { public void setup(RecordBatch b) {} public void eval() { - int cmp = (left.value > right.value) ? 1 : ((left.value < right.value) ? -1 : 0); - out.value = (cmp > -1) ? 1 : 0; + out.value = left.value >= right.value ? 1 : 0; } } @@ -126,9 +121,7 @@ public class GCompare${type.name}Functions { public void setup(RecordBatch b) {} public void eval() { - - int cmp = (left.value > right.value) ? 1 : ((left.value < right.value) ? -1 : 0); - out.value = (cmp == 0) ? 1 : 0; + out.value = left.value == right.value ? 1 : 0; } } @@ -142,8 +135,7 @@ public class GCompare${type.name}Functions { public void setup(RecordBatch b) {} public void eval() { - int cmp = (left.value > right.value) ? 1 : ((left.value < right.value) ? -1 : 0); - out.value = (cmp != 0) ? 1 : 0; + out.value = left.value != right.value ? 1 : 0; } } @@ -174,6 +166,23 @@ outside: { } </#macro> +<#macro intervalConvertBlock left right leftMonths leftDays leftMillis rightMonths rightDays rightMillis> + org.joda.time.MutableDateTime leftDate = new org.joda.time.MutableDateTime(1970, 1, 1, 0, 0, 0, 0, org.joda.time.DateTimeZone.UTC); + org.joda.time.MutableDateTime rightDate = new org.joda.time.MutableDateTime(1970, 1, 1, 0, 0, 0, 0, org.joda.time.DateTimeZone.UTC); + + // Left and right date have the same starting point (epoch), add the interval period and compare the two + leftDate.addMonths(${leftMonths}); + leftDate.addDays(${leftDays}); + leftDate.add(${leftMillis}); + + rightDate.addMonths(${rightMonths}); + rightDate.addDays(${rightDays}); + rightDate.add(${rightMillis}); + + long leftMS = leftDate.getMillis(); + long rightMS = rightDate.getMillis(); +</#macro> + <@pp.changeOutputFile name="/org/apache/drill/exec/expr/fn/impl/GCompare${type.name}Functions.java" /> <#include "/@includes/license.ftl" /> @@ -222,15 +231,13 @@ public class GCompare${type.name}Functions { public void eval() { - int cmp; - <#if type.name == "Interval"> - <@intervalCompareBlock left="left" right="right" leftMonths="left.months" leftDays="left.days" leftMillis="left.milliSeconds" rightMonths="right.months" rightDays="right.days" rightMillis="right.milliSeconds" output="cmp"/> + <@intervalConvertBlock left="left" right="right" leftMonths="left.months" leftDays="left.days" leftMillis="left.milliSeconds" rightMonths="right.months" rightDays="right.days" rightMillis="right.milliSeconds"/> <#else> - <@intervalCompareBlock left="left" right="right" leftMonths="0" leftDays="left.days" leftMillis="left.milliSeconds" rightMonths="0" rightDays="right.days" rightMillis="right.milliSeconds" output="cmp"/> + <@intervalConvertBlock left="left" right="right" leftMonths="0" leftDays="left.days" leftMillis="left.milliSeconds" rightMonths="0" rightDays="right.days" rightMillis="right.milliSeconds"/> </#if> - out.value = (cmp == -1) ? 1 : 0; + out.value = leftMS < rightMS ? 1 : 0; } } @@ -245,15 +252,13 @@ public class GCompare${type.name}Functions { public void eval() { - int cmp; - <#if type.name == "Interval"> - <@intervalCompareBlock left="left" right="right" leftMonths="left.months" leftDays="left.days" leftMillis="left.milliSeconds" rightMonths="right.months" rightDays="right.days" rightMillis="right.milliSeconds" output="cmp"/> + <@intervalConvertBlock left="left" right="right" leftMonths="left.months" leftDays="left.days" leftMillis="left.milliSeconds" rightMonths="right.months" rightDays="right.days" rightMillis="right.milliSeconds"/> <#else> - <@intervalCompareBlock left="left" right="right" leftMonths="0" leftDays="left.days" leftMillis="left.milliSeconds" rightMonths="0" rightDays="right.days" rightMillis="right.milliSeconds" output="cmp"/> + <@intervalConvertBlock left="left" right="right" leftMonths="0" leftDays="left.days" leftMillis="left.milliSeconds" rightMonths="0" rightDays="right.days" rightMillis="right.milliSeconds"/> </#if> - out.value = (cmp < 1) ? 1 : 0; + out.value = leftMS <= rightMS ? 1 : 0; } } @@ -268,15 +273,13 @@ public class GCompare${type.name}Functions { public void eval() { - int cmp; - <#if type.name == "Interval"> - <@intervalCompareBlock left="left" right="right" leftMonths="left.months" leftDays="left.days" leftMillis="left.milliSeconds" rightMonths="right.months" rightDays="right.days" rightMillis="right.milliSeconds" output="cmp"/> + <@intervalConvertBlock left="left" right="right" leftMonths="left.months" leftDays="left.days" leftMillis="left.milliSeconds" rightMonths="right.months" rightDays="right.days" rightMillis="right.milliSeconds"/> <#else> - <@intervalCompareBlock left="left" right="right" leftMonths="0" leftDays="left.days" leftMillis="left.milliSeconds" rightMonths="0" rightDays="right.days" rightMillis="right.milliSeconds" output="cmp"/> + <@intervalConvertBlock left="left" right="right" leftMonths="0" leftDays="left.days" leftMillis="left.milliSeconds" rightMonths="0" rightDays="right.days" rightMillis="right.milliSeconds"/> </#if> - out.value = (cmp == 1) ? 1 : 0; + out.value = leftMS > rightMS ? 1 : 0; } } @@ -291,15 +294,13 @@ public class GCompare${type.name}Functions { public void eval() { - int cmp; - <#if type.name == "Interval"> - <@intervalCompareBlock left="left" right="right" leftMonths="left.months" leftDays="left.days" leftMillis="left.milliSeconds" rightMonths="right.months" rightDays="right.days" rightMillis="right.milliSeconds" output="cmp"/> + <@intervalConvertBlock left="left" right="right" leftMonths="left.months" leftDays="left.days" leftMillis="left.milliSeconds" rightMonths="right.months" rightDays="right.days" rightMillis="right.milliSeconds"/> <#else> - <@intervalCompareBlock left="left" right="right" leftMonths="0" leftDays="left.days" leftMillis="left.milliSeconds" rightMonths="0" rightDays="right.days" rightMillis="right.milliSeconds" output="cmp"/> + <@intervalConvertBlock left="left" right="right" leftMonths="0" leftDays="left.days" leftMillis="left.milliSeconds" rightMonths="0" rightDays="right.days" rightMillis="right.milliSeconds"/> </#if> - out.value = (cmp > -1) ? 1 : 0; + out.value = leftMS >= rightMS ? 1 : 0; } } @@ -313,16 +314,13 @@ public class GCompare${type.name}Functions { public void setup(RecordBatch b) {} public void eval() { - - int cmp; - <#if type.name == "Interval"> - <@intervalCompareBlock left="left" right="right" leftMonths="left.months" leftDays="left.days" leftMillis="left.milliSeconds" rightMonths="right.months" rightDays="right.days" rightMillis="right.milliSeconds" output="cmp"/> + <@intervalConvertBlock left="left" right="right" leftMonths="left.months" leftDays="left.days" leftMillis="left.milliSeconds" rightMonths="right.months" rightDays="right.days" rightMillis="right.milliSeconds"/> <#else> - <@intervalCompareBlock left="left" right="right" leftMonths="0" leftDays="left.days" leftMillis="left.milliSeconds" rightMonths="0" rightDays="right.days" rightMillis="right.milliSeconds" output="cmp"/> + <@intervalConvertBlock left="left" right="right" leftMonths="0" leftDays="left.days" leftMillis="left.milliSeconds" rightMonths="0" rightDays="right.days" rightMillis="right.milliSeconds"/> </#if> - out.value = (cmp == 0) ? 1 : 0; + out.value = leftMS == rightMS ? 1 : 0; } } @@ -336,16 +334,13 @@ public class GCompare${type.name}Functions { public void setup(RecordBatch b) {} public void eval() { - - int cmp; - <#if type.name == "Interval"> - <@intervalCompareBlock left="left" right="right" leftMonths="left.months" leftDays="left.days" leftMillis="left.milliSeconds" rightMonths="right.months" rightDays="right.days" rightMillis="right.milliSeconds" output="cmp"/> + <@intervalConvertBlock left="left" right="right" leftMonths="left.months" leftDays="left.days" leftMillis="left.milliSeconds" rightMonths="right.months" rightDays="right.days" rightMillis="right.milliSeconds"/> <#else> - <@intervalCompareBlock left="left" right="right" leftMonths="0" leftDays="left.days" leftMillis="left.milliSeconds" rightMonths="0" rightDays="right.days" rightMillis="right.milliSeconds" output="cmp"/> + <@intervalConvertBlock left="left" right="right" leftMonths="0" leftDays="left.days" leftMillis="left.milliSeconds" rightMonths="0" rightDays="right.days" rightMillis="right.milliSeconds"/> </#if> - out.value = (cmp != 0) ? 1 : 0; + out.value = leftMS != rightMS ? 1 : 0; } } }
