// modify the series to have the union of the columns from all // StreamQueries func (cme *Merger) fixFields(s *protocol.Series) { if !cme.mergeColumns { return } idx := cme.lastStreamIdx mapping := cme.resultFieldsPerStream[idx] if mapping == nil { for _, f := range cme.resultFields { index := -1 for i, sf := range s.Fields { if sf == f { index = i break } } mapping = append(mapping, index) cme.resultFieldsPerStream[idx] = mapping } } s.Fields = cme.resultFields p := s.Points[0] originalValues := p.Values p.Values = nil for _, i := range mapping { if i == -1 { p.Values = append(p.Values, nil) continue } p.Values = append(p.Values, originalValues[i]) } }
func (me *MergeEngine) Yield(s *protocol.Series) (bool, error) { oldName := s.Name s.Name = &me.name s.Fields = append(s.Fields, "_orig_series") for _, p := range s.Points { p.Values = append(p.Values, &protocol.FieldValue{StringValue: oldName}) } return me.next.Yield(s) }
func Filter(query *parser.SelectQuery, series *protocol.Series) (*protocol.Series, error) { if query.GetWhereCondition() == nil { return series, nil } columns := map[string]struct{}{} if query.GetFromClause().Type == parser.FromClauseInnerJoin { outer: for t, cs := range query.GetResultColumns() { for _, c := range cs { // if this is a wildcard select, then drop all columns and // just use '*' if c == "*" { columns = make(map[string]struct{}, 1) columns[c] = struct{}{} break outer } columns[t.Name+"."+c] = struct{}{} } } } else { for _, cs := range query.GetResultColumns() { for _, c := range cs { columns[c] = struct{}{} } } } points := series.Points series.Points = nil for _, point := range points { ok, err := matches(query.GetWhereCondition(), series.Fields, point) if err != nil { return nil, err } if ok { filterColumns(columns, series.Fields, point) series.Points = append(series.Points, point) } } if _, ok := columns["*"]; !ok { newFields := []string{} for _, f := range series.Fields { if _, ok := columns[f]; !ok { continue } newFields = append(newFields, f) } series.Fields = newFields } return series, nil }