blob: a865aef9dcd0184f5e83ef777ede1d4d1ee36165 [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.common.types.Types;
import org.apache.drill.common.types.TypeProtos.MajorType;
import org.apache.drill.common.types.TypeProtos.MinorType;
import org.apache.drill.exec.vector.complex.UnionVector;
import org.apache.drill.exec.vector.complex.impl.NullReader;
<@pp.dropOutputFile />
<@pp.changeOutputFile name="/org/apache/drill/exec/vector/complex/impl/UnionReader.java" />
<#include "/@includes/license.ftl" />
package org.apache.drill.exec.vector.complex.impl;
<#include "/@includes/vv_imports.ftl" />
/*
* This class is generated using freemarker and the ${.template_name} template.
*/
public class UnionReader extends AbstractFieldReader {
public final UnionVector data;
private final BaseReader[] readers = new BaseReader[UnionVector.TYPE_COUNT];
public UnionReader(UnionVector data) {
this.data = data;
}
@Override
public MajorType getType() {
return UnionVector.TYPES[data.getTypeValue(idx())];
}
public MinorType getVectorType() {
return data.getField().getType().getMinorType();
}
public boolean isSet(){
return !data.getAccessor().isNull(idx());
}
public void read(UnionHolder holder) {
holder.reader = this;
holder.isSet = this.isSet() ? 1 : 0;
}
public void read(int index, UnionHolder holder) {
getList().read(index, holder);
}
private FieldReader getReaderForIndex(int index) {
int typeValue = data.getTypeValue(index);
if (typeValue == UnionVector.NULL_MARKER) {
return NullReader.INSTANCE;
}
FieldReader reader = (FieldReader) readers[typeValue];
if (reader != null) {
return reader;
}
// Warning: do not use valueOf as that uses Protobuf
// field numbers, not enum ordinals.
MinorType type = MinorType.values()[typeValue];
switch (type) {
case MAP:
return (FieldReader) getMap();
case DICT:
return (FieldReader) getDict();
case LIST:
return (FieldReader) getList();
<#list vv.types as type><#list type.minor as minor><#assign name = minor.class?cap_first />
<#assign uncappedName = name?uncap_first/>
<#if !minor.class?starts_with("Decimal")>
case ${name?upper_case}:
return (FieldReader) get${name}();
</#if>
</#list></#list>
default:
throw new UnsupportedOperationException("Unsupported type: " + MinorType.valueOf(typeValue));
}
}
private SingleMapReaderImpl mapReader;
private MapReader getMap() {
if (mapReader == null) {
mapReader = (SingleMapReaderImpl) data.getMap().getReader();
mapReader.setPosition(idx());
readers[MinorType.MAP.ordinal()] = mapReader;
}
return mapReader;
}
private SingleDictReaderImpl dictReader;
private DictReader getDict() {
if (dictReader == null) {
dictReader = (SingleDictReaderImpl) data.getDict().getReader();
dictReader.setPosition(idx());
readers[MinorType.DICT.ordinal()] = dictReader;
}
return dictReader;
}
private UnionListReader listReader;
private FieldReader getList() {
if (listReader == null) {
listReader = new UnionListReader(data.getList());
listReader.setPosition(idx());
readers[MinorType.LIST.ordinal()] = listReader;
}
return listReader;
}
@Override
public java.util.Iterator<String> iterator() {
return getMap().iterator();
}
@Override
public void copyAsValue(UnionWriter writer) {
writer.data.copyFrom(idx(), writer.idx(), data);
}
<#list ["Object", "BigDecimal", "Integer", "Long", "Boolean",
"Character", "LocalDate", "LocalTime", "LocalDateTime", "Period", "Double", "Float",
"Text", "String", "Byte", "Short", "byte[]"] as friendlyType>
<#assign safeType=friendlyType />
<#if safeType=="byte[]"><#assign safeType="ByteArray" /></#if>
@Override
public ${friendlyType} read${safeType}() {
return getReaderForIndex(idx()).read${safeType}();
}
</#list>
<#list vv.types as type><#list type.minor as minor><#assign name = minor.class?cap_first />
<#assign uncappedName = name?uncap_first/>
<#assign boxedType = (minor.boxedType!type.boxedType) />
<#assign javaType = (minor.javaType!type.javaType) />
<#assign friendlyType = (minor.friendlyType!minor.boxedType!type.boxedType) />
<#assign safeType=friendlyType />
<#if safeType=="byte[]"><#assign safeType="ByteArray" /></#if>
<#if !minor.class?starts_with("Decimal")>
private Nullable${name}ReaderImpl ${uncappedName}Reader;
private Nullable${name}ReaderImpl get${name}() {
if (${uncappedName}Reader == null) {
${uncappedName}Reader = new Nullable${name}ReaderImpl(data.get${name}Vector());
${uncappedName}Reader.setPosition(idx());
readers[MinorType.${name?upper_case}.ordinal()] = ${uncappedName}Reader;
}
return ${uncappedName}Reader;
}
public void read(Nullable${name}Holder holder){
getReaderForIndex(idx()).read(holder);
}
public void copyAsValue(${name}Writer writer){
getReaderForIndex(idx()).copyAsValue(writer);
}
</#if>
</#list></#list>
@Override
public void copyAsValue(ListWriter writer) {
ComplexCopier.copy(this, (FieldWriter) writer);
}
@Override
public void setPosition(int index) {
super.setPosition(index);
for (BaseReader reader : readers) {
if (reader != null) {
reader.setPosition(index);
}
}
}
public FieldReader reader(String name){
return getMap().reader(name);
}
public FieldReader reader() {
return getList().reader();
}
public boolean next() {
return getReaderForIndex(idx()).next();
}
@Override
public String getTypeString() {
if (isSet()) {
return getType().getMinorType().name();
} else {
return MinorType.NULL.name();
}
}
}