influxdb/tsdb/engine/tsm1/array_cursor_iterator.go

85 lines
2.2 KiB
Go

package tsm1
import (
"context"
"fmt"
"github.com/influxdata/influxdb/models"
"github.com/influxdata/influxdb/pkg/metrics"
"github.com/influxdata/influxdb/query"
"github.com/influxdata/influxdb/tsdb"
"github.com/influxdata/influxql"
)
type arrayCursorIterator struct {
e *Engine
key []byte
asc struct {
Float *floatArrayAscendingCursor
Integer *integerArrayAscendingCursor
Unsigned *unsignedArrayAscendingCursor
Boolean *booleanArrayAscendingCursor
String *stringArrayAscendingCursor
}
desc struct {
Float *floatArrayDescendingCursor
Integer *integerArrayDescendingCursor
Unsigned *unsignedArrayDescendingCursor
Boolean *booleanArrayDescendingCursor
String *stringArrayDescendingCursor
}
}
func (q *arrayCursorIterator) Stats() tsdb.CursorStats {
return tsdb.CursorStats{}
}
func (q *arrayCursorIterator) Next(ctx context.Context, r *tsdb.CursorRequest) (tsdb.Cursor, error) {
// Look up fields for measurement.
mf := q.e.fieldset.Fields(r.Name)
if mf == nil {
return nil, nil
}
// Find individual field.
f := mf.Field(r.Field)
if f == nil {
// field doesn't exist for this measurement
return nil, nil
}
if grp := metrics.GroupFromContext(ctx); grp != nil {
grp.GetCounter(numberOfRefCursorsCounter).Add(1)
}
var opt query.IteratorOptions
opt.Ascending = r.Ascending
opt.StartTime = r.StartTime
opt.EndTime = r.EndTime
// Return appropriate cursor based on type.
switch f.Type {
case influxql.Float:
return q.buildFloatArrayCursor(ctx, r.Name, r.Tags, r.Field, opt), nil
case influxql.Integer:
return q.buildIntegerArrayCursor(ctx, r.Name, r.Tags, r.Field, opt), nil
case influxql.Unsigned:
return q.buildUnsignedArrayCursor(ctx, r.Name, r.Tags, r.Field, opt), nil
case influxql.String:
return q.buildStringArrayCursor(ctx, r.Name, r.Tags, r.Field, opt), nil
case influxql.Boolean:
return q.buildBooleanArrayCursor(ctx, r.Name, r.Tags, r.Field, opt), nil
default:
panic(fmt.Sprintf("unreachable: %T", f.Type))
}
}
func (q *arrayCursorIterator) seriesFieldKeyBytes(name []byte, tags models.Tags, field string) []byte {
q.key = models.AppendMakeKey(q.key[:0], name, tags)
q.key = append(q.key, keyFieldSeparatorBytes...)
q.key = append(q.key, field...)
return q.key
}