blob: 4372c857f96eaf4545439b0aea47d57fcc6ee806 [file] [log] [blame]
// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package query_functions
import (
"v.io/syncbase/v23/syncbase/nosql/internal/query/query_parser"
"v.io/syncbase/v23/syncbase/nosql/query_db"
"v.io/syncbase/v23/syncbase/nosql/syncql"
"v.io/v23/vdl"
)
// len returns the size of the argument passed in.
// For vdl's Array, List, Map and Set, it returns the number of entries.
// For TypString, it returns the number of bytes in the string.
// For TypNil, it returns 0.
// For all other types, it returns an error.
// e.g., Len("abc") returns 3
func lenFunc(db query_db.Database, off int64, args []*query_parser.Operand) (*query_parser.Operand, error) {
switch args[0].Type {
case query_parser.TypNil:
return makeIntOp(args[0].Off, 0), nil
case query_parser.TypObject:
switch args[0].Object.Kind() {
case vdl.Array, vdl.List, vdl.Map, vdl.Set:
// If array, list, set, map, call Value.Len()
return makeIntOp(args[0].Off, int64(args[0].Object.Len())), nil
}
case query_parser.TypStr:
// If string, call go's built-in len().
return makeIntOp(args[0].Off, int64(len(args[0].Str))), nil
}
return nil, syncql.NewErrFunctionLenInvalidArg(db.GetContext(), args[0].Off)
}