(seq dag.Seq)
| 652 | } |
| 653 | |
| 654 | func 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-- |
no test coverage detected