Skip to content

Commit 8638aac

Browse files
stliusebersole
authored andcommitted
HHH-8276 - Integrate LoadPlans into UniqueEntityLoader (PoC)
1 parent 4defc8a commit 8638aac

File tree

10 files changed

+70
-29
lines changed

10 files changed

+70
-29
lines changed

hibernate-core/src/main/java/org/hibernate/internal/FilterHelper.java

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030

3131
import org.hibernate.engine.spi.SessionFactoryImplementor;
3232
import org.hibernate.internal.util.StringHelper;
33+
import org.hibernate.internal.util.collections.CollectionHelper;
3334
import org.hibernate.sql.Template;
3435

3536
/**
@@ -51,30 +52,28 @@ public class FilterHelper {
5152
* conditions are the values.
5253
*
5354
* @param filters The map of defined filters.
54-
* @param dialect The sql dialect
5555
* @param factory The session factory
5656
*/
57-
public FilterHelper(List filters, SessionFactoryImplementor factory) {
57+
public FilterHelper(List<FilterConfiguration> filters, SessionFactoryImplementor factory) {
5858
int filterCount = filters.size();
5959
filterNames = new String[filterCount];
6060
filterConditions = new String[filterCount];
6161
filterAutoAliasFlags = new boolean[filterCount];
6262
filterAliasTableMaps = new Map[filterCount];
63-
Iterator iter = filters.iterator();
6463
filterCount = 0;
65-
while ( iter.hasNext() ) {
64+
for ( final FilterConfiguration filter : filters ) {
6665
filterAutoAliasFlags[filterCount] = false;
67-
final FilterConfiguration filter = (FilterConfiguration) iter.next();
6866
filterNames[filterCount] = filter.getName();
6967
filterConditions[filterCount] = filter.getCondition();
70-
filterAliasTableMaps[filterCount] = filter.getAliasTableMap(factory);
71-
if ((filterAliasTableMaps[filterCount].isEmpty() || isTableFromPersistentClass(filterAliasTableMaps[filterCount])) && filter.useAutoAliasInjection()){
68+
filterAliasTableMaps[filterCount] = filter.getAliasTableMap( factory );
69+
if ( (filterAliasTableMaps[filterCount].isEmpty() || isTableFromPersistentClass( filterAliasTableMaps[filterCount] )) && filter
70+
.useAutoAliasInjection() ) {
7271
filterConditions[filterCount] = Template.renderWhereStringTemplate(
7372
filter.getCondition(),
7473
FilterImpl.MARKER,
7574
factory.getDialect(),
7675
factory.getSqlFunctionRegistry()
77-
);
76+
);
7877
filterAutoAliasFlags[filterCount] = true;
7978
}
8079
filterConditions[filterCount] = StringHelper.replace(
@@ -91,8 +90,8 @@ private static boolean isTableFromPersistentClass(Map<String,String> aliasTableM
9190
}
9291

9392
public boolean isAffectedBy(Map enabledFilters) {
94-
for ( int i = 0, max = filterNames.length; i < max; i++ ) {
95-
if ( enabledFilters.containsKey( filterNames[i] ) ) {
93+
for ( String filterName : filterNames ) {
94+
if ( enabledFilters.containsKey( filterName ) ) {
9695
return true;
9796
}
9897
}
@@ -106,13 +105,14 @@ public String render(FilterAliasGenerator aliasGenerator, Map enabledFilters) {
106105
}
107106

108107
public void render(StringBuilder buffer, FilterAliasGenerator aliasGenerator, Map enabledFilters) {
109-
if ( filterNames != null && filterNames.length > 0 ) {
110-
for ( int i = 0, max = filterNames.length; i < max; i++ ) {
111-
if ( enabledFilters.containsKey( filterNames[i] ) ) {
112-
final String condition = filterConditions[i];
113-
if ( StringHelper.isNotEmpty( condition ) ) {
114-
buffer.append(" and " ).append(render(aliasGenerator, i));
115-
}
108+
if ( CollectionHelper.isEmpty( filterNames ) ) {
109+
return;
110+
}
111+
for ( int i = 0, max = filterNames.length; i < max; i++ ) {
112+
if ( enabledFilters.containsKey( filterNames[i] ) ) {
113+
final String condition = filterConditions[i];
114+
if ( StringHelper.isNotEmpty( condition ) ) {
115+
buffer.append( " and " ).append( render( aliasGenerator, i ) );
116116
}
117117
}
118118
}

hibernate-core/src/main/java/org/hibernate/internal/util/collections/CollectionHelper.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,10 @@ public static boolean isNotEmpty(Map map) {
159159
return !isEmpty( map );
160160
}
161161

162+
public static boolean isEmpty(Object[] objects){
163+
return objects == null || objects.length==0;
164+
}
165+
162166
public static <X,Y> Map<X, Y> makeCopy(Map<X, Y> map) {
163167
final Map<X,Y> copy = mapOfSize( map.size() + 1 );
164168
copy.putAll( map );

hibernate-core/src/main/java/org/hibernate/loader/plan2/build/internal/spaces/CollectionQuerySpaceImpl.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ public JoinImpl addIndexEntityJoin(
8080
entityQuerySpace,
8181
// not sure this 'rhsColumnNames' bit is correct...
8282
( (Queryable) indexPersister ).getKeyColumnNames(),
83+
null,
8384
required
8485
);
8586
internalGetJoins().add( join );
@@ -109,6 +110,7 @@ public JoinImpl addIndexCompositeJoin(
109110
"index",
110111
compositeQuerySpace,
111112
null,
113+
null,
112114
canJoinsBeRequired()
113115
);
114116
internalGetJoins().add( join );
@@ -135,6 +137,7 @@ public JoinImpl addElementEntityJoin(
135137
"id",
136138
entityQuerySpace,
137139
( (Queryable) elementPersister ).getKeyColumnNames(),
140+
null,
138141
canJoinsBeRequired()
139142
);
140143
internalGetJoins().add( join );
@@ -166,6 +169,7 @@ public Join addElementCompositeJoin(
166169
"elements",
167170
compositeQuerySpace,
168171
null,
172+
null,
169173
canJoinsBeRequired()
170174
);
171175
internalGetJoins().add( join );

hibernate-core/src/main/java/org/hibernate/loader/plan2/build/internal/spaces/CompositeQuerySpaceImpl.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.hibernate.persister.entity.PropertyMapping;
3333
import org.hibernate.persister.walking.spi.AttributeDefinition;
3434
import org.hibernate.persister.walking.spi.CompositionDefinition;
35+
import org.hibernate.type.AssociationType;
3536
import org.hibernate.type.CollectionType;
3637
import org.hibernate.type.EntityType;
3738

@@ -90,6 +91,7 @@ public JoinImpl addCompositeJoin(CompositionDefinition compositionDefinition, St
9091
propertyPath,
9192
rhs,
9293
null,
94+
null,
9395
required
9496
);
9597
internalGetJoins().add( join );
@@ -123,6 +125,7 @@ public JoinImpl addEntityJoin(
123125
(EntityType) attributeDefinition.getType(),
124126
sessionFactory()
125127
),
128+
(EntityType) attributeDefinition.getType(),
126129
required
127130
);
128131
internalGetJoins().add( join );
@@ -151,6 +154,7 @@ public JoinImpl addCollectionJoin(
151154
attributeDefinition.getName(),
152155
rhs,
153156
( (CollectionType) attributeDefinition.getType() ).getAssociatedJoinable( sessionFactory() ).getKeyColumnNames(),
157+
(AssociationType) attributeDefinition.getType(),
154158
required
155159
);
156160
internalGetJoins().add( join );

hibernate-core/src/main/java/org/hibernate/loader/plan2/build/internal/spaces/EntityQuerySpaceImpl.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.hibernate.persister.entity.PropertyMapping;
3434
import org.hibernate.persister.walking.spi.AttributeDefinition;
3535
import org.hibernate.persister.walking.spi.CompositionDefinition;
36+
import org.hibernate.type.AssociationType;
3637
import org.hibernate.type.CollectionType;
3738
import org.hibernate.type.CompositeType;
3839
import org.hibernate.type.EntityType;
@@ -92,6 +93,7 @@ public JoinImpl addCompositeJoin(CompositionDefinition compositionDefinition, St
9293
compositionDefinition.getName(),
9394
rhs,
9495
null,
96+
null,
9597
required
9698
);
9799
internalGetJoins().add( join );
@@ -123,6 +125,7 @@ public JoinImpl addEntityJoin(
123125
(EntityType) attribute.getType(),
124126
sessionFactory()
125127
),
128+
(AssociationType) attribute.getType(),
126129
required
127130
);
128131
internalGetJoins().add( join );
@@ -151,6 +154,7 @@ public JoinImpl addCollectionJoin(
151154
attributeDefinition.getName(),
152155
rhs,
153156
( (CollectionType) attributeDefinition.getType() ).getAssociatedJoinable( sessionFactory() ).getKeyColumnNames(),
157+
(AssociationType) attributeDefinition.getType(),
154158
required
155159
);
156160
internalGetJoins().add( join );
@@ -178,6 +182,7 @@ public Join makeCompositeIdentifierJoin() {
178182
"id",
179183
rhs,
180184
null,
185+
null,
181186
canJoinsBeRequired()
182187
);
183188
internalGetJoins().add( join );

hibernate-core/src/main/java/org/hibernate/loader/plan2/build/internal/spaces/JoinImpl.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,10 @@
2323
*/
2424
package org.hibernate.loader.plan2.build.internal.spaces;
2525

26-
import org.hibernate.QueryException;
2726
import org.hibernate.internal.util.StringHelper;
2827
import org.hibernate.loader.plan2.spi.JoinDefinedByMetadata;
2928
import org.hibernate.loader.plan2.spi.QuerySpace;
30-
import org.hibernate.persister.walking.spi.AttributeDefinition;
29+
import org.hibernate.type.AssociationType;
3130

3231
/**
3332
* @author Steve Ebersole
@@ -40,19 +39,21 @@ public class JoinImpl implements JoinDefinedByMetadata {
4039

4140
private final String[] rhsColumnNames;
4241
private final boolean rightHandSideOptional;
42+
private final AssociationType joinedAssociationPropertyType;
4343

4444
public JoinImpl(
4545
QuerySpace leftHandSide,
4646
String lhsPropertyName,
4747
QuerySpace rightHandSide,
4848
String[] rhsColumnNames,
49+
AssociationType attributeType,
4950
boolean rightHandSideOptional) {
5051
this.leftHandSide = leftHandSide;
5152
this.lhsPropertyName = lhsPropertyName;
5253
this.rightHandSide = rightHandSide;
5354
this.rhsColumnNames = rhsColumnNames;
5455
this.rightHandSideOptional = rightHandSideOptional;
55-
56+
this.joinedAssociationPropertyType = attributeType;
5657
if ( StringHelper.isEmpty( lhsPropertyName ) ) {
5758
throw new IllegalArgumentException( "Incoming 'lhsPropertyName' parameter was empty" );
5859
}
@@ -101,4 +102,9 @@ public String getAnyAdditionalJoinConditions(String rhsTableAlias) {
101102
public String getJoinedAssociationPropertyName() {
102103
return lhsPropertyName;
103104
}
105+
106+
@Override
107+
public AssociationType getJoinedAssociationPropertyType() {
108+
return joinedAssociationPropertyType;
109+
}
104110
}

hibernate-core/src/main/java/org/hibernate/loader/plan2/exec/internal/LoadQueryJoinAndFetchProcessor.java

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import org.hibernate.loader.plan2.spi.Fetch;
4848
import org.hibernate.loader.plan2.spi.FetchSource;
4949
import org.hibernate.loader.plan2.spi.Join;
50+
import org.hibernate.loader.plan2.spi.JoinDefinedByMetadata;
5051
import org.hibernate.loader.plan2.spi.QuerySpace;
5152
import org.hibernate.persister.collection.CollectionPersister;
5253
import org.hibernate.persister.collection.QueryableCollection;
@@ -55,6 +56,7 @@
5556
import org.hibernate.persister.walking.internal.FetchStrategyHelper;
5657
import org.hibernate.sql.JoinFragment;
5758
import org.hibernate.sql.JoinType;
59+
import org.hibernate.type.AssociationType;
5860

5961
/**
6062
* Helper for implementors of entity and collection based query building based on LoadPlans providing common
@@ -183,11 +185,12 @@ private void renderEntityJoin(Join join, JoinFragment joinFragment) {
183185

184186
final String[] rhsColumnNames = join.resolveNonAliasedRightHandSideJoinConditionColumns();
185187
final String rhsTableAlias = aliases.getTableAlias();
186-
188+
final AssociationType associationType = join instanceof JoinDefinedByMetadata ? ((JoinDefinedByMetadata)join).getJoinedAssociationPropertyType() : null;
187189
final String additionalJoinConditions = resolveAdditionalJoinCondition(
188190
rhsTableAlias,
189191
join.getAnyAdditionalJoinConditions( rhsTableAlias ),
190-
(Joinable) rightHandSide.getEntityPersister()
192+
(Joinable) rightHandSide.getEntityPersister(),
193+
associationType
191194
);
192195

193196
final Joinable joinable = (Joinable) rightHandSide.getEntityPersister();
@@ -202,13 +205,15 @@ private void renderEntityJoin(Join join, JoinFragment joinFragment) {
202205
);
203206
}
204207

205-
private String resolveAdditionalJoinCondition(String rhsTableAlias, String withClause, Joinable joinable) {
208+
private String resolveAdditionalJoinCondition(String rhsTableAlias, String withClause, Joinable joinable, AssociationType associationType) {
206209
// turns out that the call to AssociationType#getOnCondition in the initial code really just translates to
207210
// calls to the Joinable.filterFragment() method where the Joinable is either the entity or
208211
// collection persister
209-
final String filter = joinable.filterFragment(
210-
rhsTableAlias,
211-
buildingParameters.getQueryInfluencers().getEnabledFilters()
212+
final String filter = associationType!=null?
213+
associationType.getOnCondition( rhsTableAlias, factory, buildingParameters.getQueryInfluencers().getEnabledFilters() ):
214+
joinable.filterFragment(
215+
rhsTableAlias,
216+
buildingParameters.getQueryInfluencers().getEnabledFilters()
212217
);
213218

214219
if ( StringHelper.isEmpty( withClause ) && StringHelper.isEmpty( filter ) ) {
@@ -432,11 +437,13 @@ private void renderManyToManyJoin(
432437
// }
433438

434439
{
440+
final AssociationType associationType = join instanceof JoinDefinedByMetadata ? ((JoinDefinedByMetadata)join).getJoinedAssociationPropertyType() : null;
435441
// add join fragments from the collection table -> element entity table ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
436442
final String additionalJoinConditions = resolveAdditionalJoinCondition(
437443
elementTableAlias,
438444
join.getAnyAdditionalJoinConditions( elementTableAlias ),
439-
queryableCollection
445+
queryableCollection,
446+
associationType
440447
);
441448

442449
final String manyToManyFilter = persister.getManyToManyFilterFragment(

hibernate-core/src/main/java/org/hibernate/loader/plan2/exec/process/internal/CollectionReferenceInitializerImpl.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,10 @@
3333
import org.hibernate.engine.spi.PersistenceContext;
3434
import org.hibernate.internal.CoreLogging;
3535
import org.hibernate.loader.plan2.exec.process.spi.CollectionReferenceInitializer;
36+
import org.hibernate.loader.plan2.exec.process.spi.ResultSetProcessingContext;
3637
import org.hibernate.loader.plan2.exec.spi.CollectionReferenceAliases;
3738
import org.hibernate.loader.plan2.spi.CollectionReference;
39+
import org.hibernate.loader.plan2.spi.Fetch;
3840
import org.hibernate.pretty.MessageHelper;
3941

4042
/**
@@ -153,7 +155,12 @@ protected Object findCollectionOwner(
153155
}
154156

155157
protected Serializable findCollectionOwnerKey(ResultSetProcessingContextImpl context) {
156-
return null;
158+
ResultSetProcessingContext.EntityReferenceProcessingState ownerState = context.getOwnerProcessingState( (Fetch) collectionReference );
159+
160+
if(ownerState == null || ownerState.getEntityKey()==null){
161+
return null;
162+
}
163+
return ownerState.getEntityKey().getIdentifier();
157164
}
158165

159166
@Override

hibernate-core/src/main/java/org/hibernate/loader/plan2/spi/JoinDefinedByMetadata.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
*/
2424
package org.hibernate.loader.plan2.spi;
2525

26+
import org.hibernate.type.AssociationType;
27+
2628
/**
2729
* Specialization of a Join that is defined by the metadata.
2830
*
@@ -37,4 +39,5 @@ public interface JoinDefinedByMetadata extends Join {
3739
* @return The property name
3840
*/
3941
public String getJoinedAssociationPropertyName();
42+
public AssociationType getJoinedAssociationPropertyType();
4043
}

hibernate-core/src/test/java/org/hibernate/test/interceptor/InterceptorTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,8 @@ public void testPrepareStatementIntercept() {
296296
@Override
297297
public String onPrepareStatement(String sql) {
298298
assertNotNull( sql );
299-
assertTrue( sql.toLowerCase().startsWith( expectedSQLs.poll().toLowerCase() ) );
299+
String expectedSql = expectedSQLs.poll().toLowerCase();
300+
assertTrue("sql:\n " + sql.toLowerCase() +"\n doesn't start with \n"+expectedSql+"\n", sql.toLowerCase().startsWith( expectedSql ) );
300301
return sql;
301302
}
302303
};

0 commit comments

Comments
 (0)