// SelectTags returns a list of non-field tags in the SELECT section of stmt. func (m *Measurement) SelectTags(stmt *influxql.SelectStatement) []string { set := newStringSet() for _, name := range stmt.NamesInSelect() { if !m.HasField(name) && m.HasTagKey(name) { set.add(name) } } return set.list() }
// SelectFields returns a list of fields in the SELECT section of stmt. func (m *Measurement) SelectFields(stmt *influxql.SelectStatement) []string { set := newStringSet() for _, name := range stmt.NamesInSelect() { if m.HasField(name) { set.add(name) continue } } return set.list() }
// createTagSetsAndFields returns the tagsets and various fields given a measurement and // SELECT statement. func createTagSetsAndFields(m *Measurement, stmt *influxql.SelectStatement) (*tagSetsAndFields, error) { _, tagKeys, err := stmt.Dimensions.Normalize() if err != nil { return nil, err } sfs := newStringSet() sts := newStringSet() wfs := newStringSet() // Validate the fields and tags asked for exist and keep track of which are in the select vs the where for _, n := range stmt.NamesInSelect() { if m.HasField(n) { sfs.add(n) continue } if m.HasTagKey(n) { sts.add(n) } } for _, n := range stmt.NamesInDimension() { if m.HasTagKey(n) { tagKeys = append(tagKeys, n) } } for _, n := range stmt.NamesInWhere() { if n == "time" { continue } if m.HasField(n) { wfs.add(n) continue } } // Get the sorted unique tag sets for this statement. tagSets, err := m.TagSets(stmt, tagKeys) if err != nil { return nil, err } return &tagSetsAndFields{ tagSets: tagSets, selectFields: sfs.list(), selectTags: sts.list(), whereFields: wfs.list(), }, nil }