/*
 * 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.
 */
package org.apache.drill.udf.dynamic;

import io.netty.buffer.DrillBuf;
import org.apache.drill.exec.expr.DrillSimpleFunc;
import org.apache.drill.exec.expr.annotations.FunctionTemplate;
import org.apache.drill.exec.expr.annotations.Output;
import org.apache.drill.exec.expr.annotations.Param;
import org.apache.drill.exec.expr.holders.VarCharHolder;

import javax.inject.Inject;
import java.nio.charset.StandardCharsets;

@FunctionTemplate(
    name="custom_upper",
    scope = FunctionTemplate.FunctionScope.SIMPLE,
    nulls = FunctionTemplate.NullHandling.NULL_IF_NULL
)
public class CustomUpperFunction implements DrillSimpleFunc {

  @Param
  VarCharHolder input;

  @Output
  VarCharHolder output;

  @Inject
  DrillBuf buffer;

  public void setup() {
  }

  public void eval() {

    // get value
    String inputString = org.apache.drill.exec.expr.fn.impl.StringFunctionHelpers.toStringFromUTF8(input.start, input.end, input.buffer);

    // convert to upper case
    String outputValue = inputString.toUpperCase();

    // put the output value into output buffer
    output.buffer = buffer;
    output.start = 0;
    output.end = outputValue.getBytes(StandardCharsets.UTF_8).length;
    buffer.setBytes(0, outputValue.getBytes(StandardCharsets.UTF_8));

  }
}

