def get_list_from_ddb_typed_value(cls, node, function_name): assert isinstance(node, DDBTypedValue) dynamo_value = node.get_value() assert isinstance(dynamo_value, DynamoType) if not dynamo_value.is_list(): raise IncorrectOperandType(function_name, dynamo_value.type) return dynamo_value
def execute(self, item): string_set_to_remove = self.get_action_value() assert isinstance(string_set_to_remove, DynamoType) if not string_set_to_remove.is_set(): raise IncorrectOperandType( self.operator, DDBTypeConversion.get_human_type(string_set_to_remove.type), ) string_set = self.get_item_at_end_of_path(item) assert isinstance(string_set, DynamoType) if string_set.type != string_set_to_remove.type: raise IncorrectDataType() # String set is currently implemented as a list string_set_list = string_set.value stringset_to_remove_list = string_set_to_remove.value for value in stringset_to_remove_list: try: string_set_list.remove(value) except (KeyError, ValueError): # DynamoDB does not mind if value is not present pass # DynamoDB does not support empty sets. If we've deleted # the last item in the set, we have to remove the attribute. if not string_set_list: element = self.get_element_to_action() container = self.get_item_before_end_of_path(item) container.pop(element.get_attribute_name())
def get_subtraction(cls, left_operand, right_operand): """ Args: left_operand(DynamoType): right_operand(DynamoType): Returns: DDBTypedValue: """ try: return DDBTypedValue(left_operand - right_operand) except TypeError: raise IncorrectOperandType("-", left_operand.type)
def execute(self, item): string_set_to_remove = self.get_action_value() assert isinstance(string_set_to_remove, DynamoType) if not string_set_to_remove.is_set(): raise IncorrectOperandType( self.operator, DDBTypeConversion.get_human_type(string_set_to_remove.type), ) string_set = self.get_item_at_end_of_path(item) assert isinstance(string_set, DynamoType) if string_set.type != string_set_to_remove.type: raise IncorrectDataType() # String set is currently implemented as a list string_set_list = string_set.value stringset_to_remove_list = string_set_to_remove.value for value in stringset_to_remove_list: try: string_set_list.remove(value) except (KeyError, ValueError): # DynamoDB does not mind if value is not present pass # DynamoDB does not support empty sets. If we've deleted # the last item in the set, we have to remove the attribute. if not string_set_list: element = self.get_element_to_action() if isinstance(element, ExpressionAttributeName): attribute_name = self.expression_attribute_names[ element.get_attribute_name_placeholder() ] elif isinstance(element, ExpressionAttribute): attribute_name = element.get_attribute_name() else: raise NotImplementedError( "Moto does not support deleting {t} yet".format(t=type(element)) ) container = self.get_item_before_end_of_path(item) del container[attribute_name]
def execute(self, item): string_set_to_remove = self.get_action_value() assert isinstance(string_set_to_remove, DynamoType) if not string_set_to_remove.is_set(): raise IncorrectOperandType( self.operator, DDBTypeConversion.get_human_type(string_set_to_remove.type), ) string_set = self.get_item_at_end_of_path(item) assert isinstance(string_set, DynamoType) if string_set.type != string_set_to_remove.type: raise IncorrectDataType() # String set is currently implemented as a list string_set_list = string_set.value stringset_to_remove_list = string_set_to_remove.value for value in stringset_to_remove_list: try: string_set_list.remove(value) except (KeyError, ValueError): # DynamoDB does not mind if value is not present pass