Aggregations from the SELECT FROM ... WHERE
()
| 88 | // SELECT <select_list> FROM ... WHERE |
| 89 | // |
| 90 | func (m *rewrite) walkSelectList() error { |
| 91 | |
| 92 | m.result.Columns = m.sel.Columns |
| 93 | |
| 94 | for i := len(m.result.Columns) - 1; i >= 0; i-- { |
| 95 | col := m.result.Columns[i] |
| 96 | //u.Debugf("i=%d of %d %v %#v ", i, len(m.sel.Columns), col.Key(), col) |
| 97 | if col.Expr != nil { |
| 98 | switch curNode := col.Expr.(type) { |
| 99 | // case *expr.NumberNode: |
| 100 | // return nil, value.NewNumberValue(curNode.Float64), nil |
| 101 | // case *expr.BinaryNode: |
| 102 | // return m.walkBinary(curNode) |
| 103 | // case *expr.TriNode: // Between |
| 104 | // return m.walkTri(curNode) |
| 105 | // case *expr.UnaryNode: |
| 106 | // return m.walkUnary(curNode) |
| 107 | case *expr.FuncNode: |
| 108 | // All Func Nodes are Aggregates? |
| 109 | newNode, err := m.selectFunc(curNode) |
| 110 | if err == nil { |
| 111 | col.Expr = newNode |
| 112 | } else if err != nil { |
| 113 | u.Error(err) |
| 114 | return err |
| 115 | } |
| 116 | //u.Debugf("esm: %v:%v", col.As, esm) |
| 117 | //u.Debugf(curNode.String()) |
| 118 | // case *expr.ArrayNode: |
| 119 | // return m.walkArrayNode(curNode) |
| 120 | // case *expr.IdentityNode: |
| 121 | // return nil, value.NewStringValue(curNode.Text), nil |
| 122 | // case *expr.StringNode: |
| 123 | // return nil, value.NewStringValue(curNode.Text), nil |
| 124 | case *expr.IdentityNode: |
| 125 | //u.Debugf("likely a projection, not agg T:%T %v", curNode, curNode) |
| 126 | default: |
| 127 | u.Warnf("unrecognized not agg T:%T %v", curNode, curNode) |
| 128 | //panic("Unrecognized node type") |
| 129 | } |
| 130 | } |
| 131 | |
| 132 | } |
| 133 | return nil |
| 134 | } |
| 135 | |
| 136 | // Group By Clause: Mongo is a little weird where they move the |
| 137 | // group by expressions INTO the aggregation clause: |
no test coverage detected