blob: cd69b831cd2a03079dfb87aec1054150ed68cc03 [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.metadata.schema;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import org.apache.carbondata.core.metadata.schema.partition.PartitionType;
import org.apache.carbondata.core.metadata.schema.table.Writable;
import org.apache.carbondata.core.metadata.schema.table.column.ColumnSchema;
/**
* Partition information of carbon partition table
*/
public class PartitionInfo implements Serializable, Writable {
private static final long serialVersionUID = -0L;
private List<ColumnSchema> columnSchemaList;
private PartitionType partitionType;
/**
* range information defined for range partition table
*/
private List<String> rangeInfo;
/**
* value list defined for list partition table
*/
private List<List<String>> listInfo;
/**
* total count of partitions
*/
private int numPartitions;
/**
* current max partition id, increase only, will be used in alter table partition operation
*/
private int maxPartitionId;
/**
* record the partitionId in the logical ascending order
* initiate when table created and changed when alter table
*/
private List<Integer> partitionIds;
public PartitionInfo() {
}
public PartitionInfo(List<ColumnSchema> columnSchemaList, PartitionType partitionType) {
this.columnSchemaList = columnSchemaList;
this.partitionType = partitionType;
this.partitionIds = new ArrayList<>();
}
/**
* add partition means split default partition, add in last directly
*/
public void addPartition(int addPartitionCount) {
for (int i = 0; i < addPartitionCount; i++) {
partitionIds.add(++maxPartitionId);
numPartitions++;
}
}
/**
* e.g. original partition[0,1,2,3,4,5]
* split partition 2 to partition 6,7,8 (will not reuse 2)
* then sourcePartitionId is 2, newPartitionNumbers is 3
* @param sourcePartitionIndex
* @param newPartitionNumbers
*/
public void splitPartition(int sourcePartitionIndex, int newPartitionNumbers) {
partitionIds.remove(sourcePartitionIndex);
for (int i = 0; i < newPartitionNumbers; i++) {
partitionIds.add(sourcePartitionIndex + i, ++maxPartitionId);
}
numPartitions = numPartitions - 1 + newPartitionNumbers;
}
public void dropPartition(int index) {
partitionIds.remove(index);
numPartitions--;
}
public List<ColumnSchema> getColumnSchemaList() {
return columnSchemaList;
}
public void setColumnSchemaList(List<ColumnSchema> columnSchemaList) {
this.columnSchemaList = columnSchemaList;
}
public PartitionType getPartitionType() {
return partitionType;
}
public void setRangeInfo(List<String> rangeInfo) {
this.rangeInfo = rangeInfo;
}
public List<String> getRangeInfo() {
return rangeInfo;
}
public void setListInfo(List<List<String>> listInfo) {
this.listInfo = listInfo;
}
public List<List<String>> getListInfo() {
return listInfo;
}
public void initialize(int partitionNum) {
for (int i = 0; i < partitionNum; i++) {
partitionIds.add(i);
}
maxPartitionId = partitionNum - 1;
numPartitions = partitionNum;
}
public void setNumPartitions(int numPartitions) {
this.numPartitions = numPartitions;
}
public int getNumPartitions() {
return numPartitions;
}
public int getMaxPartitionId() {
return maxPartitionId;
}
public void setMaxPartitionId(int maxPartitionId) {
this.maxPartitionId = maxPartitionId;
}
public List<Integer> getPartitionIds() {
return partitionIds;
}
public void setPartitionIds(List<Integer> partitionIdList) {
this.partitionIds = partitionIdList;
}
public int getPartitionId(int index) {
return partitionIds.get(index);
}
@Override
public void write(DataOutput output) throws IOException {
output.writeInt(columnSchemaList.size());
for (ColumnSchema columnSchema: columnSchemaList) {
columnSchema.write(output);
}
output.writeInt(partitionType.ordinal());
if (PartitionType.RANGE.equals(partitionType)) {
output.writeInt(rangeInfo.size());
for (String value: rangeInfo) {
output.writeUTF(value);
}
}
output.writeInt(partitionIds.size());
for (Integer value: partitionIds) {
output.writeInt(value);
}
if (PartitionType.LIST.equals(partitionType)) {
output.writeInt(listInfo.size());
for (List<String> listValue: listInfo) {
output.writeInt(listValue.size());
for (String value: listValue) {
output.writeUTF(value);
}
}
}
output.writeInt(numPartitions);
output.writeInt(maxPartitionId);
}
@Override
public void readFields(DataInput input) throws IOException {
int colSchemaSize = input.readInt();
this.columnSchemaList = new ArrayList<>(colSchemaSize);
for (int i = 0; i < colSchemaSize; i++) {
ColumnSchema colSchema = new ColumnSchema();
colSchema.readFields(input);
this.columnSchemaList.add(colSchema);
}
this.partitionType = PartitionType.values()[input.readInt()];
if (PartitionType.RANGE.equals(this.partitionType)) {
int rangeSize = input.readInt();
this.rangeInfo = new ArrayList<>(rangeSize);
for (int i = 0; i < rangeSize; i++) {
rangeInfo.add(input.readUTF());
}
}
int partitionIdSize = input.readInt();
partitionIds = new ArrayList<>(partitionIdSize);
for (int i = 0; i < partitionIdSize; i++) {
partitionIds.add(input.readInt());
}
if (PartitionType.LIST.equals(partitionType)) {
int listInfoSize = input.readInt();
int aListSize;
this.listInfo = new ArrayList<>(listInfoSize);
for (int i = 0; i < listInfoSize; i++) {
aListSize = input.readInt();
List<String> aList = new ArrayList<>(aListSize);
for (int j = 0; j < aListSize; j++) {
aList.add(input.readUTF());
}
this.listInfo.add(aList);
}
}
numPartitions = input.readInt();
maxPartitionId = input.readInt();
}
}