// https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html
grammar UpdateExpression;

import Common;

start: updateExpression EOF;

updateExpression
  : setExpression
  | removeExpression
  | addExpression
  | deleteExpression
  ;

setExpression
  : SET setAction (',' setAction)*
  ;

removeExpression
  : REMOVE removeAction (',' removeAction)*
  ;

addExpression
  : ADD addAction (',' addAction)*
  ;

deleteExpression
  : DELETE deleteAction (',' deleteAction)*
  ;

setAction
  : path '=' value
  ;

removeAction
  : path
  ;

addAction
  : path EXPRESSION_ATTRIBUTE_VALUE
  ;

deleteAction
  : path EXPRESSION_ATTRIBUTE_VALUE
  ;

value
  : operand
  | operand '+' operand
  | operand '-' operand
  ;

operand
  : path
  | EXPRESSION_ATTRIBUTE_VALUE
  | IF_NOT_EXISTS '(' path ',' operand ')'
  | LIST_APPEND '(' operand ',' operand ')'
  ;

path
  : ATTRIBUTE_NAME
  | EXPRESSION_ATTRIBUTE_NAME
  | nestedPath
  ;

nestedPath
  : (ATTRIBUTE_NAME | EXPRESSION_ATTRIBUTE_NAME) '.' nestedPath
  | (ATTRIBUTE_NAME | EXPRESSION_ATTRIBUTE_NAME) INDEXING_OPERATOR
  | (ATTRIBUTE_NAME | EXPRESSION_ATTRIBUTE_NAME) INDEXING_OPERATOR '.' nestedPath
  | (ATTRIBUTE_NAME | EXPRESSION_ATTRIBUTE_NAME)
  ;

IF_NOT_EXISTS
  : 'if_not_exists'
  ;

LIST_APPEND
  : 'list_append'
  ;

SET
  : S E T
  ;

REMOVE
  : R E M O V E
  ;

ADD
  : A D D
  ;

DELETE
  : D E L E T E
  ;

INDEXING_OPERATOR
  : ('[' NUMBER ']')+
  ;