blob: 7ddad718a93402b60bdc2ef85681254e33522e99 [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.
*/
package org.apache.carbondata.core.datastore.row;
import org.apache.carbondata.core.datastore.block.SegmentProperties;
import org.apache.carbondata.core.metadata.datatype.DataTypes;
import org.apache.carbondata.core.metadata.schema.table.column.CarbonColumn;
import org.apache.carbondata.core.scan.wrappers.ByteArrayWrapper;
import org.apache.carbondata.core.util.ByteUtil;
import org.apache.carbondata.core.util.DataTypeUtil;
// Utility to create and retrieve data from CarbonRow in write step.
public class WriteStepRowUtil {
// In write step, the element of CarbonRow is:
// 0: Dictionary dimension columns, encoded as int for each column
// 1: No dictionary and complex columns, they are all together encoded as one element (byte[][])
// 2: Measure columns, encoded as Object for each column
public static final int DICTIONARY_DIMENSION = 0;
public static final int NO_DICTIONARY_AND_COMPLEX = 1;
public static final int MEASURE = 2;
public static CarbonRow fromColumnCategory(int[] dictDimensions, Object[] noDictAndComplex,
Object[] measures) {
Object[] row = new Object[3];
row[DICTIONARY_DIMENSION] = dictDimensions;
row[NO_DICTIONARY_AND_COMPLEX] = noDictAndComplex;
row[MEASURE] = measures;
return new CarbonRow(row);
}
public static CarbonRow fromMergerRow(Object[] row, SegmentProperties segmentProperties,
CarbonColumn[] noDicAndComplexColumns) {
Object[] converted = new Object[3];
// dictionary dimension
byte[] mdk = ((ByteArrayWrapper) row[0]).getDictionaryKey();
int numDict = mdk.length / ByteUtil.dateBytesSize();
int[] dictDimensions = new int[numDict];
for (int i = 0; i < numDict; i++) {
dictDimensions[i] = ByteUtil.convertBytesToInt(mdk, i * ByteUtil.dateBytesSize());
}
converted[DICTIONARY_DIMENSION] = dictDimensions;
Object[] noDictAndComplexKeys =
new Object[segmentProperties.getNumberOfNoDictionaryDimension() + segmentProperties
.getComplexDimensions().size()];
byte[][] noDictionaryKeys = ((ByteArrayWrapper) row[0]).getNoDictionaryKeys();
for (int i = 0; i < noDictionaryKeys.length; i++) {
// in case of compaction rows are collected from result collector and are in byte[].
// Convert the no dictionary columns to original data,
// as load expects the no dictionary column with original data.
if (DataTypeUtil.isPrimitiveColumn(noDicAndComplexColumns[i].getDataType())) {
noDictAndComplexKeys[i] = DataTypeUtil
.getDataBasedOnDataTypeForNoDictionaryColumn(noDictionaryKeys[i],
noDicAndComplexColumns[i].getDataType());
// for timestamp the above method will give the original data, so it should be
// converted again to the format to be loaded (without micros)
if (null != noDictAndComplexKeys[i]
&& noDicAndComplexColumns[i].getDataType() == DataTypes.TIMESTAMP) {
noDictAndComplexKeys[i] = (long) noDictAndComplexKeys[i] / 1000L;
}
} else {
noDictAndComplexKeys[i] = noDictionaryKeys[i];
}
}
// For Complex Type Columns
byte[][] complexKeys = ((ByteArrayWrapper) row[0]).getComplexTypesKeys();
for (int i = segmentProperties.getNumberOfNoDictionaryDimension(), j = 0;
i < segmentProperties.getNumberOfNoDictionaryDimension() + segmentProperties
.getComplexDimensions().size(); i++) {
noDictAndComplexKeys[i] = complexKeys[j++];
}
// no dictionary and complex dimension
converted[NO_DICTIONARY_AND_COMPLEX] = noDictAndComplexKeys;
// measure
int measureCount = row.length - 1;
Object[] measures = new Object[measureCount];
System.arraycopy(row, 1, measures, 0, measureCount);
converted[MEASURE] = measures;
return new CarbonRow(converted);
}
public static int[] getDictDimension(CarbonRow row) {
return (int[]) row.getData()[DICTIONARY_DIMENSION];
}
public static Object[] getNoDictAndComplexDimension(CarbonRow row) {
return (Object[]) row.getData()[NO_DICTIONARY_AND_COMPLEX];
}
public static Object[] getMeasure(CarbonRow row) {
return (Object[]) row.getData()[MEASURE];
}
}