Skip to content

Commit 39c2d9c

Browse files
committed
HSEARCH-5162 Make ORM mass indexer work when JPA compliance is enabled
1 parent 193c8cd commit 39c2d9c

File tree

8 files changed

+73
-42
lines changed

8 files changed

+73
-42
lines changed

integrationtest/mapper/orm-jakarta-batch/src/test/java/org/hibernate/search/integrationtest/jakarta/batch/massindexing/MassIndexingJobIT.java

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -42,19 +42,25 @@
4242
import org.hibernate.search.util.common.AssertionFailure;
4343
import org.hibernate.search.util.impl.integrationtest.mapper.orm.OrmSetupHelper;
4444
import org.hibernate.search.util.impl.test.annotation.TestForIssue;
45+
import org.hibernate.search.util.impl.test.extension.parameterized.ParameterizedPerMethod;
46+
import org.hibernate.search.util.impl.test.extension.parameterized.ParameterizedSetup;
47+
import org.hibernate.search.util.impl.test.extension.parameterized.ParameterizedSetupBeforeTest;
4548

46-
import org.junit.jupiter.api.BeforeAll;
47-
import org.junit.jupiter.api.BeforeEach;
4849
import org.junit.jupiter.api.Test;
49-
import org.junit.jupiter.api.TestInstance;
5050
import org.junit.jupiter.api.extension.RegisterExtension;
51+
import org.junit.jupiter.params.provider.Arguments;
52+
import org.junit.jupiter.params.provider.MethodSource;
5153

