/* * 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.sqm.test.domain; import java.util.Set; import java.util.stream.Collectors; import org.hibernate.orm.persister.entity.spi.EntityPersister; import org.hibernate.query.sqm.domain.SqmExpressableTypeEntity; import org.hibernate.query.sqm.domain.SqmExpressableTypeEntityPolymorphicEntity; import org.hibernate.query.sqm.domain.SqmNavigable; import org.hibernate.query.sqm.domain.SqmNavigableSource; import org.hibernate.query.sqm.domain.type.SqmDomainTypeEntity; /** * @author Steve Ebersole */ public class PolymorphicEntityReferenceImpl implements SqmExpressableTypeEntityPolymorphicEntity { private final String requestedName; private Set<EntityPersister> implementors; public PolymorphicEntityReferenceImpl(String requestedName, Set<EntityPersister> implementors) { this.requestedName = requestedName; this.implementors = implementors; } @Override public Set<SqmExpressableTypeEntity> getImplementors() { return implementors.stream().collect( Collectors.toSet() ); } public void addImplementor(EntityPersister implementor) { implementors.add( implementor ); } @Override public SqmDomainTypeEntity getExportedDomainType() { return null; } @Override public SqmNavigable findNavigable(String navigableName) { // only return navigables that all of the implementors define SqmNavigable sqmNavigable = null; for ( EntityPersister implementor : implementors ) { final SqmNavigable current = implementor.findNavigable( navigableName ); if ( current == null ) { return null; } if ( sqmNavigable == null ) { sqmNavigable = current; } } return sqmNavigable; } @Override public String asLoggableText() { return "PolymorphicEntityReference( " + requestedName + ")"; } @Override public String getEntityName() { return requestedName; } @Override public SqmNavigableSource getSource() { return null; } @Override public String getNavigableName() { return getEntityName(); } }