blob: 2ff3399b550f3e8206352ed59fb97fd8d9f18f16 [file] [log] [blame]
/*
* Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
// Contributors:
// Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.internal.jpa.parsing;
import org.eclipse.persistence.exceptions.JPQLException;
/**
* INTERNAL:
* EqualsAssignmentNode is implemented to distinguish nodes that hold updates in an update
* query from other BinaryOperatorNodes
*/
public class EqualsAssignmentNode extends BinaryOperatorNode {
/**
* INTERNAL
* Validate the current node and calculates its type.
*/
@Override
public void validate(ParseTreeContext context) {
// look for any field access that is not qualified with an variable
super.validate(context);
validateTarget(left, context);
}
/** */
private void validateTarget(Node node, ParseTreeContext context) {
if (node.isDotNode()) {
TypeHelper typeHelper = context.getTypeHelper();
Node path = node.getLeft();
Object type = path.getType();
AttributeNode attributeNode = (AttributeNode)node.getRight();
String attribute = attributeNode.getAttributeName();
if (typeHelper.isSingleValuedRelationship(type, attribute) ||
typeHelper.isSimpleStateAttribute(type, attribute)) {
validateNavigation(path, context);
} else {
throw JPQLException.invalidSetClauseTarget(
context.getQueryInfo(), attributeNode.getLine(),
attributeNode.getColumn(), path.getAsString(), attribute);
}
}
}
/** */
private void validateNavigation(Node qualifier, ParseTreeContext context) {
if (qualifier.isDotNode()) {
TypeHelper typeHelper = context.getTypeHelper();
Node left = qualifier.getLeft();
AttributeNode attributeNode = (AttributeNode)qualifier.getRight();
String attribute = attributeNode.getAttributeName();
Object type = left.getType();
if (!typeHelper.isEmbeddedAttribute(type, attribute)) {
throw JPQLException.invalidSetClauseNavigation(
context.getQueryInfo(), attributeNode.getLine(),
attributeNode.getColumn(), qualifier.getAsString(), attribute);
}
validateNavigation(left, context);
}
}
}