Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions compiler/semantic/op.go
Original file line number Diff line number Diff line change
Expand Up @@ -233,8 +233,8 @@ func (t *translator) fromConst(val super.Value, entity *ast.FromEval, args []ast
op, name := t.fromName(entity, val.AsString(), args)
return sem.Seq{op}, name
}
vals, err := val.Elements()
if err != nil {
vals, ok := val.Elements()
if !ok {
t.error(entity.Expr, fmt.Errorf("from expression requires a string but encountered %s", sup.String(val)))
return sem.Seq{badOp}, ""
}
Expand Down
8 changes: 4 additions & 4 deletions runtime/sam/expr/function/len.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,11 @@ func (l *LenFn) Call(args []super.Value) super.Value {
case *super.TypeRecord:
length = len(typ.Fields)
case *super.TypeArray, *super.TypeSet, *super.TypeMap:
var err error
length, err = val.ContainerLength()
if err != nil {
panic(err)
n, ok := val.ContainerLength()
if !ok {
panic(val.Type())
}
length = n
case *super.TypeOfString:
length = utf8.RuneCount(val.Bytes())
case *super.TypeOfBytes, *super.TypeOfIP, *super.TypeOfNet:
Expand Down
4 changes: 2 additions & 2 deletions runtime/sam/expr/map.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ func (a *mapCall) Eval(in super.Value) super.Value {
if val.IsNull() || val.IsError() {
return val
}
elems, err := val.Elements()
if err != nil {
elems, ok := val.Elements()
if !ok {
return a.sctx.WrapError("map: expected array or set value", in)
}
if len(elems) == 0 {
Expand Down
6 changes: 3 additions & 3 deletions runtime/sam/expr/slice.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,9 @@ func (s *Slice) Eval(this super.Value) super.Value {
case *super.TypeOfString:
length = utf8.RuneCount(elem.Bytes())
case *super.TypeArray, *super.TypeSet:
n, err := elem.ContainerLength()
if err != nil {
panic(err)
n, ok := elem.ContainerLength()
if !ok {
panic(elem.Type())
}
length = n
default:
Expand Down
6 changes: 3 additions & 3 deletions sup/formatter.go
Original file line number Diff line number Diff line change
Expand Up @@ -379,9 +379,9 @@ func (f *formatter) formatRecord(indent int, typ *super.TypeRecord, bytes scode.

func (f *formatter) formatElems(indent int, open, close string, inner super.Type, val super.Value, known bool) bool {
f.build(open)
n, err := val.ContainerLength()
if err != nil {
panic(err)
n, ok := val.ContainerLength()
if !ok {
panic(val.Type())
}
if n == 0 {
f.build(close)
Expand Down
22 changes: 9 additions & 13 deletions value.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,6 @@ import (
"github.com/brimdata/super/scode"
)

var (
ErrNotContainer = errors.New("expected container type, got primitive")
)

var (
Null = Value{typ: TypeNull}

Expand Down Expand Up @@ -194,43 +190,43 @@ func (v Value) ArrayIndex(idx int64) (Value, error) {

// Elements returns an array of Values for the given container type.
// Returns an error if the element is not an array or set.
func (v Value) Elements() ([]Value, error) {
func (v Value) Elements() ([]Value, bool) {
innerType := InnerType(v.Type())
if innerType == nil {
return nil, ErrNotContainer
return nil, false
}
var elements []Value
for it := v.ContainerIter(); !it.Done(); {
elements = append(elements, NewValue(innerType, it.Next()))
}
return elements, nil
return elements, true
}

func (v Value) ContainerLength() (int, error) {
func (v Value) ContainerLength() (int, bool) {
switch v.Type().(type) {
case *TypeSet, *TypeArray:
if v.IsNull() {
return 0, nil
return 0, true
}
var n int
for it := v.ContainerIter(); !it.Done(); {
it.Next()
n++
}
return n, nil
return n, true
case *TypeMap:
if v.IsNull() {
return 0, nil
return 0, true
}
var n int
for it := v.ContainerIter(); !it.Done(); {
it.Next()
it.Next()
n++
}
return n, nil
return n, true
default:
return -1, ErrNotContainer
return -1, false
}
}

Expand Down
Loading