Added Initializer de-duplication handling

This commit is contained in:
Steve Ebersole 2020-05-28 15:56:20 -05:00
parent 4074c39264
commit 26f6c9271a
73 changed files with 794 additions and 1280 deletions

View File

@ -34,6 +34,5 @@ CollectionInitializer produceInitializer(
LockMode lockMode,
DomainResultAssembler keyContainerAssembler,
DomainResultAssembler keyCollectionAssembler,
Consumer<Initializer> initializerConsumer,
AssemblerCreationState creationState);
}

View File

@ -21,6 +21,7 @@
import org.hibernate.internal.CoreMessageLogger;
import org.hibernate.persister.collection.CollectionPersister;
import org.hibernate.pretty.MessageHelper;
import org.hibernate.sql.results.internal.ResultsHelper;
import org.hibernate.stat.spi.StatisticsImplementor;
/**
@ -94,7 +95,7 @@ private void handlePotentiallyEmptyCollection(
CollectionPersister ceLoadedPersister) {
if ( !collection.wasInitialized() ) {
collection.initializeEmptyCollection( ceLoadedPersister );
org.hibernate.sql.results.internal.Helper.finalizeCollectionLoading(
ResultsHelper.finalizeCollectionLoading(
source.getPersistenceContext(),
ceLoadedPersister,
collection,

View File

@ -20,8 +20,8 @@
* @author Steve Ebersole
*/
public class LoggingHelper {
private static final String NULL = "<null>";
private static final String UNREFERENCED = "<unreferenced>";
public static final String NULL = "<null>";
public static final String UNREFERENCED = "<unreferenced>";
public static String toLoggableString(NavigableRole role) {
if ( role == null ) {

View File

@ -12,7 +12,6 @@
import java.util.function.Consumer;
import org.hibernate.LockMode;
import org.hibernate.NotYetImplementedFor6Exception;
import org.hibernate.engine.FetchStrategy;
import org.hibernate.engine.FetchTiming;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
@ -44,7 +43,6 @@
import org.hibernate.sql.results.graph.embeddable.EmbeddableValuedFetchable;
import org.hibernate.sql.results.graph.embeddable.internal.EmbeddableFetchImpl;
import org.hibernate.sql.results.graph.embeddable.internal.EmbeddableResultImpl;
import org.hibernate.type.CompositeType;
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
/**

View File

@ -402,9 +402,7 @@ public Fetch generateFetch(
null,
SqlAstJoinType.LEFT,
lockMode,
creationState.getSqlAliasBaseManager(),
creationState.getSqlAstCreationState().getSqlExpressionResolver(),
creationState.getSqlAstCreationState().getCreationContext()
creationState.getSqlAstCreationState()
);
return tableGroupJoin.getJoinedGroup();
}

View File

@ -26,6 +26,7 @@
import org.hibernate.property.access.spi.PropertyAccess;
import org.hibernate.query.NavigablePath;
import org.hibernate.sql.ast.SqlAstJoinType;
import org.hibernate.sql.ast.spi.FromClauseAccess;
import org.hibernate.sql.ast.spi.SqlAliasBase;
import org.hibernate.sql.ast.spi.SqlAliasBaseGenerator;
import org.hibernate.sql.ast.spi.SqlAliasStemHelper;
@ -273,35 +274,37 @@ public EntityFetch generateFetch(
String resultVariable,
DomainResultCreationState creationState) {
final SqlAstCreationState sqlAstCreationState = creationState.getSqlAstCreationState();
final TableGroup lhsTableGroup = sqlAstCreationState.getFromClauseAccess().getTableGroup(
final FromClauseAccess fromClauseAccess = sqlAstCreationState.getFromClauseAccess();
final TableGroup parentTableGroup = fromClauseAccess.getTableGroup(
fetchParent.getNavigablePath()
);
if ( fetchTiming == FetchTiming.IMMEDIATE && selected ) {
if ( sqlAstCreationState.getFromClauseAccess().findTableGroup( fetchablePath ) == null ) {
SqlAstJoinType sqlAstJoinType;
if ( isNullable ) {
sqlAstJoinType = SqlAstJoinType.LEFT;
}
else {
sqlAstJoinType = SqlAstJoinType.INNER;
}
final TableGroupJoin tableGroupJoin = createTableGroupJoin(
fetchablePath,
lhsTableGroup,
null,
sqlAstJoinType,
lockMode,
creationState.getSqlAliasBaseManager(),
creationState.getSqlAstCreationState().getSqlExpressionResolver(),
creationState.getSqlAstCreationState().getCreationContext()
);
fromClauseAccess.resolveTableGroup(
fetchablePath,
np -> {
final SqlAstJoinType sqlAstJoinType;
if ( isNullable ) {
sqlAstJoinType = SqlAstJoinType.LEFT;
}
else {
sqlAstJoinType = SqlAstJoinType.INNER;
}
sqlAstCreationState.getFromClauseAccess().registerTableGroup(
fetchablePath,
tableGroupJoin.getJoinedGroup()
);
}
final TableGroupJoin tableGroupJoin = createTableGroupJoin(
fetchablePath,
parentTableGroup,
null,
sqlAstJoinType,
lockMode,
creationState.getSqlAstCreationState()
);
return tableGroupJoin.getJoinedGroup();
}
);
return new EntityFetchJoinedImpl(
fetchParent,
@ -317,11 +320,11 @@ public EntityFetch generateFetch(
final DomainResult keyResult;
if ( referringPrimaryKey ) {
keyResult = foreignKeyDescriptor.createDomainResult( fetchablePath, lhsTableGroup, creationState );
keyResult = foreignKeyDescriptor.createDomainResult( fetchablePath, parentTableGroup, creationState );
}
else {
keyResult = ( (EntityPersister) getDeclaringType() ).getIdentifierMapping()
.createDomainResult( fetchablePath, lhsTableGroup, null, creationState );
.createDomainResult( fetchablePath, parentTableGroup, null, creationState );
}
assert !selected;

View File

@ -125,7 +125,7 @@ public String getIdentifierForTableGroup() {
@Override
public String toString() {
return getClass().getSimpleName() + "[" + fullPath + "]";
return fullPath;
}
@Override

View File

@ -610,8 +610,7 @@ private void consumeAttributeJoin(SqmAttributeJoin<?,?> sqmJoin, TableGroup lhsT
sqmJoin.getExplicitAlias(),
sqmJoin.getSqmJoinType().getCorrespondingSqlJoinType(),
determineLockMode( sqmJoin.getExplicitAlias() ),
sqlAliasBaseManager, getSqlExpressionResolver(),
creationContext
this
);
joinedTableGroup = joinedTableGroupJoin.getJoinedGroup();
@ -642,8 +641,7 @@ else if ( pathSource instanceof EmbeddedSqmPathSource ) {
sqmJoin.getExplicitAlias(),
sqmJoin.getSqmJoinType().getCorrespondingSqlJoinType(),
determineLockMode( sqmJoin.getExplicitAlias() ),
sqlAliasBaseManager, getSqlExpressionResolver(),
creationContext
this
);
joinedTableGroup = joinedTableGroupJoin.getJoinedGroup();
@ -684,9 +682,7 @@ sqlAliasBaseManager, getSqlExpressionResolver(),
sqmJoin.getExplicitAlias(),
sqmJoin.getSqmJoinType().getCorrespondingSqlJoinType(),
determineLockMode( sqmJoin.getExplicitAlias() ),
sqlAliasBaseManager,
getSqlExpressionResolver(),
creationContext
this
);
joinedTableGroup = joinedTableGroupJoin.getJoinedGroup();
@ -802,9 +798,7 @@ private void consumeImplicitJoins(SqmPath<?> sqmPath, TableGroup tableGroup) {
null,
tableGroup.isInnerJoinPossible() ? SqlAstJoinType.INNER : SqlAstJoinType.LEFT,
null,
sqlAliasBaseManager,
getSqlExpressionResolver(),
creationContext
this
);
fromClauseIndex.register( joinedPath, tableGroupJoin.getJoinedGroup() );

View File

@ -388,9 +388,7 @@ else if ( fetchDepth > maxDepth ) {
alias,
SqlAstJoinType.LEFT,
LockMode.NONE,
getSqlAliasBaseManager(),
getSqlExpressionResolver(),
getCreationContext()
this
);
return tableGroupJoin.getJoinedGroup();
}

View File

@ -6,67 +6,29 @@
*/
package org.hibernate.sql.ast;
import java.util.Locale;
import java.util.List;
import java.util.Set;
import org.hibernate.NotYetImplementedFor6Exception;
import org.hibernate.SortOrder;
import org.hibernate.query.sqm.tree.expression.Conversion;
import org.hibernate.sql.ast.spi.SqlSelection;
import org.hibernate.sql.ast.tree.SqlAstTreeLogger;
import org.hibernate.sql.ast.tree.Statement;
import org.hibernate.sql.ast.tree.delete.DeleteStatement;
import org.hibernate.sql.ast.tree.expression.Any;
import org.hibernate.sql.ast.tree.expression.BinaryArithmeticExpression;
import org.hibernate.sql.ast.tree.expression.CaseSearchedExpression;
import org.hibernate.sql.ast.tree.expression.CaseSimpleExpression;
import org.hibernate.sql.ast.tree.expression.CastTarget;
import org.hibernate.sql.ast.tree.expression.ColumnReference;
import org.hibernate.sql.ast.tree.expression.Distinct;
import org.hibernate.sql.ast.tree.expression.Duration;
import org.hibernate.sql.ast.tree.expression.DurationUnit;
import org.hibernate.sql.ast.tree.expression.EntityTypeLiteral;
import org.hibernate.sql.ast.tree.expression.Every;
import org.hibernate.sql.ast.tree.expression.ExtractUnit;
import org.hibernate.sql.ast.tree.expression.Format;
import org.hibernate.sql.ast.tree.expression.JdbcLiteral;
import org.hibernate.sql.ast.tree.expression.JdbcParameter;
import org.hibernate.sql.ast.tree.expression.QueryLiteral;
import org.hibernate.sql.ast.tree.expression.SelfRenderingExpression;
import org.hibernate.sql.ast.tree.expression.SqlSelectionExpression;
import org.hibernate.sql.ast.tree.expression.SqlTuple;
import org.hibernate.sql.ast.tree.expression.Star;
import org.hibernate.sql.ast.tree.expression.TrimSpecification;
import org.hibernate.sql.ast.tree.expression.UnaryOperation;
import org.hibernate.sql.ast.tree.from.FromClause;
import org.hibernate.sql.ast.tree.from.TableGroup;
import org.hibernate.sql.ast.tree.from.TableGroupJoin;
import org.hibernate.sql.ast.tree.from.TableReference;
import org.hibernate.sql.ast.tree.from.TableReferenceJoin;
import org.hibernate.sql.ast.tree.insert.InsertStatement;
import org.hibernate.sql.ast.tree.predicate.BetweenPredicate;
import org.hibernate.sql.ast.tree.predicate.ComparisonPredicate;
import org.hibernate.sql.ast.tree.predicate.ExistsPredicate;
import org.hibernate.sql.ast.tree.predicate.FilterPredicate;
import org.hibernate.sql.ast.tree.predicate.GroupedPredicate;
import org.hibernate.sql.ast.tree.predicate.InListPredicate;
import org.hibernate.sql.ast.tree.predicate.InSubQueryPredicate;
import org.hibernate.sql.ast.tree.predicate.Junction;
import org.hibernate.sql.ast.tree.predicate.LikePredicate;
import org.hibernate.sql.ast.tree.predicate.NegatedPredicate;
import org.hibernate.sql.ast.tree.predicate.NullnessPredicate;
import org.hibernate.sql.ast.tree.predicate.SelfRenderingPredicate;
import org.hibernate.sql.ast.tree.select.QuerySpec;
import org.hibernate.sql.ast.tree.select.SelectClause;
import org.hibernate.sql.ast.tree.select.SelectStatement;
import org.hibernate.sql.ast.tree.select.SortSpecification;
import org.hibernate.sql.ast.tree.update.Assignment;
import org.hibernate.sql.ast.tree.update.UpdateStatement;
/**
* Logs a debug representation of the SQL AST.
*
* NOTE : at the moment, we only render the from-elements
*
* @author Steve Ebersole
*/
public class SqlTreePrinter implements SqlAstWalker {
public static void print(Statement sqlAstStatement) {
public class SqlTreePrinter {
public static void logSqlAst(Statement sqlAstStatement) {
if ( ! SqlAstTreeLogger.DEBUG_ENABLED ) {
return;
}
@ -85,88 +47,37 @@ private SqlTreePrinter() {
private void visitStatement(Statement sqlAstStatement) {
if ( sqlAstStatement instanceof SelectStatement ) {
final SelectStatement selectStatement = (SelectStatement) sqlAstStatement;
logNode(
"select-statement",
() -> visitQuerySpec( ( (SelectStatement) sqlAstStatement ).getQuerySpec() )
"SelectStatement",
() -> visitFromClause( selectStatement.getQuerySpec().getFromClause() )
);
}
else if ( sqlAstStatement instanceof DeleteStatement ) {
final DeleteStatement deleteStatement = (DeleteStatement) sqlAstStatement;
logNode(
"delete-statement",
() -> {
logNode(
"target",
() -> logNode( deleteStatement.getTargetTable().toString() )
);
logNode(
"where",
() -> {
if ( deleteStatement.getRestriction() != null ) {
deleteStatement.getRestriction().accept( this );
}
}
);
}
"DeleteStatement",
() -> logWithIndentation(
"target : " + deleteStatement.getTargetTable().getTableExpression()
)
);
}
else if ( sqlAstStatement instanceof UpdateStatement ) {
final UpdateStatement updateStatement = (UpdateStatement) sqlAstStatement;
logNode(
"update-statement",
() -> {
logNode(
"target",
() -> logNode( updateStatement.getTargetTable().toString() )
);
logNode(
"set",
() -> {
for ( Assignment assignment : updateStatement.getAssignments() ) {
logNode(
"assignment",
() -> assignment.accept( this ),
true
);
}
}
);
logNode(
"where",
() -> {
if ( updateStatement.getRestriction() != null ) {
updateStatement.getRestriction().accept( this );
}
}
);
}
"UpdateStatement",
() -> logWithIndentation(
"target : " + updateStatement.getTargetTable().getTableExpression()
)
);
}
else if ( sqlAstStatement instanceof InsertStatement) {
final InsertStatement insertStatement = (InsertStatement) sqlAstStatement;
logNode(
"insert-select-statement",
() -> {
logNode(
"target",
() -> logNode( insertStatement.getTargetTable().toString() )
);
logNode(
"into",
() -> {
for ( ColumnReference spec : insertStatement.getTargetColumnReferences() ) {
logNode(
"target-column",
() -> spec.accept( this )
);
}
}
);
logNode(
"select",
() -> visitQuerySpec( insertStatement.getSourceSelectStatement() )
);
}
"InsertStatement",
() -> logWithIndentation(
"target : " + insertStatement.getTargetTable().getTableExpression()
)
);
}
else {
@ -174,16 +85,69 @@ else if ( sqlAstStatement instanceof InsertStatement) {
}
}
private void visitFromClause(FromClause fromClause) {
logNode(
"FromClause",
() -> fromClause.visitRoots( this::visitTableGroup )
);
}
private void visitTableGroup(TableGroup tableGroup) {
logNode(
toDisplayText( tableGroup ),
() -> logTableGroupDetails( tableGroup )
);
}
private String toDisplayText(TableGroup tableGroup) {
return tableGroup.getClass().getSimpleName() + " ("
+ tableGroup.getGroupAlias() + " : "
+ tableGroup.getNavigablePath()
+ ")";
}
private void logTableGroupDetails(TableGroup tableGroup) {
logWithIndentation(
"primaryTableReference : %s as %s",
tableGroup.getPrimaryTableReference().getTableExpression(),
tableGroup.getPrimaryTableReference().getIdentificationVariable()
);
final List<TableReferenceJoin> tableReferenceJoins = tableGroup.getTableReferenceJoins();
if ( ! tableReferenceJoins.isEmpty() ) {
logNode(
"TableReferenceJoins",
() -> {
for ( TableReferenceJoin join : tableReferenceJoins ) {
logWithIndentation(
"%s join %s as %s",
join.getJoinType().getText(),
join.getJoinedTableReference().getTableExpression(),
join.getJoinedTableReference().getIdentificationVariable()
);
}
}
);
}
final Set<TableGroupJoin> tableGroupJoins = tableGroup.getTableGroupJoins();
if ( ! tableGroupJoins.isEmpty() ) {
logNode(
"TableGroupJoins",
() -> tableGroup.visitTableGroupJoins( this::visitTableGroupJoin )
);
}
}
private void visitTableGroupJoin(TableGroupJoin tableGroupJoin) {
logNode(
tableGroupJoin.getJoinType().getText() + " join " + toDisplayText( tableGroupJoin.getJoinedGroup() ),
() -> logTableGroupDetails( tableGroupJoin.getJoinedGroup() )
);
}
private void logNode(String text) {
logWithIndentation( "-> [%s]", text );
}
private void logNode(String pattern, Object arg) {
logWithIndentation( "-> [" + String.format( pattern, arg ) + ']');
}
private void logNode(String pattern, Object arg, Object arg2) {
logWithIndentation( "-> [" + String.format( pattern, arg, arg2 ) + ']');
logWithIndentation( "%s", text );
}
private void logNode(String text, Runnable subTreeHandler) {
@ -191,7 +155,7 @@ private void logNode(String text, Runnable subTreeHandler) {
}
private void logNode(String text, Runnable subTreeHandler, boolean indentContinuation) {
logWithIndentation( "-> [%s]", text );
logWithIndentation( "%s {", text );
depth++;
try {
@ -210,7 +174,7 @@ private void logNode(String text, Runnable subTreeHandler, boolean indentContinu
}
depth--;
logWithIndentation( "<- [%s]", text );
logWithIndentation( "}", text );
}
private void logWithIndentation(Object line) {
@ -226,8 +190,8 @@ private void logWithIndentation(String pattern, Object arg1, Object arg2) {
logWithIndentation( String.format( pattern, arg1, arg2 ) );
}
private void logWithIndentation(String pattern, Object... args) {
logWithIndentation( String.format( pattern, args ) );
private void logWithIndentation(String pattern, Object arg1, Object arg2, Object arg3) {
logWithIndentation( String.format( pattern, arg1, arg2, arg3 ) );
}
private void pad(int depth) {
@ -236,532 +200,4 @@ private void pad(int depth) {
}
}
@Override
public void visitAssignment(Assignment assignment) {
}
@Override
public void visitQuerySpec(QuerySpec querySpec) {
logNode(
"query-spec",
() -> {
visitSelectClause( querySpec.getSelectClause() );
visitFromClause( querySpec.getFromClause() );
if ( querySpec.getWhereClauseRestrictions() != null && ! querySpec.getWhereClauseRestrictions().isEmpty() ) {
logNode(
"where",
() -> querySpec.getWhereClauseRestrictions().accept( this )
);
}
// todo (6.0) : group-by
// todo (6.0) : having
if ( ! querySpec.getSortSpecifications().isEmpty() ) {
logNode(
"order-by",
() -> {
for ( SortSpecification sortSpecification : querySpec.getSortSpecifications() ) {
visitSortSpecification( sortSpecification );
}
}
);
}
if ( querySpec.getLimitClauseExpression() != null ) {
logNode(
"limit",
() -> querySpec.getLimitClauseExpression().accept( this )
);
}
if ( querySpec.getOffsetClauseExpression() != null ) {
logNode(
"offset",
() -> querySpec.getOffsetClauseExpression().accept( this )
);
}
}
);
}
@Override
public void visitSortSpecification(SortSpecification sortSpecification) {
logNode(
"sort",
() -> {
sortSpecification.getSortExpression().accept( this );
logNode(
sortSpecification.getSortOrder() == null
? SortOrder.ASCENDING.name()
: sortSpecification.getSortOrder().name()
);
}
);
}
@Override
public void visitLimitOffsetClause(QuerySpec querySpec) {
throw new UnsupportedOperationException( "Unexpected call to #visitLimitOffsetClause" );
}
@Override
public void visitSelectClause(SelectClause selectClause) {
logNode(
"select",
() -> {
for ( SqlSelection sqlSelection : selectClause.getSqlSelections() ) {
visitSqlSelection( sqlSelection );
}
}
);
}
@Override
public void visitSqlSelection(SqlSelection sqlSelection) {
logWithIndentation( "selection - " + sqlSelection );
}
@Override
public void visitFromClause(FromClause fromClause) {
logNode(
"from",
() -> fromClause.visitRoots( this::visitTableGroup )
);
}
@Override
public void visitTableGroup(TableGroup tableGroup) {
logNode(
"table-group",
() -> {
visitTableReference( tableGroup.getPrimaryTableReference() );
for ( TableReferenceJoin join : tableGroup.getTableReferenceJoins() ) {
visitTableReferenceJoin( join );
}
tableGroup.visitTableGroupJoins( this::visitTableGroupJoin );
}
);
}
@Override
public void visitTableGroupJoin(TableGroupJoin tableGroupJoin) {
logNode(
"table-group-join",
() -> {
visitTableGroup( tableGroupJoin.getJoinedGroup() );
logNode( tableGroupJoin.getJoinType().getText() );
logNode(
"on",
() -> tableGroupJoin.getPredicate().accept( this )
);
}
);
}
@Override
public void visitTableReference(TableReference tableReference) {
logNode( tableReference.getTableExpression() + " as " + tableReference.getIdentificationVariable() );
}
@Override
public void visitTableReferenceJoin(TableReferenceJoin tableReferenceJoin) {
logNode(
"join",
() -> {
visitTableReference( tableReferenceJoin.getJoinedTableReference() );
logNode( tableReferenceJoin.getJoinType().getText() );
logNode(
"on",
() -> tableReferenceJoin.getJoinPredicate().accept( this )
);
}
);
}
@Override
public void visitColumnReference(ColumnReference columnReference) {
logNode( "{%s}.{%s}", columnReference.getQualifier(), columnReference.getColumnExpression() );
}
@Override
public void visitExtractUnit(ExtractUnit extractUnit) {
logNode( extractUnit.getUnit().toString() );
}
@Override
public void visitFormat(Format format) {
logNode( format.getFormat() );
}
@Override
public void visitDistinct(Distinct distinct) {
logNode( "{distinct}" );
}
@Override
public void visitStar(Star star) {
logNode( "{*}" );
}
@Override
public void visitTrimSpecification(TrimSpecification trimSpecification) {
logNode( "{" + trimSpecification.getSpecification().toSqlText() + "}" );
}
@Override
public void visitCastTarget(CastTarget castTarget) {
logNode( "`" + castTarget.getExpressionType().getJdbcMapping().getSqlTypeDescriptor() + "`" );
}
@Override
public void visitBinaryArithmeticExpression(BinaryArithmeticExpression expression) {
logNode(
expression.getOperator().getOperatorSqlTextString(),
() -> {
expression.getLeftHandOperand().accept( this );
expression.getRightHandOperand().accept( this );
}
);
}
@Override
public void visitSqlSelectionExpression(SqlSelectionExpression expression) {
logNode( "selection-reference (%s)", expression.getSelection().getJdbcResultSetIndex() );
}
@Override
public void visitEntityTypeLiteral(EntityTypeLiteral expression) {
}
@Override
public void visitTuple(SqlTuple tuple) {
logNode(
"tuple",
() -> tuple.getExpressions().forEach( expr -> expr.accept( this ) )
);
}
@Override
public void visitParameter(JdbcParameter jdbcParameter) {
logNode( "parameter" );
}
@Override
public void visitCaseSearchedExpression(CaseSearchedExpression caseSearchedExpression) {
throw new NotYetImplementedFor6Exception();
}
@Override
public void visitCaseSimpleExpression(CaseSimpleExpression caseSimpleExpression) {
throw new NotYetImplementedFor6Exception();
}
@Override
public void visitAny(Any any) {
}
@Override
public void visitEvery(Every every) {
}
// @Override
// public void visitCoalesceFunction(CoalesceFunction coalesceExpression) {
// throw new NotYetImplementedFor6Exception();
// }
//
// @Override
// public void visitNamedParameter(NamedParameter namedParameter) {
// logNode( "named-param (%s)", namedParameter.getName() );
// }
//
// @Override
// public void visitGenericParameter(GenericParameter parameter) {
// logNode( "generic-param" );
// }
//
// @Override
// public void visitPositionalParameter(PositionalParameter parameter) {
// logNode( "positional-param (%s)", parameter.getPosition() );
// }
@Override
public void visitJdbcLiteral(JdbcLiteral jdbcLiteral) {
logNode( "literal (" + jdbcLiteral.getLiteralValue() + ')' );
}
@Override
public void visitQueryLiteral(QueryLiteral queryLiteral) {
logNode( "literal (" + queryLiteral.getLiteralValue() + ')' );
}
@Override
public void visitUnaryOperationExpression(UnaryOperation operation) {
logNode(
operation.getOperator().name().toLowerCase( Locale.ROOT ),
() -> operation.getOperand().accept( this )
);
}
@Override
public void visitBetweenPredicate(BetweenPredicate betweenPredicate) {
logNode(
"between",
() -> {
betweenPredicate.getExpression().accept( this );
betweenPredicate.getLowerBound().accept( this );
betweenPredicate.getUpperBound().accept( this );
}
);
}
@Override
public void visitFilterPredicate(FilterPredicate filterPredicate) {
logNode(
"filter-predicate",
() -> {
logNode( filterPredicate.getFilterFragment() );
}
);
}
@Override
public void visitGroupedPredicate(GroupedPredicate groupedPredicate) {
logNode(
"grouped-predicate",
() -> groupedPredicate.getSubPredicate().accept( this )
);
}
@Override
public void visitInListPredicate(InListPredicate inListPredicate) {
logNode(
"in",
() -> {
inListPredicate.getTestExpression().accept( this );
logNode(
"list",
() -> inListPredicate.getListExpressions().forEach( expr -> expr.accept( this ) )
);
}
);
}
@Override
public void visitInSubQueryPredicate(InSubQueryPredicate inSubQueryPredicate) {
logNode(
"in",
() -> {
inSubQueryPredicate.getTestExpression().accept( this );
visitQuerySpec( inSubQueryPredicate.getSubQuery() );
}
);
}
@Override
public void visitExistsPredicate(ExistsPredicate existsPredicate) {
}
@Override
public void visitJunction(Junction junction) {
logNode(
junction.getNature().name().toLowerCase(),
() -> junction.getPredicates().forEach( predicate -> predicate.accept( this ) )
);
}
@Override
public void visitLikePredicate(LikePredicate likePredicate) {
logNode(
"like",
() -> {
likePredicate.getMatchExpression().accept( this );
likePredicate.getPattern().accept( this );
if ( likePredicate.getEscapeCharacter() != null ) {
likePredicate.getEscapeCharacter().accept( this );
}
}
);
}
@Override
public void visitNegatedPredicate(NegatedPredicate negatedPredicate) {
logNode(
"not",
() -> negatedPredicate.getPredicate().accept( this )
);
}
@Override
public void visitNullnessPredicate(NullnessPredicate nullnessPredicate) {
}
@Override
public void visitRelationalPredicate(ComparisonPredicate comparisonPredicate) {
logNode(
comparisonPredicate.getOperator().name().toLowerCase( Locale.ROOT ),
() -> {
comparisonPredicate.getLeftHandExpression().accept( this );
comparisonPredicate.getRightHandExpression().accept( this );
}
);
}
@Override
public void visitSelfRenderingPredicate(SelfRenderingPredicate selfRenderingPredicate) {
}
@Override
public void visitSelfRenderingExpression(SelfRenderingExpression expression) {
}
@Override
public void visitDurationUnit(DurationUnit durationUnit) {
}
@Override
public void visitDuration(Duration duration) {
}
@Override
public void visitConversion(Conversion conversion) {
}
// @Override
// public void visitNonStandardFunctionExpression(NonStandardFunction function) {
//
// }
//
// @Override
// public void visitAbsFunction(AbsFunction function) {
//
// }
//
// @Override
// public void visitAvgFunction(AvgFunction function) {
//
// }
//
// @Override
// public void visitBitLengthFunction(BitLengthFunction function) {
//
// }
//
// @Override
// public void visitCastFunction(CastFunction function) {
//
// }
//
// @Override
// public void visitConcatFunction(ConcatFunction function) {
//
// }
//
// @Override
// public void visitSubstrFunction(SubstrFunction function) {
//
// }
//
// @Override
// public void visitCountFunction(CountFunction function) {
// logNode(
// "count",
// () -> function.getArgument().accept( this )
// );
// }
//
// @Override
// public void visitCountStarFunction(CountStarFunction function) {
// logNode( "count(*)" );
// }
//
// @Override
// public void visitCurrentDateFunction(CurrentDateFunction function) {
// logNode( "current_date" );
// }
//
// @Override
// public void visitCurrentTimeFunction(CurrentTimeFunction function) {
// logNode( "current_time" );
// }
//
// @Override
// public void visitCurrentTimestampFunction(CurrentTimestampFunction function) {
// logNode( "current_timestamp" );
// }
// @Override
// public void visitExtractFunction(ExtractFunction extractFunction) {
//
// }
//
// @Override
// public void visitLengthFunction(LengthFunction function) {
//
// }
//
// @Override
// public void visitLocateFunction(LocateFunction function) {
//
// }
//
// @Override
// public void visitLowerFunction(LowerFunction function) {
//
// }
//
// @Override
// public void visitMaxFunction(MaxFunction function) {
//
// }
//
// @Override
// public void visitMinFunction(MinFunction function) {
//
// }
//
// @Override
// public void visitModFunction(ModFunction function) {
//
// }
//
// @Override
// public void visitNullifFunction(NullifFunction function) {
//
// }
//
// @Override
// public void visitSqrtFunction(SqrtFunction function) {
//
// }
//
// @Override
// public void visitSumFunction(SumFunction function) {
//
// }
//
// @Override
// public void visitTrimFunction(TrimFunction function) {
//
// }
//
// @Override
// public void visitUpperFunction(UpperFunction function) {
//
// }
}

View File

@ -20,6 +20,9 @@
import org.hibernate.sql.exec.spi.JdbcSelect;
import org.hibernate.sql.results.jdbc.internal.JdbcValuesMappingProducerStandard;
import static org.hibernate.sql.ast.SqlTreePrinter.logSqlAst;
import static org.hibernate.sql.results.graph.DomainResultGraphPrinter.logDomainResultGraph;
/**
* The final phase of query translation. Here we take the SQL-AST an
* "interpretation". For a select query, that means an instance of
@ -81,9 +84,8 @@ public JdbcSelect translate(QuerySpec querySpec) {
@Override
public JdbcSelect translate(SelectStatement sqlAstSelect) {
if ( SqlAstTreeLogger.DEBUG_ENABLED ) {
SqlTreePrinter.print( sqlAstSelect );
}
logDomainResultGraph( sqlAstSelect.getDomainResultDescriptors() );
logSqlAst( sqlAstSelect );
visitQuerySpec( sqlAstSelect.getQuerySpec() );

View File

@ -11,12 +11,35 @@
import org.hibernate.sql.ast.SqlAstJoinType;
import org.hibernate.sql.ast.spi.SqlAliasBaseGenerator;
import org.hibernate.sql.ast.spi.SqlAstCreationContext;
import org.hibernate.sql.ast.spi.SqlAstCreationState;
import org.hibernate.sql.ast.spi.SqlExpressionResolver;
/**
* @author Steve Ebersole
*/
public interface TableGroupJoinProducer extends TableGroupProducer {
/**
* Create a TableGroupJoin as defined for this producer
*/
default TableGroupJoin createTableGroupJoin(
NavigablePath navigablePath,
TableGroup lhs,
String explicitSourceAlias,
SqlAstJoinType sqlAstJoinType,
LockMode lockMode,
SqlAstCreationState creationState) {
return createTableGroupJoin(
navigablePath,
lhs,
explicitSourceAlias,
sqlAstJoinType,
lockMode,
creationState.getSqlAliasBaseGenerator(),
creationState.getSqlExpressionResolver(),
creationState.getCreationContext()
);
}
/**
* Create a TableGroupJoin as defined for this producer
*/

View File

@ -28,7 +28,7 @@
import org.hibernate.sql.exec.spi.JdbcParameterBindings;
import org.hibernate.sql.exec.spi.JdbcSelect;
import org.hibernate.sql.exec.spi.JdbcSelectExecutor;
import org.hibernate.sql.results.internal.Helper;
import org.hibernate.sql.results.internal.ResultsHelper;
import org.hibernate.sql.results.internal.RowProcessingStateStandardImpl;
import org.hibernate.sql.results.jdbc.internal.DeferredResultSetAccess;
import org.hibernate.sql.results.jdbc.internal.JdbcValuesCacheHit;
@ -204,7 +204,7 @@ public boolean shouldReturnProxies() {
final List<AfterLoadAction> afterLoadActions = new ArrayList<>();
final RowReader<R> rowReader = Helper.createRowReader(
final RowReader<R> rowReader = ResultsHelper.createRowReader(
executionContext.getSession().getFactory(),
afterLoadActions::add,
rowTransformer,

View File

@ -6,11 +6,15 @@
*/
package org.hibernate.sql.results.graph;
import java.util.function.Supplier;
import org.hibernate.query.NavigablePath;
import org.hibernate.sql.ast.spi.SqlAstCreationContext;
/**
* @author Steve Ebersole
*/
public interface AssemblerCreationState {
Initializer resolveInitializer(NavigablePath navigablePath, Supplier<Initializer> producer);
SqlAstCreationContext getSqlAstCreationContext();
}

View File

@ -0,0 +1,21 @@
/*
* 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.sql.results.graph;
import org.hibernate.sql.results.ResultsLogger;
import org.jboss.logging.Logger;
/**
* @author Steve Ebersole
*/
public interface AssemblerLogger {
Logger LOGGER = ResultsLogger.subLogger( "assembler" );
boolean DEBUG_ENABLED = LOGGER.isDebugEnabled();
boolean TRACE_ENABLED = LOGGER.isTraceEnabled();
}

View File

@ -6,8 +6,6 @@
*/
package org.hibernate.sql.results.graph;
import java.util.function.Consumer;
/**
* Represents a result value in the domain query results. Acts as the producer for the
* {@link DomainResultAssembler} for this result as well as any {@link Initializer} instances needed
@ -30,7 +28,5 @@ public interface DomainResult<J> extends DomainResultGraphNode {
/**
* Create an assembler (and any initializers) for this result.
*/
DomainResultAssembler<J> createResultAssembler(
Consumer<Initializer> initializerCollector,
AssemblerCreationState creationState);
DomainResultAssembler<J> createResultAssembler(AssemblerCreationState creationState);
}

View File

@ -10,6 +10,7 @@
import org.hibernate.internal.util.collections.Stack;
import org.hibernate.internal.util.collections.StandardStack;
import org.hibernate.sql.results.ResultsLogger;
import org.jboss.logging.Logger;
@ -21,21 +22,28 @@
* @author Steve Ebersole
*/
public class DomainResultGraphPrinter {
private static final Logger log = Logger.getLogger( DomainResultGraphPrinter.class );
private static final Logger log = ResultsLogger.subLogger( "graph.AST" );
private static final boolean DEBUG_ENABLED = log.isDebugEnabled();
private static final boolean TRACE_ENABLED = log.isTraceEnabled();
public static void print(List<DomainResult> domainResults) {
if ( ! log.isDebugEnabled() ) {
public static void logDomainResultGraph(List<DomainResult> domainResults) {
logDomainResultGraph( "DomainResult Graph", domainResults );
}
public static void logDomainResultGraph(String header, List<DomainResult> domainResults) {
if ( ! DEBUG_ENABLED ) {
return;
}
final DomainResultGraphPrinter graphPrinter = new DomainResultGraphPrinter();
final DomainResultGraphPrinter graphPrinter = new DomainResultGraphPrinter( header );
graphPrinter.visitDomainResults( domainResults );
}
private final StringBuilder buffer = new StringBuilder( "DomainResult Graph:\n");
private final StringBuilder buffer;
private final Stack<FetchParent> fetchParentStack = new StandardStack<>();
private DomainResultGraphPrinter() {
private DomainResultGraphPrinter(String header) {
buffer = new StringBuilder( header + ":" + System.lineSeparator() );
}
private void visitDomainResults(List<DomainResult> domainResults) {
@ -50,9 +58,17 @@ private void visitDomainResults(List<DomainResult> domainResults) {
}
log.debug( buffer.toString() );
if ( TRACE_ENABLED ) {
log.tracef( new Exception(), "Stack trace calling DomainResultGraphPrinter" );
}
}
private void visitGraphNode(DomainResultGraphNode node, boolean lastInBranch) {
visitGraphNode( node, lastInBranch, node.getClass().getSimpleName() );
}
private void visitGraphNode(DomainResultGraphNode node, boolean lastInBranch, String nodeText) {
indentLine();
if ( lastInBranch ) {
@ -62,7 +78,7 @@ private void visitGraphNode(DomainResultGraphNode node, boolean lastInBranch) {
buffer.append( " +-" );
}
buffer.append( node.getClass().getSimpleName() );
buffer.append( nodeText );
if ( node.getNavigablePath() != null ) {
buffer.append( " [" )
.append( node.getNavigablePath().getFullPath() )
@ -75,10 +91,20 @@ private void visitGraphNode(DomainResultGraphNode node, boolean lastInBranch) {
}
}
private void visitKeyGraphNode(DomainResultGraphNode node, boolean lastInBranch) {
visitGraphNode( node, lastInBranch, "(key) " + node.getClass().getSimpleName() );
}
private void visitFetches(FetchParent fetchParent) {
fetchParentStack.push( fetchParent );
try {
// final Fetch identifierFetch = fetchParent.getKeyFetch();
// if ( identifierFetch != null ) {
// final boolean lastInBranch = identifierFetch.getFetchedMapping() instanceof FetchParent;
// visitKeyGraphNode( identifierFetch, lastInBranch );
// }
final int numberOfFetches = fetchParent.getFetches().size();
for ( int i = 0; i < numberOfFetches; i++ ) {

View File

@ -59,8 +59,5 @@ public interface Fetch extends DomainResultGraphNode {
/**
* Create the assembler for this fetch
*/
DomainResultAssembler createAssembler(
FetchParentAccess parentAccess,
Consumer<Initializer> collector,
AssemblerCreationState creationState);
DomainResultAssembler createAssembler(FetchParentAccess parentAccess, AssemblerCreationState creationState);
}

View File

@ -0,0 +1,21 @@
/*
* 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.sql.results.graph;
import org.hibernate.sql.results.ResultsLogger;
import org.jboss.logging.Logger;
/**
* @author Steve Ebersole
*/
public interface ResultGraphLogger {
Logger LOGGER = ResultsLogger.subLogger( "graph" );
boolean DEBUG_ENABLED = LOGGER.isDebugEnabled();
boolean TRACE_ENABLED = LOGGER.isTraceEnabled();
}

View File

@ -6,8 +6,6 @@
*/
package org.hibernate.sql.results.graph.basic;
import java.util.function.Consumer;
import org.hibernate.engine.FetchTiming;
import org.hibernate.metamodel.mapping.BasicValuedModelPart;
import org.hibernate.metamodel.model.convert.spi.BasicValueConverter;
@ -19,7 +17,6 @@
import org.hibernate.sql.results.graph.FetchParent;
import org.hibernate.sql.results.graph.FetchParentAccess;
import org.hibernate.sql.results.graph.Fetchable;
import org.hibernate.sql.results.graph.Initializer;
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
/**
@ -95,15 +92,12 @@ public NavigablePath getNavigablePath() {
@Override
public DomainResultAssembler createAssembler(
FetchParentAccess parentAccess,
Consumer<Initializer> collector,
AssemblerCreationState creationState) {
return assembler;
}
@Override
public DomainResultAssembler<T> createResultAssembler(
Consumer<Initializer> initializerCollector,
AssemblerCreationState creationState) {
public DomainResultAssembler<T> createResultAssembler(AssemblerCreationState creationState) {
return assembler;
}

View File

@ -6,15 +6,12 @@
*/
package org.hibernate.sql.results.graph.basic;
import java.util.function.Consumer;
import org.hibernate.Internal;
import org.hibernate.sql.results.graph.DomainResult;
import org.hibernate.metamodel.model.convert.spi.BasicValueConverter;
import org.hibernate.query.NavigablePath;
import org.hibernate.sql.results.graph.AssemblerCreationState;
import org.hibernate.sql.results.graph.DomainResult;
import org.hibernate.sql.results.graph.DomainResultAssembler;
import org.hibernate.sql.results.graph.Initializer;
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
/**
@ -93,9 +90,7 @@ public DomainResultAssembler<T> getAssembler() {
}
@Override
public DomainResultAssembler<T> createResultAssembler(
Consumer<Initializer> initializerCollector,
AssemblerCreationState creationState) {
public DomainResultAssembler<T> createResultAssembler(AssemblerCreationState creationState) {
return assembler;
}
}

View File

@ -6,7 +6,7 @@
*/
package org.hibernate.sql.results.graph.collection;
import org.hibernate.sql.results.ResultsLogger;
import org.hibernate.sql.results.LoadingLogger;
import org.jboss.logging.BasicLogger;
import org.jboss.logging.Logger;
@ -15,12 +15,14 @@
* @author Steve Ebersole
*/
public interface CollectionLoadingLogger extends BasicLogger {
String LOGGER_NAME = ResultsLogger.LOGGER_NAME + "loading.collection";
String LOCAL_NAME = "collection";
String LOGGER_NAME = LoadingLogger.subLoggerName( LOCAL_NAME );
/**
* Static access to the logging instance
*/
Logger INSTANCE = Logger.getLogger( LOGGER_NAME );
Logger INSTANCE = LoadingLogger.subLogger( LOCAL_NAME );
boolean TRACE_ENABLED = INSTANCE.isTraceEnabled();
boolean DEBUG_ENABLED = INSTANCE.isDebugEnabled();

View File

@ -6,6 +6,8 @@
*/
package org.hibernate.sql.results.graph.collection.internal;
import java.util.function.Supplier;
import org.hibernate.collection.internal.PersistentArrayHolder;
import org.hibernate.collection.spi.PersistentCollection;
import org.hibernate.metamodel.mapping.PluralAttributeMapping;
@ -25,9 +27,9 @@ public abstract class AbstractCollectionAssembler implements DomainResultAssembl
public AbstractCollectionAssembler(
PluralAttributeMapping fetchedMapping,
CollectionInitializer initializer) {
Supplier<CollectionInitializer> initializerProducer) {
this.fetchedMapping = fetchedMapping;
this.initializer = initializer;
this.initializer = initializerProducer.get();
}
@Override

View File

@ -15,7 +15,6 @@
import org.hibernate.engine.spi.PersistenceContext;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.internal.log.LoggingHelper;
import org.hibernate.internal.util.StringHelper;
import org.hibernate.metamodel.mapping.PluralAttributeMapping;
import org.hibernate.persister.collection.CollectionPersister;
import org.hibernate.query.NavigablePath;
@ -71,6 +70,8 @@ public AbstractImmediateCollectionInitializer(
this.lockMode = lockMode;
}
protected abstract String getSimpleConcreteImplName();
@Override
public void resolveInstance(RowProcessingState rowProcessingState) {
if ( collectionInstance != null ) {
@ -80,7 +81,7 @@ public void resolveInstance(RowProcessingState rowProcessingState) {
if ( CollectionLoadingLogger.TRACE_ENABLED ) {
CollectionLoadingLogger.INSTANCE.tracef(
"(%s) Beginning Initializer#resolveInstance for collection : %s",
StringHelper.collapse( this.getClass().getName() ),
getSimpleConcreteImplName(),
LoggingHelper.toLoggableString( getNavigablePath(), collectionKey.getKey() )
);
}
@ -105,9 +106,9 @@ public void resolveInstance(RowProcessingState rowProcessingState) {
if ( CollectionLoadingLogger.DEBUG_ENABLED ) {
CollectionLoadingLogger.INSTANCE.debugf(
"(%s) Found existing loading collection entry [%s]; using loading collection instance - %s",
StringHelper.collapse( this.getClass().getName() ),
getSimpleConcreteImplName(),
LoggingHelper.toLoggableString( getNavigablePath(), collectionKey.getKey() ),
LoggingHelper.toLoggableString( collectionInstance )
toLoggableString( collectionInstance )
);
}
@ -120,7 +121,7 @@ public void resolveInstance(RowProcessingState rowProcessingState) {
if ( CollectionLoadingLogger.DEBUG_ENABLED ) {
CollectionLoadingLogger.INSTANCE.debugf(
"(%s) Collection [%s] being loaded by another initializer [%s] - skipping processing",
StringHelper.collapse( this.getClass().getName() ),
getSimpleConcreteImplName(),
LoggingHelper.toLoggableString( getNavigablePath(), collectionKey.getKey() ),
existingLoadingEntry.getInitializer()
);
@ -142,9 +143,9 @@ public void resolveInstance(RowProcessingState rowProcessingState) {
if ( CollectionLoadingLogger.DEBUG_ENABLED ) {
CollectionLoadingLogger.INSTANCE.debugf(
"(%s) Found existing collection instance [%s] in Session; skipping processing - [%s]",
StringHelper.collapse( this.getClass().getName() ),
getSimpleConcreteImplName(),
LoggingHelper.toLoggableString( getNavigablePath(), collectionKey.getKey() ),
LoggingHelper.toLoggableString( collectionInstance )
toLoggableString( collectionInstance )
);
}
@ -167,9 +168,9 @@ public void resolveInstance(RowProcessingState rowProcessingState) {
if ( CollectionLoadingLogger.DEBUG_ENABLED ) {
CollectionLoadingLogger.INSTANCE.debugf(
"(%s) Found existing unowned collection instance [%s] in Session; skipping processing - [%s]",
StringHelper.collapse( this.getClass().getName() ),
getSimpleConcreteImplName(),
LoggingHelper.toLoggableString( getNavigablePath(), collectionKey.getKey() ),
LoggingHelper.toLoggableString( collectionInstance )
toLoggableString( collectionInstance )
);
}
@ -197,9 +198,9 @@ public void resolveInstance(RowProcessingState rowProcessingState) {
if ( CollectionLoadingLogger.DEBUG_ENABLED ) {
CollectionLoadingLogger.INSTANCE.debugf(
"(%s) Created new collection wrapper [%s] : %s",
StringHelper.collapse( this.getClass().getName() ),
getSimpleConcreteImplName(),
LoggingHelper.toLoggableString( getNavigablePath(), collectionKey.getKey() ),
LoggingHelper.toLoggableString( collectionInstance )
toLoggableString( collectionInstance )
);
}
@ -212,9 +213,9 @@ public void resolveInstance(RowProcessingState rowProcessingState) {
if ( CollectionLoadingLogger.DEBUG_ENABLED ) {
CollectionLoadingLogger.INSTANCE.debugf(
"(%s) Responsible for loading collection [%s] : %s",
StringHelper.collapse( this.getClass().getName() ),
getSimpleConcreteImplName(),
LoggingHelper.toLoggableString( getNavigablePath(), collectionKey.getKey() ),
LoggingHelper.toLoggableString( collectionInstance )
toLoggableString( collectionInstance )
);
}
@ -226,6 +227,16 @@ public void resolveInstance(RowProcessingState rowProcessingState) {
}
}
/**
* Specialized toString handling for PersistentCollection. All `PersistentCollection#toString`
* implementations are crazy expensive as they trigger a load
*/
private String toLoggableString(PersistentCollection collectionInstance) {
return collectionInstance == null
? LoggingHelper.NULL
: collectionInstance.getClass().getName() + "@" + System.identityHashCode( collectionInstance );
}
protected void takeResponsibility(RowProcessingState rowProcessingState, CollectionKey collectionKey) {
responsibility = new LoadingCollectionEntryImpl(
getCollectionAttributeMapping().getCollectionDescriptor(),
@ -280,7 +291,7 @@ public void resolveKey(RowProcessingState rowProcessingState) {
if ( CollectionLoadingLogger.DEBUG_ENABLED ) {
CollectionLoadingLogger.INSTANCE.debugf(
"(%s) Current row collection key : %s",
StringHelper.collapse( this.getClass().getName() ),
getSimpleConcreteImplName(),
LoggingHelper.toLoggableString( getNavigablePath(), this.collectionKey.getKey() )
);
}
@ -294,7 +305,7 @@ else if ( keyCollectionValue != null ) {
if ( CollectionLoadingLogger.DEBUG_ENABLED ) {
CollectionLoadingLogger.INSTANCE.debugf(
"(%s) Current row collection key : %s",
StringHelper.collapse( this.getClass().getName() ),
getSimpleConcreteImplName(),
LoggingHelper.toLoggableString( getNavigablePath(), this.collectionKey.getKey() )
);
}
@ -343,9 +354,9 @@ public void initializeInstance(RowProcessingState rowProcessingState) {
if ( CollectionLoadingLogger.DEBUG_ENABLED ) {
CollectionLoadingLogger.INSTANCE.debugf(
"(%s) Reading element from row for collection [%s] -> %s",
StringHelper.collapse( this.getClass().getName() ),
getSimpleConcreteImplName(),
LoggingHelper.toLoggableString( getNavigablePath(), collectionKey.getKey() ),
LoggingHelper.toLoggableString( collectionInstance )
toLoggableString( collectionInstance )
);
}

View File

@ -22,6 +22,8 @@
* @author Chris Cranford
*/
public class ArrayInitializer extends AbstractImmediateCollectionInitializer {
private static final String CONCRETE_NAME = ArrayInitializer.class.getSimpleName();
private final DomainResultAssembler listIndexAssembler;
private final DomainResultAssembler elementAssembler;
@ -50,6 +52,11 @@ public ArrayInitializer(
this.indexBase = getCollectionAttributeMapping().getIndexMetadata().getListIndexBase();
}
@Override
protected String getSimpleConcreteImplName() {
return CONCRETE_NAME;
}
@Override
public PersistentArrayHolder getCollectionInstance() {
return (PersistentArrayHolder) super.getCollectionInstance();

View File

@ -6,18 +6,15 @@
*/
package org.hibernate.sql.results.graph.collection.internal;
import java.util.function.Consumer;
import org.hibernate.LockMode;
import org.hibernate.collection.spi.CollectionInitializerProducer;
import org.hibernate.metamodel.mapping.PluralAttributeMapping;
import org.hibernate.query.NavigablePath;
import org.hibernate.sql.results.graph.AssemblerCreationState;
import org.hibernate.sql.results.graph.collection.CollectionInitializer;
import org.hibernate.sql.results.graph.DomainResultAssembler;
import org.hibernate.sql.results.graph.Fetch;
import org.hibernate.sql.results.graph.FetchParentAccess;
import org.hibernate.sql.results.graph.Initializer;
import org.hibernate.sql.results.graph.collection.CollectionInitializer;
/**
* @author Chris Cranford
@ -44,7 +41,6 @@ public CollectionInitializer produceInitializer(
LockMode lockMode,
DomainResultAssembler keyContainerAssembler,
DomainResultAssembler keyCollectionAssembler,
Consumer<Initializer> initializerConsumer,
AssemblerCreationState creationState) {
return new ArrayInitializer(
navigablePath,
@ -53,16 +49,8 @@ public CollectionInitializer produceInitializer(
lockMode,
keyContainerAssembler,
keyCollectionAssembler,
listIndexFetch.createAssembler(
parentAccess,
initializerConsumer,
creationState
),
elementFetch.createAssembler(
parentAccess,
initializerConsumer,
creationState
)
listIndexFetch.createAssembler( parentAccess, creationState ),
elementFetch.createAssembler( parentAccess, creationState )
);
}
}

View File

@ -26,6 +26,8 @@
* @author Steve Ebersole
*/
public class BagInitializer extends AbstractImmediateCollectionInitializer {
private static final String CONCRETE_NAME = BagInitializer.class.getSimpleName();
private final DomainResultAssembler elementAssembler;
private final DomainResultAssembler collectionIdAssembler;
@ -43,6 +45,11 @@ public BagInitializer(
this.collectionIdAssembler = collectionIdAssembler;
}
@Override
protected String getSimpleConcreteImplName() {
return CONCRETE_NAME;
}
@Override
protected void readCollectionRow(
CollectionKey collectionKey,

View File

@ -6,19 +6,15 @@
*/
package org.hibernate.sql.results.graph.collection.internal;
import java.util.function.Consumer;
import org.hibernate.LockMode;
import org.hibernate.collection.spi.CollectionInitializerProducer;
import org.hibernate.metamodel.mapping.PluralAttributeMapping;
import org.hibernate.query.NavigablePath;
import org.hibernate.sql.results.graph.AssemblerCreationState;
import org.hibernate.sql.results.graph.collection.CollectionInitializer;
import org.hibernate.sql.results.graph.DomainResultAssembler;
import org.hibernate.sql.results.graph.Fetch;
import org.hibernate.sql.results.graph.FetchParentAccess;
import org.hibernate.sql.results.graph.Initializer;
import org.hibernate.sql.results.graph.collection.CollectionInitializer;
/**
* @author Steve Ebersole
@ -55,11 +51,9 @@ public CollectionInitializer produceInitializer(
LockMode lockMode,
DomainResultAssembler keyContainerAssembler,
DomainResultAssembler keyCollectionAssembler,
Consumer<Initializer> initializerConsumer,
AssemblerCreationState creationState) {
final DomainResultAssembler elementAssembler = elementFetch.createAssembler(
parentAccess,
initializerConsumer,
creationState
);
@ -70,7 +64,6 @@ public CollectionInitializer produceInitializer(
else {
collectionIdAssembler = collectionIdFetch.createAssembler(
parentAccess,
initializerConsumer,
creationState
);
}

View File

@ -8,7 +8,6 @@
import java.util.Collections;
import java.util.List;
import java.util.function.Consumer;
import org.hibernate.LockMode;
import org.hibernate.collection.spi.CollectionInitializerProducer;
@ -79,28 +78,24 @@ public JavaTypeDescriptor getResultJavaTypeDescriptor() {
}
@Override
public DomainResultAssembler createResultAssembler(
Consumer initializerCollector,
AssemblerCreationState creationState) {
public DomainResultAssembler createResultAssembler(AssemblerCreationState creationState) {
final CollectionInitializer initializer = (CollectionInitializer) creationState.resolveInitializer(
getNavigablePath(),
() -> {
final DomainResultAssembler fkAssembler = fkResult.createResultAssembler( creationState );
final DomainResultAssembler fkAssembler = fkResult.createResultAssembler(
initializerCollector,
creationState
return initializerProducer.produceInitializer(
loadingPath,
loadingAttribute,
null,
LockMode.READ,
fkAssembler,
fkAssembler,
creationState
);
}
);
final CollectionInitializer initializer = initializerProducer.produceInitializer(
loadingPath,
loadingAttribute,
null,
LockMode.READ,
fkAssembler,
fkAssembler,
initializerCollector,
creationState
);
initializerCollector.accept( initializer );
return new EagerCollectionAssembler( loadingAttribute, initializer );
}

View File

@ -13,6 +13,7 @@
import org.hibernate.sql.results.graph.AssemblerCreationState;
import org.hibernate.sql.results.graph.FetchParentAccess;
import org.hibernate.sql.results.graph.Initializer;
import org.hibernate.sql.results.graph.collection.CollectionInitializer;
/**
* @author Steve Ebersole
@ -22,9 +23,14 @@ public DelayedCollectionAssembler(
NavigablePath fetchPath,
PluralAttributeMapping fetchedMapping,
FetchParentAccess parentAccess,
Consumer<Initializer> collector,
AssemblerCreationState creationState) {
super( fetchedMapping, new DelayedCollectionInitializer( fetchPath, fetchedMapping, parentAccess ) );
collector.accept( initializer );
super(
fetchedMapping,
() -> (CollectionInitializer) creationState.resolveInitializer(
fetchPath,
() -> new DelayedCollectionInitializer( fetchPath, fetchedMapping, parentAccess )
)
);
}
}

View File

@ -32,13 +32,11 @@ public DelayedCollectionFetch(
@Override
public DomainResultAssembler createAssembler(
FetchParentAccess parentAccess,
Consumer<Initializer> collector,
AssemblerCreationState creationState) {
return new DelayedCollectionAssembler(
getNavigablePath(),
getFetchedMapping(),
parentAccess,
collector,
creationState
);
}

View File

@ -17,6 +17,6 @@ public class EagerCollectionAssembler extends AbstractCollectionAssembler {
public EagerCollectionAssembler(
PluralAttributeMapping fetchedMapping,
CollectionInitializer initializer) {
super( fetchedMapping, initializer );
super( fetchedMapping, () -> initializer );
}
}

View File

@ -7,7 +7,6 @@
package org.hibernate.sql.results.graph.collection.internal;
import java.util.List;
import java.util.function.Consumer;
import org.hibernate.LockMode;
import org.hibernate.collection.spi.CollectionInitializerProducer;
@ -20,7 +19,6 @@
import org.hibernate.sql.ast.spi.FromClauseAccess;
import org.hibernate.sql.ast.tree.from.TableGroup;
import org.hibernate.sql.results.graph.AssemblerCreationState;
import org.hibernate.sql.results.graph.collection.CollectionInitializer;
import org.hibernate.sql.results.graph.DomainResult;
import org.hibernate.sql.results.graph.DomainResultAssembler;
import org.hibernate.sql.results.graph.DomainResultCreationState;
@ -28,7 +26,7 @@
import org.hibernate.sql.results.graph.FetchParent;
import org.hibernate.sql.results.graph.FetchParentAccess;
import org.hibernate.sql.results.graph.FetchableContainer;
import org.hibernate.sql.results.graph.Initializer;
import org.hibernate.sql.results.graph.collection.CollectionInitializer;
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
/**
@ -99,38 +97,31 @@ public EagerCollectionFetch(
}
@Override
public DomainResultAssembler createAssembler(
FetchParentAccess parentAccess,
Consumer<Initializer> collector,
AssemblerCreationState creationState) {
final DomainResultAssembler keyContainerAssembler = keyContainerResult.createResultAssembler(
collector,
creationState
);
final DomainResultAssembler keyCollectionAssembler;
if ( keyCollectionResult == null ) {
keyCollectionAssembler = null;
}
else {
keyCollectionAssembler = keyCollectionResult.createResultAssembler(
collector,
creationState
);
}
final CollectionInitializer initializer = initializerProducer.produceInitializer(
public DomainResultAssembler createAssembler(FetchParentAccess parentAccess, AssemblerCreationState creationState) {
final CollectionInitializer initializer = (CollectionInitializer) creationState.resolveInitializer(
getNavigablePath(),
getFetchedMapping(),
parentAccess,
null,
keyContainerAssembler,
keyCollectionAssembler,
collector,
creationState
);
() -> {
final DomainResultAssembler keyContainerAssembler = keyContainerResult.createResultAssembler( creationState );
collector.accept( initializer );
final DomainResultAssembler keyCollectionAssembler;
if ( keyCollectionResult == null ) {
keyCollectionAssembler = null;
}
else {
keyCollectionAssembler = keyCollectionResult.createResultAssembler( creationState );
}
return initializerProducer.produceInitializer(
getNavigablePath(),
getFetchedMapping(),
parentAccess,
null,
keyContainerAssembler,
keyCollectionAssembler,
creationState
);
}
);
return new EagerCollectionAssembler( getFetchedMapping(), initializer );
}

View File

@ -24,6 +24,8 @@
* @author Steve Ebersole
*/
public class ListInitializer extends AbstractImmediateCollectionInitializer {
private static final String CONCRETE_NAME = ListInitializer.class.getSimpleName();
private final DomainResultAssembler listIndexAssembler;
private final DomainResultAssembler elementAssembler;
@ -45,6 +47,11 @@ public ListInitializer(
listIndexBase = attributeMapping.getIndexMetadata().getListIndexBase();
}
@Override
protected String getSimpleConcreteImplName() {
return CONCRETE_NAME;
}
@Override
public PersistentList getCollectionInstance() {
return (PersistentList) super.getCollectionInstance();

View File

@ -6,18 +6,15 @@
*/
package org.hibernate.sql.results.graph.collection.internal;
import java.util.function.Consumer;
import org.hibernate.LockMode;
import org.hibernate.collection.spi.CollectionInitializerProducer;
import org.hibernate.metamodel.mapping.PluralAttributeMapping;
import org.hibernate.query.NavigablePath;
import org.hibernate.sql.results.graph.AssemblerCreationState;
import org.hibernate.sql.results.graph.collection.CollectionInitializer;
import org.hibernate.sql.results.graph.DomainResultAssembler;
import org.hibernate.sql.results.graph.Fetch;
import org.hibernate.sql.results.graph.FetchParentAccess;
import org.hibernate.sql.results.graph.Initializer;
import org.hibernate.sql.results.graph.collection.CollectionInitializer;
/**
* @author Steve Ebersole
@ -44,7 +41,6 @@ public CollectionInitializer produceInitializer(
LockMode lockMode,
DomainResultAssembler keyContainerAssembler,
DomainResultAssembler keyCollectionAssembler,
Consumer<Initializer> initializerConsumer,
AssemblerCreationState creationState) {
return new ListInitializer(
navigablePath,
@ -53,16 +49,8 @@ public CollectionInitializer produceInitializer(
lockMode,
keyContainerAssembler,
keyCollectionAssembler,
listIndexFetch.createAssembler(
parentAccess,
initializerConsumer,
creationState
),
elementFetch.createAssembler(
parentAccess,
initializerConsumer,
creationState
)
listIndexFetch.createAssembler( parentAccess, creationState ),
elementFetch.createAssembler( parentAccess, creationState )
);
}
}

View File

@ -27,6 +27,8 @@
* @author Steve Ebersole
*/
public class MapInitializer extends AbstractImmediateCollectionInitializer {
private static final String CONCRETE_NAME = MapInitializer.class.getSimpleName();
private final DomainResultAssembler mapKeyAssembler;
private final DomainResultAssembler mapValueAssembler;
@ -44,6 +46,11 @@ public MapInitializer(
this.mapValueAssembler = mapValueAssembler;
}
@Override
protected String getSimpleConcreteImplName() {
return CONCRETE_NAME;
}
@Override
public PersistentMap getCollectionInstance() {
return (PersistentMap) super.getCollectionInstance();

View File

@ -6,18 +6,15 @@
*/
package org.hibernate.sql.results.graph.collection.internal;
import java.util.function.Consumer;
import org.hibernate.LockMode;
import org.hibernate.collection.spi.CollectionInitializerProducer;
import org.hibernate.metamodel.mapping.PluralAttributeMapping;
import org.hibernate.query.NavigablePath;
import org.hibernate.sql.results.graph.AssemblerCreationState;
import org.hibernate.sql.results.graph.collection.CollectionInitializer;
import org.hibernate.sql.results.graph.DomainResultAssembler;
import org.hibernate.sql.results.graph.Fetch;
import org.hibernate.sql.results.graph.FetchParentAccess;
import org.hibernate.sql.results.graph.Initializer;
import org.hibernate.sql.results.graph.collection.CollectionInitializer;
/**
* @author Steve Ebersole
@ -44,17 +41,14 @@ public CollectionInitializer produceInitializer(
LockMode lockMode,
DomainResultAssembler keyContainerAssembler,
DomainResultAssembler keyCollectionAssembler,
Consumer<Initializer> initializerConsumer,
AssemblerCreationState creationState) {
final DomainResultAssembler mapKeyAssembler = mapKeyFetch.createAssembler(
parentAccess,
initializerConsumer,
creationState
);
final DomainResultAssembler mapValueAssembler = mapValueFetch.createAssembler(
parentAccess,
initializerConsumer,
creationState
);

View File

@ -6,13 +6,11 @@
*/
package org.hibernate.sql.results.graph.collection.internal;
import java.util.function.Consumer;
import org.hibernate.metamodel.mapping.PluralAttributeMapping;
import org.hibernate.query.NavigablePath;
import org.hibernate.sql.results.graph.AssemblerCreationState;
import org.hibernate.sql.results.graph.FetchParentAccess;
import org.hibernate.sql.results.graph.Initializer;
import org.hibernate.sql.results.graph.collection.CollectionInitializer;
/**
* @author Andrea Boriero
@ -23,9 +21,13 @@ public SelectEagerCollectionAssembler(
NavigablePath fetchPath,
PluralAttributeMapping fetchedMapping,
FetchParentAccess parentAccess,
Consumer<Initializer> collector,
AssemblerCreationState creationState) {
super( fetchedMapping, new SelectEagerCollectionInitializer( fetchPath, fetchedMapping, parentAccess ) );
collector.accept( initializer );
super(
fetchedMapping,
() -> (CollectionInitializer) creationState.resolveInitializer(
fetchPath,
() -> new SelectEagerCollectionInitializer( fetchPath, fetchedMapping, parentAccess )
)
);
}
}

View File

@ -41,12 +41,12 @@ public boolean hasTableGroup() {
@Override
public DomainResultAssembler createAssembler(
FetchParentAccess parentAccess, Consumer<Initializer> collector, AssemblerCreationState creationState) {
FetchParentAccess parentAccess,
AssemblerCreationState creationState) {
return new SelectEagerCollectionAssembler(
getNavigablePath(),
getFetchedMapping(),
parentAccess,
collector,
creationState
);
}

View File

@ -22,6 +22,8 @@
* @author Steve Ebersole
*/
public class SetInitializer extends AbstractImmediateCollectionInitializer {
private static final String CONCRETE_NAME = SetInitializer.class.getSimpleName();
private final DomainResultAssembler elementAssembler;
public SetInitializer(
@ -36,6 +38,11 @@ public SetInitializer(
this.elementAssembler = elementAssembler;
}
@Override
protected String getSimpleConcreteImplName() {
return CONCRETE_NAME;
}
@Override
public PersistentSet getCollectionInstance() {
return (PersistentSet) super.getCollectionInstance();

View File

@ -6,18 +6,15 @@
*/
package org.hibernate.sql.results.graph.collection.internal;
import java.util.function.Consumer;
import org.hibernate.LockMode;
import org.hibernate.collection.spi.CollectionInitializerProducer;
import org.hibernate.metamodel.mapping.PluralAttributeMapping;
import org.hibernate.query.NavigablePath;
import org.hibernate.sql.results.graph.AssemblerCreationState;
import org.hibernate.sql.results.graph.collection.CollectionInitializer;
import org.hibernate.sql.results.graph.DomainResultAssembler;
import org.hibernate.sql.results.graph.Fetch;
import org.hibernate.sql.results.graph.FetchParentAccess;
import org.hibernate.sql.results.graph.Initializer;
import org.hibernate.sql.results.graph.collection.CollectionInitializer;
/**
* @author Steve Ebersole
@ -41,13 +38,8 @@ public CollectionInitializer produceInitializer(
LockMode lockMode,
DomainResultAssembler keyContainerAssembler,
DomainResultAssembler keyCollectionAssembler,
Consumer<Initializer> initializerConsumer,
AssemblerCreationState creationState) {
final DomainResultAssembler elementAssembler = elementFetch.createAssembler(
parentAccess,
initializerConsumer,
creationState
);
final DomainResultAssembler elementAssembler = elementFetch.createAssembler( parentAccess, creationState );
return new SetInitializer(
navigablePath,

View File

@ -8,10 +8,10 @@
import java.util.IdentityHashMap;
import java.util.Map;
import java.util.function.Consumer;
import org.hibernate.metamodel.mapping.EmbeddableMappingType;
import org.hibernate.metamodel.mapping.EmbeddableValuedModelPart;
import org.hibernate.metamodel.mapping.EntityIdentifierMapping;
import org.hibernate.metamodel.mapping.SingularAttributeMapping;
import org.hibernate.metamodel.mapping.StateArrayContributorMapping;
import org.hibernate.query.NavigablePath;
@ -20,7 +20,6 @@
import org.hibernate.sql.results.graph.DomainResultAssembler;
import org.hibernate.sql.results.graph.Fetch;
import org.hibernate.sql.results.graph.FetchParentAccess;
import org.hibernate.sql.results.graph.Initializer;
import org.hibernate.sql.results.internal.NullValueAssembler;
import org.hibernate.sql.results.jdbc.spi.RowProcessingState;
@ -44,7 +43,6 @@ public abstract class AbstractEmbeddableInitializer extends AbstractFetchParentA
public AbstractEmbeddableInitializer(
EmbeddableResultGraphNode resultDescriptor,
FetchParentAccess fetchParentAccess,
Consumer<Initializer> initializerConsumer,
AssemblerCreationState creationState) {
this.navigablePath = resultDescriptor.getNavigablePath();
this.embeddedModelPartDescriptor = resultDescriptor.getReferencedMappingContainer();
@ -61,7 +59,7 @@ public AbstractEmbeddableInitializer(
final DomainResultAssembler stateAssembler = fetch == null
? new NullValueAssembler( stateArrayContributor.getJavaTypeDescriptor() )
: fetch.createAssembler( this, initializerConsumer, creationState );
: fetch.createAssembler( this, creationState );
assemblerMap.put( stateArrayContributor, stateAssembler );
}

View File

@ -6,7 +6,7 @@
*/
package org.hibernate.sql.results.graph.embeddable;
import org.hibernate.sql.results.ResultsLogger;
import org.hibernate.sql.results.LoadingLogger;
import org.jboss.logging.BasicLogger;
import org.jboss.logging.Logger;
@ -19,17 +19,16 @@
@MessageLogger( projectCode = "HHH" )
@ValidIdRange( min = 90005301, max = 90005400 )
public interface EmbeddableLoadingLogger extends BasicLogger {
String LOGGER_NAME = ResultsLogger.LOGGER_NAME + "loading.composite";
String LOCAL_NAME = "composite";
String LOGGER_NAME = LoadingLogger.subLoggerName( LOCAL_NAME );
/**
* Static access to the logging instance
*/
EmbeddableLoadingLogger INSTANCE = Logger.getMessageLogger(
EmbeddableLoadingLogger.class,
LOGGER_NAME
);
Logger INSTANCE = LoadingLogger.subLogger( LOCAL_NAME );
boolean TRACE_ENABLED = INSTANCE.isTraceEnabled();
boolean DEBUG_ENABLED = INSTANCE.isDebugEnabled();
boolean INFO_ENABLED = INSTANCE.isInfoEnabled();
}

View File

@ -6,8 +6,6 @@
*/
package org.hibernate.sql.results.graph.embeddable.internal;
import java.util.function.Consumer;
import org.hibernate.LockMode;
import org.hibernate.engine.FetchTiming;
import org.hibernate.metamodel.mapping.EmbeddableMappingType;
@ -24,7 +22,7 @@
import org.hibernate.sql.results.graph.FetchParent;
import org.hibernate.sql.results.graph.FetchParentAccess;
import org.hibernate.sql.results.graph.Fetchable;
import org.hibernate.sql.results.graph.Initializer;
import org.hibernate.sql.results.graph.embeddable.EmbeddableInitializer;
import org.hibernate.sql.results.graph.embeddable.EmbeddableResultGraphNode;
import org.hibernate.sql.results.graph.embeddable.EmbeddableValuedFetchable;
@ -64,9 +62,7 @@ public EmbeddableFetchImpl(
null,
nullable ? SqlAstJoinType.LEFT : SqlAstJoinType.INNER,
LockMode.NONE,
stem -> creationState.getSqlAliasBaseManager().createSqlAliasBase( stem ),
creationState.getSqlAstCreationState().getSqlExpressionResolver(),
creationState.getSqlAstCreationState().getCreationContext()
creationState.getSqlAstCreationState()
);
return tableGroupJoin.getJoinedGroup();
}
@ -114,18 +110,16 @@ public EmbeddableMappingType getReferencedMappingType() {
@Override
public DomainResultAssembler createAssembler(
FetchParentAccess parentAccess,
Consumer<Initializer> collector,
AssemblerCreationState creationState) {
final EmbeddableFetchInitializer initializer = new EmbeddableFetchInitializer(
parentAccess,
this,
collector,
creationState
final EmbeddableInitializer initializer = (EmbeddableInitializer) creationState.resolveInitializer(
getNavigablePath(),
() -> new EmbeddableFetchInitializer(
parentAccess,
this,
creationState
)
);
collector.accept( initializer );
return new EmbeddableAssembler( initializer );
}
}

View File

@ -6,14 +6,11 @@
*/
package org.hibernate.sql.results.graph.embeddable.internal;
import java.util.function.Consumer;
import org.hibernate.sql.results.graph.embeddable.AbstractEmbeddableInitializer;
import org.hibernate.sql.results.graph.AssemblerCreationState;
import org.hibernate.sql.results.graph.FetchParentAccess;
import org.hibernate.sql.results.graph.embeddable.AbstractEmbeddableInitializer;
import org.hibernate.sql.results.graph.embeddable.EmbeddableInitializer;
import org.hibernate.sql.results.graph.embeddable.EmbeddableResultGraphNode;
import org.hibernate.sql.results.graph.FetchParentAccess;
import org.hibernate.sql.results.graph.Initializer;
/**
* @author Steve Ebersole
@ -24,9 +21,8 @@ public class EmbeddableFetchInitializer
public EmbeddableFetchInitializer(
FetchParentAccess fetchParentAccess,
EmbeddableResultGraphNode resultDescriptor,
Consumer<Initializer> initializerConsumer,
AssemblerCreationState creationState) {
super( resultDescriptor, fetchParentAccess, initializerConsumer, creationState );
super( resultDescriptor, fetchParentAccess, creationState );
}
@Override

View File

@ -8,7 +8,6 @@
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import org.hibernate.engine.FetchTiming;
import org.hibernate.internal.util.MutableInteger;
@ -26,9 +25,9 @@
import org.hibernate.sql.results.graph.DomainResultCreationState;
import org.hibernate.sql.results.graph.Fetch;
import org.hibernate.sql.results.graph.Fetchable;
import org.hibernate.sql.results.graph.Initializer;
import org.hibernate.sql.results.graph.basic.BasicFetch;
import org.hibernate.sql.results.graph.basic.BasicResult;
import org.hibernate.sql.results.graph.embeddable.EmbeddableInitializer;
import org.hibernate.sql.results.graph.embeddable.EmbeddableResultGraphNode;
import org.hibernate.sql.results.graph.entity.internal.EntityFetchDelayedImpl;
import org.hibernate.sql.results.graph.entity.internal.EntityFetchSelectImpl;
@ -36,7 +35,8 @@
/**
* @author Andrea Boriero
*/
public class EmbeddableForeignKeyResultImpl<T> extends AbstractFetchParent
public class EmbeddableForeignKeyResultImpl<T>
extends AbstractFetchParent
implements EmbeddableResultGraphNode, DomainResult<T> {
private final String resultVariable;
@ -119,16 +119,12 @@ public String getResultVariable() {
}
@Override
public DomainResultAssembler<T> createResultAssembler(
Consumer<Initializer> initializerCollector, AssemblerCreationState creationState) {
final EmbeddableResultInitializer initializer = new EmbeddableResultInitializer(
this,
initializerCollector,
creationState
public DomainResultAssembler<T> createResultAssembler(AssemblerCreationState creationState) {
final EmbeddableInitializer initializer = (EmbeddableInitializer) creationState.resolveInitializer(
getNavigablePath(),
() -> new EmbeddableResultInitializer(this, creationState )
);
initializerCollector.accept( initializer );
//noinspection unchecked
return new EmbeddableAssembler( initializer );
}

View File

@ -6,8 +6,6 @@
*/
package org.hibernate.sql.results.graph.embeddable.internal;
import java.util.function.Consumer;
import org.hibernate.LockMode;
import org.hibernate.metamodel.mapping.EmbeddableMappingType;
import org.hibernate.metamodel.mapping.EmbeddableValuedModelPart;
@ -17,11 +15,11 @@
import org.hibernate.sql.ast.tree.from.TableGroupJoin;
import org.hibernate.sql.results.graph.AbstractFetchParent;
import org.hibernate.sql.results.graph.AssemblerCreationState;
import org.hibernate.sql.results.graph.embeddable.EmbeddableResultGraphNode;
import org.hibernate.sql.results.graph.DomainResult;
import org.hibernate.sql.results.graph.DomainResultAssembler;
import org.hibernate.sql.results.graph.DomainResultCreationState;
import org.hibernate.sql.results.graph.Initializer;
import org.hibernate.sql.results.graph.embeddable.EmbeddableInitializer;
import org.hibernate.sql.results.graph.embeddable.EmbeddableResultGraphNode;
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
/**
@ -50,9 +48,7 @@ public EmbeddableResultImpl(
resultVariable,
SqlAstJoinType.INNER,
LockMode.NONE,
creationState.getSqlAstCreationState().getSqlAliasBaseGenerator(),
creationState.getSqlAstCreationState().getSqlExpressionResolver(),
creationState.getSqlAstCreationState().getCreationContext()
creationState.getSqlAstCreationState()
);
return tableGroupJoin.getJoinedGroup();
@ -88,17 +84,15 @@ public EmbeddableValuedModelPart getReferencedMappingContainer() {
}
@Override
public DomainResultAssembler<T> createResultAssembler(
Consumer<Initializer> initializerCollector,
AssemblerCreationState creationState) {
final EmbeddableResultInitializer initializer = new EmbeddableResultInitializer(
this,
initializerCollector,
creationState
public DomainResultAssembler<T> createResultAssembler(AssemblerCreationState creationState) {
final EmbeddableInitializer initializer = (EmbeddableInitializer) creationState.resolveInitializer(
getNavigablePath(),
() -> new EmbeddableResultInitializer(
this,
creationState
)
);
initializerCollector.accept( initializer );
//noinspection unchecked
return new EmbeddableAssembler( initializer );
}

View File

@ -6,12 +6,9 @@
*/
package org.hibernate.sql.results.graph.embeddable.internal;
import java.util.function.Consumer;
import org.hibernate.sql.results.graph.embeddable.AbstractEmbeddableInitializer;
import org.hibernate.sql.results.graph.AssemblerCreationState;
import org.hibernate.sql.results.graph.embeddable.AbstractEmbeddableInitializer;
import org.hibernate.sql.results.graph.embeddable.EmbeddableResultGraphNode;
import org.hibernate.sql.results.graph.Initializer;
/**
* @author Steve Ebersole
@ -19,13 +16,17 @@
public class EmbeddableResultInitializer extends AbstractEmbeddableInitializer {
public EmbeddableResultInitializer(
EmbeddableResultGraphNode resultDescriptor,
Consumer<Initializer> initializerConsumer,
AssemblerCreationState creationState) {
super( resultDescriptor, null, initializerConsumer, creationState );
super( resultDescriptor, null, creationState );
}
@Override
public Object getParentKey() {
return null;
}
@Override
public String toString() {
return "EmbeddableResultInitializer(" + getNavigablePath() + ")";
}
}

View File

@ -11,7 +11,7 @@
import java.util.IdentityHashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
import java.util.function.Supplier;
import org.hibernate.LockMode;
import org.hibernate.WrongClassException;
@ -38,13 +38,14 @@
import org.hibernate.persister.entity.Loadable;
import org.hibernate.proxy.HibernateProxy;
import org.hibernate.query.NavigablePath;
import org.hibernate.sql.results.internal.NullValueAssembler;
import org.hibernate.sql.ast.spi.SqlAstCreationContext;
import org.hibernate.sql.results.graph.AbstractFetchParentAccess;
import org.hibernate.sql.results.graph.AssemblerCreationState;
import org.hibernate.sql.results.graph.DomainResult;
import org.hibernate.sql.results.graph.DomainResultAssembler;
import org.hibernate.sql.results.graph.Fetch;
import org.hibernate.sql.results.graph.Initializer;
import org.hibernate.sql.results.internal.NullValueAssembler;
import org.hibernate.sql.results.jdbc.spi.JdbcValuesSourceProcessingState;
import org.hibernate.sql.results.jdbc.spi.RowProcessingState;
import org.hibernate.type.TypeHelper;
@ -56,10 +57,10 @@
*/
public abstract class AbstractEntityInitializer extends AbstractFetchParentAccess implements EntityInitializer {
// NOTE : even though we only keep the EntityDescriptor here, rather than EntityReference
// NOTE : even though we only keep the EntityDescriptor here, rather than EntityResultGraphNode
// the "scope" of this initializer is a specific EntityReference.
//
// The full EntityReference is simply not needed here, and so we just keep
// The full EntityResultGraphNode is simply not needed here, and so we just keep
// the EntityDescriptor here to avoid chicken/egg issues in the creation of
// these
@ -93,7 +94,6 @@ protected AbstractEntityInitializer(
DomainResult<?> identifierResult,
DomainResult<?> discriminatorResult,
DomainResult<?> versionResult,
Consumer<Initializer> initializerConsumer,
AssemblerCreationState creationState) {
super( );
@ -112,8 +112,38 @@ protected AbstractEntityInitializer(
if ( identifierResult != null ) {
this.identifierAssembler = identifierResult.createResultAssembler(
identifierInitializers::add,
creationState
new AssemblerCreationState() {
@Override
public Initializer resolveInitializer(NavigablePath navigablePath, Supplier<Initializer> producer) {
for ( int i = 0; i < identifierInitializers.size(); i++ ) {
final Initializer existing = identifierInitializers.get( i );
if ( existing.getNavigablePath().equals( navigablePath ) ) {
identifierInitializers.add( existing );
return existing;
}
}
// // also check the non-identifier initializers
// final Initializer otherExisting = creationState.resolveInitializer(
// navigablePath,
// () -> null
// );
//
// if ( otherExisting != null ) {
// identifierInitializers.add( otherExisting );
// return otherExisting;
// }
final Initializer initializer = producer.get();
identifierInitializers.add( initializer );
return initializer;
}
@Override
public SqlAstCreationContext getSqlAstCreationContext() {
return creationState.getSqlAstCreationContext();
}
}
);
}
else {
@ -121,26 +151,14 @@ protected AbstractEntityInitializer(
}
if ( discriminatorResult != null ) {
discriminatorAssembler = discriminatorResult.createResultAssembler(
initializer -> {
throw new UnsupportedOperationException(
"Registering an Initializer as part of Entity discriminator is illegal" );
},
creationState
);
discriminatorAssembler = discriminatorResult.createResultAssembler( creationState );
}
else {
discriminatorAssembler = null;
}
if ( versionResult != null ) {
this.versionAssembler = versionResult.createResultAssembler(
initializer -> {
throw new UnsupportedOperationException(
"Registering an Initializer as part of Entity version is illegal" );
},
creationState
);
this.versionAssembler = versionResult.createResultAssembler( creationState );
}
else {
this.versionAssembler = null;
@ -163,21 +181,17 @@ protected AbstractEntityInitializer(
stateAssembler = new NullValueAssembler( attributeMapping.getMappedTypeDescriptor().getMappedJavaTypeDescriptor() );
}
else {
stateAssembler = fetch.createAssembler(
this,
initializerConsumer,
creationState
);
stateAssembler = fetch.createAssembler( this, creationState );
}
assemblerMap.put( attributeMapping, stateAssembler );
},
null
);
initializerConsumer.accept( this );
}
protected abstract String getSimpleConcreteImplName();
public NavigablePath getNavigablePath() {
return navigablePath;
}
@ -234,7 +248,7 @@ public void resolveKey(RowProcessingState rowProcessingState) {
}
if ( EntityLoadingLogger.TRACE_ENABLED ) {
EntityLoadingLogger.INSTANCE.tracef(
EntityLoadingLogger.LOGGER.tracef(
"(%s) Beginning Initializer#resolveKey process for entity : %s",
StringHelper.collapse( this.getClass().getName() ),
getNavigablePath().getFullPath()
@ -248,9 +262,9 @@ public void resolveKey(RowProcessingState rowProcessingState) {
resolveEntityKey( rowProcessingState );
if ( entityKey == null ) {
EntityLoadingLogger.INSTANCE.debugf(
EntityLoadingLogger.LOGGER.debugf(
"(%s) EntityKey (%s) is null",
StringHelper.collapse( this.getClass().getName() ),
getSimpleConcreteImplName(),
getNavigablePath()
);
@ -260,9 +274,9 @@ public void resolveKey(RowProcessingState rowProcessingState) {
}
if ( EntityLoadingLogger.DEBUG_ENABLED ) {
EntityLoadingLogger.INSTANCE.debugf(
EntityLoadingLogger.LOGGER.debugf(
"(%s) Hydrated EntityKey (%s): %s",
StringHelper.collapse( this.getClass().getName() ),
getSimpleConcreteImplName(),
getNavigablePath(),
entityKey.getIdentifier()
);
@ -355,7 +369,7 @@ public void resolveInstance(RowProcessingState rowProcessingState) {
final Object entityIdentifier = entityKey.getIdentifier();
if ( EntityLoadingLogger.TRACE_ENABLED ) {
EntityLoadingLogger.INSTANCE.tracef(
EntityLoadingLogger.LOGGER.tracef(
"(%s) Beginning Initializer#resolveInstance process for entity (%s) : %s",
StringHelper.collapse( this.getClass().getName() ),
getNavigablePath(),
@ -385,9 +399,9 @@ public void resolveInstance(RowProcessingState rowProcessingState) {
if ( existingLoadingEntry != null ) {
if ( EntityLoadingLogger.DEBUG_ENABLED ) {
EntityLoadingLogger.INSTANCE.debugf(
EntityLoadingLogger.LOGGER.debugf(
"(%s) Found existing loading entry [%s] - using loading instance",
StringHelper.collapse( this.getClass().getName() ),
getSimpleConcreteImplName(),
toLoggableString( getNavigablePath(), entityIdentifier )
);
}
@ -397,9 +411,9 @@ public void resolveInstance(RowProcessingState rowProcessingState) {
if ( existingLoadingEntry.getEntityInitializer() != this ) {
// the entity is already being loaded elsewhere
if ( EntityLoadingLogger.DEBUG_ENABLED ) {
EntityLoadingLogger.INSTANCE.debugf(
EntityLoadingLogger.LOGGER.debugf(
"(%s) Entity [%s] being loaded by another initializer [%s] - skipping processing",
StringHelper.collapse( this.getClass().getName() ),
getSimpleConcreteImplName(),
toLoggableString( getNavigablePath(), entityIdentifier ),
existingLoadingEntry.getEntityInitializer()
);
@ -433,8 +447,9 @@ public void resolveInstance(RowProcessingState rowProcessingState) {
entityInstance = session.instantiate( concreteDescriptor.getEntityName(), entityKey.getIdentifier() );
if ( EntityLoadingLogger.DEBUG_ENABLED ) {
EntityLoadingLogger.INSTANCE.debugf(
"Created new entity instance [%s] : %s",
EntityLoadingLogger.LOGGER.debugf(
"(%s) Created new entity instance [%s] : %s",
getSimpleConcreteImplName(),
toLoggableString( getNavigablePath(), entityIdentifier ),
entityInstance
);
@ -475,8 +490,9 @@ public void initializeInstance(RowProcessingState rowProcessingState) {
final Serializable entityIdentifier = entityKey.getIdentifier();
if ( EntityLoadingLogger.TRACE_ENABLED ) {
EntityLoadingLogger.INSTANCE.tracef(
"Beginning Initializer#initializeInstance process for entity %s",
EntityLoadingLogger.LOGGER.tracef(
"(%s) Beginning Initializer#initializeInstance process for entity %s",
getSimpleConcreteImplName(),
toLoggableString( getNavigablePath(), entityIdentifier )
);
}
@ -549,8 +565,9 @@ public void initializeInstance(RowProcessingState rowProcessingState) {
if ( cacheAccess != null && session.getCacheMode().isPutEnabled() ) {
if ( EntityLoadingLogger.DEBUG_ENABLED ) {
EntityLoadingLogger.INSTANCE.debugf(
"Adding entityInstance to second-level cache: %s",
EntityLoadingLogger.LOGGER.debugf(
"(%S) Adding entityInstance to second-level cache: %s",
getSimpleConcreteImplName(),
toLoggableString( getNavigablePath(), entityIdentifier )
);
}
@ -605,8 +622,8 @@ public void initializeInstance(RowProcessingState rowProcessingState) {
persistenceContext.getNaturalIdHelper().cacheNaturalIdCrossReferenceFromLoad(
entityDescriptor,
entityIdentifier,
persistenceContext
.getNaturalIdHelper().extractNaturalIdValues( resolvedEntityState, entityDescriptor )
persistenceContext.getNaturalIdHelper()
.extractNaturalIdValues( resolvedEntityState, entityDescriptor )
);
}
@ -643,8 +660,9 @@ public void initializeInstance(RowProcessingState rowProcessingState) {
concreteDescriptor.afterInitialize( entityInstance, session );
if ( EntityLoadingLogger.DEBUG_ENABLED ) {
EntityLoadingLogger.INSTANCE.debugf(
"Done materializing entityInstance : %s",
EntityLoadingLogger.LOGGER.debugf(
"(%s) Done materializing entityInstance : %s",
getSimpleConcreteImplName(),
toLoggableString( getNavigablePath(), entityIdentifier )
);
}

View File

@ -6,8 +6,6 @@
*/
package org.hibernate.sql.results.graph.entity;
import java.util.function.Consumer;
import org.hibernate.metamodel.mapping.EntityMappingType;
import org.hibernate.metamodel.mapping.EntityValuedModelPart;
import org.hibernate.query.NavigablePath;
@ -17,7 +15,6 @@
import org.hibernate.sql.results.graph.FetchParent;
import org.hibernate.sql.results.graph.FetchParentAccess;
import org.hibernate.sql.results.graph.Fetchable;
import org.hibernate.sql.results.graph.Initializer;
import org.hibernate.sql.results.graph.entity.internal.EntityAssembler;
/**
@ -64,19 +61,13 @@ public Fetchable getFetchedMapping() {
@Override
public DomainResultAssembler createAssembler(
FetchParentAccess parentAccess,
Consumer<Initializer> collector,
AssemblerCreationState creationState) {
final EntityInitializer entityInitializer = getEntityInitializer(
parentAccess,
collector,
creationState
);
final EntityInitializer entityInitializer = getEntityInitializer( parentAccess, creationState );
return new EntityAssembler( getFetchedMapping().getJavaTypeDescriptor(), entityInitializer );
}
protected abstract EntityInitializer getEntityInitializer(
FetchParentAccess parentAccess,
Consumer<Initializer> collector,
AssemblerCreationState creationState);
@Override

View File

@ -6,30 +6,21 @@
*/
package org.hibernate.sql.results.graph.entity;
import org.hibernate.sql.results.ResultsLogger;
import org.hibernate.sql.results.LoadingLogger;
import org.jboss.logging.BasicLogger;
import org.jboss.logging.Logger;
import org.jboss.logging.annotations.MessageLogger;
import org.jboss.logging.annotations.ValidIdRange;
/**
* @author Steve Ebersole
*/
@MessageLogger( projectCode = "HHH" )
@ValidIdRange( min = 90005201, max = 90005300 )
public interface EntityLoadingLogger extends BasicLogger {
String LOGGER_NAME = ResultsLogger.LOGGER_NAME + "loading.entity";
public interface EntityLoadingLogger {
String LOGGER_NAME = LoadingLogger.subLoggerName( "entity" );
/**
* Static access to the logging instance
*/
EntityLoadingLogger INSTANCE = Logger.getMessageLogger(
EntityLoadingLogger.class,
LOGGER_NAME
);
Logger LOGGER = LoadingLogger.subLogger( "entity" );
boolean TRACE_ENABLED = INSTANCE.isTraceEnabled();
boolean DEBUG_ENABLED = INSTANCE.isDebugEnabled();
boolean INFO_ENABLED = INSTANCE.isInfoEnabled();
boolean TRACE_ENABLED = LOGGER.isTraceEnabled();
boolean DEBUG_ENABLED = LOGGER.isDebugEnabled();
}

View File

@ -18,6 +18,7 @@
public class EntityAssembler implements DomainResultAssembler {
private final JavaTypeDescriptor javaTypeDescriptor;
private final EntityInitializer initializer;
private EntityInitializer replacedInitializer;
public EntityAssembler(
JavaTypeDescriptor javaTypeDescriptor,

View File

@ -6,8 +6,6 @@
*/
package org.hibernate.sql.results.graph.entity.internal;
import java.util.function.Consumer;
import org.hibernate.LockMode;
import org.hibernate.engine.FetchTiming;
import org.hibernate.metamodel.mapping.internal.SingularAssociationAttributeMapping;
@ -17,7 +15,6 @@
import org.hibernate.sql.results.graph.DomainResultAssembler;
import org.hibernate.sql.results.graph.FetchParent;
import org.hibernate.sql.results.graph.FetchParentAccess;
import org.hibernate.sql.results.graph.Initializer;
import org.hibernate.sql.results.graph.entity.EntityInitializer;
/**
@ -57,14 +54,16 @@ public boolean hasTableGroup() {
@Override
public DomainResultAssembler createAssembler(
FetchParentAccess parentAccess,
Consumer<Initializer> collector,
AssemblerCreationState creationState) {
final EntityInitializer entityInitializer = new EntityFetchDelayedInitializer(
final EntityInitializer entityInitializer = (EntityInitializer) creationState.resolveInitializer(
getNavigablePath(),
getEntityValuedModelPart().getEntityMappingType().getEntityPersister(),
keyResult.createResultAssembler( collector, creationState )
() -> new EntityFetchDelayedInitializer(
getNavigablePath(),
getEntityValuedModelPart().getEntityMappingType().getEntityPersister(),
keyResult.createResultAssembler( creationState )
)
);
collector.accept( entityInitializer );
return new EntityAssembler( getFetchedMapping().getJavaTypeDescriptor(), entityInitializer );
}
}

View File

@ -6,8 +6,6 @@
*/
package org.hibernate.sql.results.graph.entity.internal;
import java.util.function.Consumer;
import org.hibernate.LockMode;
import org.hibernate.engine.FetchTiming;
import org.hibernate.query.NavigablePath;
@ -15,7 +13,6 @@
import org.hibernate.sql.results.graph.DomainResultCreationState;
import org.hibernate.sql.results.graph.FetchParent;
import org.hibernate.sql.results.graph.FetchParentAccess;
import org.hibernate.sql.results.graph.Initializer;
import org.hibernate.sql.results.graph.entity.AbstractNonLazyEntityFetch;
import org.hibernate.sql.results.graph.entity.EntityInitializer;
import org.hibernate.sql.results.graph.entity.EntityValuedFetchable;
@ -49,17 +46,18 @@ public EntityFetchJoinedImpl(
@Override
protected EntityInitializer getEntityInitializer(
FetchParentAccess parentAccess,
Consumer<Initializer> collector,
AssemblerCreationState creationState) {
return new EntityJoinedFetchInitializer(
entityResult,
return (EntityInitializer) creationState.resolveInitializer(
getNavigablePath(),
lockMode,
entityResult.getIdentifierResult(),
entityResult.getDiscriminatorResult(),
entityResult.getVersionResult(),
collector,
creationState
() -> new EntityJoinedFetchInitializer(
entityResult,
getNavigablePath(),
lockMode,
entityResult.getIdentifierResult(),
entityResult.getDiscriminatorResult(),
entityResult.getVersionResult(),
creationState
)
);
}

View File

@ -6,8 +6,6 @@
*/
package org.hibernate.sql.results.graph.entity.internal;
import java.util.function.Consumer;
import org.hibernate.LockMode;
import org.hibernate.engine.FetchTiming;
import org.hibernate.metamodel.mapping.internal.SingularAssociationAttributeMapping;
@ -18,7 +16,7 @@
import org.hibernate.sql.results.graph.DomainResultCreationState;
import org.hibernate.sql.results.graph.FetchParent;
import org.hibernate.sql.results.graph.FetchParentAccess;
import org.hibernate.sql.results.graph.Initializer;
import org.hibernate.sql.results.graph.entity.EntityInitializer;
/**
* An eager entity fetch performed as a subsequent (n+1) select
@ -53,22 +51,17 @@ public boolean hasTableGroup() {
}
@Override
public DomainResultAssembler createAssembler(
FetchParentAccess parentAccess,
Consumer<Initializer> collector,
AssemblerCreationState creationState) {
final EntitySelectFetchInitializer initializer = new EntitySelectFetchInitializer(
public DomainResultAssembler createAssembler(FetchParentAccess parentAccess, AssemblerCreationState creationState) {
final EntityInitializer initializer = (EntityInitializer) creationState.resolveInitializer(
getNavigablePath(),
getReferencedMappingContainer().getEntityPersister(),
result.createResultAssembler( collector, creationState ),
nullable
() -> new EntitySelectFetchInitializer(
getNavigablePath(),
getReferencedMappingContainer().getEntityPersister(),
result.createResultAssembler( creationState ),
nullable
)
);
collector.accept( initializer );
return new EntityAssembler(
getResultJavaTypeDescriptor(),
initializer
);
return new EntityAssembler( getResultJavaTypeDescriptor(), initializer );
}
}

View File

@ -6,21 +6,19 @@
*/
package org.hibernate.sql.results.graph.entity.internal;
import java.util.function.Consumer;
import org.hibernate.LockMode;
import org.hibernate.internal.log.LoggingHelper;
import org.hibernate.sql.results.graph.entity.AbstractEntityInitializer;
import org.hibernate.query.NavigablePath;
import org.hibernate.sql.results.graph.AssemblerCreationState;
import org.hibernate.sql.results.graph.DomainResult;
import org.hibernate.sql.results.graph.entity.AbstractEntityInitializer;
import org.hibernate.sql.results.graph.entity.EntityResultGraphNode;
import org.hibernate.sql.results.graph.Initializer;
/**
* @author Andrea Boriero
*/
public class EntityJoinedFetchInitializer extends AbstractEntityInitializer {
private static final String CONCRETE_NAME = EntityJoinedFetchInitializer.class.getSimpleName();
protected EntityJoinedFetchInitializer(
EntityResultGraphNode resultDescriptor,
@ -29,7 +27,6 @@ protected EntityJoinedFetchInitializer(
DomainResult<?> identifierResult,
DomainResult<?> discriminatorResult,
DomainResult<?> versionResult,
Consumer<Initializer> initializerConsumer,
AssemblerCreationState creationState) {
super(
resultDescriptor,
@ -38,11 +35,15 @@ protected EntityJoinedFetchInitializer(
identifierResult,
discriminatorResult,
versionResult,
initializerConsumer,
creationState
);
}
@Override
protected String getSimpleConcreteImplName() {
return CONCRETE_NAME;
}
@Override
protected boolean isEntityReturn() {
return false;
@ -50,6 +51,6 @@ protected boolean isEntityReturn() {
@Override
public String toString() {
return "EntityFetchInitializer(" + LoggingHelper.toLoggableString( getNavigablePath() ) + ")";
return "EntityJoinedFetchInitializer(" + LoggingHelper.toLoggableString( getNavigablePath() ) + ")";
}
}

View File

@ -6,8 +6,6 @@
*/
package org.hibernate.sql.results.graph.entity.internal;
import java.util.function.Consumer;
import org.hibernate.metamodel.mapping.EntityMappingType;
import org.hibernate.metamodel.mapping.EntityValuedModelPart;
import org.hibernate.query.NavigablePath;
@ -16,6 +14,7 @@
import org.hibernate.sql.results.graph.DomainResultCreationState;
import org.hibernate.sql.results.graph.FetchableContainer;
import org.hibernate.sql.results.graph.entity.AbstractEntityResultGraphNode;
import org.hibernate.sql.results.graph.entity.EntityInitializer;
import org.hibernate.sql.results.graph.entity.EntityResult;
/**
@ -68,20 +67,18 @@ public String getResultVariable() {
}
@Override
public DomainResultAssembler createResultAssembler(
Consumer initializerCollector,
AssemblerCreationState creationState) {
// todo (6.0) : seems like here is where we ought to determine the SQL selection mappings
final EntityResultInitializer initializer = new EntityResultInitializer(
this,
public DomainResultAssembler createResultAssembler(AssemblerCreationState creationState) {
final EntityInitializer initializer = (EntityInitializer) creationState.resolveInitializer(
getNavigablePath(),
getLockMode(),
getIdentifierResult(),
getDiscriminatorResult(),
getVersionResult(),
initializerCollector,
creationState
() -> new EntityResultInitializer(
this,
getNavigablePath(),
getLockMode(),
getIdentifierResult(),
getDiscriminatorResult(),
getVersionResult(),
creationState
)
);
return new EntityAssembler( getResultJavaTypeDescriptor(), initializer );

View File

@ -6,15 +6,13 @@
*/
package org.hibernate.sql.results.graph.entity.internal;
import java.util.function.Consumer;
import org.hibernate.LockMode;
import org.hibernate.sql.results.graph.entity.AbstractEntityInitializer;
import org.hibernate.query.NavigablePath;
import org.hibernate.sql.results.graph.AssemblerCreationState;
import org.hibernate.sql.results.graph.DomainResult;
import org.hibernate.sql.results.graph.collection.internal.MapInitializer;
import org.hibernate.sql.results.graph.entity.AbstractEntityInitializer;
import org.hibernate.sql.results.graph.entity.EntityResultGraphNode;
import org.hibernate.sql.results.graph.Initializer;
/**
* Initializer for cases where the entity is a root domain selection
@ -22,6 +20,8 @@
* @author Steve Ebersole
*/
public class EntityResultInitializer extends AbstractEntityInitializer {
private static final String CONCRETE_NAME = EntityResultInitializer.class.getSimpleName();
public EntityResultInitializer(
EntityResultGraphNode resultDescriptor,
NavigablePath navigablePath,
@ -29,7 +29,6 @@ public EntityResultInitializer(
DomainResult identifierResult,
DomainResult discriminatorResult,
DomainResult versionResult,
Consumer<Initializer> initializerConsumer,
AssemblerCreationState creationState) {
super(
resultDescriptor,
@ -38,11 +37,15 @@ public EntityResultInitializer(
identifierResult,
discriminatorResult,
versionResult,
initializerConsumer,
creationState
);
}
@Override
protected String getSimpleConcreteImplName() {
return CONCRETE_NAME;
}
@Override
protected boolean isEntityReturn() {
return true;

View File

@ -6,8 +6,6 @@
*/
package org.hibernate.sql.results.graph.entity.internal;
import java.util.function.Consumer;
import org.hibernate.metamodel.mapping.EntityDiscriminatorMapping;
import org.hibernate.metamodel.mapping.EntityMappingType;
import org.hibernate.metamodel.mapping.EntityValuedModelPart;
@ -17,6 +15,7 @@
import org.hibernate.sql.results.graph.AssemblerCreationState;
import org.hibernate.sql.results.graph.DomainResultAssembler;
import org.hibernate.sql.results.graph.DomainResultCreationState;
import org.hibernate.sql.results.graph.entity.EntityInitializer;
/**
* @author Andrea Boriero
@ -31,20 +30,18 @@ public EntityResultJoinedSubclassImpl(
}
@Override
public DomainResultAssembler createResultAssembler(
Consumer initializerCollector,
AssemblerCreationState creationState) {
// todo (6.0) : seems like here is where we ought to determine the SQL selection mappings
final EntityResultInitializer initializer = new EntityResultInitializer(
this,
public DomainResultAssembler createResultAssembler(AssemblerCreationState creationState) {
final EntityInitializer initializer = (EntityInitializer) creationState.resolveInitializer(
getNavigablePath(),
getLockMode(),
getIdentifierResult(),
getDiscriminatorResult(),
getVersionResult(),
initializerCollector,
creationState
() -> new EntityResultInitializer(
this,
getNavigablePath(),
getLockMode(),
getIdentifierResult(),
getDiscriminatorResult(),
getVersionResult(),
creationState
)
);
return new EntityAssembler( getResultJavaTypeDescriptor(), initializer );

View File

@ -26,6 +26,8 @@
import org.hibernate.sql.results.graph.DomainResultAssembler;
import org.hibernate.sql.results.graph.DomainResultCreationState;
import org.hibernate.sql.results.graph.FetchableContainer;
import org.hibernate.sql.results.graph.Initializer;
import org.hibernate.sql.results.graph.entity.EntityInitializer;
import org.hibernate.sql.results.graph.entity.EntityResult;
import org.hibernate.sql.results.graph.entity.EntityResultGraphNode;
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
@ -186,20 +188,20 @@ public String getResultVariable() {
}
@Override
public DomainResultAssembler createResultAssembler(
Consumer initializerCollector,
AssemblerCreationState creationState) {
public DomainResultAssembler createResultAssembler(AssemblerCreationState creationState) {
// todo (6.0) : seems like here is where we ought to determine the SQL selection mappings
final EntityResultInitializer initializer = new EntityResultInitializer(
this,
final EntityInitializer initializer = (EntityInitializer) creationState.resolveInitializer(
getNavigablePath(),
getLockMode(),
null,
getDiscriminatorResult(),
getVersionResult(),
initializerCollector,
creationState
() -> new EntityResultInitializer(
this,
getNavigablePath(),
getLockMode(),
null,
getDiscriminatorResult(),
getVersionResult(),
creationState
)
);
return new EntityAssembler( getResultJavaTypeDescriptor(), initializer );

View File

@ -6,11 +6,8 @@
*/
package org.hibernate.sql.results.graph.instantiation.internal;
import java.util.function.Consumer;
import org.hibernate.sql.results.graph.AssemblerCreationState;
import org.hibernate.sql.results.graph.DomainResult;
import org.hibernate.sql.results.graph.Initializer;
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
/**
@ -35,11 +32,10 @@ public JavaTypeDescriptor getResultJavaTypeDescriptor() {
@Override
public ArgumentReader<A> createResultAssembler(
Consumer<Initializer> initializerCollector,
AssemblerCreationState creationState) {
//noinspection unchecked
return new ArgumentReader(
realDomainResult.createResultAssembler( initializerCollector, creationState ),
realDomainResult.createResultAssembler( creationState ),
getResultVariable()
);
}

View File

@ -11,7 +11,6 @@
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.function.Consumer;
import org.hibernate.internal.util.StringHelper;
import org.hibernate.query.DynamicInstantiationNature;
@ -19,7 +18,6 @@
import org.hibernate.sql.results.graph.AssemblerCreationState;
import org.hibernate.sql.results.graph.DomainResultAssembler;
import org.hibernate.sql.results.graph.instantiation.DynamicInstantiationResult;
import org.hibernate.sql.results.graph.Initializer;
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
import org.jboss.logging.Logger;
@ -58,9 +56,7 @@ public String getResultVariable() {
}
@Override
public DomainResultAssembler<R> createResultAssembler(
Consumer<Initializer> initializerConsumer,
AssemblerCreationState creationState) {
public DomainResultAssembler<R> createResultAssembler(AssemblerCreationState creationState) {
boolean areAllArgumentsAliased = true;
boolean areAnyArgumentsAliased = false;
final Set<String> aliases = new HashSet<>();
@ -84,7 +80,7 @@ public DomainResultAssembler<R> createResultAssembler(
}
argumentReaders.add(
argumentResult.createResultAssembler( initializerConsumer, creationState )
argumentResult.createResultAssembler( creationState )
);
}
}

View File

@ -87,7 +87,7 @@ public void load(Consumer<List> loadingEntryConsumer) {
final PersistenceContext persistenceContext = session.getPersistenceContext();
final CollectionPersister collectionDescriptor = getCollectionDescriptor();
Helper.finalizeCollectionLoading( persistenceContext, collectionDescriptor, collectionInstance, getKey() );
ResultsHelper.finalizeCollectionLoading( persistenceContext, collectionDescriptor, collectionInstance, getKey() );
}
@Override

View File

@ -7,8 +7,10 @@
package org.hibernate.sql.results.internal;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.function.Consumer;
import java.util.Map;
import java.util.function.Supplier;
import org.hibernate.collection.spi.PersistentCollection;
import org.hibernate.engine.spi.BatchFetchQueue;
@ -16,8 +18,11 @@
import org.hibernate.engine.spi.PersistenceContext;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.persister.collection.CollectionPersister;
import org.hibernate.query.NavigablePath;
import org.hibernate.sql.ast.spi.SqlAstCreationContext;
import org.hibernate.sql.exec.spi.Callback;
import org.hibernate.sql.results.ResultsLogger;
import org.hibernate.sql.results.graph.AssemblerCreationState;
import org.hibernate.sql.results.graph.DomainResultAssembler;
import org.hibernate.sql.results.graph.Initializer;
import org.hibernate.sql.results.jdbc.spi.JdbcValues;
@ -27,17 +32,48 @@
/**
* @author Steve Ebersole
*/
public class Helper {
public class ResultsHelper {
public static <R> RowReader<R> createRowReader(
SessionFactoryImplementor sessionFactory,
Callback callback,
RowTransformer<R> rowTransformer,
JdbcValues jdbcValues) {
final Map<NavigablePath,Initializer> initializerMap = new LinkedHashMap<>();
final List<Initializer> initializers = new ArrayList<>();
//noinspection rawtypes
final List<DomainResultAssembler> assemblers = jdbcValues.getValuesMapping().resolveAssemblers(
getInitializerConsumer( initializers ),
() -> sessionFactory
new AssemblerCreationState() {
@Override
public Initializer resolveInitializer(
NavigablePath navigablePath,
Supplier<Initializer> producer) {
final Initializer existing = initializerMap.get( navigablePath );
if ( existing != null ) {
ResultsLogger.LOGGER.debugf(
"Returning previously-registered initializer : %s",
existing
);
return existing;
}
final Initializer initializer = producer.get();
ResultsLogger.LOGGER.debugf(
"Registering initializer : %s",
initializer
);
initializerMap.put( navigablePath, initializer );
initializers.add( initializer );
return initializer;
}
@Override
public SqlAstCreationContext getSqlAstCreationContext() {
return sessionFactory;
}
}
);
return new StandardRowReader<>(
@ -48,18 +84,6 @@ public static <R> RowReader<R> createRowReader(
);
}
private static Consumer<Initializer> getInitializerConsumer(List<Initializer> initializers) {
return initializer -> {
ResultsLogger.LOGGER.debugf( "Initializer registration : %s", initializer );
if ( initializers.contains( initializer ) ) {
ResultsLogger.LOGGER.debug( "Skipping initializer registration - already registered" );
}
ResultsLogger.LOGGER.debugf( "Adding initializer : %s", initializer );
initializers.add( initializer );
};
}
public static void finalizeCollectionLoading(
PersistenceContext persistenceContext,
CollectionPersister collectionDescriptor,

View File

@ -6,10 +6,7 @@
*/
package org.hibernate.sql.results.internal.domain;
import java.util.function.Consumer;
import org.hibernate.LockMode;
import org.hibernate.NotYetImplementedFor6Exception;
import org.hibernate.engine.FetchStrategy;
import org.hibernate.engine.FetchTiming;
import org.hibernate.engine.spi.CollectionKey;
@ -91,7 +88,6 @@ public JavaTypeDescriptor getResultJavaTypeDescriptor() {
@Override
public DomainResultAssembler createAssembler(
FetchParentAccess parentAccess,
Consumer<Initializer> collector,
AssemblerCreationState creationState) {
return new CircularFetchAssembler(
fetchable,

View File

@ -7,14 +7,12 @@
package org.hibernate.sql.results.jdbc.internal;
import java.util.List;
import java.util.function.Consumer;
import org.hibernate.internal.util.collections.CollectionHelper;
import org.hibernate.sql.ast.spi.SqlSelection;
import org.hibernate.sql.results.graph.AssemblerCreationState;
import org.hibernate.sql.results.graph.DomainResult;
import org.hibernate.sql.results.graph.DomainResultAssembler;
import org.hibernate.sql.results.graph.Initializer;
import org.hibernate.sql.results.jdbc.spi.JdbcValuesMapping;
/**
@ -42,17 +40,12 @@ public List<DomainResult> getDomainResults() {
}
@Override
public List<DomainResultAssembler> resolveAssemblers(
Consumer<Initializer> initializerConsumer,
AssemblerCreationState creationState) {
public List<DomainResultAssembler> resolveAssemblers(AssemblerCreationState creationState) {
final List<DomainResultAssembler> assemblers = CollectionHelper.arrayList( domainResults.size() );
//noinspection ForLoopReplaceableByForEach
for ( int i = 0; i < domainResults.size(); i++ ) {
final DomainResultAssembler resultAssembler = domainResults.get( i ).createResultAssembler(
initializerConsumer,
creationState
);
final DomainResultAssembler resultAssembler = domainResults.get( i ).createResultAssembler( creationState );
assemblers.add( resultAssembler );
}

View File

@ -7,12 +7,10 @@
package org.hibernate.sql.results.jdbc.spi;
import java.util.List;
import java.util.function.Consumer;
import org.hibernate.sql.results.graph.AssemblerCreationState;
import org.hibernate.sql.results.graph.DomainResult;
import org.hibernate.sql.results.graph.DomainResultAssembler;
import org.hibernate.sql.results.graph.Initializer;
import org.hibernate.sql.ast.spi.SqlSelection;
/**
@ -33,7 +31,5 @@ public interface JdbcValuesMapping {
List<DomainResult> getDomainResults();
List<DomainResultAssembler> resolveAssemblers(
Consumer<Initializer> initializerConsumer,
AssemblerCreationState creationState);
List<DomainResultAssembler> resolveAssemblers(AssemblerCreationState creationState);
}

View File

@ -13,6 +13,7 @@
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import org.hibernate.Hibernate;
@ -36,63 +37,36 @@
@DomainModel(
annotatedClasses = {
ManyToOneEmbeddedIdWithToOneFKTest.System.class,
ManyToOneEmbeddedIdWithToOneFKTest.SystemUser.class,
ManyToOneEmbeddedIdWithToOneFKTest.Subsystem.class
ManyToOneEmbeddedIdWithToOneFKTest.DataCenterUser.class,
ManyToOneEmbeddedIdWithToOneFKTest.DataCenter.class
}
)
@SessionFactory(statementInspectorClass = SQLStatementInspector.class)
public class ManyToOneEmbeddedIdWithToOneFKTest {
@BeforeEach
public void setUp(SessionFactoryScope scope) {
scope.inTransaction(
session -> {
Subsystem subsystem = new Subsystem( 2, "sub1" );
PK userKey = new PK( subsystem, "Fab" );
SystemUser user = new SystemUser( userKey, "Fab" );
System system = new System( 1, "sub1" );
system.setUser( user );
session.save( subsystem );
session.save( user );
session.save( system );
}
);
}
@AfterEach
public void tearDown(SessionFactoryScope scope) {
scope.inTransaction(
session -> {
session.createQuery( "delete from System" ).executeUpdate();
session.createQuery( "delete from SystemUser" ).executeUpdate();
session.createQuery( "delete from Subsystem" ).executeUpdate();
}
);
}
@Test
public void testGet(SessionFactoryScope scope) {
SQLStatementInspector statementInspector = (SQLStatementInspector) scope.getStatementInspector();
statementInspector.clear();
scope.inTransaction(
session -> {
System system = session.get( System.class, 1 );
final System system = session.get( System.class, 1 );
assertThat( system, is( notNullValue() ) );
assertThat( system.getId() , is(1) );
assertThat( system.getId() , is(1 ) );
assertTrue( Hibernate.isInitialized( system.getUser() ) );
assertThat( system.getDataCenterUser(), notNullValue() );
assertThat( system.getDataCenterUser().getPk(), notNullValue() );
assertTrue( Hibernate.isInitialized( system.getDataCenterUser() ) );
PK pk = system.getUser().getPk();
assertTrue( Hibernate.isInitialized( pk.subsystem ) );
final PK pk = system.getDataCenterUser().getPk();
assertTrue( Hibernate.isInitialized( pk.dataCenter ) );
assertThat( pk.username, is( "Fab"));
assertThat( pk.subsystem.id, is( 2));
assertThat( pk.subsystem.getDescription(), is( "sub1"));
assertThat( pk.username, is( "Fab" ) );
assertThat( pk.dataCenter.id, is( 2 ) );
assertThat( pk.dataCenter.getDescription(), is( "Raleigh" ) );
SystemUser user = system.getUser();
assertThat( user, is( notNullValue() ) );
final DataCenterUser user = system.getDataCenterUser();
assertThat( user, notNullValue() );
statementInspector.assertExecutedCount( 1 );
statementInspector.assertNumberOfOccurrenceInQuery( 0, "join", 2 );
@ -106,39 +80,64 @@ public void testHql(SessionFactoryScope scope) {
statementInspector.clear();
/*
select
s1_0.id_,
s1_0.name as name2_1_,
s1_0.user_subsystem_id ,
s1_0.user_username_
s1_0.id,
s1_0.dataCenterUser_dataCenter_id,
s1_0.dataCenterUser_username,
s1_0.name
from
System s1_0
where
s1_0.id=?
select
s2_0.id,
s2_0.description_
select
d1_0.id,
d1_0.description
from
Subsystem s2_0
where
s2_0.id=?
data_center as d1_0
where
d1_0.id = ?
select
s1_0.subsystem_id,
s1_0.username
d1_0.dataCenter_id,
d1_0.username,
d1_0.privilegeMask
from
SystemUser as s1_0
data_center_user as d1_0
where
(
s1_0.subsystem_id, s1_0.username
d1_0.dataCenter_id, d1_0.username
) in (
(
?, ?
)
)
NOTE: currently the 3rd query is:
select
d2_0.id,
d2_0.description,
d1_0.dataCenter_id,
d1_0.username,
d1_0.privilegeMask
from
data_center_user as d1_0
inner join
data_center as d2_0
on d1_0.dataCenter_id = d2_0.id
where
(
d1_0.dataCenter_id, d1_0.username
) in (
(
?, ?
)
)
*/
scope.inTransaction(
session -> {
// this HQL should load the System with id = 1
System system = (System) session.createQuery( "from System e where e.id = :id" )
.setParameter( "id", 1 ).uniqueResult();
@ -150,16 +149,16 @@ public void testHql(SessionFactoryScope scope) {
statementInspector.assertNumberOfOccurrenceInQuery( 2, "join", 0 );
assertTrue( Hibernate.isInitialized( system.getUser() ) );
assertTrue( Hibernate.isInitialized( system.getDataCenterUser() ) );
final PK pk = system.getUser().getPk();
assertTrue( Hibernate.isInitialized( pk.subsystem ) );
final PK pk = system.getDataCenterUser().getPk();
assertTrue( Hibernate.isInitialized( pk.dataCenter ) );
assertThat( pk.username, is( "Fab"));
assertThat( pk.subsystem.id, is( 2));
assertThat( pk.subsystem.getDescription(), is( "sub1"));
assertThat( pk.username, is( "Fab" ) );
assertThat( pk.dataCenter.id, is( 2 ) );
assertThat( pk.dataCenter.getDescription(), is( "Raleigh" ) );
SystemUser user = system.getUser();
DataCenterUser user = system.getDataCenterUser();
assertThat( user, is( notNullValue() ) );
statementInspector.assertExecutedCount( 3 );
}
@ -172,14 +171,14 @@ public void testHqlJoin(SessionFactoryScope scope) {
statementInspector.clear();
scope.inTransaction(
session -> {
System system = session.createQuery( "from System e join e.user where e.id = :id", System.class )
System system = session.createQuery( "from System e join e.dataCenterUser where e.id = :id", System.class )
.setParameter( "id", 1 ).uniqueResult();
statementInspector.assertExecutedCount( 3 );
statementInspector.assertNumberOfOccurrenceInQuery( 0, "join", 1 );
statementInspector.assertNumberOfOccurrenceInQuery( 1, "join", 0 );
statementInspector.assertNumberOfOccurrenceInQuery( 2, "join", 0 );
assertThat( system, is( notNullValue() ) );
SystemUser user = system.getUser();
DataCenterUser user = system.getDataCenterUser();
assertThat( user, is( notNullValue() ) );
}
);
@ -192,7 +191,7 @@ public void testHqlJoinFetch(SessionFactoryScope scope) {
scope.inTransaction(
session -> {
System system = session.createQuery(
"from System e join fetch e.user where e.id = :id",
"from System e join fetch e.dataCenterUser where e.id = :id",
System.class
)
.setParameter( "id", 1 ).uniqueResult();
@ -200,7 +199,7 @@ public void testHqlJoinFetch(SessionFactoryScope scope) {
statementInspector.assertNumberOfOccurrenceInQuery( 0, "join", 1 );
statementInspector.assertNumberOfOccurrenceInQuery( 1, "join", 0 );
assertThat( system, is( notNullValue() ) );
SystemUser user = system.getUser();
DataCenterUser user = system.getDataCenterUser();
assertThat( user, is( notNullValue() ) );
}
);
@ -211,9 +210,9 @@ public void testHqlJoinFetch(SessionFactoryScope scope) {
public void testEmbeddedIdParameter(SessionFactoryScope scope) {
scope.inTransaction(
session -> {
Subsystem subsystem = new Subsystem( 2, "sub1" );
DataCenter dataCenter = new DataCenter( 2, "sub1" );
PK superUserKey = new PK( subsystem, "Fab" );
PK superUserKey = new PK( dataCenter, "Fab" );
System system = session.createQuery(
"from System e join fetch e.user u where u.id = :id",
@ -247,7 +246,7 @@ public void testHql2(SessionFactoryScope scope) {
*/
scope.inTransaction(
session -> {
SystemUser system = (SystemUser) session.createQuery( "from SystemUser " )
DataCenterUser system = (DataCenterUser) session.createQuery( "from DataCenterUser " )
.uniqueResult();
assertThat( system, is( notNullValue() ) );
@ -255,21 +254,81 @@ public void testHql2(SessionFactoryScope scope) {
statementInspector.assertNumberOfOccurrenceInQuery( 0, "join", 0 );
statementInspector.assertNumberOfOccurrenceInQuery( 1, "join", 0 );
assertTrue( Hibernate.isInitialized( system.getPk().subsystem ) );
assertTrue( Hibernate.isInitialized( system.getPk().dataCenter ) );
}
);
}
@BeforeEach
public void setUp(SessionFactoryScope scope) {
scope.inTransaction(
session -> {
DataCenter dataCenter = new DataCenter( 2, "Raleigh" );
PK userKey = new PK( dataCenter, "Fab" );
DataCenterUser user = new DataCenterUser( userKey, (byte) 1 );
System system = new System( 1, "QA" );
system.setDataCenterUser( user );
session.save( dataCenter );
session.save( user );
session.save( system );
}
);
}
@AfterEach
public void tearDown(SessionFactoryScope scope) {
scope.inTransaction(
session -> {
session.createQuery( "delete from System" ).executeUpdate();
session.createQuery( "delete from DataCenterUser" ).executeUpdate();
session.createQuery( "delete from DataCenter" ).executeUpdate();
}
);
}
@Entity(name = "DataCenter")
@Table(name = "data_center" )
public static class DataCenter {
@Id
private Integer id;
private String description;
public DataCenter() {
}
public DataCenter(Integer id, String description) {
this.id = id;
this.description = description;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
// public Integer getId() {
// return id;
// }
}
@Entity(name = "System")
@Table( name = "systems" )
public static class System {
@Id
private Integer id;
private String name;
@ManyToOne
SystemUser user;
DataCenterUser dataCenterUser;
public System() {
}
@ -295,29 +354,34 @@ public void setName(String name) {
this.name = name;
}
public SystemUser getUser() {
return user;
public DataCenterUser getDataCenterUser() {
return dataCenterUser;
}
public void setUser(SystemUser user) {
this.user = user;
public void setDataCenterUser(DataCenterUser dataCenterUser) {
this.dataCenterUser = dataCenterUser;
}
}
@Entity(name = "SystemUser")
public static class SystemUser {
@Entity( name = "DataCenterUser" )
@Table(name = "data_center_user" )
public static class DataCenterUser {
@EmbeddedId
private PK pk;
// private String name;
private byte privilegeMask;
public SystemUser() {
public DataCenterUser() {
}
public SystemUser(PK pk, String name) {
public DataCenterUser(DataCenter dataCenter, String username, byte privilegeMask) {
this( new PK( dataCenter, username ), privilegeMask );
}
public DataCenterUser(PK pk, byte privilegeMask) {
this.pk = pk;
// this.name = name;
this.privilegeMask = privilegeMask;
}
public PK getPk() {
@ -341,12 +405,11 @@ public void setPk(PK pk) {
public static class PK implements Serializable {
@ManyToOne
private Subsystem subsystem;
private DataCenter dataCenter;
private String username;
public PK(Subsystem subsystem, String username) {
this.subsystem = subsystem;
public PK(DataCenter dataCenter, String username) {
this.dataCenter = dataCenter;
this.username = username;
}
@ -362,42 +425,13 @@ public boolean equals(Object o) {
return false;
}
PK pk = (PK) o;
return Objects.equals( subsystem, pk.subsystem ) &&
return Objects.equals( dataCenter, pk.dataCenter ) &&
Objects.equals( username, pk.username );
}
@Override
public int hashCode() {
return Objects.hash( subsystem, username );
return Objects.hash( dataCenter, username );
}
}
@Entity(name = "Subsystem")
public static class Subsystem {
@Id
private Integer id;
private String description;
public Subsystem() {
}
public Subsystem(Integer id, String description) {
this.id = id;
this.description = description;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
// public Integer getId() {
// return id;
// }
}
}

View File

@ -123,7 +123,7 @@ public void testCollectionInitializerCase(SessionFactoryScope scope) {
.getDomainResultDescriptors()
.get( 0 );
DomainResultGraphPrinter.print( loader.getSqlAst().getDomainResultDescriptors() );
DomainResultGraphPrinter.logDomainResultGraph( loader.getSqlAst().getDomainResultDescriptors() );
assertThat( domainResult.getFetches(), isEmpty() );
}

View File

@ -200,10 +200,7 @@ public void testConvertedHqlInterpretation(SessionFactoryScope scope) {
// ScalarDomainResultImpl creates and caches the assembler at its creation.
// this just gets access to that cached one
final DomainResultAssembler resultAssembler = domainResult.createResultAssembler(
null,
null
);
final DomainResultAssembler resultAssembler = domainResult.createResultAssembler( null );
assertThat( resultAssembler, instanceOf( BasicResultAssembler.class ) );
final BasicValueConverter valueConverter = ( (BasicResultAssembler) resultAssembler ).getValueConverter();

View File

@ -28,7 +28,7 @@ public void simpleTest(SessionFactoryScope scope) {
"select s.id, s.someString, s.someLong from SimpleEntity s",
scope.getSessionFactory()
);
DomainResultGraphPrinter.print( sqlAst.getDomainResultDescriptors() );
DomainResultGraphPrinter.logDomainResultGraph( sqlAst.getDomainResultDescriptors() );
}
}

View File

@ -28,6 +28,6 @@ public void simpleTest(SessionFactoryScope scope) {
"select e from EntityOfComposites e join fetch e.component c join fetch c.nested",
scope.getSessionFactory()
);
DomainResultGraphPrinter.print( interpretation.getDomainResultDescriptors() );
DomainResultGraphPrinter.logDomainResultGraph( interpretation.getDomainResultDescriptors() );
}
}

View File

@ -9,6 +9,11 @@ log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.appender.stdout2=org.apache.log4j.ConsoleAppender
log4j.appender.stdout2.Target=System.out
log4j.appender.stdout2.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout2.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.appender.unclosedSessionFactoryFile=org.apache.log4j.FileAppender
log4j.appender.unclosedSessionFactoryFile.append=true
log4j.appender.unclosedSessionFactoryFile.file=target/tmp/log/UnclosedSessionFactoryWarnings.log
@ -17,6 +22,11 @@ log4j.appender.unclosedSessionFactoryFile.layout.ConversionPattern=%d{ABSOLUTE}
log4j.rootLogger=info, stdout
log4j.logger.org.hibernate.orm=debug, stdout2
log4j.additivity.org.hibernate.orm=false
log4j.logger.org.hibernate.orm.sql.results=debug
log4j.logger.org.hibernate.orm.graph=debug
log4j.logger.org.hibernate.orm.query.sqm=debug
log4j.logger.org.hibernate.orm.query.hql=debug