/* * Copyright 2015-2023 Amazon Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at: * * http://aws.amazon.com/apache2.0 * * 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 com.amazonaws.services.dynamodbv2.xspec; import static com.amazonaws.services.dynamodbv2.xspec.ExpressionSpecBuilder.attribute_exists; import static com.amazonaws.services.dynamodbv2.xspec.ExpressionSpecBuilder.attribute_not_exists; import com.amazonaws.annotation.Immutable; import com.amazonaws.annotation.Beta; /** * A path operand used in building DynamooDB expressions such as update * expressions and condition (aka filter) expressions. In general, a path * operand refers to an attribute of some specific type in DynamoDB. *
* Use {@link ExpressionSpecBuilder#S(String)},
* {@link ExpressionSpecBuilder#N(String)}, etc. to instantiate path operands to
* refer to attributes of specific data types. You can also use
* {@link ExpressionSpecBuilder#attribute(String)} to instantiate a path operand
* with an unspecified data type.
*
* @see ExpressionSpecBuilder
*/
@Beta
@Immutable
public class PathOperand extends Operand {
private final Path path;
private final String pathString; // This is a performance optimization; not strictly necessary.
/**
* Constructs a path operand for building expressions.
*
* @param path
* a document path in which nested elements are assumed to be
* delimited by either "." or array indexing such as "[1]".
*/
PathOperand(String path) {
this.path = new Path(path);
this.pathString = path;
}
@Override
String asSubstituted(SubstitutionContext context) {
return path.asSubstituted(context);
}
/**
* Returns a function condition (that evaluates to true if the attribute referred
* to by this path operand exists) for building condition expression.
*/
public final FunctionCondition exists() {
return attribute_exists(this);
}
/**
* Returns a function condition (that evaluates to true if the attribute referred
* to by this path operand does not exist) for building condition
* expression.
*/
public final FunctionCondition notExists() {
return attribute_not_exists(this);
}
/**
* Returns a RemoveAction
for removing the attribute referred
* to by this path operand from an item; used for building update
* expression.
*/
public final RemoveAction remove() {
return new RemoveAction(this);
}
/**
* Returns the path of this path operand as a string.
*/
final String getPath() {
return pathString;
}
@Override
public final String toString() {
return pathString;
}
@Override
public final int hashCode() {
return pathString.hashCode();
}
/**
* Returns true if the given object is a path operand with the same path as
* that of the current path operand; false otherwise.
*/
@Override
public final boolean equals(Object o) {
if (!(o instanceof PathOperand))
return false;
PathOperand that = (PathOperand)o;
return this.getPath().equals(that.getPath());
}
}