viirya commented on code in PR #37879: URL: https://github.com/apache/spark/pull/37879#discussion_r972437078
########## sql/core/src/main/scala/org/apache/spark/sql/execution/CacheManager.scala: ########## @@ -159,11 +159,51 @@ class CacheManager extends Logging with AdaptiveSparkPlanHelper { plan: LogicalPlan, cascade: Boolean, blocking: Boolean = false): Unit = { + uncacheQuery(spark, _.sameResult(plan), cascade, blocking) + } + + def uncacheTableOrView(spark: SparkSession, name: Seq[String], cascade: Boolean): Unit = { + uncacheQuery( + spark, + isMatchedTableOrView(_, name, spark.sessionState.conf), + cascade, + blocking = false) + } + + private def isMatchedTableOrView(plan: LogicalPlan, name: Seq[String], conf: SQLConf): Boolean = { + def isSameName(nameInCache: Seq[String]): Boolean = { + nameInCache.length == name.length && nameInCache.zip(name).forall(conf.resolver.tupled) + } + + plan match { + case SubqueryAlias(ident, LogicalRelation(_, _, Some(catalogTable), _)) => + val v1Ident = catalogTable.identifier + isSameName(ident.qualifier :+ ident.name) && + isSameName(v1Ident.catalog.toSeq ++ v1Ident.database :+ v1Ident.table) + + case SubqueryAlias(ident, DataSourceV2Relation(_, _, Some(catalog), Some(v2Ident), _)) => + isSameName(ident.qualifier :+ ident.name) && + isSameName(catalog.name() +: v2Ident.namespace() :+ v2Ident.name()) + + case SubqueryAlias(ident, View(catalogTable, _, _)) => + val v1Ident = catalogTable.identifier + isSameName(ident.qualifier :+ ident.name) && + isSameName(v1Ident.catalog.toSeq ++ v1Ident.database :+ v1Ident.table) + + case _ => false + } + } + + def uncacheQuery( + spark: SparkSession, + isMatchedPlan: LogicalPlan => Boolean, + cascade: Boolean, + blocking: Boolean): Unit = { val shouldRemove: LogicalPlan => Boolean = if (cascade) { - _.exists(_.sameResult(plan)) Review Comment: `sameResult` doesn't work? ########## sql/core/src/main/scala/org/apache/spark/sql/execution/CacheManager.scala: ########## @@ -159,11 +159,51 @@ class CacheManager extends Logging with AdaptiveSparkPlanHelper { plan: LogicalPlan, cascade: Boolean, blocking: Boolean = false): Unit = { + uncacheQuery(spark, _.sameResult(plan), cascade, blocking) + } + + def uncacheTableOrView(spark: SparkSession, name: Seq[String], cascade: Boolean): Unit = { + uncacheQuery( + spark, + isMatchedTableOrView(_, name, spark.sessionState.conf), + cascade, + blocking = false) + } + + private def isMatchedTableOrView(plan: LogicalPlan, name: Seq[String], conf: SQLConf): Boolean = { + def isSameName(nameInCache: Seq[String]): Boolean = { + nameInCache.length == name.length && nameInCache.zip(name).forall(conf.resolver.tupled) + } + + plan match { + case SubqueryAlias(ident, LogicalRelation(_, _, Some(catalogTable), _)) => + val v1Ident = catalogTable.identifier + isSameName(ident.qualifier :+ ident.name) && + isSameName(v1Ident.catalog.toSeq ++ v1Ident.database :+ v1Ident.table) + + case SubqueryAlias(ident, DataSourceV2Relation(_, _, Some(catalog), Some(v2Ident), _)) => + isSameName(ident.qualifier :+ ident.name) && + isSameName(catalog.name() +: v2Ident.namespace() :+ v2Ident.name()) Review Comment: Does SubqueryAlias have same name as the underlying relation? -- 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: reviews-unsubscr...@spark.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: reviews-unsubscr...@spark.apache.org For additional commands, e-mail: reviews-h...@spark.apache.org