makeResultSet makes final result set from time series event(GroupedIterators). TODO: can opt use stream, leaf node need return grouping if completed.
()
| 133 | // makeResultSet makes final result set from time series event(GroupedIterators). |
| 134 | // TODO: can opt use stream, leaf node need return grouping if completed. |
| 135 | func (ctx *RootMetricContext) makeResultSet() (resultSet *commonmodels.ResultSet, err error) { |
| 136 | makeResultStartTime := time.Now() |
| 137 | orderBy, err := ctx.buildOrderBy() |
| 138 | if err != nil { |
| 139 | return nil, err |
| 140 | } |
| 141 | |
| 142 | statement := ctx.Deps.Statement |
| 143 | resultSet = new(commonmodels.ResultSet) |
| 144 | // TODO: merge stats for cross idc query? |
| 145 | groupByKeys := statement.GroupBy |
| 146 | groupByKeysLength := len(groupByKeys) |
| 147 | fieldsMap := make(map[string]struct{}) |
| 148 | timeRange := ctx.timeRange |
| 149 | interval := ctx.interval |
| 150 | if ctx.groupAgg != nil { |
| 151 | groupIts := ctx.groupAgg.ResultSet() |
| 152 | selectItems := ctx.getSelectItems() |
| 153 | for _, it := range groupIts { |
| 154 | // TODO: reuse expression?? |
| 155 | expression := newExpressionFn( |
| 156 | timeRange, |
| 157 | interval, |
| 158 | selectItems, |
| 159 | ) |
| 160 | // do expression eval |
| 161 | expression.Eval(it) |
| 162 | |
| 163 | // result order by/limit |
| 164 | orderBy.Push(aggregation.NewOrderByRow(it.Tags(), expression.ResultSet())) |
| 165 | } |
| 166 | |
| 167 | rows := orderBy.ResultSet() |
| 168 | for _, row := range rows { |
| 169 | var tags map[string]string |
| 170 | tagValues, fields := row.ResultSet() |
| 171 | if groupByKeysLength > 0 { |
| 172 | tagValues := tag.SplitTagValues(tagValues) |
| 173 | if groupByKeysLength != len(tagValues) { |
| 174 | // if tag values not match group by tag keys, ignore this time series |
| 175 | continue |
| 176 | } |
| 177 | // build group by tags for final result |
| 178 | tags = make(map[string]string) |
| 179 | for idx, tagKey := range groupByKeys { |
| 180 | tags[tagKey] = tagValues[idx] |
| 181 | } |
| 182 | } |
| 183 | timeSeries := commonmodels.NewSeries(tags, tagValues) |
| 184 | resultSet.AddSeries(timeSeries) |
| 185 | |
| 186 | having := ctx.Deps.Statement.Having |
| 187 | notHavingSlots := make(map[int]struct{}) |
| 188 | slotValues := make(map[int]map[string]float64) |
| 189 | |
| 190 | if having != nil { |
| 191 | for fieldName, values := range fields { |
| 192 | if values == nil { |