// Array evaluator: evaluate multiple values into an array // // (b,c,d) // func walkArray(ctx expr.EvalContext, node *expr.ArrayNode) (value.Value, bool) { vals := make([]value.Value, len(node.Args)) for i := 0; i < len(node.Args); i++ { v, _ := Eval(ctx, node.Args[i]) vals[i] = v } // we are returning an array of evaluated nodes return value.NewSliceValues(vals), true }
// ValueArray // IN ("a","b","c") // ["a","b","c"] func ValueArray(pg TokenPager) (value.Value, error) { //u.Debugf("valueArray cur:%v peek:%v", pg.Cur().V, pg.Peek().V) vals := make([]value.Value, 0) arrayLoop: for { tok := pg.Next() // consume token //u.Infof("valueArray() consumed token?: %v", tok) switch tok.T { case lex.TokenComma: // continue case lex.TokenRightParenthesis: //u.Warnf("found right paren %v cur: %v", tok, pg.Cur()) break arrayLoop case lex.TokenEOF, lex.TokenEOS, lex.TokenFrom, lex.TokenAs: //u.Debugf("return: %v", tok) break arrayLoop case lex.TokenValue: vals = append(vals, value.NewStringValue(tok.V)) case lex.TokenInteger: fv, err := strconv.ParseFloat(tok.V, 64) if err == nil { vals = append(vals, value.NewNumberValue(fv)) } else { return value.NilValueVal, err } case lex.TokenFloat: fv, err := strconv.ParseFloat(tok.V, 64) if err == nil { vals = append(vals, value.NewNumberValue(fv)) } else { return value.NilValueVal, err } default: return value.NilValueVal, fmt.Errorf("Could not recognize token: %v", tok) } tok = pg.Next() switch tok.T { case lex.TokenComma: // fine, consume the comma case lex.TokenRightBracket: //u.Warnf("right bracket: %v", tok) break arrayLoop default: u.Warnf("unrecognized token: %v", tok) return value.NilValueVal, fmt.Errorf("unrecognized token %v", tok) } } //u.Debugf("returning array: %v", vals) return value.NewSliceValues(vals), nil }