/** * 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. */ package org.apache.hadoop.hive.ql.exec.vector; /** * The representation of a vectorized column of struct objects. * * Each field is represented by a separate inner ColumnVector. Since this * ColumnVector doesn't own any per row data other that the isNull flag, the * isRepeating only covers the isNull array. */ public class UnionColumnVector extends ColumnVector { public int[] tags; public ColumnVector[] fields; public UnionColumnVector() { this(VectorizedRowBatch.DEFAULT_SIZE); } /** * Constructor for UnionColumnVector * * @param len Vector length * @param fields the field column vectors */ public UnionColumnVector(int len, ColumnVector... fields) { super(len); tags = new int[len]; this.fields = fields; } @Override public void flatten(boolean selectedInUse, int[] sel, int size) { flattenPush(); for(int i=0; i < fields.length; ++i) { fields[i].flatten(selectedInUse, sel, size); } flattenNoNulls(selectedInUse, sel, size); } @Override public void setElement(int outElementNum, int inputElementNum, ColumnVector inputVector) { if (inputVector.isRepeating) { inputElementNum = 0; } if (inputVector.noNulls || !inputVector.isNull[inputElementNum]) { isNull[outElementNum] = false; UnionColumnVector input = (UnionColumnVector) inputVector; tags[outElementNum] = input.tags[inputElementNum]; fields[tags[outElementNum]].setElement(outElementNum, inputElementNum, input.fields[tags[outElementNum]]); } else { noNulls = false; isNull[outElementNum] = true; } } @Override public void stringifyValue(StringBuilder buffer, int row) { if (isRepeating) { row = 0; } if (noNulls || !isNull[row]) { buffer.append("{\"tag\": "); buffer.append(tags[row]); buffer.append(", \"value\": "); fields[tags[row]].stringifyValue(buffer, row); buffer.append('}'); } else { buffer.append("null"); } } @Override public void ensureSize(int size, boolean preserveData) { super.ensureSize(size, preserveData); if (tags.length < size) { if (preserveData) { int[] oldTags = tags; tags = new int[size]; System.arraycopy(oldTags, 0, tags, 0, oldTags.length); } else { tags = new int[size]; } for(int i=0; i < fields.length; ++i) { fields[i].ensureSize(size, preserveData); } } } @Override public void reset() { super.reset(); for(int i =0; i < fields.length; ++i) { fields[i].reset(); } } @Override public void init() { super.init(); for(int i =0; i < fields.length; ++i) { fields[i].init(); } } @Override public void unFlatten() { super.unFlatten(); for(int i=0; i < fields.length; ++i) { fields[i].unFlatten(); } } @Override public void setRepeating(boolean isRepeating) { super.setRepeating(isRepeating); for(int i=0; i < fields.length; ++i) { fields[i].setRepeating(isRepeating); } } @Override public void shallowCopyTo(ColumnVector otherCv) { throw new UnsupportedOperationException(); // Implement if needed. } }