private def transformAggregate()

in mv/plan/src/main/scala/org/apache/carbondata/mv/plans/modular/AggregatePushDown.scala [83:207]


  private def transformAggregate(aggregate: AggregateExpression,
      selAliasMap: AttributeMap[Attribute],
      ith: Int,
      fact: ModularRelation,
      map: scala.collection.mutable.Map[Int, (NamedExpression, Seq[NamedExpression])],
      aliasInfo: Option[(String, ExprId)]) = {
    aggregate match {
      case cnt: AggregateExpression if cnt.aggregateFunction.isInstanceOf[Count] &&
        cnt.aggregateFunction.children.length == 1 && cnt.aggregateFunction.children.head
        .isInstanceOf[Attribute] =>
        val exprs = cnt.aggregateFunction.children
        val tAttr = selAliasMap.get(exprs.head.asInstanceOf[Attribute]).getOrElse(exprs.head)
          .asInstanceOf[Attribute]
        if (fact.outputSet.contains(tAttr)) {
          val cnt1 = AggregateExpression(Count(tAttr), cnt.mode, isDistinct = false)
          val alias = Alias(cnt1, cnt1.toString)()
          val tSum = cnt.copy(Sum(alias.toAttribute), cnt.mode, isDistinct = false, resultId = cnt
            .resultId)
          val (name, id) = aliasInfo.getOrElse(("", NamedExpression.newExprId))
          map += (ith -> (Alias(tSum, name)(exprId = id), Seq(alias)))
        } else {
          Map.empty[Int, (NamedExpression, Seq[NamedExpression])]
        }
      case cnt: AggregateExpression if cnt.aggregateFunction.isInstanceOf[Count] &&
        cnt.aggregateFunction.children.length == 1 && cnt.aggregateFunction.children.head
        .isInstanceOf[Literal] =>
        val cnt1 = cnt.copy(Count(cnt.aggregateFunction.children.head), cnt.mode,
          isDistinct = false)
        val alias = Alias(cnt1, cnt1.toString)()
        val tSum = cnt.copy(Sum(alias.toAttribute), cnt.mode, isDistinct = false, resultId = cnt
          .resultId)
        val (name, id) = aliasInfo.getOrElse(("", NamedExpression.newExprId))
        map += (ith -> (Alias(tSum, name)(exprId = id), Seq(alias)))
      case sum: AggregateExpression if sum.aggregateFunction.isInstanceOf[Sum] &&
        sum.aggregateFunction.children.head.isInstanceOf[Attribute] =>
        val expr = sum.aggregateFunction.children.head
        val tAttr = selAliasMap.get(expr.asInstanceOf[Attribute]).getOrElse(expr)
          .asInstanceOf[Attribute]
        if (fact.outputSet.contains(tAttr)) {
          val sum1 = AggregateExpression(Sum(tAttr), sum.mode, isDistinct = false)
          val alias = Alias(sum1, sum1.toString)()
          val tSum = sum.copy(Sum(alias.toAttribute), sum.mode, isDistinct = false, resultId = sum
            .resultId)
          val (name, id) = aliasInfo.getOrElse(("", NamedExpression.newExprId))
          map += (ith -> (Alias(tSum, name)(exprId = id), Seq(alias)))
        } else {
          Map.empty[Int, (NamedExpression, Seq[NamedExpression])]
        }
      case sum@MatchAggregateExpression(Sum(cast@MatchCast(expr, dataType)), _, false, _, _) =>
        val tAttr = selAliasMap.get(expr.asInstanceOf[Attribute]).getOrElse(expr)
          .asInstanceOf[Attribute]
        if (fact.outputSet.contains(tAttr)) {
          val sum1 = AggregateExpression(Sum(cast), sum.mode, false)
          val alias = Alias(sum1, sum1.toString)()
          val tSum = sum.copy(Sum(alias.toAttribute), sum.mode, isDistinct = false, resultId = sum
            .resultId)
          val (name, id) = aliasInfo.getOrElse(("", NamedExpression.newExprId))
          map += (ith -> (Alias(tSum, name)(exprId = id), Seq(alias)))
        } else {
          Map.empty[Int, (NamedExpression, Seq[NamedExpression])]
        }
      case sum: AggregateExpression if sum.aggregateFunction.isInstanceOf[Sum] &&
        sum.aggregateFunction.children.head.isInstanceOf[Literal] =>
        val sum1 = AggregateExpression(Sum(sum.aggregateFunction.children.head), sum.mode,
          isDistinct = false)
        val alias = Alias(sum1, sum1.toString)()
        val tSum = sum.copy(Sum(alias.toAttribute), sum.mode, isDistinct = false, resultId = sum
          .resultId)
        val (name, id) = aliasInfo.getOrElse(("", NamedExpression.newExprId))
        map += (ith -> (Alias(tSum, name)(exprId = id), Seq(alias)))
      case max: AggregateExpression if max.aggregateFunction.isInstanceOf[Max] &&
        max.aggregateFunction.children.head.isInstanceOf[Attribute] =>
        val expr = max.aggregateFunction.children.head
        val tAttr = selAliasMap.get(expr.asInstanceOf[Attribute]).getOrElse(expr)
          .asInstanceOf[Attribute]
        if (fact.outputSet.contains(tAttr)) {
          val max1 = AggregateExpression(Sum(tAttr), max.mode, isDistinct = false)
          val alias = Alias(max1, max1.toString)()
          val tMax = max.copy(Max(alias.toAttribute), max.mode, isDistinct = false, resultId = max
            .resultId)
          val (name, id) = aliasInfo.getOrElse(("", NamedExpression.newExprId))
          map += (ith -> (Alias(tMax, name)(exprId = id), Seq(alias)))
        } else {
          Map.empty[Int, (NamedExpression, Seq[NamedExpression])]
        }
      case min: AggregateExpression if min.aggregateFunction.isInstanceOf[Min] &&
        min.aggregateFunction.children.head.isInstanceOf[Attribute] =>
        val expr = min.aggregateFunction.children.head
        val tAttr = selAliasMap.get(expr.asInstanceOf[Attribute]).getOrElse(expr)
          .asInstanceOf[Attribute]
        if (fact.outputSet.contains(tAttr)) {
          val min1 = AggregateExpression(Min(tAttr), min.mode, isDistinct = false)
          val alias = Alias(min1, min1.toString)()
          val tMin = min.copy(Max(alias.toAttribute), min.mode, isDistinct = false, resultId = min
            .resultId)
          val (name, id) = aliasInfo.getOrElse(("", NamedExpression.newExprId))
          map += (ith -> (Alias(tMin, name)(exprId = id), Seq(alias)))
        } else {
          Map.empty[Int, (NamedExpression, Seq[NamedExpression])]
        }
      case avg: AggregateExpression if (avg.aggregateFunction.isInstanceOf[Average] &&
        avg.aggregateFunction.children.head.isInstanceOf[Attribute]) =>
        val expr = avg.aggregateFunction.children.head
        val tAttr = selAliasMap.get(expr.asInstanceOf[Attribute]).getOrElse(expr)
          .asInstanceOf[Attribute]
        if (fact.outputSet.contains(tAttr)) {
          map += (ith ->  getAliasMapForAvgAggregate(tAttr, avg, aliasInfo))
        } else {
          Map.empty[Int, (NamedExpression, Seq[NamedExpression])]
        }
      case avg@MatchAggregateExpression(Average(cast@MatchCast(expr, dataType)), _, false, _, _) =>
        val tAttr = selAliasMap.get(expr.asInstanceOf[Attribute]).getOrElse(expr)
          .asInstanceOf[Attribute]
        if (fact.outputSet.contains(tAttr)) {
          map += (ith -> getAliasMapForAvgAggregate(cast, avg, aliasInfo))
        } else {
          Map.empty[Int, (NamedExpression, Seq[NamedExpression])]
        }
      case avg: AggregateExpression if avg.aggregateFunction.isInstanceOf[Average] &&
                                       avg.aggregateFunction.children.head.isInstanceOf[Literal] =>
        map +=
        (ith -> getAliasMapForAvgAggregate(avg.aggregateFunction.children.head, avg, aliasInfo))
      case _ => Map.empty[Int, (NamedExpression, Seq[NamedExpression])]
    }
  }