/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
*/
package org.hibernate.query.sqm.tree.expression.domain;
import org.hibernate.persister.common.spi.Navigable;
import org.hibernate.persister.queryable.spi.EntityValuedExpressableType;
import org.hibernate.query.spi.NavigablePath;
import org.hibernate.query.sqm.consume.spi.SemanticQueryWalker;
import org.hibernate.query.sqm.domain.SqmExpressableTypeEntity;
import org.hibernate.query.sqm.tree.from.SqmFrom;
import org.jboss.logging.Logger;
/**
* @author Steve Ebersole
*/
public class SqmEntityReference extends AbstractSqmNavigableReference
implements SqmNavigableReference, SqmNavigableSourceReference, SqmEntityTypedReference {
private static final Logger log = Logger.getLogger( SqmEntityReference.class );
private final SqmNavigableSourceReference sourceBinding;
private final EntityValuedExpressableType entityReference;
private NavigablePath propertyPath;
private SqmFrom exportedFromElement;
public SqmEntityReference(EntityValuedExpressableType entityReference) {
this.entityReference = entityReference;
this.sourceBinding = null;
this.propertyPath = new NavigablePath( null, entityReference.getEntityName() );
}
public SqmEntityReference(SqmNavigableSourceReference sourceBinding, EntityValuedExpressableType entityReference) {
this.sourceBinding = sourceBinding;
this.entityReference = entityReference;
this.propertyPath = new NavigablePath( sourceBinding.getNavigablePath(), entityReference.getEntityName() );
}
@Override
public SqmFrom getExportedFromElement() {
return exportedFromElement;
}
@Override
public void injectExportedFromElement(SqmFrom sqmFrom) {
log.debugf(
"Injecting SqmFrom [%s] into EntityBindingImpl [%s], was [%s]",
sqmFrom,
this,
this.exportedFromElement
);
exportedFromElement = sqmFrom;
propertyPath = new NavigablePath( null, entityReference.getEntityName() + "(" + sqmFrom.getIdentificationVariable() + ")" );
}
@Override
public SqmNavigableSourceReference getSourceReference() {
return sourceBinding;
}
@Override
public EntityValuedExpressableType getReferencedNavigable() {
return entityReference;
}
@Override
public NavigablePath getNavigablePath() {
return propertyPath;
}
@Override
public EntityValuedExpressableType getExpressionType() {
return entityReference;
}
@Override
public EntityValuedExpressableType getInferableType() {
return getExpressionType();
}
@Override
public <T> T accept(SemanticQueryWalker<T> walker) {
return (T) exportedFromElement.getBinding();
// return exportedFromElement.accept( walker );
}
@Override
public String asLoggableText() {
return entityReference.asLoggableText();
}
}