This is an automated email from the ASF dual-hosted git repository.

dkuzmenko pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hive.git


The following commit(s) were added to refs/heads/master by this push:
     new 05201478f80 HIVE-28219: Support drop partitions by names in 
IMetaStoreClient (#5223)
05201478f80 is described below

commit 05201478f804904ccf098583b0d5159a3264eeb3
Author: Wechar Yu <yuwq1...@gmail.com>
AuthorDate: Thu Aug 28 16:17:44 2025 +0800

    HIVE-28219: Support drop partitions by names in IMetaStoreClient (#5223)
---
 .../iceberg/mr/hive/HiveIcebergMetaHook.java       | 19 ++++++++
 .../org/apache/hadoop/hive/ql/metadata/Hive.java   | 23 ++++++++--
 .../ql/metadata/SessionHiveMetaStoreClient.java    | 52 ++++++++++++++--------
 .../apache/hadoop/hive/ql/metadata/TestHive.java   | 42 +++++++++++++++++
 .../hadoop/hive/metastore/IMetaStoreClient.java    | 33 ++++++++++++++
 .../hive/metastore/client/BaseMetaStoreClient.java | 20 +++++++++
 .../client/HookEnabledMetaStoreClient.java         | 12 ++---
 .../metastore/client/MetaStoreClientWrapper.java   |  8 ++--
 .../client/ThriftHiveMetaStoreClient.java          | 31 ++++---------
 .../apache/hadoop/hive/metastore/HiveMetaHook.java | 16 +++++++
 10 files changed, 203 insertions(+), 53 deletions(-)

diff --git 
a/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/HiveIcebergMetaHook.java
 
b/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/HiveIcebergMetaHook.java
index 50224923400..a7389f7f20f 100644
--- 
a/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/HiveIcebergMetaHook.java
+++ 
b/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/HiveIcebergMetaHook.java
@@ -45,9 +45,11 @@
 import org.apache.hadoop.hive.metastore.PartitionDropOptions;
 import org.apache.hadoop.hive.metastore.Warehouse;
 import org.apache.hadoop.hive.metastore.api.CreateTableRequest;
+import org.apache.hadoop.hive.metastore.api.DropPartitionsExpr;
 import org.apache.hadoop.hive.metastore.api.EnvironmentContext;
 import org.apache.hadoop.hive.metastore.api.FieldSchema;
 import org.apache.hadoop.hive.metastore.api.MetaException;
+import org.apache.hadoop.hive.metastore.api.RequestPartsSpec;
 import org.apache.hadoop.hive.metastore.api.SQLPrimaryKey;
 import org.apache.hadoop.hive.metastore.api.SerDeInfo;
 import org.apache.hadoop.hive.metastore.api.StorageDescriptor;
@@ -1217,6 +1219,23 @@ public void 
preDropPartitions(org.apache.hadoop.hive.metastore.api.Table hmsTabl
     } catch (IOException e) {
       throw new MetaException(String.format("Error while fetching the 
partitions due to: %s", e));
     }
+  }
+
+  @Override
+  public void preDropPartitions(org.apache.hadoop.hive.metastore.api.Table 
hmsTable,
+                                EnvironmentContext context,
+                                RequestPartsSpec partsSpec) throws 
MetaException {
+    if (partsSpec.isSetExprs()) {
+      List<DropPartitionsExpr> exprs = partsSpec.getExprs();
+      List<org.apache.commons.lang3.tuple.Pair<Integer, byte[]>> partExprs = 
Lists.newArrayList();
+      for (DropPartitionsExpr expr : exprs) {
+        partExprs.add(
+            org.apache.commons.lang3.tuple.Pair.of(expr.getPartArchiveLevel(), 
expr.getExpr()));
+      }
+      preDropPartitions(hmsTable, context, partExprs);
+    } else if (partsSpec.isSetNames()) {
+      preTruncateTable(hmsTable, context, partsSpec.getNames());
+    }
     context.putToProperties(ThriftHiveMetaStoreClient.SKIP_DROP_PARTITION, 
"true");
   }
 
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/metadata/Hive.java 
b/ql/src/java/org/apache/hadoop/hive/ql/metadata/Hive.java
index eec284a9327..82964ddb3c1 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/metadata/Hive.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/metadata/Hive.java
@@ -87,6 +87,7 @@
 import org.apache.hadoop.hive.metastore.api.Database;
 import org.apache.hadoop.hive.metastore.api.DefaultConstraintsRequest;
 import org.apache.hadoop.hive.metastore.api.DropDatabaseRequest;
+import org.apache.hadoop.hive.metastore.api.DropPartitionsExpr;
 import org.apache.hadoop.hive.metastore.api.EnvironmentContext;
 import org.apache.hadoop.hive.metastore.api.FieldSchema;
 import org.apache.hadoop.hive.metastore.api.FireEventRequest;
@@ -126,6 +127,7 @@
 import org.apache.hadoop.hive.metastore.api.PrincipalPrivilegeSet;
 import org.apache.hadoop.hive.metastore.api.PrincipalType;
 import org.apache.hadoop.hive.metastore.api.PrivilegeBag;
+import org.apache.hadoop.hive.metastore.api.RequestPartsSpec;
 import org.apache.hadoop.hive.metastore.api.Role;
 import org.apache.hadoop.hive.metastore.api.RolePrincipalGrant;
 import org.apache.hadoop.hive.metastore.api.SQLAllTableConstraints;
@@ -4065,8 +4067,23 @@ public boolean dropPartition(String dbName, String 
tableName, List<String> parti
   public List<Partition> dropPartitions(String dbName, String tableName,
       List<Pair<Integer, byte[]>> partitionExpressions,
       PartitionDropOptions dropOptions) throws HiveException {
+    RequestPartsSpec rps = new RequestPartsSpec();
+    List<DropPartitionsExpr> exprs = new 
ArrayList<>(partitionExpressions.size());
+
+    for (Pair<Integer, byte[]> partExpr : partitionExpressions) {
+      DropPartitionsExpr dpe = new DropPartitionsExpr();
+      dpe.setExpr(partExpr.getRight());
+      dpe.setPartArchiveLevel(partExpr.getLeft());
+      exprs.add(dpe);
+    }
+    rps.setExprs(exprs);
+    return dropPartitions(new TableName(getDefaultCatalog(conf), dbName, 
tableName), rps, dropOptions);
+  }
+
+  public List<Partition> dropPartitions(TableName tableName,
+      RequestPartsSpec partsSpec, PartitionDropOptions dropOptions) throws 
HiveException {
     try {
-      Table table = getTable(dbName, tableName);
+      Table table = getTable(tableName.getDb(), tableName.getTable());
       if (!dropOptions.deleteData) {
         AcidUtils.TableSnapshot snapshot = AcidUtils.getTableSnapshot(conf, 
table, true);
         if (snapshot != null) {
@@ -4076,8 +4093,8 @@ public List<Partition> dropPartitions(String dbName, 
String tableName,
           .map(ss -> ss.getTxnMgr().getCurrentTxnId()).orElse(0L);
         dropOptions.setTxnId(txnId);
       }
-      List<org.apache.hadoop.hive.metastore.api.Partition> partitions = 
getMSC().dropPartitions(dbName, tableName,
-          partitionExpressions, dropOptions);
+      List<org.apache.hadoop.hive.metastore.api.Partition> partitions = 
getMSC().dropPartitions(
+          tableName, partsSpec, dropOptions, null);
       return convertFromMetastore(table, partitions);
     } catch (NoSuchObjectException e) {
       throw new HiveException("Partition or table doesn't exist.", e);
diff --git 
a/ql/src/java/org/apache/hadoop/hive/ql/metadata/SessionHiveMetaStoreClient.java
 
b/ql/src/java/org/apache/hadoop/hive/ql/metadata/SessionHiveMetaStoreClient.java
index fee1897cca7..5a897cfd24b 100644
--- 
a/ql/src/java/org/apache/hadoop/hive/ql/metadata/SessionHiveMetaStoreClient.java
+++ 
b/ql/src/java/org/apache/hadoop/hive/ql/metadata/SessionHiveMetaStoreClient.java
@@ -45,6 +45,7 @@
 import org.apache.hadoop.hive.metastore.api.CreateTableRequest;
 import org.apache.hadoop.hive.metastore.api.Database;
 import org.apache.hadoop.hive.metastore.api.DeleteColumnStatisticsRequest;
+import org.apache.hadoop.hive.metastore.api.DropPartitionsExpr;
 import org.apache.hadoop.hive.metastore.api.EnvironmentContext;
 import org.apache.hadoop.hive.metastore.api.FieldSchema;
 import org.apache.hadoop.hive.metastore.api.ForeignKeysRequest;
@@ -82,6 +83,7 @@
 import org.apache.hadoop.hive.metastore.api.PrimaryKeysRequest;
 import org.apache.hadoop.hive.metastore.api.PrimaryKeysResponse;
 import org.apache.hadoop.hive.metastore.api.PrincipalPrivilegeSet;
+import org.apache.hadoop.hive.metastore.api.RequestPartsSpec;
 import org.apache.hadoop.hive.metastore.api.SQLForeignKey;
 import org.apache.hadoop.hive.metastore.api.SQLNotNullConstraint;
 import org.apache.hadoop.hive.metastore.api.SQLPrimaryKey;
@@ -92,6 +94,7 @@
 import org.apache.hadoop.hive.metastore.api.TableValidWriteIds;
 import org.apache.hadoop.hive.metastore.api.UniqueConstraintsRequest;
 import org.apache.hadoop.hive.metastore.api.UniqueConstraintsResponse;
+import org.apache.hadoop.hive.metastore.cache.CachedStore;
 import org.apache.hadoop.hive.metastore.client.MetaStoreClientWrapper;
 import org.apache.hadoop.hive.metastore.client.ThriftHiveMetaStoreClient;
 import org.apache.hadoop.hive.metastore.client.builder.PartitionBuilder;
@@ -1559,28 +1562,39 @@ public boolean dropPartition(String catName, String 
dbName, String tableName, St
   }
 
   @Override
-  public List<Partition> dropPartitions(String catName, String dbName, String 
tblName,
-      List<Pair<Integer, byte[]>> partExprs, PartitionDropOptions options, 
EnvironmentContext context)
+  public List<Partition> dropPartitions(TableName tableName,
+      RequestPartsSpec partsSpec, PartitionDropOptions options, 
EnvironmentContext context)
       throws TException {
-    if (isDefaultCatalog(catName)) {
-      Table table = getTempTable(dbName, tblName);
+    if (isDefaultCatalog(tableName.getCat())) {
+      Table table = getTempTable(tableName.getDb(), tableName.getTable());
       if (table != null) {
         TempTable tt = getPartitionedTempTable(table);
+            List<List<String>> partValues = new ArrayList<>();
+        if (partsSpec.isSetExprs()) {
+          List<DropPartitionsExpr> exprs = partsSpec.getExprs();
+          for (DropPartitionsExpr expr : exprs) {
+            String filter = generateJDOFilter(table, expr.getExpr(),
+                conf.get(HiveConf.ConfVars.DEFAULT_PARTITION_NAME.varname));
+            List<Partition> partitions = tt.listPartitionsByFilter(filter);
+            for (Partition p : partitions) {
+              partValues.add(p.getValues());
+            }
+          }
+        } else if (partsSpec.isSetNames()) {
+          List<String> partNames = partsSpec.getNames();
+          for (String partName : partNames) {
+            partValues.add(CachedStore.partNameToVals(partName));
+          }
+        }
+        boolean purgeData = options != null ? options.purgeData : true;
+        boolean deleteData = options != null ? options.deleteData : true;
         List<Partition> result = new ArrayList<>();
-        for (Pair<Integer, byte[]> pair : partExprs) {
-          byte[] expr = pair.getRight();
-          String filter = generateJDOFilter(table, expr,
-              conf.get(HiveConf.ConfVars.DEFAULT_PARTITION_NAME.varname));
-          List<Partition> partitions = tt.listPartitionsByFilter(filter);
-          for (Partition p : partitions) {
-            Partition droppedPartition = tt.dropPartition(p.getValues());
-            if (droppedPartition != null) {
-              result.add(droppedPartition);
-              boolean purgeData = options != null ? options.purgeData : true;
-              boolean deleteData = options != null ? options.deleteData : true;
-              if (deleteData && !tt.isExternal()) {
-                deletePartitionLocation(droppedPartition, purgeData);
-              }
+        for (List<String> partValue : partValues) {
+          Partition droppedPartition = tt.dropPartition(partValue);
+          if (droppedPartition != null) {
+            result.add(droppedPartition);
+            if (deleteData && !tt.isExternal()) {
+              deletePartitionLocation(droppedPartition, purgeData);
             }
           }
         }
@@ -1588,7 +1602,7 @@ public List<Partition> dropPartitions(String catName, 
String dbName, String tblN
       }
     }
 
-    return delegate.dropPartitions(catName, dbName, tblName, partExprs, 
options, context);
+    return delegate.dropPartitions(tableName, partsSpec, options, context);
   }
 
   @Override
diff --git a/ql/src/test/org/apache/hadoop/hive/ql/metadata/TestHive.java 
b/ql/src/test/org/apache/hadoop/hive/ql/metadata/TestHive.java
index f722520d590..0fb4b06611e 100755
--- a/ql/src/test/org/apache/hadoop/hive/ql/metadata/TestHive.java
+++ b/ql/src/test/org/apache/hadoop/hive/ql/metadata/TestHive.java
@@ -39,6 +39,7 @@
 import org.apache.hadoop.fs.FileStatus;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
+import org.apache.hadoop.hive.common.TableName;
 import org.apache.hadoop.hive.conf.HiveConf;
 import org.apache.hadoop.hive.conf.HiveConf.ConfVars;
 import org.apache.hadoop.hive.metastore.IMetaStoreClient;
@@ -48,6 +49,7 @@
 import org.apache.hadoop.hive.metastore.api.Database;
 import org.apache.hadoop.hive.metastore.api.FieldSchema;
 import org.apache.hadoop.hive.metastore.api.MetaException;
+import org.apache.hadoop.hive.metastore.api.RequestPartsSpec;
 import org.apache.hadoop.hive.metastore.api.WMNullableResourcePlan;
 import org.apache.hadoop.hive.metastore.api.WMPool;
 import org.apache.hadoop.hive.metastore.api.WMResourcePlan;
@@ -745,6 +747,46 @@ public void testDropPartitionsWithPurge() throws Exception 
{
     }
   }
 
+  @Test
+  public void testDropPartitionsByNames() throws Throwable {
+    String catName = Warehouse.DEFAULT_CATALOG_NAME;
+    String dbName = Warehouse.DEFAULT_DATABASE_NAME;
+    String tblName = "table_for_testDropPartitionsByNames";
+    TableName tableName = new TableName(catName, dbName, tblName);
+
+    Table table = createPartitionedTable(dbName, tblName);
+    for (int i = 10; i <= 12; i++) {
+      Map<String, String> partitionSpec = new ImmutableMap.Builder<String, 
String>()
+          .put("ds", "20231129")
+          .put("hr", String.valueOf(i))
+          .build();
+      hm.createPartition(table, partitionSpec);
+    }
+
+    List<Partition> partitions = hm.getPartitions(table);
+    assertEquals(3, partitions.size());
+
+    RequestPartsSpec partsSpec = new RequestPartsSpec();
+    partsSpec.setNames(Arrays.asList("ds=20231129/hr=10"));
+    hm.dropPartitions(tableName, partsSpec, PartitionDropOptions.instance());
+    assertEquals(2, hm.getPartitions(table).size());
+
+    try {
+      // drop missing partition name
+      partsSpec.setNames(Arrays.asList("ds=20231129/hr=10", 
"ds=20231129/hr=11"));
+      hm.dropPartitions(tableName, partsSpec, PartitionDropOptions.instance());
+      fail("Expected exception");
+    } catch (HiveException e) {
+      // expected
+      assertEquals("Some partitions to drop are missing", 
e.getCause().getMessage());
+      assertEquals(2, hm.getPartitions(table).size());
+    }
+
+    partsSpec.setNames(Arrays.asList("ds=20231129/hr=12", 
"ds=20231129/hr=11"));
+    hm.dropPartitions(tableName, partsSpec, PartitionDropOptions.instance());
+    assertEquals(0, hm.getPartitions(table).size());
+  }
+
   @Test
   public void testDropMissingPartitionsByFilter() throws Throwable {
     String dbName = Warehouse.DEFAULT_DATABASE_NAME;
diff --git 
a/standalone-metastore/metastore-client/src/main/java/org/apache/hadoop/hive/metastore/IMetaStoreClient.java
 
b/standalone-metastore/metastore-client/src/main/java/org/apache/hadoop/hive/metastore/IMetaStoreClient.java
index 0b668c155a6..793cfffceda 100644
--- 
a/standalone-metastore/metastore-client/src/main/java/org/apache/hadoop/hive/metastore/IMetaStoreClient.java
+++ 
b/standalone-metastore/metastore-client/src/main/java/org/apache/hadoop/hive/metastore/IMetaStoreClient.java
@@ -1980,6 +1980,8 @@ boolean dropPartition(String catName, String db_name, 
String tbl_name, List<Stri
 
   /**
    * Drop partitions based on an expression.
+   * @deprecated since 4.1.0, will be removed in 5.0.0
+   * use {@link #dropPartitions(TableName, RequestPartsSpec, 
PartitionDropOptions, EnvironmentContext)} instead.
    * @param dbName database name.
    * @param tblName table name.
    * @param partExprs I don't understand this fully, so can't completely 
explain it.  The second
@@ -1994,12 +1996,15 @@ boolean dropPartition(String catName, String db_name, 
String tbl_name, List<Stri
    * @throws MetaException error access the RDBMS or storage.
    * @throws TException Thrift transport error.
    */
+  @Deprecated
   List<Partition> dropPartitions(String dbName, String tblName,
                                  List<Pair<Integer, byte[]>> partExprs, 
boolean deleteData,
                                  boolean ifExists) throws 
NoSuchObjectException, MetaException, TException;
 
   /**
    * Drop partitions based on an expression.
+   * @deprecated since 4.1.0, will be removed in 5.0.0
+   * use {@link #dropPartitions(TableName, RequestPartsSpec, 
PartitionDropOptions, EnvironmentContext)} instead.
    * @param catName catalog name.
    * @param dbName database name.
    * @param tblName table name.
@@ -2015,6 +2020,7 @@ List<Partition> dropPartitions(String dbName, String 
tblName,
    * @throws MetaException error access the RDBMS or storage.
    * @throws TException Thrift transport error.
    */
+  @Deprecated
   default List<Partition> dropPartitions(String catName, String dbName, String 
tblName,
                                          List<Pair<Integer, byte[]>> partExprs,
                                          boolean deleteData, boolean ifExists)
@@ -2027,6 +2033,8 @@ default List<Partition> dropPartitions(String catName, 
String dbName, String tbl
 
   /**
    * Drop partitions based on an expression.
+   * @deprecated since 4.1.0, will be removed in 5.0.0
+   * use {@link #dropPartitions(TableName, RequestPartsSpec, 
PartitionDropOptions, EnvironmentContext)} instead.
    * @param catName catalog name.
    * @param dbName database name.
    * @param tblName table name.
@@ -2044,6 +2052,7 @@ default List<Partition> dropPartitions(String catName, 
String dbName, String tbl
    * @throws MetaException error access the RDBMS or storage.
    * @throws TException Thrift transport error.
    */
+  @Deprecated
   default List<Partition> dropPartitions(String catName, String dbName, String 
tblName,
                                          List<Pair<Integer, byte[]>> 
partExprs, boolean deleteData,
                                          boolean ifExists, boolean needResults)
@@ -2057,6 +2066,8 @@ default List<Partition> dropPartitions(String catName, 
String dbName, String tbl
 
   /**
    * Generalization of dropPartitions(),
+   * @deprecated since 4.1.0, will be removed in 5.0.0
+   * use {@link #dropPartitions(TableName, RequestPartsSpec, 
PartitionDropOptions, EnvironmentContext)} instead.
    * @param dbName Name of the database
    * @param tblName Name of the table
    * @param partExprs Partition-specification
@@ -2066,6 +2077,7 @@ default List<Partition> dropPartitions(String catName, 
String dbName, String tbl
    * @throws MetaException error access the RDBMS or storage.
    * @throws TException On failure
    */
+  @Deprecated
   List<Partition> dropPartitions(String dbName, String tblName,
                                  List<Pair<Integer, byte[]>> partExprs,
                                  PartitionDropOptions options)
@@ -2073,6 +2085,8 @@ List<Partition> dropPartitions(String dbName, String 
tblName,
 
   /**
    * Generalization of dropPartitions(),
+   * @deprecated since 4.1.0, will be removed in 5.0.0
+   * use {@link #dropPartitions(TableName, RequestPartsSpec, 
PartitionDropOptions, EnvironmentContext)} instead.
    * @param catName catalog name
    * @param dbName Name of the database
    * @param tblName Name of the table
@@ -2083,15 +2097,34 @@ List<Partition> dropPartitions(String dbName, String 
tblName,
    * @throws MetaException error access the RDBMS or storage.
    * @throws TException On failure
    */
+  @Deprecated
   List<Partition> dropPartitions(String catName, String dbName, String tblName,
                                  List<Pair<Integer, byte[]>> partExprs,
                                  PartitionDropOptions options)
       throws NoSuchObjectException, MetaException, TException;
 
+  /**
+   * @deprecated since 4.1.0, will be removed in 5.0.0
+   * use {@link #dropPartitions(TableName, RequestPartsSpec, 
PartitionDropOptions, EnvironmentContext)} instead.
+   */
+  @Deprecated
   List<Partition> dropPartitions(String catName, String dbName, String tblName,
       List<Pair<Integer, byte[]>> partExprs, PartitionDropOptions options, 
EnvironmentContext context)
       throws NoSuchObjectException, MetaException, TException;
 
+  /**
+   * Drop partitions based on the request partitions specification.
+   * @param tableName Name of the table.
+   * @param partsSpec Specification of the partitions to drop.
+   * @param options Options for dropping partitions.
+   * @param context Environment context for the operation.
+   * @return List of Partitions dropped.
+   * @throws TException thrift transport error.
+   */
+  List<Partition> dropPartitions(TableName tableName,
+      RequestPartsSpec partsSpec, PartitionDropOptions options, 
EnvironmentContext context)
+      throws TException;
+
   /**
    * Drop a partition.
    * @param db_name database name.
diff --git 
a/standalone-metastore/metastore-client/src/main/java/org/apache/hadoop/hive/metastore/client/BaseMetaStoreClient.java
 
b/standalone-metastore/metastore-client/src/main/java/org/apache/hadoop/hive/metastore/client/BaseMetaStoreClient.java
index 5dd1703b0e8..8a624735a14 100644
--- 
a/standalone-metastore/metastore-client/src/main/java/org/apache/hadoop/hive/metastore/client/BaseMetaStoreClient.java
+++ 
b/standalone-metastore/metastore-client/src/main/java/org/apache/hadoop/hive/metastore/client/BaseMetaStoreClient.java
@@ -33,7 +33,10 @@
 import org.apache.hadoop.hive.metastore.utils.MetaStoreUtils;
 import org.apache.thrift.TException;
 
+import com.google.common.collect.Lists;
+
 import java.nio.ByteBuffer;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
@@ -557,6 +560,23 @@ public final List<Partition> dropPartitions(String 
catName, String dbName, Strin
     return dropPartitions(catName, dbName, tblName, partExprs, options, null);
   }
 
+  @Override
+  public List<Partition> dropPartitions(String catName, String dbName, String 
tblName,
+      List<Pair<Integer, byte[]>> partExprs, PartitionDropOptions options, 
EnvironmentContext context)
+      throws NoSuchObjectException, MetaException, TException {
+    RequestPartsSpec rps = new RequestPartsSpec();
+    List<DropPartitionsExpr> exprs = new ArrayList<>(partExprs.size());
+
+    for (Pair<Integer, byte[]> partExpr : partExprs) {
+      DropPartitionsExpr dpe = new DropPartitionsExpr();
+      dpe.setExpr(partExpr.getRight());
+      dpe.setPartArchiveLevel(partExpr.getLeft());
+      exprs.add(dpe);
+    }
+    rps.setExprs(exprs);
+    return dropPartitions(new TableName(catName, dbName, tblName), rps, 
options, context);
+  }
+
   @Override
   public final boolean dropPartition(String db_name, String tbl_name, String 
name, boolean deleteData)
       throws NoSuchObjectException, MetaException, TException {
diff --git 
a/standalone-metastore/metastore-client/src/main/java/org/apache/hadoop/hive/metastore/client/HookEnabledMetaStoreClient.java
 
b/standalone-metastore/metastore-client/src/main/java/org/apache/hadoop/hive/metastore/client/HookEnabledMetaStoreClient.java
index d8f4174249e..0c4dc3061ca 100644
--- 
a/standalone-metastore/metastore-client/src/main/java/org/apache/hadoop/hive/metastore/client/HookEnabledMetaStoreClient.java
+++ 
b/standalone-metastore/metastore-client/src/main/java/org/apache/hadoop/hive/metastore/client/HookEnabledMetaStoreClient.java
@@ -20,6 +20,7 @@
 
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.hive.common.TableName;
 import org.apache.hadoop.hive.metastore.DefaultHiveMetaHook;
 import org.apache.hadoop.hive.metastore.HiveMetaHook;
 import org.apache.hadoop.hive.metastore.HiveMetaHookLoader;
@@ -35,6 +36,7 @@
 import org.apache.hadoop.hive.metastore.api.MetaException;
 import org.apache.hadoop.hive.metastore.api.NoSuchObjectException;
 import org.apache.hadoop.hive.metastore.api.Partition;
+import org.apache.hadoop.hive.metastore.api.RequestPartsSpec;
 import org.apache.hadoop.hive.metastore.api.SQLCheckConstraint;
 import org.apache.hadoop.hive.metastore.api.SQLDefaultConstraint;
 import org.apache.hadoop.hive.metastore.api.SQLForeignKey;
@@ -311,18 +313,18 @@ private void dropDatabaseCascadePerDb(DropDatabaseRequest 
req, List<String> tabl
   }
 
   @Override
-  public List<Partition> dropPartitions(String catName, String dbName, String 
tblName,
-      List<Pair<Integer, byte[]>> partExprs, PartitionDropOptions options, 
EnvironmentContext context)
+  public List<Partition> dropPartitions(TableName tableName,
+      RequestPartsSpec partsSpec, PartitionDropOptions options, 
EnvironmentContext context)
       throws TException {
-    Table table = delegate.getTable(catName, dbName, tblName);
+    Table table = delegate.getTable(tableName.getCat(), tableName.getDb(), 
tableName.getTable());
     HiveMetaHook hook = getHook(table);
     if (hook != null) {
       if (context == null) {
         context = new EnvironmentContext();
       }
-      hook.preDropPartitions(table, context, partExprs);
+      hook.preDropPartitions(table, context, partsSpec);
     }
-    return delegate.dropPartitions(catName, dbName, tblName, partExprs, 
options, context);
+    return delegate.dropPartitions(tableName, partsSpec, options, context);
   }
 
   @Override
diff --git 
a/standalone-metastore/metastore-client/src/main/java/org/apache/hadoop/hive/metastore/client/MetaStoreClientWrapper.java
 
b/standalone-metastore/metastore-client/src/main/java/org/apache/hadoop/hive/metastore/client/MetaStoreClientWrapper.java
index a200ee4a14b..4d63e4f8812 100644
--- 
a/standalone-metastore/metastore-client/src/main/java/org/apache/hadoop/hive/metastore/client/MetaStoreClientWrapper.java
+++ 
b/standalone-metastore/metastore-client/src/main/java/org/apache/hadoop/hive/metastore/client/MetaStoreClientWrapper.java
@@ -18,8 +18,8 @@
 
 package org.apache.hadoop.hive.metastore.client;
 
-import org.apache.commons.lang3.tuple.Pair;
 import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.hive.common.TableName;
 import org.apache.hadoop.hive.common.ValidTxnList;
 import org.apache.hadoop.hive.common.ValidWriteIdList;
 import org.apache.hadoop.hive.metastore.IMetaStoreClient;
@@ -504,10 +504,10 @@ public boolean dropPartition(String catName, String 
db_name, String tbl_name, Li
   }
 
   @Override
-  public List<Partition> dropPartitions(String catName, String dbName, String 
tblName,
-      List<Pair<Integer, byte[]>> partExprs, PartitionDropOptions options, 
EnvironmentContext context)
+  public List<Partition> dropPartitions(TableName tableName,
+      RequestPartsSpec partsSpec, PartitionDropOptions options, 
EnvironmentContext context)
       throws NoSuchObjectException, MetaException, TException {
-    return delegate.dropPartitions(catName, dbName, tblName, partExprs, 
options, context);
+    return delegate.dropPartitions(tableName, partsSpec, options, context);
   }
 
   @Override
diff --git 
a/standalone-metastore/metastore-client/src/main/java/org/apache/hadoop/hive/metastore/client/ThriftHiveMetaStoreClient.java
 
b/standalone-metastore/metastore-client/src/main/java/org/apache/hadoop/hive/metastore/client/ThriftHiveMetaStoreClient.java
index a2aafd0f3da..24a50145364 100644
--- 
a/standalone-metastore/metastore-client/src/main/java/org/apache/hadoop/hive/metastore/client/ThriftHiveMetaStoreClient.java
+++ 
b/standalone-metastore/metastore-client/src/main/java/org/apache/hadoop/hive/metastore/client/ThriftHiveMetaStoreClient.java
@@ -25,6 +25,7 @@
 import org.apache.hadoop.classification.InterfaceAudience;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hive.common.StatsSetupConst;
+import org.apache.hadoop.hive.common.TableName;
 import org.apache.hadoop.hive.common.ValidTxnList;
 import org.apache.hadoop.hive.common.ValidWriteIdList;
 import org.apache.hadoop.hive.metastore.DefaultMetaStoreFilterHookImpl;
@@ -1583,44 +1584,30 @@ public boolean dropPartition(String catName, String 
db_name, String tbl_name,
   }
 
   @Override
-  public List<Partition> dropPartitions(String catName, String dbName, String 
tblName,
-      List<Pair<Integer, byte[]>> partExprs, PartitionDropOptions options, 
EnvironmentContext context)
+  public List<Partition> dropPartitions(TableName tableName,
+      RequestPartsSpec partsSpec, PartitionDropOptions options, 
EnvironmentContext context)
       throws NoSuchObjectException, MetaException, TException {
+    DropPartitionsRequest req = new DropPartitionsRequest(tableName.getDb(), 
tableName.getTable(), partsSpec);
+    req.setCatName(tableName.getCat());
+    req.setDeleteData(options.deleteData);
+    req.setNeedResult(options.returnResults);
+    req.setIfExists(options.ifExists);
+
     if (context == null) {
       context = new EnvironmentContext();
     }
-
     if (context.getProperties() != null &&
         
Boolean.parseBoolean(context.getProperties().get(SKIP_DROP_PARTITION))) {
       return Lists.newArrayList();
     }
-
-    RequestPartsSpec rps = new RequestPartsSpec();
-    List<DropPartitionsExpr> exprs = new ArrayList<>(partExprs.size());
-
-    for (Pair<Integer, byte[]> partExpr : partExprs) {
-      DropPartitionsExpr dpe = new DropPartitionsExpr();
-      dpe.setExpr(partExpr.getRight());
-      dpe.setPartArchiveLevel(partExpr.getLeft());
-      exprs.add(dpe);
-    }
-    rps.setExprs(exprs);
-    DropPartitionsRequest req = new DropPartitionsRequest(dbName, tblName, 
rps);
-    req.setCatName(catName);
-    req.setDeleteData(options.deleteData);
-    req.setNeedResult(options.returnResults);
-    req.setIfExists(options.ifExists);
-
     if (options.purgeData) {
       LOG.info("Dropped partitions will be purged!");
       context.putToProperties("ifPurge", "true");
     }
     if (options.writeId != null) {
-      context = Optional.ofNullable(context).orElse(new EnvironmentContext());
       context.putToProperties(hive_metastoreConstants.WRITE_ID, 
options.writeId.toString());
     }
     if (options.txnId != null) {
-      context = Optional.ofNullable(context).orElse(new EnvironmentContext());
       context.putToProperties(hive_metastoreConstants.TXN_ID, 
options.txnId.toString());
     }
     req.setEnvironmentContext(context);
diff --git 
a/standalone-metastore/metastore-common/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaHook.java
 
b/standalone-metastore/metastore-common/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaHook.java
index 11dfa1120c8..2569335061e 100644
--- 
a/standalone-metastore/metastore-common/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaHook.java
+++ 
b/standalone-metastore/metastore-common/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaHook.java
@@ -24,6 +24,7 @@
 import org.apache.hadoop.hive.metastore.api.CreateTableRequest;
 import org.apache.hadoop.hive.metastore.api.EnvironmentContext;
 import org.apache.hadoop.hive.metastore.api.MetaException;
+import org.apache.hadoop.hive.metastore.api.RequestPartsSpec;
 import org.apache.hadoop.hive.metastore.api.Table;
 import com.google.common.collect.ImmutableList;
 
@@ -217,13 +218,28 @@ default void postGetTable(Table table) {
 
   /**
    * Called before dropping the partitions from the table in the metastore 
during ALTER TABLE DROP PARTITION.
+   * @deprecated since 4.1.0, will be removed in 5.0.0
+   * use {@link #preDropPartitions(Table, EnvironmentContext, 
RequestPartsSpec)} instead.
    * @param table table whose partition needs to be dropped
    * @param context context of the  operation
    * @param partExprs List of partition expressions
    * @throws MetaException
    */
+  @Deprecated
   default void preDropPartitions(Table table,
       EnvironmentContext context, List<Pair<Integer, byte[]>> partExprs) 
throws MetaException {
     // Do nothing
   }
+
+ /**
+   * Called before dropping the partitions from the table in the metastore 
during ALTER TABLE DROP PARTITION.
+   * @param table table whose partition needs to be dropped
+   * @param context context of the  operation
+   * @param partsSpec request partition specification
+   * @throws MetaException
+   */
+  default void preDropPartitions(Table table,
+      EnvironmentContext context, RequestPartsSpec partsSpec) throws 
MetaException {
+    // Do nothing
+  }
 }

Reply via email to