MCPcopy
hub / github.com/lindb/lindb / makeResultSet

Method makeResultSet

query/context/root_metric_context.go:135–279  ·  view source on GitHub ↗

makeResultSet makes final result set from time series event(GroupedIterators). TODO: can opt use stream, leaf node need return grouping if completed.

()

Source from the content-addressed store, hash-verified

133// makeResultSet makes final result set from time series event(GroupedIterators).
134// TODO: can opt use stream, leaf node need return grouping if completed.
135func (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 {

Callers 2

WaitResponseMethod · 0.95

Calls 15

buildOrderByMethod · 0.95
getSelectItemsMethod · 0.95
HasNextMethod · 0.95
NextMethod · 0.95
CalcExprMethod · 0.95
NewOrderByRowFunction · 0.92
SplitTagValuesFunction · 0.92
NewCalcFunction · 0.92
CalcTimestampFunction · 0.92
IntervalTypeAlias · 0.92
AddFieldMethod · 0.80
ResultSetMethod · 0.65

Tested by 1