/**
 * 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.
 */
<@pp.dropOutputFile />
<#list vv.types as type>
<#list type.minor as minor>

<#assign className="GConvertToNullable${minor.class}Holder" />

<@pp.changeOutputFile name="/org/apache/drill/exec/expr/fn/impl/${className}.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.*;
import org.apache.drill.exec.expr.holders.*;
import org.apache.drill.exec.record.RecordBatch;

<#if minor.class.startsWith("Decimal")>
@FunctionTemplate(name = "convertToNullable${minor.class?upper_case}", scope = FunctionTemplate.FunctionScope.DECIMAL_MAX_SCALE, nulls = FunctionTemplate.NullHandling.INTERNAL)
<#else>
@FunctionTemplate(name = "convertToNullable${minor.class?upper_case}", scope = FunctionTemplate.FunctionScope.SIMPLE, nulls = FunctionTemplate.NullHandling.INTERNAL)
</#if>
public class ${className} implements DrillSimpleFunc {

  @Param ${minor.class}Holder input;
  @Output Nullable${minor.class}Holder output;

  public void setup() { }

  public void eval() {
    output.isSet = 1;
<#if type.major != "VarLen">
  <#if (minor.class == "Interval")>
    output.months = input.months;
    output.days = input.days;
    output.milliseconds = input.milliseconds;
  <#elseif (minor.class == "IntervalDay")>
    output.days = input.days;
    output.milliseconds = input.milliseconds;
  <#elseif minor.class.startsWith("Decimal")>
    output.scale = input.scale;
    output.precision = input.precision;
    <#if minor.class.startsWith("Decimal28") || minor.class.startsWith("Decimal38")>
    output.setSign(input.getSign(input.start, input.buffer), output.start, output.buffer);
    output.start = input.start;
    output.buffer = input.buffer;
    <#else>
    output.value = input.value;
    </#if>
  <#elseif (type.width > 8)>
    output.start = input.start;
    output.buffer = input.buffer;
  <#else>
    output.value = input.value;
  </#if>
<#else>
    output.start = input.start;
    output.end = input.end;
    output.buffer = input.buffer;
</#if>
  }
}
</#list>
</#list>