@@ -117,9 +117,9 @@ case class Aggregate2Sort(
117117 private val buffer : MutableRow = new GenericMutableRow (bufferSize)
118118 private val aggregateResult : MutableRow = new GenericMutableRow (aggregateAttributes.length)
119119 private val joinedRow = new JoinedRow4
120- private val resultProjection =
121- new InterpretedMutableProjection (
122- resultExpressions, groupingExpressions.map(_.toAttribute) ++ aggregateAttributes)
120+ private lazy val resultProjection =
121+ newMutableProjection (
122+ resultExpressions, groupingExpressions.map(_.toAttribute) ++ aggregateAttributes)()
123123
124124 val offsetAttributes = if (preShuffle) Nil else Seq .fill(groupingExpressions.length)(AttributeReference (" offset" , NullType )())
125125 val offsetExpressions = if (preShuffle) Nil else Seq .fill(groupingExpressions.length)(NoOp )
@@ -128,7 +128,7 @@ case class Aggregate2Sort(
128128 val initExpressions = offsetExpressions ++ aggregateFunctions.flatMap {
129129 case ae : AlgebraicAggregate => ae.initialValues
130130 }
131- println(initExpressions.mkString(" ," ))
131+ // println(initExpressions.mkString(","))
132132 newMutableProjection(initExpressions, Nil )().target(buffer)
133133 }
134134
@@ -140,24 +140,38 @@ case class Aggregate2Sort(
140140 case ae : AlgebraicAggregate => ae.updateExpressions
141141 }
142142
143- println(updateExpressions.mkString(" ," ))
143+ // println(updateExpressions.mkString(","))
144144 newMutableProjection(updateExpressions, bufferSchema ++ child.output)().target(buffer)
145145 }
146146
147- val mergeProjection = {
147+ lazy val mergeProjection = {
148148 val bufferSchemata =
149149 offsetAttributes ++ aggregateFunctions.flatMap {
150150 case ae : AlgebraicAggregate => ae.bufferAttributes
151151 } ++ offsetAttributes ++ aggregateFunctions.flatMap {
152152 case ae : AlgebraicAggregate => ae.rightBufferSchema
153153 }
154- val mergeExpressions = offsetExpressions ++ aggregateFunctions.flatMap {
155- case ae : AlgebraicAggregate => ae.mergeExpressions
156- }
154+ val mergeExpressions = offsetExpressions ++ aggregateFunctions.flatMap {
155+ case ae : AlgebraicAggregate => ae.mergeExpressions
156+ }
157157
158158 newMutableProjection(mergeExpressions, bufferSchemata)()
159159 }
160160
161+ lazy val evalProjection = {
162+ val bufferSchemata =
163+ offsetAttributes ++ aggregateFunctions.flatMap {
164+ case ae : AlgebraicAggregate => ae.bufferAttributes
165+ } ++ offsetAttributes ++ aggregateFunctions.flatMap {
166+ case ae : AlgebraicAggregate => ae.rightBufferSchema
167+ }
168+ val evalExpressions = aggregateFunctions.map {
169+ case ae : AlgebraicAggregate => ae.evaluateExpression
170+ }
171+
172+ newMutableProjection(evalExpressions, bufferSchemata)()
173+ }
174+
161175 // Initialize this iterator.
162176 initialize()
163177
@@ -177,7 +191,7 @@ case class Aggregate2Sort(
177191
178192 private def initializeBuffer (): Unit = {
179193 initialProjection(EmptyRow )
180- println(" initilized: " + buffer)
194+ // println("initilized: " + buffer)
181195 }
182196
183197 private def processRow (row : InternalRow ): Unit = {
@@ -230,16 +244,20 @@ case class Aggregate2Sort(
230244 // If it is preShuffle, we just output the grouping columns and the buffer.
231245 joinedRow(currentGroupingKey, buffer).copy()
232246 } else {
247+ /*
233248 var i = 0
234249 while (i < aggregateFunctions.length) {
235250 aggregateResult.update(i, aggregateFunctions(i).eval(buffer))
236251 i += 1
237252 }
238253 resultProjection(joinedRow(currentGroupingKey, aggregateResult)).copy()
254+ */
255+ resultProjection(joinedRow(currentGroupingKey, evalProjection.target(aggregateResult)(buffer)))
256+
239257 }
240258 initializeBuffer()
241259
242- println(s " outputRow $preShuffle " + outputRow)
260+ // println(s"outputRow $preShuffle " + outputRow)
243261 outputRow
244262 } else {
245263 // no more result
0 commit comments