blob: 3005fca0385aaf9cc7a53c9a31221b4a616b5484 [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.
*/
<@pp.dropOutputFile />
<#list vv.types as type>
<#list type.minor as minor>
<#list ["", "Nullable", "Repeated"] as holderMode>
<#assign nullMode = holderMode />
<#if holderMode == "Repeated"><#assign nullMode = "Nullable" /></#if>
<#assign lowerName = minor.class?uncap_first />
<#if lowerName == "int" ><#assign lowerName = "integer" /></#if>
<#assign name = 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 fields = minor.fields!type.fields />
<@pp.changeOutputFile name="/org/apache/arrow/vector/complex/impl/${holderMode}${name}HolderReaderImpl.java" />
<#include "/@includes/license.ftl" />
package org.apache.arrow.vector.complex.impl;
<#include "/@includes/vv_imports.ftl" />
import java.math.BigDecimal;
import java.math.BigInteger;
import org.joda.time.Period;
// Source code generated using FreeMarker template ${.template_name}
@SuppressWarnings("unused")
public class ${holderMode}${name}HolderReaderImpl extends AbstractFieldReader {
private ${nullMode}${name}Holder holder;
<#if holderMode == "Repeated" >
private int index = -1;
private ${holderMode}${name}Holder repeatedHolder;
</#if>
public ${holderMode}${name}HolderReaderImpl(${holderMode}${name}Holder holder) {
<#if holderMode == "Repeated" >
this.holder = new ${nullMode}${name}Holder();
this.repeatedHolder = holder;
<#else>
this.holder = holder;
</#if>
}
@Override
public int size() {
<#if holderMode == "Repeated">
return repeatedHolder.end - repeatedHolder.start;
<#else>
throw new UnsupportedOperationException("You can't call size on a Holder value reader.");
</#if>
}
@Override
public boolean next() {
<#if holderMode == "Repeated">
if(index + 1 < repeatedHolder.end) {
index++;
repeatedHolder.vector.getAccessor().get(repeatedHolder.start + index, holder);
return true;
} else {
return false;
}
<#else>
throw new UnsupportedOperationException("You can't call next on a single value reader.");
</#if>
}
@Override
public void setPosition(int index) {
throw new UnsupportedOperationException("You can't call next on a single value reader.");
}
@Override
public MajorType getType() {
<#if holderMode == "Repeated">
return this.repeatedHolder.TYPE;
<#else>
return this.holder.TYPE;
</#if>
}
@Override
public boolean isSet() {
<#if holderMode == "Repeated">
return this.repeatedHolder.end!=this.repeatedHolder.start;
<#elseif nullMode == "Nullable">
return this.holder.isSet == 1;
<#else>
return true;
</#if>
}
<#if holderMode != "Repeated">
@Override
public void read(${name}Holder h) {
<#list fields as field>
h.${field.name} = holder.${field.name};
</#list>
}
@Override
public void read(Nullable${name}Holder h) {
<#list fields as field>
h.${field.name} = holder.${field.name};
</#list>
h.isSet = isSet() ? 1 : 0;
}
</#if>
<#if holderMode == "Repeated">
@Override
public ${friendlyType} read${safeType}(int index){
repeatedHolder.vector.getAccessor().get(repeatedHolder.start + index, holder);
${friendlyType} value = read${safeType}();
if (this.index > -1) {
repeatedHolder.vector.getAccessor().get(repeatedHolder.start + this.index, holder);
}
return value;
}
</#if>
@Override
public ${friendlyType} read${safeType}(){
<#if nullMode == "Nullable">
if (!isSet()) {
return null;
}
</#if>
<#if type.major == "VarLen">
int length = holder.end - holder.start;
byte[] value = new byte [length];
holder.buffer.getBytes(holder.start, value, 0, length);
<#if minor.class == "VarBinary">
return value;
<#elseif minor.class == "Var16Char">
return new String(value);
<#elseif minor.class == "VarChar">
Text text = new Text();
text.set(value);
return text;
</#if>
<#elseif minor.class == "Interval">
Period p = new Period();
return p.plusMonths(holder.months).plusDays(holder.days).plusMillis(holder.milliseconds);
<#elseif minor.class == "IntervalDay">
Period p = new Period();
return p.plusDays(holder.days).plusMillis(holder.milliseconds);
<#elseif minor.class == "Decimal9" ||
minor.class == "Decimal18" >
BigInteger value = BigInteger.valueOf(holder.value);
return new BigDecimal(value, holder.scale);
<#elseif minor.class == "Decimal28Dense" ||
minor.class == "Decimal38Dense">
return org.apache.arrow.vector.util.DecimalUtility.getBigDecimalFromDense(holder.buffer,
holder.start,
holder.nDecimalDigits,
holder.scale,
holder.maxPrecision,
holder.WIDTH);
<#elseif minor.class == "Decimal28Sparse" ||
minor.class == "Decimal38Sparse">
return org.apache.arrow.vector.util.DecimalUtility.getBigDecimalFromSparse(holder.buffer,
holder.start,
holder.nDecimalDigits,
holder.scale);
<#elseif minor.class == "Bit" >
return new Boolean(holder.value != 0);
<#else>
${friendlyType} value = new ${friendlyType}(this.holder.value);
return value;
</#if>
}
@Override
public Object readObject() {
<#if holderMode == "Repeated" >
List<Object> valList = Lists.newArrayList();
for (int i = repeatedHolder.start; i < repeatedHolder.end; i++) {
valList.add(repeatedHolder.vector.getAccessor().getObject(i));
}
return valList;
<#else>
return readSingleObject();
</#if>
}
private Object readSingleObject() {
<#if nullMode == "Nullable">
if (!isSet()) {
return null;
}
</#if>
<#if type.major == "VarLen">
int length = holder.end - holder.start;
byte[] value = new byte [length];
holder.buffer.getBytes(holder.start, value, 0, length);
<#if minor.class == "VarBinary">
return value;
<#elseif minor.class == "Var16Char">
return new String(value);
<#elseif minor.class == "VarChar">
Text text = new Text();
text.set(value);
return text;
</#if>
<#elseif minor.class == "Interval">
Period p = new Period();
return p.plusMonths(holder.months).plusDays(holder.days).plusMillis(holder.milliseconds);
<#elseif minor.class == "IntervalDay">
Period p = new Period();
return p.plusDays(holder.days).plusMillis(holder.milliseconds);
<#elseif minor.class == "Decimal9" ||
minor.class == "Decimal18" >
BigInteger value = BigInteger.valueOf(holder.value);
return new BigDecimal(value, holder.scale);
<#elseif minor.class == "Decimal28Dense" ||
minor.class == "Decimal38Dense">
return org.apache.arrow.vector.util.DecimalUtility.getBigDecimalFromDense(holder.buffer,
holder.start,
holder.nDecimalDigits,
holder.scale,
holder.maxPrecision,
holder.WIDTH);
<#elseif minor.class == "Decimal28Sparse" ||
minor.class == "Decimal38Sparse">
return org.apache.arrow.vector.util.DecimalUtility.getBigDecimalFromSparse(holder.buffer,
holder.start,
holder.nDecimalDigits,
holder.scale);
<#elseif minor.class == "Bit" >
return new Boolean(holder.value != 0);
<#else>
${friendlyType} value = new ${friendlyType}(this.holder.value);
return value;
</#if>
}
<#if holderMode != "Repeated" && nullMode != "Nullable">
public void copyAsValue(${minor.class?cap_first}Writer writer){
writer.write(holder);
}
</#if>
}
</#list>
</#list>
</#list>