5254
/**
5355
* @author Mincong Huang
5456
*/
55-
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
57+
@ParameterizedPerMethod
5658
class MassIndexingJobIT {
5759

60+
public static List<? extends Arguments> params() {
61+
return List.of( Arguments.of( true ), Arguments.of( false ) );
62+
}
63+
5864
protected static final int INSTANCES_PER_DATA_TEMPLATE = 100;
5965

6066
// We have three data templates per entity type (see setup)
@@ -73,16 +79,18 @@ class MassIndexingJobIT {
7379

7480
private EntityManagerFactory emf;
7581

76-
@BeforeAll
77-
void setup() {
78-
emf = ormSetupHelper.start().withAnnotatedTypes(
79-
Company.class, Person.class, WhoAmI.class, CompanyGroup.class )
82+
@ParameterizedSetup
83+
@MethodSource("params")
84+
void setup(boolean jpaCompliance) {
85+
emf = ormSetupHelper.start()
86+
.withAnnotatedTypes( Company.class, Person.class, WhoAmI.class, CompanyGroup.class )
87+
.withProperty( "hibernate.jpa.compliance.query", jpaCompliance )
8088
.withProperty( HibernateOrmMapperSettings.INDEXING_LISTENERS_ENABLED, false )
8189
.dataClearing( config -> config.clearOrder( CompanyGroup.class, Company.class ) )
8290
.setup();
8391
}
8492

85-
@BeforeEach
93+
@ParameterizedSetupBeforeTest
8694
void initData() {
8795
List<Company> companies = new ArrayList<>();
8896
List<Person> people = new ArrayList<>();

integrationtest/mapper/orm/src/test/java/org/hibernate/search/integrationtest/mapper/orm/dynamicmap/DynamicMapBaseIT.java

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@
4646
import org.junit.jupiter.api.Disabled;
4747
import org.junit.jupiter.api.Test;
4848
import org.junit.jupiter.api.extension.RegisterExtension;
49+
import org.junit.jupiter.params.ParameterizedTest;
50+
import org.junit.jupiter.params.provider.ValueSource;
4951

5052
/**
5153
* Test basic features when mapping a Hibernate ORM "dynamic-map" entity.
@@ -65,8 +67,9 @@ class DynamicMapBaseIT {
6567
@RegisterExtension
6668
public OrmSetupHelper ormSetupHelper = OrmSetupHelper.withBackendMock( backendMock );
6769

68-
@Test
69-
void simple() {
70+
@ParameterizedTest
71+
@ValueSource(booleans = { true, false })
72+
void simple(boolean jpaCompliance) {
7073
String hbmPath = "/DynamicMapBaseIT/simple.hbm.xml";
7174
String entityTypeName = "Book";
7275

@@ -77,6 +80,7 @@ void simple() {
7780
);
7881
SessionFactory sessionFactory = ormSetupHelper.start()
7982
.withConfiguration( builder -> builder.addHbmFromClassPath( hbmPath ) )
83+
.withProperty( "hibernate.jpa.compliance.query", jpaCompliance )
8084
.withProperty(
8185
HibernateOrmMapperSettings.MAPPING_CONFIGURER,
8286
(HibernateOrmSearchMappingConfigurer) context -> {
@@ -157,9 +161,10 @@ void typeName_invalid() {
157161
"e.g. 'MyEntity.myEmbedded' or 'MyEntity.myEmbedded.myNestedEmbedded'." );
158162
}
159163

160-
@Test
161164
@TestForIssue(jiraKey = "HSEARCH-3848")
162-
void searchObject() {
165+
@ParameterizedTest
166+
@ValueSource(booleans = { true, false })
167+
void searchObject(boolean jpaCompliance) {
163168
String hbmPath = "/DynamicMapBaseIT/simple.hbm.xml";
164169
String entityTypeName = "Book";
165170

@@ -168,6 +173,7 @@ void searchObject() {
168173
);
169174
SessionFactory sessionFactory = ormSetupHelper.start()
170175
.withConfiguration( builder -> builder.addHbmFromClassPath( hbmPath ) )
176+
.withProperty( "hibernate.jpa.compliance.query", jpaCompliance )
171177
.withProperty(
172178
HibernateOrmMapperSettings.MAPPING_CONFIGURER,
173179
(HibernateOrmSearchMappingConfigurer) context -> {
@@ -217,8 +223,9 @@ void searchObject() {
217223
} );
218224
}
219225

220-
@Test
221-
void massIndexing() {
226+
@ParameterizedTest
227+
@ValueSource(booleans = { true, false })
228+
void massIndexing(boolean jpaCompliance) {
222229
String hbmPath = "/DynamicMapBaseIT/simple.hbm.xml";
223230
String entityTypeName = "Book";
224231

@@ -228,6 +235,7 @@ void massIndexing() {
228235
SessionFactory sessionFactory = ormSetupHelper.start()
229236
.withConfiguration( builder -> builder.addHbmFromClassPath( hbmPath ) )
230237
.withProperty( HibernateOrmMapperSettings.INDEXING_LISTENERS_ENABLED, false )
238+
.withProperty( "hibernate.jpa.compliance.query", jpaCompliance )
231239
.withProperty(
232240
HibernateOrmMapperSettings.MAPPING_CONFIGURER,
233241
(HibernateOrmSearchMappingConfigurer) context -> {

integrationtest/mapper/orm/src/test/java/org/hibernate/search/integrationtest/mapper/orm/massindexing/MassIndexingConditionalExpressionsIT.java

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import static org.hibernate.search.util.impl.integrationtest.mapper.orm.OrmUtils.with;
1111

1212
import java.time.Instant;
13+
import java.util.List;
1314

1415
import jakarta.persistence.Access;
1516
import jakarta.persistence.AccessType;
@@ -30,16 +31,22 @@
3031
import org.hibernate.search.util.impl.integrationtest.common.extension.BackendMock;
3132
import org.hibernate.search.util.impl.integrationtest.mapper.orm.OrmSetupHelper;
3233
import org.hibernate.search.util.impl.test.annotation.TestForIssue;
34+
import org.hibernate.search.util.impl.test.extension.parameterized.ParameterizedPerMethod;
35+
import org.hibernate.search.util.impl.test.extension.parameterized.ParameterizedSetup;
36+
import org.hibernate.search.util.impl.test.extension.parameterized.ParameterizedSetupBeforeTest;
3337

34-
import org.junit.jupiter.api.BeforeAll;
35-
import org.junit.jupiter.api.BeforeEach;
3638
import org.junit.jupiter.api.Test;
37-
import org.junit.jupiter.api.TestInstance;
3839
import org.junit.jupiter.api.extension.RegisterExtension;
40+
import org.junit.jupiter.params.provider.Arguments;
41+
import org.junit.jupiter.params.provider.MethodSource;
3942

40-
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
43+
@ParameterizedPerMethod
4144
class MassIndexingConditionalExpressionsIT {
4245

46+
public static List<? extends Arguments> params() {
47+
return List.of( Arguments.of( true ), Arguments.of( false ) );
48+
}
49+
4350
// where INSTANT_0 < INSTANT_1 < INSTANT_2
4451
private static final Instant INSTANT_0 = Instant.ofEpochMilli( 1_000_000 );
4552
private static final Instant INSTANT_1 = Instant.ofEpochMilli( 1_500_000 );
@@ -62,8 +69,9 @@ class MassIndexingConditionalExpressionsIT {
6269
public static OrmSetupHelper ormSetupHelper = OrmSetupHelper.withBackendMock( backendMock );
6370
private SessionFactory sessionFactory;
6471

65-
@BeforeAll
66-
void setup() {
72+
@ParameterizedSetup
73+
@MethodSource("params")
74+
void setup(boolean jpaCompliance) {
6775
backendMock.expectAnySchema( H0_Indexed.NAME );
6876
backendMock.expectAnySchema( H1_B_Indexed.NAME );
6977
backendMock.expectAnySchema( H2_Root_Indexed.NAME );
@@ -72,8 +80,9 @@ void setup() {
7280
backendMock.expectAnySchema( H3_A_Indexed.NAME );
7381
backendMock.expectAnySchema( H3_B_Indexed.NAME );
7482

75-
sessionFactory = ormSetupHelper.start().withPropertyRadical(
76-
HibernateOrmMapperSettings.Radicals.INDEXING_LISTENERS_ENABLED, false )
83+
sessionFactory = ormSetupHelper.start()
84+
.withPropertyRadical( HibernateOrmMapperSettings.Radicals.INDEXING_LISTENERS_ENABLED, false )
85+
.withProperty( "hibernate.jpa.compliance.query", jpaCompliance )
7786
.withAnnotatedTypes(
7887
H0_Indexed.class,
7988
H1_Root_NotIndexed.class, H1_A_NotIndexed.class, H1_B_Indexed.class,
@@ -84,7 +93,7 @@ void setup() {
8493
).setup();
8594
}
8695

87-
@BeforeEach
96+
@ParameterizedSetupBeforeTest
8897
void initData() {
8998
with( sessionFactory ).runInTransaction( session -> {
9099
session.persist( new H0_Indexed( 1, INSTANT_0, INT_0 ) );

mapper/orm/src/main/java/org/hibernate/search/mapper/orm/common/impl/HibernateOrmUtils.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.hibernate.mapping.Property;
2828
import org.hibernate.metamodel.MappingMetamodel;
2929
import org.hibernate.metamodel.mapping.EntityMappingType;
30+
import org.hibernate.metamodel.model.domain.EntityDomainType;
3031
import org.hibernate.search.mapper.orm.logging.impl.Log;
3132
import org.hibernate.search.mapper.pojo.loading.spi.PojoLoadingTypeContext;
3233
import org.hibernate.search.util.common.AssertionFailure;
@@ -80,6 +81,11 @@ public static EntityMappingType entityMappingType(SessionFactoryImplementor sess
8081
return metamodel.getEntityDescriptor( entityName );
8182
}
8283

84+
public static EntityDomainType<?> entityDomainType(SessionFactoryImplementor sessionFactory, String entityName) {
85+
var metamodel = sessionFactory.getJpaMetamodel();
86+
return metamodel.entity( entityName );
87+
}
88+
8389
public static Class<?> entityClass(PersistentClass persistentClass) {
8490
if ( persistentClass.hasPojoRepresentation() ) {
8591
return persistentClass.getMappedClass();

mapper/orm/src/main/java/org/hibernate/search/mapper/orm/loading/impl/AbstractHibernateOrmLoadingStrategy.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.hibernate.mapping.RootClass;
2222
import org.hibernate.mapping.SingleTableSubclass;
2323
import org.hibernate.metamodel.mapping.EntityMappingType;
24+
import org.hibernate.metamodel.model.domain.EntityDomainType;
2425
import org.hibernate.search.mapper.orm.common.impl.HibernateOrmUtils;
2526
import org.hibernate.search.mapper.orm.loading.spi.ConditionalExpression;
2627
import org.hibernate.search.mapper.orm.loading.spi.HibernateOrmEntityLoadingStrategy;
@@ -218,9 +219,9 @@ public HibernateOrmQueryLoader<E, I> createQueryLoader(SessionFactoryImplementor
218219
throw new AssertionFailure( "conditional/order expression is always defined on a single type" );
219220
}
220221

221-
EntityMappingType entityMappingType = HibernateOrmUtils.entityMappingType( sessionFactory,
222+
EntityDomainType<?> entityDomainType = HibernateOrmUtils.entityDomainType( sessionFactory,
222223
typeContexts.iterator().next().secondaryEntityName() );
223-
return new HibernateOrmQueryLoaderImpl<>( actualQueryFactory, entityMappingType,
224+
return new HibernateOrmQueryLoaderImpl<>( actualQueryFactory, entityDomainType,
224225
includedTypesFilter, conditionalExpressions, order );
225226
}
226227
return new HibernateOrmQueryLoaderImpl<>( actualQueryFactory, includedTypesFilter );

mapper/orm/src/main/java/org/hibernate/search/mapper/orm/loading/impl/ConditionalExpressionQueryFactory.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import java.util.Set;
1212

1313
import org.hibernate.engine.spi.SharedSessionContractImplementor;
14-
import org.hibernate.metamodel.mapping.EntityMappingType;
14+
import org.hibernate.metamodel.model.domain.EntityDomainType;
1515
import org.hibernate.query.Query;
1616
import org.hibernate.search.mapper.orm.loading.spi.ConditionalExpression;
1717

@@ -35,22 +35,22 @@ public final boolean uniquePropertyIsTheEntityId() {
3535
}
3636

3737
@Override
38-
public Query<Long> createQueryForCount(SharedSessionContractImplementor session, EntityMappingType entityMappingType,
38+
public Query<Long> createQueryForCount(SharedSessionContractImplementor session, EntityDomainType<?> entityDomainType,
3939
Set<? extends Class<? extends E>> includedTypesFilter,
4040
List<ConditionalExpression> conditionalExpressions) {
4141
return createQueryWithConditionalExpressionsOrOrder( session,
42-
"select count(e) from " + entityMappingType.getEntityName() + " e",
42+
"select count(e) from " + entityDomainType.getName() + " e",
4343
Long.class, "e", includedTypesFilter, conditionalExpressions, null
4444
);
4545
}
4646

4747
@Override
4848
public Query<I> createQueryForIdentifierListing(SharedSessionContractImplementor session,
49-
EntityMappingType entityMappingType,
49+
EntityDomainType<?> entityDomainType,
5050
Set<? extends Class<? extends E>> includedTypesFilter,
5151
List<ConditionalExpression> conditionalExpressions, String order) {
5252
return createQueryWithConditionalExpressionsOrOrder( session,
53-
"select e." + uniquePropertyName + " from " + entityMappingType.getEntityName() + " e",
53+
"select e." + uniquePropertyName + " from " + entityDomainType.getName() + " e",
5454
uniquePropertyType, "e",
5555
includedTypesFilter, conditionalExpressions, order
5656
);

mapper/orm/src/main/java/org/hibernate/search/mapper/orm/loading/impl/HibernateOrmQueryLoaderImpl.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,33 +12,33 @@
1212
import org.hibernate.MultiIdentifierLoadAccess;
1313
import org.hibernate.engine.spi.SessionImplementor;
1414
import org.hibernate.engine.spi.SharedSessionContractImplementor;
15-
import org.hibernate.metamodel.mapping.EntityMappingType;
15+
import org.hibernate.metamodel.model.domain.EntityDomainType;
1616
import org.hibernate.query.Query;
1717
import org.hibernate.search.mapper.orm.loading.spi.ConditionalExpression;
1818
import org.hibernate.search.mapper.orm.loading.spi.HibernateOrmQueryLoader;
1919

2020
class HibernateOrmQueryLoaderImpl<E, I> implements HibernateOrmQueryLoader<E, I> {
2121
private final TypeQueryFactory<E, I> queryFactory;
2222
private final Set<Class<? extends E>> includedTypesFilter;
23-
private final EntityMappingType entityMappingType;
23+
private final EntityDomainType<?> entityDomainType;
2424
private final List<ConditionalExpression> conditionalExpressions;
2525
private final String order;
2626

2727
public HibernateOrmQueryLoaderImpl(TypeQueryFactory<E, I> queryFactory,
2828
Set<Class<? extends E>> includedTypesFilter) {
2929
this.queryFactory = queryFactory;
3030
this.includedTypesFilter = includedTypesFilter;
31-
this.entityMappingType = null;
31+
this.entityDomainType = null;
3232
this.conditionalExpressions = List.of();
3333
this.order = null;
3434
}
3535

3636
public HibernateOrmQueryLoaderImpl(TypeQueryFactory<E, I> queryFactory,
37-
EntityMappingType entityMappingType, Set<Class<? extends E>> includedTypesFilter,
37+
EntityDomainType<?> entityDomainType, Set<Class<? extends E>> includedTypesFilter,
3838
List<ConditionalExpression> conditionalExpressions, String order) {
3939
this.queryFactory = queryFactory;
4040
this.includedTypesFilter = includedTypesFilter;
41-
this.entityMappingType = entityMappingType;
41+
this.entityDomainType = entityDomainType;
4242
this.conditionalExpressions = conditionalExpressions;
4343
this.order = order;
4444
}
@@ -47,15 +47,14 @@ public HibernateOrmQueryLoaderImpl(TypeQueryFactory<E, I> queryFactory,
4747
public Query<Long> createCountQuery(SharedSessionContractImplementor session) {
4848
return conditionalExpressions.isEmpty()
4949
? queryFactory.createQueryForCount( session, includedTypesFilter )
50-
: queryFactory.createQueryForCount( session, entityMappingType, includedTypesFilter,
51-
conditionalExpressions );
50+
: queryFactory.createQueryForCount( session, entityDomainType, includedTypesFilter, conditionalExpressions );
5251
}
5352

5453
@Override
5554
public Query<I> createIdentifiersQuery(SharedSessionContractImplementor session) {
5655
return conditionalExpressions.isEmpty() && order == null
5756
? queryFactory.createQueryForIdentifierListing( session, includedTypesFilter )
58-
: queryFactory.createQueryForIdentifierListing( session, entityMappingType, includedTypesFilter,
57+
: queryFactory.createQueryForIdentifierListing( session, entityDomainType, includedTypesFilter,
5958
conditionalExpressions, order );
6059
}
6160

mapper/orm/src/main/java/org/hibernate/search/mapper/orm/loading/impl/TypeQueryFactory.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
import org.hibernate.MultiIdentifierLoadAccess;
1414
import org.hibernate.engine.spi.SessionImplementor;
1515
import org.hibernate.engine.spi.SharedSessionContractImplementor;
16-
import org.hibernate.metamodel.mapping.EntityMappingType;
16+
import org.hibernate.metamodel.model.domain.EntityDomainType;
1717
import org.hibernate.query.Query;
1818
import org.hibernate.search.mapper.orm.loading.spi.ConditionalExpression;
1919

@@ -43,11 +43,11 @@ Query<Long> createQueryForCount(SharedSessionContractImplementor session,
4343
Query<I> createQueryForIdentifierListing(SharedSessionContractImplementor session,
4444
Set<? extends Class<? extends E>> includedTypesFilter);
4545

46-
Query<Long> createQueryForCount(SharedSessionContractImplementor session, EntityMappingType entityMappingType,
46+
Query<Long> createQueryForCount(SharedSessionContractImplementor session, EntityDomainType<?> entityDomainType,
4747
Set<? extends Class<? extends E>> includedTypesFilter,
4848
List<ConditionalExpression> conditionalExpressions);
4949

50-
Query<I> createQueryForIdentifierListing(SharedSessionContractImplementor session, EntityMappingType entityMappingType,
50+
Query<I> createQueryForIdentifierListing(SharedSessionContractImplementor session, EntityDomainType<?> entityDomainType,
5151
Set<? extends Class<? extends E>> includedTypesFilter,
5252
List<ConditionalExpression> conditionalExpressions, String order);
5353

0 commit comments

Comments
 (0)