MCPcopy Create free account
hub / github.com/brimdata/super / mergeValuesOps

Function mergeValuesOps

compiler/optimizer/optimizer.go:654–716  ·  view source on GitHub ↗
(seq dag.Seq)

Source from the content-addressed store, hash-verified

652}
653
654func mergeValuesOps(seq dag.Seq) dag.Seq {
655 return Walk(seq, func(seq dag.Seq) dag.Seq {
656 for i := 0; i+1 < len(seq); i++ {
657 v1, ok := seq[i].(*dag.ValuesOp)
658 if !ok || len(v1.Exprs) != 1 || hasThisWithEmptyPath(seq[i+1]) {
659 continue
660 }
661 re1, ok := v1.Exprs[0].(*dag.RecordExpr)
662 if !ok {
663 continue
664 }
665 v1TopLevelFields, v1TopLevelSpread, ok := recordElemsFieldsAndSpread(re1.Elems)
666 if !ok {
667 continue
668 }
669 mergeOK := true
670 propagateV1Fields := func(e dag.Expr) dag.Expr {
671 if !mergeOK {
672 return e
673 }
674 this, ok := e.(*dag.ThisExpr)
675 if !ok {
676 return e
677 }
678 v1Expr, ok := v1TopLevelFields[this.Path[0]]
679 if !ok {
680 if v1TopLevelSpread == nil {
681 return newErrorMissing()
682 }
683 e, mergeOK = addPathToExpr(v1TopLevelSpread, this.Path)
684 return e
685 }
686 e, mergeOK = addPathToExpr(v1Expr, this.Path[1:])
687 return e
688 }
689 var mergedOp dag.Op
690 switch op := seq[i+1].(type) {
691 case *dag.AggregateOp:
692 op = dag.CopyOp(op).(*dag.AggregateOp)
693 for i := range op.Keys {
694 walkT(reflect.ValueOf(&op.Keys[i].RHS), propagateV1Fields)
695 }
696 for i := range op.Aggs {
697 walkT(reflect.ValueOf(&op.Aggs[i].RHS), propagateV1Fields)
698 }
699 mergedOp = op
700 case *dag.ValuesOp:
701 op = dag.CopyOp(op).(*dag.ValuesOp)
702 walkT(reflect.ValueOf(op.Exprs), propagateV1Fields)
703 mergedOp = op
704 default:
705 continue
706 }
707 if mergeOK {
708 inlineRecordExprSpreads(mergedOp)
709 seq[i] = mergedOp
710 seq.Delete(i+1, i+2)
711 i--

Callers 1

OptimizeMethod · 0.85

Calls 9

CopyOpFunction · 0.92
hasThisWithEmptyPathFunction · 0.85
newErrorMissingFunction · 0.85
addPathToExprFunction · 0.85
walkTFunction · 0.85
inlineRecordExprSpreadsFunction · 0.85
WalkFunction · 0.70
DeleteMethod · 0.65

Tested by

no test coverage detected