/**
* 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.metastore.partition.spec;
import org.apache.hadoop.hive.metastore.api.MetaException;
import org.apache.hadoop.hive.metastore.api.Partition;
import org.apache.hadoop.hive.metastore.api.PartitionSpec;
import java.util.List;
import java.util.Map;
/**
* Polymorphic proxy class, equivalent to org.apache.hadoop.hive.metastore.api.PartitionSpec.
*/
public abstract class PartitionSpecProxy {
/**
* The number of Partition instances represented by the PartitionSpec.
* @return Number of partitions.
*/
public abstract int size();
/**
* Setter for name of the DB.
* @param dbName The name of the DB.
*/
public abstract void setDbName(String dbName);
/**
* Setter for name of the table.
* @param tableName The name of the table.
*/
public abstract void setTableName(String tableName);
/**
* Getter for name of the DB.
* @return The name of the DB.
*/
public abstract String getDbName();
/**
* Getter for name of the table.
* @return The name of the table.
*/
public abstract String getTableName();
/**
* Iterator to the (virtual) sequence of Partitions represented by the PartitionSpec.
* @return A PartitionIterator to the beginning of the Partition sequence.
*/
public abstract PartitionIterator getPartitionIterator();
/**
* Conversion to a org.apache.hadoop.hive.metastore.api.PartitionSpec sequence.
* @return A list of org.apache.hadoop.hive.metastore.api.PartitionSpec instances.
*/
public abstract List<PartitionSpec> toPartitionSpec();
/**
* Setter for the common root-location for all partitions in the PartitionSet.
* @param rootLocation The new common root-location.
* @throws MetaException
*/
public abstract void setRootLocation(String rootLocation) throws MetaException;
/**
* Factory to construct PartitionSetProxy instances, from PartitionSets.
*/
public static class Factory {
/**
* Factory method. Construct PartitionSpecProxy from raw PartitionSpec.
* @param partSpec Raw PartitionSpec from the Thrift API.
* @return PartitionSpecProxy instance.
*/
public static PartitionSpecProxy get(PartitionSpec partSpec) {
if (partSpec == null) {
return null;
}
else
if (partSpec.isSetPartitionList()) {
return new PartitionListComposingSpecProxy(partSpec);
}
else
if (partSpec.isSetSharedSDPartitionSpec()) {
return new PartitionSpecWithSharedSDProxy(partSpec);
}
assert false : "Unsupported type of PartitionSpec!";
return null;
}
/**
* Factory method to construct CompositePartitionSpecProxy.
* @param partitionSpecs List of raw PartitionSpecs.
* @return A CompositePartitionSpecProxy instance.
*/
public static PartitionSpecProxy get(List<PartitionSpec> partitionSpecs) {
return new CompositePartitionSpecProxy(partitionSpecs);
}
} // class Factory;
/**
* Iterator to iterate over Partitions corresponding to a PartitionSpec.
*/
public static interface PartitionIterator extends java.util.Iterator<Partition> {
/**
* Getter for the Partition "pointed to" by the iterator.
* Like next(), but without advancing the iterator.
* @return The "current" partition object.
*/
public Partition getCurrent();
/**
* Getter for the name of the DB.
* @return Name of the DB.
*/
public String getDbName();
/**
* Getter for the name of the table.
* @return Name of the table.
*/
public String getTableName();
/**
* Getter for the Partition parameters.
* @return Key-value map for Partition-level parameters.
*/
public Map<String, String> getParameters();
/**
* Setter for Partition parameters.
* @param parameters Key-value map fo Partition-level parameters.
*/
public void setParameters(Map<String, String> parameters);
/**
* Insert an individual parameter to a Partition's parameter-set.
* @param key
* @param value
*/
public void putToParameters(String key, String value);
/**
* Getter for Partition-location.
* @return Partition's location.
*/
public String getLocation();
/**
* Setter for creation-time of a Partition.
* @param time Timestamp indicating the time of creation of the Partition.
*/
public void setCreateTime(long time);
} // class PartitionIterator;
/**
* Simple wrapper class for pre-constructed Partitions, to expose a PartitionIterator interface,
* where the iterator-sequence consists of just one Partition.
*/
public static class SimplePartitionWrapperIterator implements PartitionIterator {
private Partition partition;
public SimplePartitionWrapperIterator(Partition partition) {this.partition = partition;}
@Override public Partition getCurrent() { return partition; }
@Override public String getDbName() { return partition.getDbName(); }
@Override public String getTableName() { return partition.getTableName(); }
@Override public Map<String, String> getParameters() { return partition.getParameters(); }
@Override public void setParameters(Map<String, String> parameters) { partition.setParameters(parameters); }
@Override public void putToParameters(String key, String value) { partition.putToParameters(key, value);}
@Override public String getLocation() { return partition.getSd().getLocation(); }
@Override public void setCreateTime(long time) { partition.setCreateTime((int)time);}
@Override public boolean hasNext() { return false; } // No next partition.
@Override public Partition next() { return null; } // No next partition.
@Override public void remove() {} // Do nothing.
} // P
} // class PartitionSpecProxy;