influxdb/query/values/array.go

129 lines
2.6 KiB
Go

package values
import (
"fmt"
"regexp"
"sort"
"github.com/influxdata/platform/query/semantic"
)
// Array represents an sequence of elements
// All elements must be the same type
type Array interface {
Value
Get(i int) Value
Set(i int, v Value)
Append(v Value)
Len() int
Range(func(i int, v Value))
Sort(func(i, j Value) bool)
}
type array struct {
t semantic.Type
elements []Value
}
func NewArray(elementType semantic.Type) Array {
return &array{
t: semantic.NewArrayType(elementType),
}
}
func NewArrayWithBacking(elementType semantic.Type, elements []Value) Array {
return &array{
t: semantic.NewArrayType(elementType),
elements: elements,
}
}
func (a *array) Type() semantic.Type {
return a.t
}
func (a *array) Get(i int) Value {
if i >= len(a.elements) {
panic(fmt.Errorf("index out of bounds: i:%d len:%d", i, len(a.elements)))
}
return a.elements[i]
}
func (a *array) Set(i int, v Value) {
if i >= len(a.elements) {
panic(fmt.Errorf("index out of bounds: i:%d len:%d", i, len(a.elements)))
}
a.elements[i] = v
}
func (a *array) Append(v Value) {
a.elements = append(a.elements, v)
}
func (a *array) Range(f func(i int, v Value)) {
for i, v := range a.elements {
f(i, v)
}
}
func (a *array) Len() int {
return len(a.elements)
}
func (a *array) Sort(f func(i, j Value) bool) {
sort.Slice(a.elements, func(i, j int) bool {
return f(a.elements[i], a.elements[j])
})
}
func (a *array) Str() string {
panic(UnexpectedKind(semantic.Object, semantic.String))
}
func (a *array) Int() int64 {
panic(UnexpectedKind(semantic.Object, semantic.Int))
}
func (a *array) UInt() uint64 {
panic(UnexpectedKind(semantic.Object, semantic.UInt))
}
func (a *array) Float() float64 {
panic(UnexpectedKind(semantic.Object, semantic.Float))
}
func (a *array) Bool() bool {
panic(UnexpectedKind(semantic.Object, semantic.Bool))
}
func (a *array) Time() Time {
panic(UnexpectedKind(semantic.Object, semantic.Time))
}
func (a *array) Duration() Duration {
panic(UnexpectedKind(semantic.Object, semantic.Duration))
}
func (a *array) Regexp() *regexp.Regexp {
panic(UnexpectedKind(semantic.Object, semantic.Regexp))
}
func (a *array) Array() Array {
return a
}
func (a *array) Object() Object {
panic(UnexpectedKind(semantic.Object, semantic.Object))
}
func (a *array) Function() Function {
panic(UnexpectedKind(semantic.Object, semantic.Function))
}
func (a *array) Equal(rhs Value) bool {
if a.Type() != rhs.Type() {
return false
}
r := rhs.Array()
if (a.Len() != r.Len()) {
return false
}
length := a.Len()
for i := 0; i < length; i++ {
aVal := a.Get(i)
rVal := r.Get(i)
if !aVal.Equal(rVal) {
return false
}
}
return true
}