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

krisztiankasa 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 b92763e  HIVE-24820: MaterializedViewCache enables adding multiple 
entries of the same Materialization instance (Krisztian Kasa, reviewed by 
Zoltan Haindrich)
b92763e is described below

commit b92763e8e193076815f4ed6ba299c873d770aec1
Author: Krisztian Kasa <[email protected]>
AuthorDate: Thu Jan 27 11:35:27 2022 +0100

    HIVE-24820: MaterializedViewCache enables adding multiple entries of the 
same Materialization instance (Krisztian Kasa, reviewed by Zoltan Haindrich)
---
 .../update/MaterializedViewUpdateOperation.java    |  2 +-
 .../ql/metadata/HiveMaterializedViewsRegistry.java | 13 ++++++++++++
 .../hive/ql/metadata/MaterializedViewsCache.java   |  2 +-
 .../ql/metadata/TestMaterializedViewsCache.java    | 12 +++++++++++
 .../clientpositive/materialized_view_partitioned.q |  4 ++++
 .../llap/materialized_view_partitioned.q.out       | 24 ++++++++++++++++++++++
 6 files changed, 55 insertions(+), 2 deletions(-)

diff --git 
a/ql/src/java/org/apache/hadoop/hive/ql/ddl/view/materialized/update/MaterializedViewUpdateOperation.java
 
b/ql/src/java/org/apache/hadoop/hive/ql/ddl/view/materialized/update/MaterializedViewUpdateOperation.java
index 312a663..9e91da8 100644
--- 
a/ql/src/java/org/apache/hadoop/hive/ql/ddl/view/materialized/update/MaterializedViewUpdateOperation.java
+++ 
b/ql/src/java/org/apache/hadoop/hive/ql/ddl/view/materialized/update/MaterializedViewUpdateOperation.java
@@ -56,7 +56,7 @@ public class MaterializedViewUpdateOperation extends 
DDLOperation<MaterializedVi
                 
context.getConf().get(ValidTxnWriteIdList.VALID_TABLES_WRITEIDS_KEY));
         context.getDb().updateCreationMetadata(mvTable.getDbName(), 
mvTable.getTableName(), newMetadata);
         mvTable.setMaterializedViewMetadata(newMetadata);
-        
HiveMaterializedViewsRegistry.get().createMaterializedView(context.getDb().getConf(),
 mvTable);
