func (self *Shard) Query(querySpec *parser.QuerySpec, processor engine.Processor) error { self.closeLock.RLock() defer self.closeLock.RUnlock() if self.closed { return fmt.Errorf("Shard is closed") } if querySpec.IsListSeriesQuery() { return fmt.Errorf("List series queries should never come to the shard") } else if querySpec.IsDeleteFromSeriesQuery() { return self.executeDeleteQuery(querySpec, processor) } if !self.hasReadAccess(querySpec) { return errors.New("User does not have access to one or more of the series requested.") } switch t := querySpec.SelectQuery().FromClause.Type; t { case parser.FromClauseArray: log.Debug("Shard %s: running a regular query", self.db.Path()) return self.executeArrayQuery(querySpec, processor) case parser.FromClauseMerge, parser.FromClauseInnerJoin: log.Debug("Shard %s: running a merge query", self.db.Path()) return self.executeMergeQuery(querySpec, processor, t) default: panic(fmt.Errorf("Unknown from clause type %s", t)) } }