func (self *Shard) Query(querySpec *parser.QuerySpec, processor cluster.QueryProcessor) error { if querySpec.IsListSeriesQuery() { return self.executeListSeriesQuery(querySpec, processor) } else if querySpec.IsDeleteFromSeriesQuery() { return self.executeDeleteQuery(querySpec, processor) } seriesAndColumns := querySpec.SelectQuery().GetReferencedColumns() if !self.hasReadAccess(querySpec) { return errors.New("User does not have access to one or more of the series requested.") } for series, columns := range seriesAndColumns { if regex, ok := series.GetCompiledRegex(); ok { seriesNames := self.metaStore.GetSeriesForDatabaseAndRegex(querySpec.Database(), regex) for _, name := range seriesNames { if !querySpec.HasReadAccess(name) { continue } err := self.executeQueryForSeries(querySpec, name, columns, processor) if err != nil { return err } } } else { err := self.executeQueryForSeries(querySpec, series.Name, columns, processor) if err != nil { return err } } } return nil }
func (self *Shard) hasReadAccess(querySpec *parser.QuerySpec) bool { for series := range querySpec.SeriesValuesAndColumns() { if _, isRegex := series.GetCompiledRegex(); !isRegex { if !querySpec.HasReadAccess(series.Name) { return false } } } return true }