/******************************************************************************* * Copyright (c) 1998, 2015 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 v1.0 and Eclipse Distribution License v. 1.0 * which accompanies this distribution. * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html * and the Eclipse Distribution License is available at * http://www.eclipse.org/org/documents/edl-v10.php. * * Contributors: * Oracle - initial API and implementation from Oracle TopLink ******************************************************************************/ package org.eclipse.persistence.internal.expressions; import org.eclipse.persistence.descriptors.ClassDescriptor; import org.eclipse.persistence.exceptions.QueryException; import org.eclipse.persistence.expressions.*; import org.eclipse.persistence.internal.helper.DatabaseField; import org.eclipse.persistence.internal.queries.ReportItem; import org.eclipse.persistence.internal.sessions.AbstractSession; import org.eclipse.persistence.mappings.querykeys.DirectQueryKey; import org.eclipse.persistence.mappings.querykeys.QueryKey; import org.eclipse.persistence.queries.ReportQuery; /** * Represents an alias to a item selected by a from clause sub-select. */ public class FromAliasExpression extends QueryKeyExpression { protected ReportItem item; protected ClassDescriptor containingDescriptor; public FromAliasExpression() { super(); } public FromAliasExpression(String name, Expression base) { super(name, base); } /** * INTERNAL: * Used for debug printing. */ @Override public String descriptionOfNodeType() { return "From Alias"; } /** * INTERNAL: * If a descriptor cannot be found, then return null. */ @Override public QueryKey getQueryKeyOrNull() { if (!hasQueryKey) { return null; } if (getContainingDescriptor() == null) { // Assign an artificial query key to represent the alias. DirectQueryKey alias = new DirectQueryKey(); alias.setField(new DatabaseField(this.name)); ReportQuery subQuery = ((FromSubSelectExpression)getBaseExpression()).getSubSelect().getSubQuery(); alias.setDescriptor(subQuery.getDescriptor()); this.queryKey = alias; return alias; } return super.getQueryKeyOrNull(); } /** * INTERNAL: * If the alias is for a query key item, then return its descriptor. * If it is for a function, then it has no descriptor. */ @Override public ClassDescriptor getContainingDescriptor() { AbstractSession session = getBuilder().getSession(); if (this.containingDescriptor == null) { Expression expression = getItem().getAttributeExpression(); if (expression.isQueryKeyExpression()) { // Need to ensure expression has a session before getting its descriptor. if (expression.getBuilder().getSession() == null) { expression.getBuilder().setSession(session); } this.containingDescriptor = ((QueryKeyExpression)expression).getContainingDescriptor(); return this.containingDescriptor; } return null; } return containingDescriptor; } /** * INTERNAL: * Return the report item that this is an alias for. */ public ReportItem getItem() { if (this.item == null) { ReportQuery subQuery = ((FromSubSelectExpression)getBaseExpression()).getSubSelect().getSubQuery(); this.item = subQuery.getItem(this.name); if (this.item == null) { throw QueryException.invalidQueryKeyInExpression(this.name); } } return this.item; } }