| /* |
| * Copyright (c) 2011, 2021 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 |
| // |
| package org.eclipse.persistence.jpa.jpql.tools.model.query; |
| |
| import org.eclipse.persistence.jpa.jpql.tools.spi.IEntity; |
| import org.eclipse.persistence.jpa.jpql.tools.spi.IManagedType; |
| |
| /** |
| * Range variable declarations allow the developer to designate a "root" for objects which may not |
| * be reachable by navigation. In order to select values by comparing more than one instance of an |
| * entity abstract schema type, more than one identification variable ranging over the abstract |
| * schema type is needed in the <code><b>FROM</b></code> clause. |
| * |
| * <div><p><b>BNF:</b> <code>range_variable_declaration ::= abstract_schema_name [AS] identification_variable</code></p></div> |
| * |
| * @see org.eclipse.persistence.jpa.jpql.parser.RangeVariableDeclaration RangeVariableDeclaration |
| * |
| * @version 2.4 |
| * @since 2.4 |
| * @author Pascal Filion |
| */ |
| public class RangeVariableDeclarationStateObject extends AbstractRangeVariableDeclarationStateObject { |
| |
| /** |
| * Creates a new <code>RangeVariableDeclarationStateObject</code>. |
| * |
| * @param parent The parent of this state object, which cannot be <code>null</code> |
| * @exception NullPointerException The given parent cannot be <code>null</code> |
| */ |
| public RangeVariableDeclarationStateObject(AbstractModifyClauseStateObject parent) { |
| super(parent); |
| setIdentificationVariableOptional(true); |
| } |
| |
| /** |
| * Creates a new <code>RangeVariableDeclarationStateObject</code>. |
| * |
| * @param parent The parent of this state object, which cannot be <code>null</code> |
| * @exception NullPointerException The given parent cannot be <code>null</code> |
| */ |
| public RangeVariableDeclarationStateObject(IdentificationVariableDeclarationStateObject parent) { |
| super(parent); |
| } |
| |
| /** |
| * Creates a new <code>RangeVariableDeclarationStateObject</code>. |
| * |
| * @param parent The parent of this state object, which cannot be <code>null</code> |
| * @param entityName The name of the abstract schema, which is the name of the entity |
| * @exception NullPointerException The given parent cannot be <code>null</code> |
| */ |
| public RangeVariableDeclarationStateObject(IdentificationVariableDeclarationStateObject parent, |
| String entityName) { |
| |
| super(parent, entityName); |
| } |
| |
| @Override |
| public void accept(StateObjectVisitor visitor) { |
| visitor.visit(this); |
| } |
| |
| @Override |
| public RangeVariableDeclarationStateObject addAs() { |
| return (RangeVariableDeclarationStateObject) super.addAs(); |
| } |
| |
| @Override |
| protected StateObject buildRootStateObject() { |
| return new AbstractSchemaNameStateObject(this); |
| } |
| |
| /** |
| * Returns the actual {@link IEntity} that has the abstract schema name. |
| * |
| * @return The actual {@link IEntity} or <code>null</code> if no entity exists |
| */ |
| public IEntity getEntity() { |
| return getRootStateObject().getEntity(); |
| } |
| |
| /** |
| * Returns the abstract schema name. |
| * |
| * @return The name of the abstract schema type for which the identification variable is ranging over |
| */ |
| public String getEntityName() { |
| return getRootStateObject().getText(); |
| } |
| |
| @Override |
| public IManagedType getManagedType(StateObject stateObject) { |
| |
| if (getIdentificationVariableStateObject().isEquivalent(stateObject)) { |
| return getRootStateObject().getEntity(); |
| } |
| |
| return null; |
| } |
| |
| @Override |
| public String getRootPath() { |
| return getEntityName(); |
| } |
| |
| @Override |
| public AbstractSchemaNameStateObject getRootStateObject() { |
| return (AbstractSchemaNameStateObject) super.getRootStateObject(); |
| } |
| |
| /** |
| * Sets the abstract schema name to the given value. |
| * |
| * @param entity The {@link IEntity} that this clause will range over |
| */ |
| public void setDeclaration(IEntity entity) { |
| setEntity(entity); |
| setIdentificationVariable(null); |
| } |
| |
| /** |
| * Sets the abstract schema name to the given value and the identification variable that will |
| * range over it. |
| * |
| * @param entity The {@link IEntity} that this clause will range over |
| * @param identificationVariable The new identification variable |
| */ |
| public void setDeclaration(IEntity entity, String identificationVariable) { |
| setEntity(entity); |
| setIdentificationVariable(identificationVariable); |
| } |
| |
| /** |
| * Sets the abstract schema name to the given value and the identification variable that will |
| * range over it. |
| * |
| * @param entityName The name of the entity name |
| * @param identificationVariable The new identification variable |
| */ |
| public void setDeclaration(String entityName, String identificationVariable) { |
| setEntityName(entityName); |
| setIdentificationVariable(identificationVariable); |
| } |
| |
| /** |
| * Sets the actual {@link IEntity} and updates the abstract schema name. |
| * |
| * @param entity The {@link IEntity} that the clause will range over |
| */ |
| public void setEntity(IEntity entity) { |
| getRootStateObject().setEntity(entity); |
| } |
| |
| /** |
| * Sets the name of the abstract schema, which is the name of the entity. |
| * |
| * @param abstractSchemaName The name of the abstract schema, which is the name of the entity |
| */ |
| public void setEntityName(String abstractSchemaName) { |
| getRootStateObject().setText(abstractSchemaName); |
| } |
| |
| @Override |
| public void setRootPath(String root) { |
| setEntityName(root); |
| } |
| } |