Example #1
0
// tagSets returns the unique tag sets that exist for the given tag keys. This is used to determine
// what composite series will be created by a group by. i.e. "group by region" should return:
// {"region":"uswest"}, {"region":"useast"}
// or region, service returns
// {"region": "uswest", "service": "redis"}, {"region": "uswest", "service": "mysql"}, etc...
func (m *Measurement) tagSets(stmt *influxql.SelectStatement, dimensions []string) map[string]map[uint32]influxql.Expr {
	// get the unique set of series ids and the filters that should be applied to each
	seriesIDs, filters := m.seriesIDsAndFilters(stmt)

	// build the tag sets
	tagSets := make(map[string]map[uint32]influxql.Expr)
	for _, id := range seriesIDs {
		// get the series and set the tag values for the dimensions we care about
		s := m.seriesByID[id]
		tags := make([]string, len(dimensions))
		for i, dim := range dimensions {
			tags[i] = s.Tags[dim]
		}

		// marshal it into a string and put this series and its expr into the tagSets map
		t := string(influxql.MarshalStrings(tags))
		set, ok := tagSets[t]
		if !ok {
			set = make(map[uint32]influxql.Expr)
		}
		set[id] = filters[id]
		tagSets[t] = set
	}

	return tagSets
}
Example #2
0
// NewIterator returns a new iterator.
func NewIterator(tags []string, points []Point) *Iterator {
	return &Iterator{tags: string(influxql.MarshalStrings(tags)), points: points}
}