/*
* 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.test.loadplans.plans;
import org.hibernate.LockMode;
import org.hibernate.LockOptions;
import org.hibernate.engine.spi.LoadQueryInfluencers;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.internal.util.StringHelper;
import org.hibernate.loader.JoinWalker;
import org.hibernate.loader.entity.EntityJoinWalker;
import org.hibernate.loader.plan.build.internal.FetchStyleLoadPlanBuildingAssociationVisitationStrategy;
import org.hibernate.loader.plan.build.spi.MetamodelDrivenLoadPlanBuilder;
import org.hibernate.loader.plan.exec.internal.BatchingLoadQueryDetailsFactory;
import org.hibernate.loader.plan.exec.query.internal.QueryBuildingParametersImpl;
import org.hibernate.loader.plan.exec.query.spi.QueryBuildingParameters;
import org.hibernate.loader.plan.exec.spi.LoadQueryDetails;
import org.hibernate.loader.plan.spi.LoadPlan;
import org.hibernate.persister.entity.OuterJoinLoadable;
/**
* Perform assertions based on a LoadPlan, specifically against the outputs/expectations of the legacy Loader approach.
* <p/>
* Mainly this is intended to be a transitory set of help since it is expected that Loader will go away replaced by
* LoadPlans, QueryBuilders and ResultSetProcessors. For now I want to make sure that the outputs (e.g., the SQL,
* the extraction aliases) are the same given the same input. That makes sure we have the best possibility of success
* in designing and implementing the "replacement parts".
*
* @author Steve Ebersole
*/
public class LoadPlanStructureAssertionHelper {
/**
* Singleton access to the helper
*/
public static final LoadPlanStructureAssertionHelper INSTANCE = new LoadPlanStructureAssertionHelper();
/**
* Performs a basic comparison. Builds a LoadPlan for the given persister and compares it against the
* expectations according to the Loader/Walker corollary.
*
* @param sf The SessionFactory
* @param persister The entity persister for which to build a LoadPlan and compare against the Loader/Walker
* expectations.
*/
public void performBasicComparison(SessionFactoryImplementor sf, OuterJoinLoadable persister) {
// todo : allow these to be passed in by tests?
final LoadQueryInfluencers influencers = LoadQueryInfluencers.NONE;
final LockMode lockMode = LockMode.NONE;
final int batchSize = 1;
// legacy Loader-based contracts...
final EntityJoinWalker walker = new EntityJoinWalker(
persister,
persister.getKeyColumnNames(),
batchSize,
lockMode,
sf,
influencers
);
// final EntityLoader loader = new EntityLoader( persister, lockMode, sf, influencers );
LoadPlan plan = buildLoadPlan( sf, persister, influencers, lockMode );
LoadQueryDetails details = BatchingLoadQueryDetailsFactory.INSTANCE.makeEntityLoadQueryDetails(
plan,
persister.getKeyColumnNames(),
new QueryBuildingParametersImpl(
influencers,
batchSize,
lockMode,
null
),
sf
);
compare( walker, details );
}
public LoadPlan buildLoadPlan(
SessionFactoryImplementor sf,
OuterJoinLoadable persister,
LoadQueryInfluencers influencers,
LockMode lockMode) {
FetchStyleLoadPlanBuildingAssociationVisitationStrategy strategy = new FetchStyleLoadPlanBuildingAssociationVisitationStrategy(
sf,
influencers,
lockMode
);
return MetamodelDrivenLoadPlanBuilder.buildRootEntityLoadPlan( strategy, persister );
}
public LoadPlan buildLoadPlan(SessionFactoryImplementor sf, OuterJoinLoadable persister) {
return buildLoadPlan( sf, persister, LoadQueryInfluencers.NONE, LockMode.NONE );
}
private void compare(JoinWalker walker, LoadQueryDetails details) {
System.out.println( "------ SQL -----------------------------------------------------------------" );
System.out.println( "WALKER : " + walker.getSQLString() );
System.out.println( "LOAD-PLAN : " + details.getSqlStatement() );
System.out.println( "----------------------------------------------------------------------------" );
System.out.println( );
System.out.println( "------ SUFFIXES ------------------------------------------------------------" );
System.out.println( "WALKER : " + StringHelper.join( ", ", walker.getSuffixes() ) + " : "
+ StringHelper.join( ", ", walker.getCollectionSuffixes() ) );
System.out.println( "----------------------------------------------------------------------------" );
System.out.println( );
}
}