func TestIteratorOptions_MergeSorted(t *testing.T) { opt := influxql.IteratorOptions{} sorted := opt.MergeSorted() if !sorted { t.Error("expected no expression to be sorted, got unsorted") } opt.Expr = &influxql.VarRef{} sorted = opt.MergeSorted() if !sorted { t.Error("expected expression with varref to be sorted, got unsorted") } opt.Expr = &influxql.Call{} sorted = opt.MergeSorted() if sorted { t.Error("expected expression without varref to be unsorted, got sorted") } }
// CreateIterator returns a single combined iterator for the shards. func (a Shards) CreateIterator(opt influxql.IteratorOptions) (influxql.Iterator, error) { if influxql.Sources(opt.Sources).HasSystemSource() { return a.createSystemIterator(opt) } // Create iterators for each shard. // Ensure that they are closed if an error occurs. itrs := make([]influxql.Iterator, 0, len(a)) if err := func() error { for _, sh := range a { itr, err := sh.CreateIterator(opt) if err != nil { return err } itrs = append(itrs, itr) } return nil }(); err != nil { influxql.Iterators(itrs).Close() return nil, err } // Merge into a single iterator. if opt.MergeSorted() { return influxql.NewSortedMergeIterator(itrs, opt), nil } itr := influxql.NewMergeIterator(itrs, opt) if opt.Expr != nil { if expr, ok := opt.Expr.(*influxql.Call); ok && expr.Name == "count" { opt.Expr = &influxql.Call{ Name: "sum", Args: expr.Args, } } } return influxql.NewCallIterator(itr, opt), nil }