Guest User

Untitled

a guest
Aug 24th, 2018
165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 3.39 KB | None | 0 0
  1. package com.foo
  2.  
  3. import java.util
  4.  
  5. import com.google.common.collect.ImmutableList
  6. import org.apache.calcite.plan.hep.HepRelVertex
  7. import org.apache.calcite.plan.{RelOptRule, RelOptRuleCall, RelOptRuleOperand}
  8. import org.apache.calcite.rel.core.AggregateCall
  9. import org.apache.calcite.rel.logical.{LogicalAggregate, LogicalProject}
  10. import org.apache.calcite.rex.RexNode
  11. import org.apache.calcite.util.ImmutableBitSet
  12.  
  13. import scala.collection.JavaConverters._
  14.  
  15. /*
  16. == BEFORE
  17. LogicalAggregate(group=[{0}], EXPR$1=[SUM($1)])
  18.   LogicalProject(id=[$0], $f1=[CASE(=($1, 'foo'), $2, 0)])
  19.     LogicalAggregate(group=[{0, 1}], sum_units=[SUM($2)])
  20.       LogicalTableScan(table=[[SALES, Orders]])
  21. */
  22.  
  23. /*
  24. == AFTER
  25. LogicalAggregate(group=[{0}], EXPR$1=[SUM($1)])
  26.   LogicalProject(id=[$0], $f1=[$1])
  27.     LogicalAggregate(group=[{0}], sum_units=[SUM($1)])
  28.       LogicalProject(id=[$0], sum_units=[CASE(=($1, 'foo'), $2, 0)])
  29.         LogicalTableScan(table=[[SALES, Orders]])
  30.  
  31.  */
  32.  
  33. class PushDownRule(operand: RelOptRuleOperand) extends RelOptRule(operand) {
  34.  
  35.   override def onMatch(call: RelOptRuleCall): Unit = {
  36.  
  37.     val rexBuilder = call.builder().getRexBuilder
  38.     val rootLogProj = call.rels(0).asInstanceOf[LogicalProject]
  39.  
  40.     if (call.id == 0) {
  41.  
  42.       val logAgg = rootLogProj.getInput.asInstanceOf[HepRelVertex].getCurrentRel.asInstanceOf[LogicalAggregate]
  43.       val tblScan = logAgg.getInput
  44.  
  45.       // create new logical project to be inserted before table scan
  46.       val rexNodes = new java.util.ArrayList[RexNode]()
  47.  
  48.       val idRef = rexBuilder.makeInputRef(tblScan, 0)
  49.       // val productRef = rexBuilder.makeInputRef(tblScan, 1)
  50.       val exprRef = rootLogProj.getChildExps.get(1)
  51.  
  52.       rexNodes.add(idRef)
  53.       // rexNodes.add(productRef)
  54.       rexNodes.add(exprRef)
  55.  
  56.       val rexNames = new java.util.ArrayList[String]()
  57.       rexNames.add("id")
  58.       // rexNames.add("product")
  59.       rexNames.add("sum_units")
  60.  
  61.       val newLogProj = LogicalProject.create(logAgg.getInput, rexNodes, rexNames)
  62.  
  63.       // recreate L2 aggregate with new logical project
  64.       val groups = new util.ArrayList[Integer]
  65.       groups.add(0)
  66.       val newLogAggGroupSet = ImmutableBitSet.of(groups)
  67.       val newLogAggGroupSets = ImmutableList.of(newLogAggGroupSet)
  68.  
  69.       val newAggCallList = new util.ArrayList[AggregateCall]()
  70.       val newIndexes = new util.ArrayList[Integer]()
  71.       newIndexes.add(1)
  72.       val newAggCall = logAgg.getAggCallList.get(0).copy(newIndexes, -1)
  73.       newAggCallList.add(newAggCall)
  74.  
  75.       val newLogAgg = logAgg.copy(logAgg.getTraitSet, newLogProj, logAgg.indicator, newLogAggGroupSet, newLogAggGroupSets, newAggCallList)
  76.  
  77.       // recreate L1 logical project with the new expressions and parent aggregate
  78.       val newRootLogProjRexNodes = new java.util.ArrayList[RexNode]()
  79.  
  80.       val rootLogProjIdRef = rexBuilder.makeInputRef(newLogAgg, 0)
  81.       val rootLogProjUnitsRef = rexBuilder.makeInputRef(newLogAgg, 1)
  82.  
  83.       newRootLogProjRexNodes.add(rootLogProjIdRef)
  84.       newRootLogProjRexNodes.add(rootLogProjUnitsRef)
  85.  
  86.       val newRootLogProj = rootLogProj.copy(rootLogProj.getTraitSet, newLogAgg, newRootLogProjRexNodes, rootLogProj.getRowType)
  87.  
  88.       call.transformTo(newRootLogProj)
  89.     }
  90.   }
  91. }
  92.  
  93. object PushDownRule {
  94.   def apply: PushDownRule = {
  95.     import RelOptRule._
  96.  
  97.     new PushDownRule(
  98.       operand(classOf[LogicalProject], any()))
  99.   }
  100. }
Advertisement
Add Comment
Please, Sign In to add comment