func (s *FromNode) runStream([]byte) error { dims := models.Dimensions{ ByName: s.s.GroupByMeasurementFlag, } for pt, ok := s.ins[0].NextPoint(); ok; pt, ok = s.ins[0].NextPoint() { s.timer.Start() if s.matches(pt) { if s.s.Truncate != 0 { pt.Time = pt.Time.Truncate(s.s.Truncate) } if s.s.Round != 0 { pt.Time = pt.Time.Round(s.s.Round) } dims.TagNames = s.dimensions pt = setGroupOnPoint(pt, s.allDimensions, dims) s.timer.Pause() for _, child := range s.outs { err := child.CollectPoint(pt) if err != nil { return err } } s.timer.Resume() } s.timer.Stop() } return nil }
func setGroupOnPoint(p models.Point, allDimensions bool, dimensions models.Dimensions) models.Point { if allDimensions { dimensions.TagNames = models.SortedKeys(p.Tags) } p.Group = models.ToGroupID(p.Name, p.Tags, dimensions) p.Dimensions = dimensions return p }
func (g *GroupByNode) runGroupBy([]byte) error { dims := models.Dimensions{ ByName: g.g.ByMeasurementFlag, } switch g.Wants() { case pipeline.StreamEdge: dims.TagNames = g.dimensions for pt, ok := g.ins[0].NextPoint(); ok; pt, ok = g.ins[0].NextPoint() { g.timer.Start() pt = setGroupOnPoint(pt, g.allDimensions, dims) g.timer.Stop() for _, child := range g.outs { err := child.CollectPoint(pt) if err != nil { return err } } } default: var lastTime time.Time groups := make(map[models.GroupID]*models.Batch) for b, ok := g.ins[0].NextBatch(); ok; b, ok = g.ins[0].NextBatch() { g.timer.Start() if !b.TMax.Equal(lastTime) { lastTime = b.TMax // Emit all groups for id, group := range groups { for _, child := range g.outs { err := child.CollectBatch(*group) if err != nil { return err } } // Remove from groups delete(groups, id) } } for _, p := range b.Points { if g.allDimensions { dims.TagNames = models.SortedKeys(p.Tags) } else { dims.TagNames = g.dimensions } groupID := models.ToGroupID(b.Name, p.Tags, dims) group, ok := groups[groupID] if !ok { tags := make(map[string]string, len(dims.TagNames)) for _, dim := range dims.TagNames { tags[dim] = p.Tags[dim] } group = &models.Batch{ Name: b.Name, Group: groupID, TMax: b.TMax, ByName: b.ByName, Tags: tags, } groups[groupID] = group } group.Points = append(group.Points, p) } g.timer.Stop() } } return nil }