/**
 * 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.
 */


/**
  NOTE: ComparisonFunctions.java does not contain/generate all comparison
  functions.  DecimalFunctions.java and DateIntervalFunctions.java contain
  some.
*/
<#-- TODO:  Refactor comparison code from DecimalFunctions.java and
     DateIntervalFunctions.java into here (to eliminate duplicate template code
     and so that ComparisonFunctions actually has all comparison functions. -->


<@pp.dropOutputFile />

<#macro intervalCompareBlock leftType rightType leftMonths leftDays leftMillis rightMonths rightDays rightMillis output>

        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();

        ${output} = leftMS < rightMS ? -1 : (leftMS > rightMS ? 1 : 0);

</#macro>


<#macro compareNullsSubblock leftType rightType output breakTarget nullCompare nullComparesHigh>
  <#if nullCompare>
    <#if nullComparesHigh>
      <#assign leftNullResult = 1> <#-- if only L is null and nulls are high, then "L > R" (1) -->
      <#assign rightNullResult = -1>
    <#else>
      <#assign leftNullResult = -1> <#-- if only L is null and nulls are low, then "L < R" (-1) -->
      <#assign rightNullResult = 1>
    </#if>

    <#if leftType?starts_with("Nullable")>
      <#if rightType?starts_with("Nullable")>
        <#-- Both are nullable. -->
        if ( left.isSet == 0 ) {
          if ( right.isSet == 0 ) {
            <#-- Both are null--result is "L = R". -->
            ${output} = 0;
            break ${breakTarget};
          } else {
            <#-- Only left is null--result is "L < R" or "L > R" per null ordering. -->
            ${output} = ${leftNullResult};
            break ${breakTarget};
          }
        } else if ( right.isSet == 0 ) {
          <#-- Only right is null--result is "L > R" or "L < R" per null ordering. -->
          ${output} = ${rightNullResult};
          break ${breakTarget};
        }
      <#else>
        <#-- Left is nullable but right is not. -->
        if ( left.isSet == 0 ) {
          <#-- Only left is null--result is "L < R" or "L > R" per null ordering. -->
          ${output} = ${leftNullResult};
          break ${breakTarget};
        }
      </#if>
    <#elseif rightType?starts_with("Nullable")>
      <#-- Left is not nullable but right is. -->
      if ( right.isSet == 0 ) {
        <#-- Only right is null--result is "L > R" or "L < R" per null ordering. -->
        ${output} = ${rightNullResult};
        break ${breakTarget};
      }
    </#if>
  </#if>

</#macro>


<#-- macro compareBlock: Generates block handling comparison, including NULL. -->

<#-- Parameters: >
<#-- - mode: selects case of comparison code -->
<#-- - leftType: name of left argument's type  (e.g., NullableFloat4)  -->
<#-- - rightType: name of right argument's type  -->
<#-- - output: output variable name -->
<#-- - nullCompare: whether to generate null-comparison code -->
<#-- - nullComparesHigh:  whether NULL compares as the highest value or the lowest
       value -->

<#macro compareBlock mode leftType rightType output nullCompare nullComparesHigh>
     outside:
      {
        <@compareNullsSubblock leftType=leftType rightType=rightType
          output="out.value" breakTarget="outside" nullCompare=true nullComparesHigh=nullComparesHigh />

    <#if mode == "primitive">
      ${output} = left.value < right.value ? -1 : (left.value == right.value ? 0 : 1);
    <#elseif mode == "varString">
      ${output} = org.apache.drill.exec.expr.fn.impl.ByteFunctionHelpers.compare(
          left.buffer, left.start, left.end, right.buffer, right.start, right.end );
    <#elseif mode == "intervalNameThis">
      <@intervalCompareBlock leftType=leftType rightType=rightType
        leftMonths ="left.months"  leftDays ="left.days"  leftMillis ="left.milliseconds"
        rightMonths="right.months" rightDays="right.days" rightMillis="right.milliseconds"
        output="${output}"/>
    <#elseif mode == "intervalDay">
      <@intervalCompareBlock leftType=leftType rightType=rightType
        leftMonths ="0" leftDays ="left.days"  leftMillis ="left.milliseconds"
        rightMonths="0" rightDays="right.days" rightMillis="right.milliseconds"
        output="${output}"/>
       <#-- TODO:  Refactor other comparison code to here. -->
    <#else>
      ${mode_HAS_BAD_VALUE}
    </#if>

      } // outside
</#macro>


<#-- 1.  For each group of cross-comparable types: -->
<#list comparisonTypesMain.typeGroups as typeGroup>

<#-- 2.  For each pair of (cross-comparable) types in group: -->
<#list typeGroup.comparables as leftTypeBase>
<#list typeGroup.comparables as rightTypeBase>

<#-- Generate one file for each pair of base types (includes Nullable cases). -->
<@pp.changeOutputFile name="/org/apache/drill/exec/expr/fn/impl/GCompare${leftTypeBase}Vs${rightTypeBase}.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.Param;
import org.apache.drill.exec.expr.fn.FunctionGenerationHelper;
import org.apache.drill.exec.expr.fn.impl.ByteFunctionHelpers;
import org.apache.drill.exec.expr.holders.*;
import org.apache.drill.exec.record.RecordBatch;
import javax.inject.Inject;
import io.netty.buffer.DrillBuf;

@SuppressWarnings("unused")
public class GCompare${leftTypeBase}Vs${rightTypeBase} {

<#-- 3.  For each combination of Nullable vs. not (of given non-nullable types):  -->
<#list ["${leftTypeBase}", "Nullable${leftTypeBase}"] as leftType >
<#list ["${rightTypeBase}", "Nullable${rightTypeBase}"] as rightType >


  <#-- Comparison function for sorting and grouping relational operators
       (not for comparison expression operators (=, <, etc.)). -->
  @FunctionTemplate(name = FunctionGenerationHelper.COMPARE_TO_NULLS_HIGH,
                    scope = FunctionTemplate.FunctionScope.SIMPLE,
                    nulls = NullHandling.INTERNAL)
  public static class GCompare${leftType}Vs${rightType}NullHigh implements DrillSimpleFunc {

    @Param ${leftType}Holder left;
    @Param ${rightType}Holder right;
    @Output IntHolder out;

    public void setup() {}

    public void eval() {
      <@compareBlock mode=typeGroup.mode leftType=leftType rightType=rightType
                     output="out.value" nullCompare=true nullComparesHigh=true />
    }
  }

  <#-- Comparison function for sorting and grouping relational operators
       (not for comparison expression operators (=, <, etc.)). -->
  @FunctionTemplate(name = FunctionGenerationHelper.COMPARE_TO_NULLS_LOW,
                    scope = FunctionTemplate.FunctionScope.SIMPLE,
                    nulls = NullHandling.INTERNAL)
  public static class GCompare${leftType}Vs${rightType}NullLow implements DrillSimpleFunc {

    @Param ${leftType}Holder left;
    @Param ${rightType}Holder right;
    @Output IntHolder out;

    public void setup() {}

    public void eval() {
      <@compareBlock mode=typeGroup.mode leftType=leftType rightType=rightType
                     output="out.value" nullCompare=true nullComparesHigh=false />
    }
  }

</#list>
</#list> <#-- 3. Nullable combinations -->



  <#-- Comparison function for comparison expression operator (=, &lt;, etc.),
       not for sorting and grouping relational operators. -->
  @FunctionTemplate(names = {"less_than", "<"},
                    scope = FunctionTemplate.FunctionScope.SIMPLE,
                    nulls = NullHandling.NULL_IF_NULL)
  public static class LessThan${leftTypeBase}Vs${rightTypeBase} implements DrillSimpleFunc {

      @Param ${leftTypeBase}Holder left;
      @Param ${rightTypeBase}Holder right;
      @Output BitHolder out;

      public void setup() {}

      public void eval() {

        <#if typeGroup.mode == "primitive">
          out.value = left.value < right.value ? 1 : 0;
        <#elseif typeGroup.mode == "varString"
            || typeGroup.mode == "intervalNameThis" || typeGroup.mode == "intervalDay" >
          int cmp;
          <@compareBlock mode=typeGroup.mode leftType=leftTypeBase rightType=rightTypeBase
                         output="cmp" nullCompare=false nullComparesHigh=false />
          out.value = cmp == -1 ? 1 : 0;
        <#-- TODO:  Refactor other comparison code to here. -->
        <#else>
          ${mode_HAS_BAD_VALUE}
        </#if>

      }
  }

  <#-- Comparison function for comparison expression operator (=, &lt;, etc.),
       not for sorting and grouping relational operators. -->
  @FunctionTemplate(names = {"less_than_or_equal_to", "<="},
                    scope = FunctionTemplate.FunctionScope.SIMPLE,
                    nulls = NullHandling.NULL_IF_NULL)
  public static class LessThanEq${leftTypeBase}Vs${rightTypeBase} implements DrillSimpleFunc {

      @Param ${leftTypeBase}Holder left;
      @Param ${rightTypeBase}Holder right;
      @Output BitHolder out;

      public void setup() {}

      public void eval() {

        <#if typeGroup.mode == "primitive">
          out.value = left.value <= right.value ? 1 : 0;
        <#elseif typeGroup.mode == "varString"
            || typeGroup.mode == "intervalNameThis" || typeGroup.mode == "intervalDay" >
          int cmp;
          <@compareBlock mode=typeGroup.mode leftType=leftTypeBase rightType=rightTypeBase
                         output="cmp" nullCompare=false nullComparesHigh=false />
          out.value = cmp < 1 ? 1 : 0;
        <#-- TODO:  Refactor other comparison code to here. -->
        <#else>
          ${mode_HAS_BAD_VALUE}
        </#if>

    }
  }

  <#-- Comparison function for comparison expression operator (=, &lt;, etc.),
       not for sorting and grouping relational operators. -->
  @FunctionTemplate(names = {"greater_than", ">"},
                    scope = FunctionTemplate.FunctionScope.SIMPLE,
                    nulls = NullHandling.NULL_IF_NULL)
  public static class GreaterThan${leftTypeBase}Vs${rightTypeBase} implements DrillSimpleFunc {

      @Param ${leftTypeBase}Holder left;
      @Param ${rightTypeBase}Holder right;
      @Output BitHolder out;

      public void setup() {}

      public void eval() {

        <#if typeGroup.mode == "primitive">
          out.value = left.value > right.value ? 1 : 0;
        <#elseif typeGroup.mode == "varString"
            || typeGroup.mode == "intervalNameThis" || typeGroup.mode == "intervalDay" >
          int cmp;
          <@compareBlock mode=typeGroup.mode leftType=leftTypeBase rightType=rightTypeBase
                         output="cmp" nullCompare=false nullComparesHigh=false />
          out.value = cmp == 1 ? 1 : 0;
        <#-- TODO:  Refactor other comparison code to here. -->
        <#else>
          ${mode_HAS_BAD_VALUE}
        </#if>

    }
  }

  <#-- Comparison function for comparison expression operator (=, &lt;, etc.),
       not for sorting and grouping relational operators. -->
  @FunctionTemplate(names = {"greater_than_or_equal_to", ">="},
                    scope = FunctionTemplate.FunctionScope.SIMPLE,
                    nulls = NullHandling.NULL_IF_NULL)
  public static class GreaterThanEq${leftTypeBase}Vs${rightTypeBase} implements DrillSimpleFunc {

      @Param ${leftTypeBase}Holder left;
      @Param ${rightTypeBase}Holder right;
      @Output BitHolder out;

      public void setup() {}

      public void eval() {

        <#if typeGroup.mode == "primitive">
          out.value = left.value >= right.value ? 1 : 0;
        <#elseif typeGroup.mode == "varString"
            || typeGroup.mode == "intervalNameThis" || typeGroup.mode == "intervalDay" >
          int cmp;
          <@compareBlock mode=typeGroup.mode leftType=leftTypeBase rightType=rightTypeBase
                         output="cmp" nullCompare=false nullComparesHigh=false />
          out.value = cmp > -1 ? 1 : 0;
        <#-- TODO:  Refactor other comparison code to here. -->
        <#else>
          ${mode_HAS_BAD_VALUE}
        </#if>

      }
  }

  <#-- Comparison function for comparison expression operator (=, &lt;, etc.),
       not for sorting and grouping relational operators. -->
  @FunctionTemplate(names = {"equal", "==", "="},
                    scope = FunctionTemplate.FunctionScope.SIMPLE,
                    nulls = NullHandling.NULL_IF_NULL)
  public static class Equals${leftTypeBase}Vs${rightTypeBase} implements DrillSimpleFunc {

      @Param ${leftTypeBase}Holder left;
      @Param ${rightTypeBase}Holder right;
      @Output BitHolder out;

      public void setup() {}

      public void eval() {

        <#if typeGroup.mode == "primitive">
          out.value = left.value == right.value ? 1 : 0;
        <#elseif typeGroup.mode == "varString" >
          out.value = org.apache.drill.exec.expr.fn.impl.ByteFunctionHelpers.equal(
              left.buffer, left.start, left.end, right.buffer, right.start, right.end);
        <#elseif typeGroup.mode == "intervalNameThis" || typeGroup.mode == "intervalDay" >
          int cmp;
          <@compareBlock mode=typeGroup.mode leftType=leftTypeBase rightType=rightTypeBase
                         output="cmp" nullCompare=false nullComparesHigh=false />
          out.value = cmp == 0 ? 1 : 0;
        <#-- TODO:  Refactor other comparison code to here. -->
        <#else>
          ${mode_HAS_BAD_VALUE}
        </#if>

      }
  }

  <#-- Comparison function for comparison expression operator (=, &lt;, etc.),
       not for sorting and grouping relational operators. -->
  @FunctionTemplate(names = {"not_equal", "<>", "!="},
                    scope = FunctionTemplate.FunctionScope.SIMPLE,
                    nulls = NullHandling.NULL_IF_NULL)
  public static class NotEquals${leftTypeBase}Vs${rightTypeBase} implements DrillSimpleFunc {

      @Param ${leftTypeBase}Holder left;
      @Param ${rightTypeBase}Holder right;
      @Output BitHolder out;

      public void setup() {}

      public void eval() {

        <#if typeGroup.mode == "primitive">
          out.value = left.value != right.value ? 1 : 0;
        <#elseif typeGroup.mode == "varString"
            || typeGroup.mode == "intervalNameThis" || typeGroup.mode == "intervalDay" >
          int cmp;
          <@compareBlock mode=typeGroup.mode leftType=leftTypeBase rightType=rightTypeBase
                         output="cmp" nullCompare=false nullComparesHigh=false />
          out.value = cmp == 0 ? 0 : 1;
        <#-- TODO:  Refactor other comparison code to here. -->
        <#else>
          ${mode_HAS_BAD_VALUE}
        </#if>

      }
  }

}


</#list> <#-- 2.  Pair of types-->
</#list>

</#list> <#-- 1. Group -->

