// iteratorCreator returns a new instance of IteratorCreator based on stmt. func (e *QueryExecutor) iteratorCreator(stmt *influxql.SelectStatement, opt *influxql.SelectOptions) (influxql.IteratorCreator, error) { // Retrieve a list of shard IDs. shards, err := e.MetaClient.ShardsByTimeRange(stmt.Sources, opt.MinTime, opt.MaxTime) if err != nil { return nil, err } // Generate iterators for each node. ics := make([]influxql.IteratorCreator, 0) if err := func() error { for _, shard := range shards { ic := e.TSDBStore.ShardIteratorCreator(shard.ID) if ic == nil { continue } ics = append(ics, ic) } return nil }(); err != nil { influxql.IteratorCreators(ics).Close() return nil, err } return influxql.IteratorCreators(ics), nil }
func (s *Service) processCreateIteratorRequest(conn net.Conn) { defer conn.Close() var itr influxql.Iterator if err := func() error { // Parse request. var req CreateIteratorRequest if err := DecodeLV(conn, &req); err != nil { return err } // Collect iterator creators for each shard. ics := make([]influxql.IteratorCreator, 0, len(req.ShardIDs)) for _, shardID := range req.ShardIDs { ic := s.TSDBStore.ShardIteratorCreator(shardID) if ic == nil { return nil } ics = append(ics, ic) } // Generate a single iterator from all shards. i, err := influxql.IteratorCreators(ics).CreateIterator(req.Opt) if err != nil { return err } itr = i return nil }(); err != nil { itr.Close() s.Logger.Printf("error reading CreateIterator request: %s", err) EncodeTLV(conn, createIteratorResponseMessage, &CreateIteratorResponse{Err: err}) return } // Encode success response. if err := EncodeTLV(conn, createIteratorResponseMessage, &CreateIteratorResponse{}); err != nil { s.Logger.Printf("error writing CreateIterator response: %s", err) return } // Exit if no iterator was produced. if itr == nil { return } // Stream iterator to connection. if err := influxql.NewIteratorEncoder(conn).EncodeIterator(itr); err != nil { s.Logger.Printf("error encoding CreateIterator iterator: %s", err) return } }
func (s *Service) processFieldDimensionsRequest(conn net.Conn) { var fields, dimensions map[string]struct{} if err := func() error { // Parse request. var req FieldDimensionsRequest if err := DecodeLV(conn, &req); err != nil { return err } // Collect iterator creators for each shard. ics := make([]influxql.IteratorCreator, 0, len(req.ShardIDs)) for _, shardID := range req.ShardIDs { ic := s.TSDBStore.ShardIteratorCreator(shardID) if ic == nil { return nil } ics = append(ics, ic) } // Generate a single iterator from all shards. f, d, err := influxql.IteratorCreators(ics).FieldDimensions(req.Sources) if err != nil { return err } fields, dimensions = f, d return nil }(); err != nil { s.Logger.Printf("error reading FieldDimensions request: %s", err) EncodeTLV(conn, fieldDimensionsResponseMessage, &FieldDimensionsResponse{Err: err}) return } // Encode success response. if err := EncodeTLV(conn, fieldDimensionsResponseMessage, &FieldDimensionsResponse{ Fields: fields, Dimensions: dimensions, }); err != nil { s.Logger.Printf("error writing FieldDimensions response: %s", err) return } }
func (s *Service) processSeriesKeysRequest(conn net.Conn) { var seriesList influxql.SeriesList if err := func() error { // Parse request. var req SeriesKeysRequest if err := DecodeLV(conn, &req); err != nil { return err } // Collect iterator creators for each shard. ics := make([]influxql.IteratorCreator, 0, len(req.ShardIDs)) for _, shardID := range req.ShardIDs { ic := s.TSDBStore.ShardIteratorCreator(shardID) if ic == nil { return nil } ics = append(ics, ic) } // Generate a single iterator from all shards. a, err := influxql.IteratorCreators(ics).SeriesKeys(req.Opt) if err != nil { return err } seriesList = a return nil }(); err != nil { s.Logger.Printf("error reading SeriesKeys request: %s", err) EncodeTLV(conn, seriesKeysResponseMessage, &SeriesKeysResponse{Err: err}) return } // Encode success response. if err := EncodeTLV(conn, seriesKeysResponseMessage, &SeriesKeysResponse{ SeriesList: seriesList, }); err != nil { s.Logger.Printf("error writing SeriesKeys response: %s", err) return } }