kasakrisz commented on code in PR #3552:
URL: https://github.com/apache/hive/pull/3552#discussion_r966577619


##########
ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/views/HiveMaterializedViewUtils.java:
##########
@@ -160,11 +181,79 @@ public static Boolean isOutdatedMaterializedView(
     return false;
   }
 
+  private static Boolean isOutdatedMaterializedView(
+          MaterializationSnapshot snapshot, Hive db,
+          Set<TableName> tablesUsed, Table materializedViewTable) throws 
HiveException {
+    List<String> tablesUsedNames = tablesUsed.stream()
+        .map(tableName -> TableName.getDbTable(tableName.getDb(), 
tableName.getTable()))
+        .collect(Collectors.toList());
+
+    Map<String, String> snapshotMap = snapshot.getTableSnapshots();
+    if (snapshotMap == null || snapshotMap.isEmpty()) {
+      LOG.debug("Materialized view " + 
materializedViewTable.getFullyQualifiedName() +
+              " ignored for rewriting as we could not obtain current snapshot 
ids");
+      return null;
+    }
+
+    Set<String> storedTablesUsed = 
materializedViewTable.getMVMetadata().getSourceTableFullNames();
+    for (String fullyQualifiedTableName : tablesUsedNames) {
+      // Note. If the materialized view does not contain a table that is 
contained in the query,
+      // we do not need to check whether that specific table is outdated or 
not. If a rewriting
+      // is produced in those cases, it is because that additional table is 
joined with the
+      // existing tables with an append-columns only join, i.e., PK-FK + not 
null.
+      if (!storedTablesUsed.contains(fullyQualifiedTableName)) {
+        continue;
+      }
+
+      Table table = db.getTable(fullyQualifiedTableName);
+      if (table.getStorageHandler() == null) {
+        LOG.debug("Materialized view {} ignored for rewriting as we could not 
storage handler of table {}",
+                materializedViewTable.getFullyQualifiedName(), 
fullyQualifiedTableName);
+        return null;
+      }
+      String currentTableSnapshot = 
table.getStorageHandler().getCurrentSnapshotId(table);
+      if (isBlank(currentTableSnapshot)) {

Review Comment:
   It depends on the implementation: the default is `null`
   HiveStorageHandler.java
   ```
     default String 
getCurrentSnapshotId(org.apache.hadoop.hive.ql.metadata.Table table) {
       return null;
     }
   ```



##########
ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/views/HiveMaterializedViewUtils.java:
##########
@@ -403,4 +492,28 @@ private static RelNode 
copyNodeScanNewCluster(RelOptCluster optCluster, RelNode
     }
     return newScan;
   }
+
+  public static MaterializationSnapshot getSnapshotOf(DDLOperationContext 
context, Set<TableName> tables)
+          throws HiveException {
+    Map<String, String> snapshot = getSnapshotOf(context.getDb(), tables);
+    if (snapshot.isEmpty()) {
+      return new 
MaterializationSnapshot(context.getConf().get(ValidTxnWriteIdList.VALID_TABLES_WRITEIDS_KEY));
+    }
+
+    return new MaterializationSnapshot(snapshot);
+  }
+
+  private static Map<String, String> getSnapshotOf(Hive db, Set<TableName> 
tables) throws HiveException {
+    Map<String, String> snapshot = new HashMap<>(tables.size());
+    for (TableName tableName : tables) {
+      Table table = db.getTable(tableName);
+      if (table.getStorageHandler() != null) {
+        String sh = table.getStorageHandler().getCurrentSnapshotId(table);
+        if (isNotBlank(sh)) {

Review Comment:
   It depends on the implementation: the default is `null`
   HiveStorageHandler.java
   ```
     default String 
getCurrentSnapshotId(org.apache.hadoop.hive.ql.metadata.Table table) {
       return null;
     }
   ```



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: gitbox-unsubscr...@hive.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: gitbox-unsubscr...@hive.apache.org
For additional commands, e-mail: gitbox-h...@hive.apache.org

Reply via email to