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