/**
 * 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 java.lang.Override;
import java.util.List;

import org.apache.drill.exec.record.TransferPair;
import org.apache.drill.exec.vector.complex.IndexHolder;
import org.apache.drill.exec.vector.complex.writer.IntervalWriter;
import org.apache.drill.exec.vector.complex.writer.BaseWriter.MapWriter;

<@pp.dropOutputFile />
<#list vv.types as type>
<#list type.minor as minor>
<#list ["", "Repeated"] as mode>
<#assign lowerName = minor.class?uncap_first />
<#if lowerName == "int" ><#assign lowerName = "integer" /></#if>
<#assign name = mode + minor.class?cap_first />
<#assign javaType = (minor.javaType!type.javaType) />
<#assign friendlyType = (minor.friendlyType!minor.boxedType!type.boxedType) />
<#assign safeType=friendlyType />
<#if safeType=="byte[]"><#assign safeType="ByteArray" /></#if>

<#assign hasFriendly = minor.friendlyType!"no" == "no" />

<#list ["", "Nullable"] as nullMode>
<#if (mode == "Repeated" && nullMode  == "") || mode == "" >
<@pp.changeOutputFile name="/org/apache/drill/exec/vector/complex/impl/${nullMode}${name}ReaderImpl.java" />
<#include "/@includes/license.ftl" />

package org.apache.drill.exec.vector.complex.impl;

<#include "/@includes/vv_imports.ftl" />

@SuppressWarnings("unused")
public class ${nullMode}${name}ReaderImpl extends AbstractFieldReader {
  
  private final ${nullMode}${name}Vector vector;
  
  public ${nullMode}${name}ReaderImpl(${nullMode}${name}Vector vector){
    super();
    this.vector = vector;
  }

  public MajorType getType(){
    return vector.getField().getType();
  }

  public MaterializedField getField(){
    return vector.getField();
  }
  
  public boolean isSet(){
    <#if nullMode == "Nullable">
    return !vector.getAccessor().isNull(idx());
    <#else>
    return true;
    </#if>
  }


  
  
  <#if mode == "Repeated">

  public void copyAsValue(${minor.class?cap_first}Writer writer){
    Repeated${minor.class?cap_first}WriterImpl impl = (Repeated${minor.class?cap_first}WriterImpl) writer;
    impl.vector.copyFromSafe(idx(), impl.idx(), vector);
  }
  
  public void copyAsField(String name, MapWriter writer){
    Repeated${minor.class?cap_first}WriterImpl impl = (Repeated${minor.class?cap_first}WriterImpl)  writer.list(name).${lowerName}();
    impl.vector.copyFromSafe(idx(), impl.idx(), vector);
  }
  
  public int size(){
    return vector.getAccessor().getInnerValueCountAt(idx());
  }
  
  public void read(int arrayIndex, ${minor.class?cap_first}Holder h){
    vector.getAccessor().get(idx(), arrayIndex, h);
  }
  public void read(int arrayIndex, Nullable${minor.class?cap_first}Holder h){
    vector.getAccessor().get(idx(), arrayIndex, h);
  }
  
  public ${friendlyType} read${safeType}(int arrayIndex){
    return vector.getAccessor().getSingleObject(idx(), arrayIndex);
  }

  
  public List<Object> readObject(){
    return (List<Object>) (Object) vector.getAccessor().getObject(idx());
  }
  
  <#else>
  
  public void copyAsValue(${minor.class?cap_first}Writer writer){
    ${nullMode}${minor.class?cap_first}WriterImpl impl = (${nullMode}${minor.class?cap_first}WriterImpl) writer;
    impl.vector.copyFromSafe(idx(), impl.idx(), vector);
  }
  
  public void copyAsField(String name, MapWriter writer){
    ${nullMode}${minor.class?cap_first}WriterImpl impl = (${nullMode}${minor.class?cap_first}WriterImpl) writer.${lowerName}(name);
    impl.vector.copyFromSafe(idx(), impl.idx(), vector);
  }
  
  public void read(Nullable${minor.class?cap_first}Holder h){
    vector.getAccessor().get(idx(), h);
  }
  
  public ${friendlyType} read${safeType}(){
    return vector.getAccessor().getObject(idx());
  }
  
  public void copyValue(FieldWriter w){
    
  }
  
  public Object readObject(){
    return vector.getAccessor().getObject(idx());
  }

  
  </#if>
}
</#if>
</#list>
<@pp.changeOutputFile name="/org/apache/drill/exec/vector/complex/reader/${name}Reader.java" />
<#include "/@includes/license.ftl" />

package org.apache.drill.exec.vector.complex.reader;

<#include "/@includes/vv_imports.ftl" />
@SuppressWarnings("unused")
public interface ${name}Reader extends BaseReader{
  
  <#if mode == "Repeated">
  public int size();
  public void read(int arrayIndex, ${minor.class?cap_first}Holder h);
  public void read(int arrayIndex, Nullable${minor.class?cap_first}Holder h);
  public Object readObject(int arrayIndex);
  public ${friendlyType} read${safeType}(int arrayIndex);
  <#else>
  public void read(Nullable${minor.class?cap_first}Holder h);
  public Object readObject();
  public ${friendlyType} read${safeType}();
  </#if>  
  public boolean isSet();
  public void copyAsValue(${minor.class}Writer writer);
  public void copyAsField(String name, ${minor.class}Writer writer);
  
}



</#list>
</#list>
</#list>


