All Downloads are FREE. Search and download functionalities are using the official Maven repository.

software.amazon.awssdk.enhanced.dynamodb.update.UpdateExpression Maven / Gradle / Ivy

/*
 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License").
 * You may not use this file except in compliance with the License.
 * A copy of the License is located at
 *
 *  http://aws.amazon.com/apache2.0
 *
 * or in the "license" file accompanying this file. This file is distributed
 * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
 * express or implied. See the License for the specific language governing
 * permissions and limitations under the License.
 */

package software.amazon.awssdk.enhanced.dynamodb.update;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import software.amazon.awssdk.annotations.SdkPublicApi;

/**
 * Contains sets of {@link UpdateAction} that represent the four DynamoDB update actions: SET, ADD, REMOVE and DELETE.
 * 

* Use this class to build an immutable UpdateExpression with one or more UpdateAction. An UpdateExpression may be merged * with another. When two UpdateExpression are merged, the actions of each group of UpdateAction, should they exist, are * combined; all SET actions from each expression are concatenated, all REMOVE actions etc. *

* DynamoDb Enhanced will convert the UpdateExpression to a format readable by DynamoDb, *

* Example:- *

 * {@code
 * RemoveUpdateAction removeAction = ...
 * SetUpdateAction setAction = ...
 * UpdateExpression.builder()
 *                 .addAction(removeAction)
 *                 .addAction(setAction)
 *                 .build();
 * }
 * 
* * See respective subtype of {@link UpdateAction}, for example {@link SetAction}, for details on creating that action. */ @SdkPublicApi public final class UpdateExpression { private final List removeActions; private final List setActions; private final List deleteActions; private final List addActions; private UpdateExpression(Builder builder) { this.removeActions = builder.removeActions; this.setActions = builder.setActions; this.deleteActions = builder.deleteActions; this.addActions = builder.addActions; } /** * Constructs a new builder for {@link UpdateExpression}. * * @return a new builder. */ public static Builder builder() { return new Builder(); } public List removeActions() { return Collections.unmodifiableList(new ArrayList<>(removeActions)); } public List setActions() { return Collections.unmodifiableList(new ArrayList<>(setActions)); } public List deleteActions() { return Collections.unmodifiableList(new ArrayList<>(deleteActions)); } public List addActions() { return Collections.unmodifiableList(new ArrayList<>(addActions)); } /** * Merges two UpdateExpression, returning a new */ public static UpdateExpression mergeExpressions(UpdateExpression expression1, UpdateExpression expression2) { if (expression1 == null) { return expression2; } if (expression2 == null) { return expression1; } Builder builder = builder(); builder.removeActions = Stream.concat(expression1.removeActions.stream(), expression2.removeActions.stream()).collect(Collectors.toList()); builder.setActions = Stream.concat(expression1.setActions.stream(), expression2.setActions.stream()).collect(Collectors.toList()); builder.deleteActions = Stream.concat(expression1.deleteActions.stream(), expression2.deleteActions.stream()).collect(Collectors.toList()); builder.addActions = Stream.concat(expression1.addActions.stream(), expression2.addActions.stream()).collect(Collectors.toList()); return builder.build(); } @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } UpdateExpression that = (UpdateExpression) o; if (removeActions != null ? ! removeActions.equals(that.removeActions) : that.removeActions != null) { return false; } if (setActions != null ? ! setActions.equals(that.setActions) : that.setActions != null) { return false; } if (deleteActions != null ? ! deleteActions.equals(that.deleteActions) : that.deleteActions != null) { return false; } return addActions != null ? addActions.equals(that.addActions) : that.addActions == null; } @Override public int hashCode() { int result = removeActions != null ? removeActions.hashCode() : 0; result = 31 * result + (setActions != null ? setActions.hashCode() : 0); result = 31 * result + (deleteActions != null ? deleteActions.hashCode() : 0); result = 31 * result + (addActions != null ? addActions.hashCode() : 0); return result; } /** * A builder for {@link UpdateExpression} */ public static final class Builder { private List removeActions = new ArrayList<>(); private List setActions = new ArrayList<>(); private List deleteActions = new ArrayList<>(); private List addActions = new ArrayList<>(); private Builder() { } /** * Add an action of type {@link RemoveAction} */ public Builder addAction(RemoveAction action) { removeActions.add(action); return this; } /** * Add an action of type {@link SetAction} */ public Builder addAction(SetAction action) { setActions.add(action); return this; } /** * Add an action of type {@link DeleteAction} */ public Builder addAction(DeleteAction action) { deleteActions.add(action); return this; } /** * Add an action of type {@link AddAction} */ public Builder addAction(AddAction action) { addActions.add(action); return this; } /** * Adds a list of {@link UpdateAction} of any subtype to the builder, overwriting any previous values. */ public Builder actions(List actions) { replaceActions(actions); return this; } /** * Adds a list of {@link UpdateAction} of any subtype to the builder, overwriting any previous values. */ public Builder actions(UpdateAction... actions) { actions(Arrays.asList(actions)); return this; } /** * Builds an {@link UpdateExpression} based on the values stored in this builder. */ public UpdateExpression build() { return new UpdateExpression(this); } private void replaceActions(List actions) { if (actions != null) { this.removeActions = new ArrayList<>(); this.setActions = new ArrayList<>(); this.deleteActions = new ArrayList<>(); this.addActions = new ArrayList<>(); actions.forEach(this::assignAction); } } private void assignAction(UpdateAction action) { if (action instanceof RemoveAction) { addAction((RemoveAction) action); } else if (action instanceof SetAction) { addAction((SetAction) action); } else if (action instanceof DeleteAction) { addAction((DeleteAction) action); } else if (action instanceof AddAction) { addAction((AddAction) action); } else { throw new IllegalArgumentException( String.format("Do not recognize UpdateAction: %s", action.getClass())); } } } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy