| /** |
| * 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 /> |
| <@pp.changeOutputFile name="/org/apache/arrow/vector/complex/impl/UnionWriter.java" /> |
| |
| |
| <#include "/@includes/license.ftl" /> |
| |
| package org.apache.arrow.vector.complex.impl; |
| |
| <#include "/@includes/vv_imports.ftl" /> |
| |
| /* |
| * This class is generated using freemarker and the ${.template_name} template. |
| */ |
| @SuppressWarnings("unused") |
| public class UnionWriter extends AbstractFieldWriter implements FieldWriter { |
| |
| UnionVector data; |
| private MapWriter mapWriter; |
| private UnionListWriter listWriter; |
| private List<BaseWriter> writers = Lists.newArrayList(); |
| |
| public UnionWriter(BufferAllocator allocator) { |
| super(null); |
| } |
| |
| public UnionWriter(UnionVector vector) { |
| super(null); |
| data = vector; |
| } |
| |
| public UnionWriter(UnionVector vector, FieldWriter parent) { |
| super(null); |
| data = vector; |
| } |
| |
| @Override |
| public void setPosition(int index) { |
| super.setPosition(index); |
| for (BaseWriter writer : writers) { |
| writer.setPosition(index); |
| } |
| } |
| |
| |
| @Override |
| public void start() { |
| data.getMutator().setType(idx(), MinorType.MAP); |
| getMapWriter().start(); |
| } |
| |
| @Override |
| public void end() { |
| getMapWriter().end(); |
| } |
| |
| @Override |
| public void startList() { |
| getListWriter().startList(); |
| data.getMutator().setType(idx(), MinorType.LIST); |
| } |
| |
| @Override |
| public void endList() { |
| getListWriter().endList(); |
| } |
| |
| private MapWriter getMapWriter() { |
| if (mapWriter == null) { |
| mapWriter = new SingleMapWriter(data.getMap(), null, true); |
| mapWriter.setPosition(idx()); |
| writers.add(mapWriter); |
| } |
| return mapWriter; |
| } |
| |
| public MapWriter asMap() { |
| data.getMutator().setType(idx(), MinorType.MAP); |
| return getMapWriter(); |
| } |
| |
| private ListWriter getListWriter() { |
| if (listWriter == null) { |
| listWriter = new UnionListWriter(data.getList()); |
| listWriter.setPosition(idx()); |
| writers.add(listWriter); |
| } |
| return listWriter; |
| } |
| |
| public ListWriter asList() { |
| data.getMutator().setType(idx(), MinorType.LIST); |
| return getListWriter(); |
| } |
| |
| <#list vv.types as type><#list type.minor as minor><#assign name = minor.class?cap_first /> |
| <#assign fields = minor.fields!type.fields /> |
| <#assign uncappedName = name?uncap_first/> |
| |
| <#if !minor.class?starts_with("Decimal")> |
| |
| private ${name}Writer ${name?uncap_first}Writer; |
| |
| private ${name}Writer get${name}Writer() { |
| if (${uncappedName}Writer == null) { |
| ${uncappedName}Writer = new Nullable${name}WriterImpl(data.get${name}Vector(), null); |
| ${uncappedName}Writer.setPosition(idx()); |
| writers.add(${uncappedName}Writer); |
| } |
| return ${uncappedName}Writer; |
| } |
| |
| public ${name}Writer as${name}() { |
| data.getMutator().setType(idx(), MinorType.${name?upper_case}); |
| return get${name}Writer(); |
| } |
| |
| @Override |
| public void write(${name}Holder holder) { |
| data.getMutator().setType(idx(), MinorType.${name?upper_case}); |
| get${name}Writer().setPosition(idx()); |
| get${name}Writer().write${name}(<#list fields as field>holder.${field.name}<#if field_has_next>, </#if></#list>); |
| } |
| |
| public void write${minor.class}(<#list fields as field>${field.type} ${field.name}<#if field_has_next>, </#if></#list>) { |
| data.getMutator().setType(idx(), MinorType.${name?upper_case}); |
| get${name}Writer().setPosition(idx()); |
| get${name}Writer().write${name}(<#list fields as field>${field.name}<#if field_has_next>, </#if></#list>); |
| } |
| </#if> |
| |
| </#list></#list> |
| |
| public void writeNull() { |
| } |
| |
| @Override |
| public MapWriter map() { |
| data.getMutator().setType(idx(), MinorType.LIST); |
| getListWriter().setPosition(idx()); |
| return getListWriter().map(); |
| } |
| |
| @Override |
| public ListWriter list() { |
| data.getMutator().setType(idx(), MinorType.LIST); |
| getListWriter().setPosition(idx()); |
| return getListWriter().list(); |
| } |
| |
| @Override |
| public ListWriter list(String name) { |
| data.getMutator().setType(idx(), MinorType.MAP); |
| getMapWriter().setPosition(idx()); |
| return getMapWriter().list(name); |
| } |
| |
| @Override |
| public MapWriter map(String name) { |
| data.getMutator().setType(idx(), MinorType.MAP); |
| getMapWriter().setPosition(idx()); |
| return getMapWriter().map(name); |
| } |
| |
| <#list vv.types as type><#list type.minor as minor> |
| <#assign lowerName = minor.class?uncap_first /> |
| <#if lowerName == "int" ><#assign lowerName = "integer" /></#if> |
| <#assign upperName = minor.class?upper_case /> |
| <#assign capName = minor.class?cap_first /> |
| <#if !minor.class?starts_with("Decimal")> |
| @Override |
| public ${capName}Writer ${lowerName}(String name) { |
| data.getMutator().setType(idx(), MinorType.MAP); |
| getMapWriter().setPosition(idx()); |
| return getMapWriter().${lowerName}(name); |
| } |
| |
| @Override |
| public ${capName}Writer ${lowerName}() { |
| data.getMutator().setType(idx(), MinorType.LIST); |
| getListWriter().setPosition(idx()); |
| return getListWriter().${lowerName}(); |
| } |
| </#if> |
| </#list></#list> |
| |
| @Override |
| public void allocate() { |
| data.allocateNew(); |
| } |
| |
| @Override |
| public void clear() { |
| data.clear(); |
| } |
| |
| @Override |
| public void close() throws Exception { |
| data.close(); |
| } |
| |
| @Override |
| public MaterializedField getField() { |
| return data.getField(); |
| } |
| |
| @Override |
| public int getValueCapacity() { |
| return data.getValueCapacity(); |
| } |
| } |