+        
HiveMaterializedViewsRegistry.get().refreshMaterializedView(context.getDb().getConf(),
 mvTable);
       }
     } catch (HiveException e) {
       LOG.debug("Exception during materialized view cache update", e);
diff --git 
a/ql/src/java/org/apache/hadoop/hive/ql/metadata/HiveMaterializedViewsRegistry.java
 
b/ql/src/java/org/apache/hadoop/hive/ql/metadata/HiveMaterializedViewsRegistry.java
index 27fe99d..8331ad6 100644
--- 
a/ql/src/java/org/apache/hadoop/hive/ql/metadata/HiveMaterializedViewsRegistry.java
+++ 
b/ql/src/java/org/apache/hadoop/hive/ql/metadata/HiveMaterializedViewsRegistry.java
@@ -284,6 +284,19 @@ public final class HiveMaterializedViewsRegistry {
   }
 
   /**
+   * Update the materialized view in the registry (if materialized view 
exists).
+   */
+  public void refreshMaterializedView(HiveConf conf, Table 
materializedViewTable) {
+    RelOptMaterialization cached = materializedViewsCache.get(
+        materializedViewTable.getDbName(), 
materializedViewTable.getTableName());
+    if (cached == null) {
+      return;
+    }
+    Table cachedTable = HiveMaterializedViewUtils.extractTable(cached);
+    refreshMaterializedView(conf, cachedTable, materializedViewTable);
+  }
+
+  /**
    * Update the materialized view in the registry (if existing materialized 
view matches).
    */
   public void refreshMaterializedView(HiveConf conf, Table 
oldMaterializedViewTable, Table materializedViewTable) {
diff --git 
a/ql/src/java/org/apache/hadoop/hive/ql/metadata/MaterializedViewsCache.java 
b/ql/src/java/org/apache/hadoop/hive/ql/metadata/MaterializedViewsCache.java
index 1c4e593..a5e109e 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/metadata/MaterializedViewsCache.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/metadata/MaterializedViewsCache.java
@@ -56,7 +56,7 @@ public class MaterializedViewsCache {
     ConcurrentMap<String, HiveRelOptMaterialization> dbMap = 
ensureDbMap(materializedViewTable);
 
     // You store the materialized view
-    dbMap.compute(materializedViewTable.getTableName(), (mvTableName, 
aMaterialization) -> {
+    dbMap.computeIfAbsent(materializedViewTable.getTableName(), (mvTableName) 
-> {
       List<HiveRelOptMaterialization> materializationList = 
sqlToMaterializedView.computeIfAbsent(
               materializedViewTable.getViewExpandedText(), s -> new 
ArrayList<>());
       materializationList.add(materialization);
diff --git 
a/ql/src/test/org/apache/hadoop/hive/ql/metadata/TestMaterializedViewsCache.java
 
b/ql/src/test/org/apache/hadoop/hive/ql/metadata/TestMaterializedViewsCache.java
index 5b0d1af..122976d 100644
--- 
a/ql/src/test/org/apache/hadoop/hive/ql/metadata/TestMaterializedViewsCache.java
+++ 
b/ql/src/test/org/apache/hadoop/hive/ql/metadata/TestMaterializedViewsCache.java
@@ -121,6 +121,18 @@ class TestMaterializedViewsCache {
     assertThat(materializedViewsCache.values().get(0), 
is(defaultMaterialization1));
   }
 
+  @Test
+  void testAddSameMVTwice() {
+    materializedViewsCache.putIfAbsent(defaultMV1, defaultMaterialization1);
+    materializedViewsCache.putIfAbsent(defaultMV1, defaultMaterialization1);
+
+    assertThat(materializedViewsCache.get(defaultMV1.getDbName(), 
defaultMV1.getTableName()), is(defaultMaterialization1));
+    
assertThat(materializedViewsCache.get(defaultMV1.getViewExpandedText()).size(), 
is(1));
+    
assertThat(materializedViewsCache.get(defaultMV1.getViewExpandedText()).get(0), 
is(defaultMaterialization1));
+    assertThat(materializedViewsCache.values().size(), is(1));
+    assertThat(materializedViewsCache.values().get(0), 
is(defaultMaterialization1));
+  }
+
   private Table getTable(String db, String tableName, String definition) {
     Table table = new Table(new org.apache.hadoop.hive.metastore.api.Table());
     table.setDbName(db);
diff --git a/ql/src/test/queries/clientpositive/materialized_view_partitioned.q 
b/ql/src/test/queries/clientpositive/materialized_view_partitioned.q
index fcc7c1f..3b4fb6c 100644
--- a/ql/src/test/queries/clientpositive/materialized_view_partitioned.q
+++ b/ql/src/test/queries/clientpositive/materialized_view_partitioned.q
@@ -60,3 +60,7 @@ ALTER MATERIALIZED VIEW partition_mv_3 REBUILD;
 ALTER MATERIALIZED VIEW partition_mv_3 REBUILD;
 
 SELECT * FROM partition_mv_3 where key = 238;
+
+DROP MATERIALIZED VIEW partition_mv_1;
+DROP MATERIALIZED VIEW partition_mv_2;
+DROP MATERIALIZED VIEW partition_mv_3;
diff --git 
a/ql/src/test/results/clientpositive/llap/materialized_view_partitioned.q.out 
b/ql/src/test/results/clientpositive/llap/materialized_view_partitioned.q.out
index a9a5b6d..17ec0c3 100644
--- 
a/ql/src/test/results/clientpositive/llap/materialized_view_partitioned.q.out
+++ 
b/ql/src/test/results/clientpositive/llap/materialized_view_partitioned.q.out
@@ -1161,3 +1161,27 @@ val_238  238
 val_238        238
 val_238_n2     238
 val_238_n2     238
+PREHOOK: query: DROP MATERIALIZED VIEW partition_mv_1
+PREHOOK: type: DROP_MATERIALIZED_VIEW
+PREHOOK: Input: default@partition_mv_1
+PREHOOK: Output: default@partition_mv_1
+POSTHOOK: query: DROP MATERIALIZED VIEW partition_mv_1
+POSTHOOK: type: DROP_MATERIALIZED_VIEW
+POSTHOOK: Input: default@partition_mv_1
+POSTHOOK: Output: default@partition_mv_1
+PREHOOK: query: DROP MATERIALIZED VIEW partition_mv_2
+PREHOOK: type: DROP_MATERIALIZED_VIEW
+PREHOOK: Input: default@partition_mv_2
+PREHOOK: Output: default@partition_mv_2
+POSTHOOK: query: DROP MATERIALIZED VIEW partition_mv_2
+POSTHOOK: type: DROP_MATERIALIZED_VIEW
+POSTHOOK: Input: default@partition_mv_2
+POSTHOOK: Output: default@partition_mv_2
+PREHOOK: query: DROP MATERIALIZED VIEW partition_mv_3
+PREHOOK: type: DROP_MATERIALIZED_VIEW
+PREHOOK: Input: default@partition_mv_3
+PREHOOK: Output: default@partition_mv_3
+POSTHOOK: query: DROP MATERIALIZED VIEW partition_mv_3
+POSTHOOK: type: DROP_MATERIALIZED_VIEW
+POSTHOOK: Input: default@partition_mv_3
+POSTHOOK: Output: default@partition_mv_3

Reply via email to