Github user paul-rogers commented on a diff in the pull request:
https://github.com/apache/drill/pull/914#discussion_r150753441
--- Diff: exec/vector/src/main/codegen/templates/ColumnAccessors.java ---
@@ -191,141 +180,268 @@ public void bind(RowIndex vectorIndex, ValueVector
vector) {
<#if accessorType=="BigDecimal">
<#assign label="Decimal">
</#if>
+ <#if drillType == "VarChar" || drillType == "Var16Char">
+ <#assign accessorType = "byte[]">
+ <#assign label = "Bytes">
+ </#if>
<#if ! notyet>
//------------------------------------------------------------------------
// ${drillType} readers and writers
- public static class ${drillType}ColumnReader extends
AbstractColumnReader {
+ public static class ${drillType}ColumnReader extends BaseScalarReader {
- <@bindReader "" drillType />
+ <@bindReader "" drillType false />
- <@getType label />
+ <@getType drillType label />
<@get drillType accessorType label false/>
}
- public static class Nullable${drillType}ColumnReader extends
AbstractColumnReader {
+ public static class Nullable${drillType}ColumnReader extends
BaseScalarReader {
- <@bindReader "Nullable" drillType />
+ <@bindReader "Nullable" drillType false />
- <@getType label />
+ <@getType drillType label />
@Override
public boolean isNull() {
- return accessor().isNull(vectorIndex.index());
- }
-
- <@get drillType accessorType label false/>
- }
-
- public static class Repeated${drillType}ColumnReader extends
AbstractArrayReader {
-
- <@bindReader "Repeated" drillType />
-
- <@getType label />
-
- @Override
- public int size() {
- return accessor().getInnerValueCountAt(vectorIndex.index());
+ return accessor().isNull(vectorIndex.vectorIndex());
}
- <@get drillType accessorType label true/>
+ <@get drillType accessorType label false />
}
- public static class ${drillType}ColumnWriter extends
AbstractColumnWriter {
+ public static class Repeated${drillType}ColumnReader extends
BaseElementReader {
- <@bindWriter "" drillType />
+ <@bindReader "" drillType true />
- <@getType label />
+ <@getType drillType label />
- <@set drillType accessorType label false "set" />
+ <@get drillType accessorType label true />
}
- public static class Nullable${drillType}ColumnWriter extends
AbstractColumnWriter {
-
- <@bindWriter "Nullable" drillType />
+ <#assign varWidth = drillType == "VarChar" || drillType ==
"Var16Char" || drillType == "VarBinary" />
+ <#if varWidth>
+ public static class ${drillType}ColumnWriter extends BaseVarWidthWriter {
+ <#else>
+ public static class ${drillType}ColumnWriter extends
BaseFixedWidthWriter {
+ <#if drillType = "Decimal9" || drillType == "Decimal18" ||
+ drillType == "Decimal28Sparse" || drillType ==
"Decimal38Sparse">
+ private MajorType type;
+ </#if>
+ private static final int VALUE_WIDTH = ${drillType}Vector.VALUE_WIDTH;
+ </#if>
+ private final ${drillType}Vector vector;
+
+ public ${drillType}ColumnWriter(final ValueVector vector) {
+ <#if varWidth>
+ super(((${drillType}Vector) vector).getOffsetVector());
+ <#else>
+ <#if drillType = "Decimal9" || drillType == "Decimal18" ||
+ drillType == "Decimal28Sparse" || drillType ==
"Decimal38Sparse">
+ type = vector.getField().getType();
+ </#if>
+ </#if>
+ this.vector = (${drillType}Vector) vector;
+ }
- <@getType label />
+ @Override public ValueVector vector() { return vector; }
+ <#-- All change of buffer comes through this function to allow
capturing
+ the buffer address and capacity. Only two ways to set the
buffer:
+ by binding to a vector in bindVector(), or by resizing the
vector
+ in writeIndex(). -->
@Override
- public void setNull() {
- mutator.setNull(vectorIndex.index());
+ protected final void setAddr() {
+ final DrillBuf buf = vector.getBuffer();
+ bufAddr = buf.addr();
+ <#if varWidth>
+ capacity = buf.capacity();
+ <#else>
+ <#-- Turns out that keeping track of capacity as the count of
+ values simplifies the per-value code path. -->
+ capacity = buf.capacity() / VALUE_WIDTH;
+ </#if>
}
- <@set drillType accessorType label true "set" />
- }
-
- public static class Repeated${drillType}ColumnWriter extends
AbstractArrayWriter {
-
- <@bindWriter "Repeated" drillType />
+ <#-- reallocRaw() is type specific. -->
+ @Override
+ protected void realloc(int size) {
+ vector.reallocRaw(size);
+ setAddr();
+ }
- <@getType label />
+ <#if ! varWidth>
+ @Override public int width() { return VALUE_WIDTH; }
+
+ </#if>
+ <@getType drillType label />
+
+ <#if accessorType == "byte[]">
+ <#assign args = ", int len">
+ <#else>
+ <#assign args = "">
+ </#if>
+ <#if javaType == "char">
+ <#assign putType = "short" />
+ <#assign doCast = true />
+ <#else>
+ <#assign putType = javaType />
+ <#assign doCast = (cast == "set") />
+ </#if>
+ <#if ! varWidth>
+ @Override
+ protected final void fillEmpties(final int writeIndex) {
+ <#-- Fill empties. This is required because the allocated memory is
not
+ zero-filled. -->
+ while (lastWriteIndex < writeIndex - 1) {
+ <#-- Implemented in a type-specific way because PlatformDependent
does not
+ provide a general-purpose "fillBytes" function that we could
use instead.
+ If that was provided, we'd just fill the entire missing span
of data
+ with zeros. -->
+ <#assign putAddr = "bufAddr + ++lastWriteIndex * VALUE_WIDTH" />
--- End diff --
As if the rest of the Freemarker file is readable? This line disappeared in
the above revision.
---