package storage

import (
	"github.com/influxdata/influxdb"
	"github.com/influxdata/influxql"
)

// StringIterator describes the behavior for enumerating a sequence of
// string values.
type StringIterator interface {
	// Next advances the StringIterator to the next value. It returns false
	// when there are no more values.
	Next() bool

	// Value returns the current value.
	Value() string
}

// TagKeys returns an iterator where the values are tag keys for the bucket
// matching the predicate within the time range (start, end].
func (e *Engine) TagKeys(orgID, bucketID influxdb.ID, start, end int64, predicate influxql.Expr) StringIterator {
	// This method would be invoked when the consumer wants to get the following schema information for an arbitrary
	// time range in a single bucket:
	//
	// * All tag keys;
	// * All tag keys filtered by an arbitrary predicate, e.g., tag keys for a measurement or tag keys appearing alongside another tag key pair.
	//
	return nullStringIterator
}

// TagValues returns an iterator which enumerates the values for the specific
// tagKey in the given bucket matching the predicate within the
// time range (start, end].
func (e *Engine) TagValues(orgID, bucketID influxdb.ID, tagKey string, start, end int64, predicate influxql.Expr) StringIterator {
	// This method would be invoked when the consumer wants to get the following schema information for an arbitrary
	// time range in a single bucket:
	//
	// * All measurement names, i.e. tagKey == _measurement);
	// * All field names for a specific measurement using a predicate
	//     * i.e. tagKey is "_field", predicate _measurement == "<measurement>"
	//
	return nullStringIterator
}

var nullStringIterator StringIterator = &emptyStringIterator{}

type emptyStringIterator struct{}

func (*emptyStringIterator) Next() bool    { return false }
func (*emptyStringIterator) Value() string { return "" }