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

dengzh 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 21be22f68c2 HIVE-28286: Add filtering support for get_table_metas 
(#5269) (Naveen Gangam, reviewed by Mayank Kunwar, Zoltan Ratkai, John Sherman 
and Zhihua Deng)
21be22f68c2 is described below

commit 21be22f68c23e417b657ce260127677f5b521f8b
Author: Naveen Gangam <[email protected]>
AuthorDate: Thu Jun 6 09:52:26 2024 -0400

    HIVE-28286: Add filtering support for get_table_metas (#5269) (Naveen 
Gangam, reviewed by Mayank Kunwar, Zoltan Ratkai, John Sherman and Zhihua Deng)
---
 .../plugin/metastore/HiveMetaStoreAuthorizer.java  | 49 ++++++++++++++++++++--
 1 file changed, 46 insertions(+), 3 deletions(-)

diff --git 
a/ql/src/java/org/apache/hadoop/hive/ql/security/authorization/plugin/metastore/HiveMetaStoreAuthorizer.java
 
b/ql/src/java/org/apache/hadoop/hive/ql/security/authorization/plugin/metastore/HiveMetaStoreAuthorizer.java
index b5199ad45d1..25eb646e8b3 100644
--- 
a/ql/src/java/org/apache/hadoop/hive/ql/security/authorization/plugin/metastore/HiveMetaStoreAuthorizer.java
+++ 
b/ql/src/java/org/apache/hadoop/hive/ql/security/authorization/plugin/metastore/HiveMetaStoreAuthorizer.java
@@ -65,8 +65,12 @@ import org.slf4j.LoggerFactory;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * HiveMetaStoreAuthorizer :  Do authorization checks on MetaStore Events in 
MetaStorePreEventListener
@@ -213,15 +217,54 @@ public class HiveMetaStoreAuthorizer extends 
MetaStorePreEventListener implement
 
   @Override
   @Deprecated
-  public List<TableMeta> filterTableMetas(String catName, String 
dbName,List<TableMeta> tableMetas)
+  public List<TableMeta> filterTableMetas(String catName, String dbName, 
List<TableMeta> tableMetas)
       throws MetaException {
-    return filterTableMetas(tableMetas);
+    LOG.debug("==> HiveMetaStoreAuthorizer.filterTableMetas()");
+    if (!CollectionUtils.isEmpty(tableMetas)) {
+      List<String> tableNames = new ArrayList<>();
+      tableMetas.forEach(tableMeta -> {
+        if (!tableMeta.getCatName().equalsIgnoreCase(catName) ||
+            !tableMeta.getDbName().equalsIgnoreCase(dbName)) {
+          throw new IllegalArgumentException(String.format("Table: %s doesn't 
belong to the catalog: %s, database: %s",
+              tableMeta.getCatName() + "." + tableMeta.getDbName() + "." + 
tableMeta.getTableName(), catName, dbName));
+        }
+        tableNames.add(tableMeta.getTableName());
+      });
+      TableFilterContext     tableFilterContext     = new 
TableFilterContext(dbName, tableNames);
+      HiveMetaStoreAuthzInfo hiveMetaStoreAuthzInfo = 
tableFilterContext.getAuthzContext();
+      final List<String>  filteredTableNames = 
filterTableNames(hiveMetaStoreAuthzInfo, dbName, tableNames);
+      if (!CollectionUtils.isEmpty(filteredTableNames)) {
+        Set<String> filteredTabs = new HashSet<>(filteredTableNames);
+        LOG.debug("<== HiveMetaStoreAuthorizer.filterTableMetas() : {}", 
filteredTabs);
+        return tableMetas.stream().filter(tblMeta -> 
filteredTabs.contains(tblMeta.getTableName()))
+            .collect(Collectors.toList());
+      }
+    }
+    LOG.info("<== HiveMetaStoreAuthorizer.filterTableMetas() : returning empty 
set");
+    return Collections.emptyList();
   }
 
   @Override
   public final List<TableMeta> filterTableMetas(List<TableMeta> tableMetas)
       throws MetaException {
-    return tableMetas;
+    LOG.debug("==> HiveMetaStoreAuthorizer.filterTableMetas()");
+    if (!CollectionUtils.isEmpty(tableMetas)) {
+      Map<String, List<TableMeta>> metaGroupByCatDb = new HashMap<>();
+      tableMetas.forEach(tableMeta -> {
+        String key = 
MetaStoreUtils.prependCatalogToDbName(tableMeta.getCatName(),
+            tableMeta.getDbName(), getConf()).toLowerCase();
+        metaGroupByCatDb.computeIfAbsent(key, s -> new 
ArrayList<>()).add(tableMeta);
+      });
+      List<TableMeta> filteredTabs = new ArrayList<>();
+      for (Map.Entry<String, List<TableMeta>> entry : 
metaGroupByCatDb.entrySet()) {
+        TableMeta firstTabMeta = entry.getValue().get(0);
+        filteredTabs.addAll(filterTableMetas(firstTabMeta.getCatName(),
+            firstTabMeta.getDbName(), entry.getValue()));
+      }
+      return filteredTabs;
+    }
+    LOG.info("<== HiveMetaStoreAuthorizer.filterTableMetas() : returning empty 
set");
+    return Collections.emptyList();
   }
 
   @Override

Reply via email to