@@ -49,9 +49,9 @@ case class OptimizeMetadataOnlyQuery(catalog: SessionCatalog) extends Rule[Logic
4949 }
5050
5151 plan.transform {
52- case a @ Aggregate (_, aggExprs, child @ PartitionedRelation (partAttrs, filters, relation )) =>
52+ case a @ Aggregate (_, aggExprs, child @ PartitionedRelation (_, attrs, filters, rel )) =>
5353 // We only apply this optimization when only partitioned attributes are scanned.
54- if (a.references.subsetOf(partAttrs )) {
54+ if (a.references.subsetOf(attrs )) {
5555 val aggFunctions = aggExprs.flatMap(_.collect {
5656 case agg : AggregateExpression => agg
5757 })
@@ -67,7 +67,7 @@ case class OptimizeMetadataOnlyQuery(catalog: SessionCatalog) extends Rule[Logic
6767 })
6868 }
6969 if (isAllDistinctAgg) {
70- a.withNewChildren(Seq (replaceTableScanWithPartitionMetadata(child, relation , filters)))
70+ a.withNewChildren(Seq (replaceTableScanWithPartitionMetadata(child, rel , filters)))
7171 } else {
7272 a
7373 }
@@ -159,26 +159,32 @@ case class OptimizeMetadataOnlyQuery(catalog: SessionCatalog) extends Rule[Logic
159159 */
160160 object PartitionedRelation extends PredicateHelper {
161161
162- def unapply (plan : LogicalPlan ): Option [(AttributeSet , Seq [Expression ], LogicalPlan )] = {
162+ def unapply (
163+ plan : LogicalPlan ): Option [(AttributeSet , AttributeSet , Seq [Expression ], LogicalPlan )] = {
163164 plan match {
164165 case l @ LogicalRelation (fsRelation : HadoopFsRelation , _, _, _)
165166 if fsRelation.partitionSchema.nonEmpty =>
166- val partAttrs = getPartitionAttrs(fsRelation.partitionSchema.map(_.name), l)
167- Some ((AttributeSet ( partAttrs) , Nil , l))
167+ val partAttrs = AttributeSet ( getPartitionAttrs(fsRelation.partitionSchema.map(_.name), l) )
168+ Some ((partAttrs, partAttrs , Nil , l))
168169
169170 case relation : HiveTableRelation if relation.tableMeta.partitionColumnNames.nonEmpty =>
170- val partAttrs = getPartitionAttrs(relation.tableMeta.partitionColumnNames, relation)
171- Some ((AttributeSet (partAttrs), Nil , relation))
171+ val partAttrs = AttributeSet (
172+ getPartitionAttrs(relation.tableMeta.partitionColumnNames, relation))
173+ Some ((partAttrs, partAttrs, Nil , relation))
172174
173175 case p @ Project (projectList, child) if projectList.forall(_.deterministic) =>
174- unapply(child).flatMap { case (partAttrs, filters, relation) =>
175- if (p.references.subsetOf(partAttrs)) Some ((p.outputSet, filters, relation)) else None
176+ unapply(child).flatMap { case (partAttrs, attrs, filters, relation) =>
177+ if (p.references.subsetOf(attrs)) {
178+ Some ((partAttrs, p.outputSet, filters, relation))
179+ } else {
180+ None
181+ }
176182 }
177183
178184 case f @ Filter (condition, child) if condition.deterministic =>
179- unapply(child).flatMap { case (partAttrs, filters, relation) =>
185+ unapply(child).flatMap { case (partAttrs, attrs, filters, relation) =>
180186 if (f.references.subsetOf(partAttrs)) {
181- Some ((partAttrs, splitConjunctivePredicates(condition) ++ filters, relation))
187+ Some ((partAttrs, attrs, splitConjunctivePredicates(condition) ++ filters, relation))
182188 } else {
183189 None
184190 }
0 commit comments