/** * 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.hive.hcatalog.api; import org.apache.hadoop.hive.common.classification.InterfaceAudience; import org.apache.hadoop.hive.common.classification.InterfaceStability; import org.apache.hadoop.hive.metastore.api.MetaException; import org.apache.hadoop.hive.metastore.partition.spec.PartitionSpecProxy; import org.apache.hive.hcatalog.common.HCatException; /** * Generalized representation of a set of HCatPartitions. */ @InterfaceAudience.LimitedPrivate({"Hive"}) @InterfaceStability.Evolving public class HCatPartitionSpec { protected HCatTable hcatTable; protected PartitionSpecProxy partitionSpecProxy; protected HCatPartitionSpec(HCatTable hcatTable, PartitionSpecProxy partitionSpecProxy) throws HCatException { this.hcatTable = hcatTable; this.partitionSpecProxy = partitionSpecProxy; assert_invariant(); } /** * Getter for DBName of this HCatPartitionSpec. * @return The name of the DB. */ public String getDbName() { return partitionSpecProxy.getDbName(); } /** * Getter for TableName of this HCatPartitionSpec. * @return The name of the TableName. */ public String getTableName() { return partitionSpecProxy.getTableName(); } /** * Setter for HCatTable. Required for deserialization. */ void hcatTable(HCatTable hcatTable) throws HCatException { assert this.hcatTable == null : "Expected hcatTable to be null at this point."; this.hcatTable = hcatTable; assert_invariant(); } /** * Conversion to a Hive Metastore API PartitionSpecProxy instance. */ PartitionSpecProxy toPartitionSpecProxy() { return partitionSpecProxy; } /** * Getter for the number of HCatPartitions represented by this HCatPartitionSpec instance. * @return The number of HCatPartitions. * @throws HCatException On failure. */ public int size() throws HCatException { return partitionSpecProxy.size(); } /** * Setter for the "root" location of the HCatPartitionSpec. * @param location The new "root" location of the HCatPartitionSpec. * @throws HCatException On failure to set a new location. */ public void setRootLocation(String location) throws HCatException { try { partitionSpecProxy.setRootLocation(location); } catch (MetaException metaException) { throw new HCatException("Unable to set root-path!", metaException); } } /** * Getter for an Iterator to the first HCatPartition in the HCatPartitionSpec. * @return HCatPartitionIterator to the first HCatPartition. */ public HCatPartitionIterator getPartitionIterator() { return new HCatPartitionIterator(hcatTable, partitionSpecProxy.getPartitionIterator()); } // Assert class invariant. private void assert_invariant() throws HCatException { if (hcatTable != null) { if (!hcatTable.getDbName().equalsIgnoreCase(partitionSpecProxy.getDbName())) { String errorMessage = "Invalid HCatPartitionSpec instance: Table's DBName (" + hcatTable.getDbName() + ") " + "doesn't match PartitionSpec (" + partitionSpecProxy.getDbName() + ")"; assert false : errorMessage; throw new HCatException(errorMessage); } if (!hcatTable.getTableName().equalsIgnoreCase(partitionSpecProxy.getTableName())) { String errorMessage = "Invalid HCatPartitionSpec instance: Table's TableName (" + hcatTable.getTableName() + ") " + "doesn't match PartitionSpec (" + partitionSpecProxy.getTableName() + ")"; assert false : errorMessage; throw new HCatException(errorMessage); } } } /** * Iterator over HCatPartitions in the HCatPartitionSpec. */ public static class HCatPartitionIterator { // implements java.util.Iterator<HCatPartition> { private HCatTable hcatTable; private PartitionSpecProxy.PartitionIterator iterator; HCatPartitionIterator(HCatTable hcatTable, PartitionSpecProxy.PartitionIterator iterator) { this.hcatTable = hcatTable; this.iterator = iterator; } public boolean hasNext() { return iterator.hasNext(); } public HCatPartition next() throws HCatException { return new HCatPartition(hcatTable, iterator.next()); } public void remove() { iterator.remove(); } } // class HCatPartitionIterator; } // class HCatPartitionSpec;