func (e *Engine) CreateIterator(opt influxql.IteratorOptions) (influxql.Iterator, error) { if call, ok := opt.Expr.(*influxql.Call); ok { refOpt := opt refOpt.Expr = call.Args[0].(*influxql.VarRef) inputs, err := e.createVarRefIterator(refOpt) if err != nil { return nil, err } input := influxql.NewMergeIterator(inputs, opt) if opt.InterruptCh != nil { input = influxql.NewInterruptIterator(input, opt.InterruptCh) } return influxql.NewCallIterator(input, opt) } itrs, err := e.createVarRefIterator(opt) if err != nil { return nil, err } itr := influxql.NewSortedMergeIterator(itrs, opt) if opt.InterruptCh != nil { itr = influxql.NewInterruptIterator(itr, opt.InterruptCh) } return itr, nil }
func (e *Engine) CreateIterator(opt influxql.IteratorOptions) (influxql.Iterator, error) { if call, ok := opt.Expr.(*influxql.Call); ok { refOpt := opt refOpt.Expr = call.Args[0].(*influxql.VarRef) aggregate := true if opt.Interval.IsZero() { switch call.Name { case "first": aggregate = false refOpt.Limit = 1 refOpt.Ascending = true case "last": aggregate = false refOpt.Limit = 1 refOpt.Ascending = false } } inputs, err := e.createVarRefIterator(refOpt, aggregate) if err != nil { return nil, err } else if len(inputs) == 0 { return nil, nil } // Wrap each series in a call iterator. for i, input := range inputs { if opt.InterruptCh != nil { input = influxql.NewInterruptIterator(input, opt.InterruptCh) } itr, err := influxql.NewCallIterator(input, opt) if err != nil { return nil, err } inputs[i] = itr } return influxql.NewParallelMergeIterator(inputs, opt, runtime.GOMAXPROCS(0)), nil } itrs, err := e.createVarRefIterator(opt, false) if err != nil { return nil, err } itr := influxql.NewSortedMergeIterator(itrs, opt) if itr != nil && opt.InterruptCh != nil { itr = influxql.NewInterruptIterator(itr, opt.InterruptCh) } return itr, nil }
func (e *Engine) CreateIterator(opt influxql.IteratorOptions) (influxql.Iterator, error) { if call, ok := opt.Expr.(*influxql.Call); ok { refOpt := opt refOpt.Expr = call.Args[0].(*influxql.VarRef) inputs, err := e.createVarRefIterator(refOpt) if err != nil { return nil, err } else if len(inputs) == 0 { return nil, nil } // Wrap each series in a call iterator. for i, input := range inputs { if opt.InterruptCh != nil { input = influxql.NewInterruptIterator(input, opt.InterruptCh) } itr, err := influxql.NewCallIterator(input, opt) if err != nil { return nil, err } inputs[i] = itr } return influxql.NewParallelMergeIterator(inputs, opt, runtime.GOMAXPROCS(0)), nil } itrs, err := e.createVarRefIterator(opt) if err != nil { return nil, err } itr := influxql.NewSortedMergeIterator(itrs, opt) if itr != nil && opt.InterruptCh != nil { itr = influxql.NewInterruptIterator(itr, opt.InterruptCh) } return itr, nil }