// collect a point from a given parent. // emit the oldest set if we have collected enough data. func (g *group) collect(i int, p models.PointInterface) { t := p.PointTime().Round(g.j.j.Tolerance) if t.Before(g.oldestTime) || g.oldestTime.IsZero() { g.oldestTime = t } set := g.sets[t] if set == nil { set = newJoinset(g.j.j.StreamName, g.j.fill, g.j.fillValue, g.j.j.Names, g.j.j.Tolerance, t, g.j.logger) g.sets[t] = set } set.Add(i, p) // Update head g.head[i] = t // Check if all parents have been read past the oldestTime. // If so we can emit the set. emit := true for _, t := range g.head { if !t.After(g.oldestTime) { // Still posible to get more data // need to wait for more points emit = false break } } if emit { g.emit() } }
// collect a point from a given parent. // emit the oldest set if we have collected enough data. func (g *group) collect(i int, p models.PointInterface) error { t := p.PointTime().Round(g.j.j.Tolerance) if t.Before(g.oldestTime) || g.oldestTime.IsZero() { g.oldestTime = t } var set *joinset sets := g.sets[t] if len(sets) == 0 { set = newJoinset( g.j.j.StreamName, g.j.fill, g.j.fillValue, g.j.j.Names, g.j.j.Delimiter, g.j.j.Tolerance, t, g.j.logger, ) sets = append(sets, set) g.sets[t] = sets } for j := 0; j < len(sets); j++ { if !sets[j].Has(i) { set = sets[j] break } } if set == nil { set = newJoinset( g.j.j.StreamName, g.j.fill, g.j.fillValue, g.j.j.Names, g.j.j.Delimiter, g.j.j.Tolerance, t, g.j.logger, ) sets = append(sets, set) g.sets[t] = sets } set.Set(i, p) // Update head g.head[i] = t onlyReadySets := false for _, t := range g.head { if !t.After(g.oldestTime) { onlyReadySets = true break } } err := g.emit(onlyReadySets) if err != nil { return err } return nil }