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