diff options
Diffstat (limited to 'internal/mapr/setcondition.go')
| -rw-r--r-- | internal/mapr/setcondition.go | 51 |
1 files changed, 27 insertions, 24 deletions
diff --git a/internal/mapr/setcondition.go b/internal/mapr/setcondition.go index 8c5cfc9..9dcd690 100644 --- a/internal/mapr/setcondition.go +++ b/internal/mapr/setcondition.go @@ -29,32 +29,16 @@ func (sc *setCondition) String() string { } func makeSetConditions(tokens []token) (set []setCondition, err error) { + parse := func(tokens []token) (setCondition, []token, error) { var sc setCondition - if len(tokens) < 3 { - return sc, nil, errors.New(invalidQuery + "Not enough arguments in 'set' clause") - } - - setOp := strings.ToLower(tokens[1].str) - switch setOp { - case "=": - default: - return sc, nil, errors.New(invalidQuery + "Unknown operation in 'set' clause: " + setOp) - } - if !tokens[0].isBareword { - return sc, nil, errors.New(invalidQuery + "Expected bareword at 'set' clause's lValue: " + tokens[0].str) + if err := initSetConditions(&sc, tokens); err != nil { + return sc, nil, err } - sc.lString = tokens[0].str - if !strings.HasPrefix(sc.lString, "$") { - return sc, nil, errors.New(invalidQuery + "Expected field variable name (starting with $) at 'set' clause's lValue: " + tokens[0].str) - } - sc.rType = Field - - rString := tokens[2].str // Seems like a function call? - if strings.HasSuffix(rString, ")") { + if strings.HasSuffix(sc.rString, ")") { functionStack, functionArg, err := funcs.NewFunctionStack(tokens[2].str) if err != nil { return sc, nil, err @@ -65,14 +49,12 @@ func makeSetConditions(tokens []token) (set []setCondition, err error) { return sc, tokens[3:], nil } - sc.rString = rString if f, err := strconv.ParseFloat(sc.rString, 64); err == nil { sc.rFloat = f sc.rType = Float } else { sc.rType = Field } - return sc, tokens[3:], nil } @@ -84,10 +66,31 @@ func makeSetConditions(tokens []token) (set []setCondition, err error) { if err != nil { return nil, err } - set = append(set, sc) tokens = tokensConsumeOptional(tokens, ",") } - return } + +func initSetConditions(sc *setCondition, tokens []token) error { + if len(tokens) < 3 { + return errors.New(invalidQuery + "Not enough arguments in 'set' clause") + } + + sc.lString = tokens[0].str + sc.rType = Field + sc.rString = tokens[2].str + + switch { + case tokens[1].str != "=": + return errors.New(invalidQuery + "Unknown operation in 'set' clause: " + tokens[1].str) + case !tokens[0].isBareword: + return errors.New(invalidQuery + "Expected bareword at 'set' clause's lValue: " + + tokens[0].str) + case !strings.HasPrefix(sc.lString, "$"): + return errors.New(invalidQuery + "Expected field variable name (starting with $) " + + "at 'set' clause's lValue: " + tokens[0].str) + } + + return nil +} |
