blob: 1907305ad62b031c6380ac61a9c52f96764952ec [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import org.apache.drill.exec.expr.annotations.Workspace;
<@pp.dropOutputFile />
<@pp.changeOutputFile name="/org/apache/drill/exec/expr/fn/impl/GDateTimeTruncateFunctions.java" />
<#include "/@includes/license.ftl" />
package org.apache.drill.exec.expr.fn.impl;
import org.apache.drill.exec.expr.DrillSimpleFunc;
import org.apache.drill.exec.expr.annotations.FunctionTemplate;
import org.apache.drill.exec.expr.annotations.FunctionTemplate.NullHandling;
import org.apache.drill.exec.expr.annotations.Output;
import org.apache.drill.exec.expr.annotations.Workspace;
import org.apache.drill.exec.expr.annotations.Param;
import org.apache.drill.exec.expr.holders.*;
import org.apache.drill.exec.record.RecordBatch;
import io.netty.buffer.ByteBuf;
/*
* This class is generated using freemarker and the ${.template_name} template.
*/
public class GDateTimeTruncateFunctions {
<#list dateIntervalFunc.truncInputTypes as type> <#-- Start InputType Loop -->
/**
* This class merely act as a placeholder so that Calcite allows 'trunc('truncationUnit', col)'
* function in SQL.
*/
@SuppressWarnings("unused")
@FunctionTemplate(name = "date_trunc", scope = FunctionTemplate.FunctionScope.SIMPLE, nulls = NullHandling.NULL_IF_NULL)
public static class G${type}DummyDateTrunc implements DrillSimpleFunc {
@Param VarCharHolder left;
@Param ${type}Holder right;
@Output ${type}Holder out;
@Override
public void setup() { }
@Override
public void eval() { }
}
<#list dateIntervalFunc.truncUnits as toUnit> <#-- Start UnitType Loop -->
<#-- Filter out unsupported combinations -->
<#if !(type == "Time" && toUnit == "Week") &&
!(type == "Interval" && toUnit == "Week") &&
!(type == "IntervalDay" && toUnit == "Week") &&
!(type == "IntervalYear" && toUnit == "Week")
> <#-- Truncate by Week not supported for Time input type -->
@SuppressWarnings("unused")
@FunctionTemplate(names = "date_trunc_${toUnit}", scope = FunctionTemplate.FunctionScope.SIMPLE, nulls = NullHandling.NULL_IF_NULL)
public static class G${type}${toUnit}DateTrunc implements DrillSimpleFunc {
@Param ${type}Holder right;
@Output ${type}Holder out;
@Workspace org.joda.time.MutableDateTime dateTime;
<#if toUnit == "Quarter" || toUnit == "Decade" || toUnit == "Century" || toUnit == "Millennium">
@Workspace org.joda.time.MutableDateTime dateTime2;
</#if>
public void setup() {
dateTime = new org.joda.time.MutableDateTime(org.joda.time.DateTimeZone.UTC);
<#if toUnit == "Quarter" || toUnit == "Decade" || toUnit == "Century" || toUnit == "Millennium">
dateTime2 = new org.joda.time.MutableDateTime(org.joda.time.DateTimeZone.UTC);
</#if>
}
public void eval() {
<#if type == "Time"> <#-- Start InputType -->
<#if toUnit == "Hour"> <#-- Start UnitType -->
dateTime.setMillis(right.value);
dateTime.setRounding(dateTime.getChronology().hourOfDay());
out.value = (int) dateTime.getMillis();
<#elseif toUnit == "Minute">
dateTime.setMillis(right.value);
dateTime.setRounding(dateTime.getChronology().minuteOfHour());
out.value = (int) dateTime.getMillis();
<#elseif toUnit == "Second">
dateTime.setMillis(right.value);
dateTime.setRounding(dateTime.getChronology().secondOfMinute());
out.value = (int) dateTime.getMillis();
<#else>
<#-- For all other units truncate the whole thing -->
out.value = 0;
</#if> <#-- End UnitType -->
<#elseif type == "Date">
<#if toUnit == "Second" || toUnit == "Minute" || toUnit == "Hour" || toUnit == "Day"> <#-- Start UnitType -->
// No truncation as there is no time part in date
out.value = right.value;
<#elseif toUnit == "Year">
dateTime.setMillis(right.value);
dateTime.setRounding(dateTime.getChronology().year());
out.value = dateTime.getMillis();
<#elseif toUnit == "Month">
dateTime.setMillis(right.value);
dateTime.setRounding(dateTime.getChronology().monthOfYear());
out.value = dateTime.getMillis();
<#elseif toUnit == "Week">
dateTime.setMillis(right.value);
dateTime.setRounding(dateTime.getChronology().weekOfWeekyear());
out.value = dateTime.getMillis();
<#elseif toUnit == "Quarter">
dateTime.setMillis(right.value);
int month = dateTime.getMonthOfYear();
dateTime.setRounding(dateTime.getChronology().year());
dateTime2.setMillis(dateTime.getMillis());
dateTime2.add(org.joda.time.DurationFieldType.months(), ((month-1)/3)*3);
out.value = dateTime2.getMillis();
<#elseif toUnit == "Decade">
dateTime.setMillis(right.value);
int year = dateTime.getYear();
dateTime.setRounding(dateTime.getChronology().centuryOfEra());
dateTime2.setMillis(dateTime.getMillis());
dateTime2.add(org.joda.time.DurationFieldType.years(), ((year%100)/10)*10);
out.value = dateTime2.getMillis();
<#elseif toUnit == "Century">
dateTime.setMillis(right.value);
dateTime.add(org.joda.time.DurationFieldType.years(), -1);
dateTime.setRounding(dateTime.getChronology().centuryOfEra());
dateTime2.setMillis(dateTime.getMillis());
dateTime2.add(org.joda.time.DurationFieldType.years(), 1);
out.value = dateTime2.getMillis();
<#elseif toUnit == "Millennium">
dateTime.setMillis(right.value);
int year = dateTime.getYear();
dateTime.setRounding(dateTime.getChronology().era());
dateTime2.setMillis(dateTime.getMillis());
dateTime2.add(org.joda.time.DurationFieldType.years(), ((year-1)/1000)*1000);
out.value = dateTime2.getMillis();
</#if> <#-- End UnitType -->
<#elseif type == "TimeStamp">
<#if toUnit == "Year"> <#-- Start UnitType -->
dateTime.setMillis(right.value);
dateTime.setRounding(dateTime.getChronology().year());
out.value = dateTime.getMillis();
<#elseif toUnit == "Month">
dateTime.setMillis(right.value);
dateTime.setRounding(dateTime.getChronology().monthOfYear());
out.value = dateTime.getMillis();
<#elseif toUnit == "Day">
dateTime.setMillis(right.value);
dateTime.setRounding(dateTime.getChronology().dayOfMonth());
out.value = dateTime.getMillis();
<#elseif toUnit == "Hour">
dateTime.setMillis(right.value);
dateTime.setRounding(dateTime.getChronology().hourOfDay());
out.value = dateTime.getMillis();
<#elseif toUnit == "Minute">
dateTime.setMillis(right.value);
dateTime.setRounding(dateTime.getChronology().minuteOfHour());
out.value = dateTime.getMillis();
<#elseif toUnit == "Second">
dateTime.setMillis(right.value);
dateTime.setRounding(dateTime.getChronology().secondOfMinute());
out.value = dateTime.getMillis();
<#elseif toUnit == "Week">
dateTime.setMillis(right.value);
dateTime.setRounding(dateTime.getChronology().weekOfWeekyear());
out.value = dateTime.getMillis();
<#elseif toUnit == "Quarter">
dateTime.setMillis(right.value);
int month = dateTime.getMonthOfYear();
dateTime.setRounding(dateTime.getChronology().year());
dateTime2.setMillis(dateTime.getMillis());
dateTime2.add(org.joda.time.DurationFieldType.months(), ((month-1)/3)*3);
out.value = dateTime2.getMillis();
<#elseif toUnit == "Decade">
dateTime.setMillis(right.value);
int year = dateTime.getYear();
dateTime.setRounding(dateTime.getChronology().centuryOfEra());
dateTime2.setMillis(dateTime.getMillis());
dateTime2.add(org.joda.time.DurationFieldType.years(), ((year%100)/10)*10);
out.value = dateTime2.getMillis();
<#elseif toUnit == "Century">
dateTime.setMillis(right.value);
dateTime.add(org.joda.time.DurationFieldType.years(), -1);
dateTime.setRounding(dateTime.getChronology().centuryOfEra());
dateTime2.setMillis(dateTime.getMillis());
dateTime2.add(org.joda.time.DurationFieldType.years(), 1);
out.value = dateTime2.getMillis();
<#elseif toUnit == "Millennium">
dateTime.setMillis(right.value);
int year = dateTime.getYear();
dateTime.setRounding(dateTime.getChronology().era());
dateTime2.setMillis(dateTime.getMillis());
dateTime2.add(org.joda.time.DurationFieldType.years(), ((year-1)/1000)*1000);
out.value = dateTime2.getMillis();
</#if> <#-- End UnitType -->
<#elseif type == "Interval">
<#if toUnit == "Second"> <#-- Start UnitType -->
out.months = right.months;
out.days = right.days;
out.milliseconds = (right.milliseconds/(org.apache.drill.exec.vector.DateUtilities.secondsToMillis))*
(org.apache.drill.exec.vector.DateUtilities.secondsToMillis);
<#elseif toUnit == "Minute">
out.months = right.months;
out.days = right.days;
out.milliseconds = (right.milliseconds/(org.apache.drill.exec.vector.DateUtilities.minutesToMillis))*
(org.apache.drill.exec.vector.DateUtilities.minutesToMillis);
<#elseif toUnit == "Hour">
out.months = right.months;
out.days = right.days;
out.milliseconds =
(right.milliseconds/(org.apache.drill.exec.vector.DateUtilities.hoursToMillis))*
(org.apache.drill.exec.vector.DateUtilities.hoursToMillis);
<#elseif toUnit == "Day">
out.months = right.months;
out.days = right.days;
out.milliseconds = 0;
<#elseif toUnit == "Month">
out.months = right.months;
out.days = 0;
out.milliseconds = 0;
<#elseif toUnit == "Quarter">
out.months = (right.months / 3) * 3;
out.days = 0;
out.milliseconds = 0;
<#elseif toUnit == "Year">
out.months = (right.months / 12) * 12;
out.days = 0;
out.milliseconds = 0;
<#elseif toUnit == "Decade">
out.months = (right.months / 120) * 120;
out.days = 0;
out.milliseconds = 0;
<#elseif toUnit == "Century">
out.months = (right.months / 1200) * 1200;
out.days = 0;
out.milliseconds = 0;
<#elseif toUnit == "Millennium">
out.months = (right.months / 12000) * 12000;
out.days = 0;
out.milliseconds = 0;
</#if> <#-- End UnitType -->
<#elseif type == "IntervalDay">
<#if toUnit == "Second"> <#-- Start UnitType -->
out.days = right.days;
out.milliseconds = (right.milliseconds/(org.apache.drill.exec.vector.DateUtilities.secondsToMillis))*
(org.apache.drill.exec.vector.DateUtilities.secondsToMillis);
<#elseif toUnit == "Minute">
out.days = right.days;
out.milliseconds = (right.milliseconds/(org.apache.drill.exec.vector.DateUtilities.minutesToMillis))*
(org.apache.drill.exec.vector.DateUtilities.minutesToMillis);
<#elseif toUnit == "Hour">
out.days = right.days;
out.milliseconds =
(right.milliseconds/(org.apache.drill.exec.vector.DateUtilities.hoursToMillis))*
(org.apache.drill.exec.vector.DateUtilities.hoursToMillis);
<#elseif toUnit == "Day">
out.days = right.days;
out.milliseconds = 0;
<#elseif toUnit == "Month" || toUnit == "Quarter" || toUnit == "Year" || toUnit == "Decade" || toUnit == "Century" || toUnit == "Millennium">
out.days = 0;
out.milliseconds = 0;
</#if> <#-- End UnitType -->
<#elseif type == "IntervalYear">
<#if toUnit == "Second" || toUnit == "Minute" || toUnit == "Hour" || toUnit == "Day"> <#-- Start UnitType -->
out.value = right.value;
<#elseif toUnit == "Month">
out.value = right.value;
<#elseif toUnit == "Quarter">
out.value = (right.value / 3) * 3;
<#elseif toUnit == "Year">
out.value = (right.value / 12) * 12;
<#elseif toUnit == "Decade">
out.value = (right.value / 120) * 120;
<#elseif toUnit == "Century">
out.value = (right.value / 1200) * 1200;
<#elseif toUnit == "Millennium">
out.value = (right.value / 12000) * 12000;
</#if> <#-- End UnitType -->
</#if> <#-- End InputType -->
}
}
</#if> <#-- Filter out unsupported combinations -->
</#list> <#-- End UnitType Loop -->
</#list> <#-- End InputType Loop -->
}