Skip to content

Commit 8375a3b

Browse files
SanneDavideD
authored andcommitted
Introduce ability to wrap an Hibernate ORM core Dialect
1 parent ee08a20 commit 8375a3b

9 files changed

+111
-628
lines changed
Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,10 @@
55
*/
66
package org.hibernate.reactive.dialect;
77

8-
import org.hibernate.dialect.DatabaseVersion;
8+
import org.hibernate.dialect.Dialect;
9+
import org.hibernate.dialect.DialectDelegateWrapper;
910
import org.hibernate.dialect.PostgreSQLDialect;
10-
import org.hibernate.dialect.PostgreSQLDriverKind;
1111
import org.hibernate.dialect.identity.IdentityColumnSupport;
12-
import org.hibernate.engine.jdbc.dialect.spi.DialectResolutionInfo;
1312
import org.hibernate.engine.spi.SessionFactoryImplementor;
1413
import org.hibernate.metamodel.mapping.EntityMappingType;
1514
import org.hibernate.metamodel.spi.RuntimeModelCreationContext;
@@ -25,28 +24,34 @@
2524
import org.hibernate.sql.ast.tree.Statement;
2625
import org.hibernate.sql.exec.spi.JdbcOperation;
2726

28-
public class ReactivePostgreSQLDialect extends PostgreSQLDialect {
27+
/**
28+
* Wraps the given dialect to make some internal components reactive;
29+
* also, potentially applies a SQL syntax workaround if the wrapped Dialect
30+
* is extending PostgreSQLDialect.
31+
*/
32+
public final class ReactiveDialectWrapper extends DialectDelegateWrapper {
2933

30-
public ReactivePostgreSQLDialect() {
31-
this( DatabaseVersion.make( 10 ) );
32-
}
34+
//FIXME remove PostgreSQLDialect specific workarounds after HHH-16229
35+
private final boolean requiresPostgreSQLSyntaxProcessing;
3336

34-
public ReactivePostgreSQLDialect(DialectResolutionInfo info) {
35-
super( info, PostgreSQLDriverKind.OTHER );
36-
}
37-
38-
public ReactivePostgreSQLDialect(DatabaseVersion version) {
39-
super( version, PostgreSQLDriverKind.OTHER );
37+
public ReactiveDialectWrapper(Dialect wrapped) {
38+
super( wrapped );
39+
this.requiresPostgreSQLSyntaxProcessing = ( wrapped instanceof PostgreSQLDialect );
4040
}
4141

4242
@Override
4343
public SqlAstTranslatorFactory getSqlAstTranslatorFactory() {
44-
return new StandardSqlAstTranslatorFactory() {
45-
@Override
46-
protected <T extends JdbcOperation> SqlAstTranslator<T> buildTranslator(SessionFactoryImplementor sessionFactory, Statement statement) {
47-
return new ReactivePostgreSQLSqlAstTranslator<>( sessionFactory, statement );
48-
}
49-
};
44+
if ( requiresPostgreSQLSyntaxProcessing ) {
45+
return new StandardSqlAstTranslatorFactory() {
46+
@Override
47+
protected <T extends JdbcOperation> SqlAstTranslator<T> buildTranslator(SessionFactoryImplementor sessionFactory, Statement statement) {
48+
return new ReactivePostgreSQLSqlAstTranslator<>( sessionFactory, statement );
49+
}
50+
};
51+
}
52+
else {
53+
return wrapped.getSqlAstTranslatorFactory();
54+
}
5055
}
5156

5257
@Override
@@ -63,4 +68,5 @@ public SqmMultiTableMutationStrategy getFallbackSqmMutationStrategy(EntityMappin
6368
public SqmMultiTableInsertStrategy getFallbackSqmInsertStrategy(EntityMappingType rootEntityDescriptor, RuntimeModelCreationContext runtimeModelCreationContext) {
6469
return new ReactiveCteInsertStrategy( rootEntityDescriptor, runtimeModelCreationContext );
6570
}
71+
6672
}

hibernate-reactive-core/src/main/java/org/hibernate/reactive/provider/impl/ReactiveServiceInitiators.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
import org.hibernate.engine.config.internal.ConfigurationServiceInitiator;
1717
import org.hibernate.engine.jdbc.batch.internal.BatchBuilderInitiator;
1818
import org.hibernate.engine.jdbc.cursor.internal.RefCursorSupportInitiator;
19-
import org.hibernate.engine.jdbc.dialect.internal.DialectFactoryInitiator;
2019
import org.hibernate.engine.jdbc.dialect.internal.DialectResolverInitiator;
2120
import org.hibernate.engine.jdbc.internal.JdbcServicesInitiator;
2221
import org.hibernate.engine.jndi.internal.JndiServiceInitiator;
@@ -32,6 +31,7 @@
3231
import org.hibernate.reactive.provider.service.NoJdbcEnvironmentInitiator;
3332
import org.hibernate.reactive.provider.service.NoJdbcMultiTenantConnectionProviderInitiator;
3433
import org.hibernate.reactive.provider.service.NoJtaPlatformInitiator;
34+
import org.hibernate.reactive.provider.service.ReactiveDialectFactoryInitiator;
3535
import org.hibernate.reactive.provider.service.ReactiveMarkerServiceInitiator;
3636
import org.hibernate.reactive.provider.service.ReactivePersisterClassResolverInitiator;
3737
import org.hibernate.reactive.provider.service.ReactiveSchemaManagementToolInitiator;
@@ -101,7 +101,9 @@ private static List<StandardServiceInitiator<?>> buildInitialServiceInitiatorLis
101101
serviceInitiators.add( NoJdbcMultiTenantConnectionProviderInitiator.INSTANCE );
102102

103103
serviceInitiators.add( DialectResolverInitiator.INSTANCE );
104-
serviceInitiators.add( DialectFactoryInitiator.INSTANCE );
104+
105+
//Custom for Hibernate Reactive:
106+
serviceInitiators.add( ReactiveDialectFactoryInitiator.INSTANCE );
105107
serviceInitiators.add( BatchBuilderInitiator.INSTANCE );
106108
serviceInitiators.add( JdbcServicesInitiator.INSTANCE );
107109
serviceInitiators.add( RefCursorSupportInitiator.INSTANCE );
@@ -124,6 +126,7 @@ private static List<StandardServiceInitiator<?>> buildInitialServiceInitiatorLis
124126
serviceInitiators.add( ManagedBeanRegistryInitiator.INSTANCE );
125127
serviceInitiators.add( EntityCopyObserverFactoryInitiator.INSTANCE );
126128

129+
//Custom for Hibernate Reactive:
127130
serviceInitiators.add( ReactiveValuesMappingProducerProviderInitiator.INSTANCE );
128131

129132
serviceInitiators.trimToSize();

hibernate-reactive-core/src/main/java/org/hibernate/reactive/provider/service/NoJdbcEnvironmentInitiator.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import org.hibernate.dialect.MariaDBDialect;
1818
import org.hibernate.dialect.MySQLDialect;
1919
import org.hibernate.dialect.OracleDialect;
20+
import org.hibernate.dialect.PostgreSQLDialect;
2021
import org.hibernate.dialect.SQLServerDialect;
2122
import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider;
2223
import org.hibernate.engine.jdbc.connections.spi.JdbcConnectionAccess;
@@ -25,7 +26,6 @@
2526
import org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator;
2627
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
2728
import org.hibernate.internal.util.config.ConfigurationHelper;
28-
import org.hibernate.reactive.dialect.ReactivePostgreSQLDialect;
2929
import org.hibernate.reactive.engine.jdbc.env.internal.ReactiveJdbcEnvironment;
3030
import org.hibernate.reactive.logging.impl.Log;
3131
import org.hibernate.reactive.logging.impl.LoggerFactory;
@@ -132,7 +132,7 @@ protected Class<? extends Dialect> guessDialect(String url) {
132132
return MariaDBDialect.class;
133133
}
134134
if ( url.startsWith( "postgresql:" ) || url.startsWith( "postgres:" ) ) {
135-
return ReactivePostgreSQLDialect.class;
135+
return PostgreSQLDialect.class;
136136
}
137137
if ( url.startsWith( "db2:" ) ) {
138138
return DB2Dialect.class;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/* Hibernate, Relational Persistence for Idiomatic Java
2+
*
3+
* SPDX-License-Identifier: Apache-2.0
4+
* Copyright: Red Hat Inc. and Hibernate Authors
5+
*/
6+
package org.hibernate.reactive.provider.service;
7+
8+
import java.util.Map;
9+
10+
import org.hibernate.boot.registry.StandardServiceInitiator;
11+
import org.hibernate.engine.jdbc.dialect.spi.DialectFactory;
12+
import org.hibernate.service.spi.ServiceRegistryImplementor;
13+
14+
public class ReactiveDialectFactoryInitiator implements StandardServiceInitiator<DialectFactory> {
15+
/**
16+
* Singleton access
17+
*/
18+
public static final ReactiveDialectFactoryInitiator INSTANCE = new ReactiveDialectFactoryInitiator();
19+
20+
@Override
21+
public Class<DialectFactory> getServiceInitiated() {
22+
return DialectFactory.class;
23+
}
24+
25+
@Override
26+
public DialectFactory initiateService(Map<String, Object> configurationValues, ServiceRegistryImplementor registry) {
27+
return new ReactiveWrappingDialectFactory();
28+
}
29+
}

hibernate-reactive-core/src/main/java/org/hibernate/reactive/provider/service/ReactiveSchemaManagementTool.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import org.hibernate.boot.model.relational.SqlStringGenerationContext;
1010
import org.hibernate.dialect.CockroachDialect;
1111
import org.hibernate.dialect.Dialect;
12+
import org.hibernate.dialect.DialectDelegateWrapper;
1213
import org.hibernate.dialect.MariaDBDialect;
1314
import org.hibernate.dialect.MySQLDialect;
1415
import org.hibernate.dialect.OracleDialect;
@@ -58,7 +59,12 @@ public ExtractionContext createExtractionContext(
5859
}
5960

6061
public InformationExtractor createInformationExtractor(ExtractionContext extractionContext) {
61-
final Dialect dialect = extractionContext.getJdbcEnvironment().getDialect();
62+
Dialect dialect = extractionContext.getJdbcEnvironment().getDialect();
63+
//Allow for wrapped cases:
64+
if ( dialect instanceof DialectDelegateWrapper ) {
65+
dialect = ( (DialectDelegateWrapper) dialect ).getWrappedDialect();
66+
}
67+
//Now detect the kind of Dialect:
6268
if ( dialect instanceof PostgreSQLDialect || dialect instanceof CockroachDialect ) {
6369
return new PostgreSqlReactiveInformationExtractorImpl( extractionContext );
6470
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/* Hibernate, Relational Persistence for Idiomatic Java
2+
*
3+
* SPDX-License-Identifier: Apache-2.0
4+
* Copyright: Red Hat Inc. and Hibernate Authors
5+
*/
6+
package org.hibernate.reactive.provider.service;
7+
8+
import java.util.Map;
9+
10+
import org.hibernate.HibernateException;
11+
import org.hibernate.dialect.Dialect;
12+
import org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl;
13+
import org.hibernate.engine.jdbc.dialect.spi.DialectFactory;
14+
import org.hibernate.engine.jdbc.dialect.spi.DialectResolutionInfoSource;
15+
import org.hibernate.reactive.dialect.ReactiveDialectWrapper;
16+
import org.hibernate.service.spi.ServiceRegistryAwareService;
17+
import org.hibernate.service.spi.ServiceRegistryImplementor;
18+
19+
public class ReactiveWrappingDialectFactory implements DialectFactory, ServiceRegistryAwareService {
20+
21+
private final DialectFactoryImpl original = new DialectFactoryImpl();
22+
23+
@Override
24+
public Dialect buildDialect(Map<String, Object> configValues, DialectResolutionInfoSource resolutionInfoSource)
25+
throws HibernateException {
26+
return wrap( original.buildDialect( configValues, resolutionInfoSource ) );
27+
}
28+
29+
private Dialect wrap(final Dialect dialect) {
30+
if ( dialect == null ) {
31+
return null;
32+
}
33+
else {
34+
return new ReactiveDialectWrapper( dialect );
35+
}
36+
}
37+
38+
@Override
39+
public void injectServices(ServiceRegistryImplementor serviceRegistry) {
40+
original.injectServices( serviceRegistry );
41+
}
42+
43+
}

hibernate-reactive-core/src/main/java/org/hibernate/reactive/sql/ast/spi/ReactivePostgreSQLSqlAstTranslator.java

Lines changed: 0 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -8,49 +8,15 @@
88
import org.hibernate.dialect.PostgreSQLSqlAstTranslator;
99
import org.hibernate.engine.spi.SessionFactoryImplementor;
1010
import org.hibernate.reactive.pool.impl.PostgresParameters;
11-
import org.hibernate.reactive.sql.results.internal.ReactiveStandardValuesMappingProducer;
1211
import org.hibernate.sql.ast.tree.Statement;
13-
import org.hibernate.sql.ast.tree.select.SelectStatement;
1412
import org.hibernate.sql.exec.spi.JdbcOperation;
15-
import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect;
16-
17-
import static org.hibernate.sql.ast.SqlTreePrinter.logSqlAst;
18-
import static org.hibernate.sql.results.graph.DomainResultGraphPrinter.logDomainResultGraph;
1913

2014
public class ReactivePostgreSQLSqlAstTranslator<T extends JdbcOperation> extends PostgreSQLSqlAstTranslator<T> {
2115

22-
private int paramCounter = 0;
23-
2416
public ReactivePostgreSQLSqlAstTranslator(SessionFactoryImplementor sessionFactory, Statement statement) {
2517
super( sessionFactory, statement );
2618
}
2719

28-
@Override
29-
protected JdbcOperationQuerySelect translateSelect(SelectStatement selectStatement) {
30-
logDomainResultGraph( selectStatement.getDomainResultDescriptors() );
31-
logSqlAst( selectStatement );
32-
33-
visitSelectStatement( selectStatement );
34-
35-
final int rowsToSkip;
36-
return new JdbcOperationQuerySelect(
37-
getSql(),
38-
getParameterBinders(),
39-
new ReactiveStandardValuesMappingProducer(
40-
selectStatement.getQuerySpec().getSelectClause().getSqlSelections(),
41-
selectStatement.getDomainResultDescriptors()
42-
),
43-
getAffectedTableNames(),
44-
getFilterJdbcParameters(),
45-
rowsToSkip = getRowsToSkip( selectStatement, getJdbcParameterBindings() ),
46-
getMaxRows( selectStatement, getJdbcParameterBindings(), rowsToSkip ),
47-
getAppliedParameterBindings(),
48-
getJdbcLockStrategy(),
49-
getOffsetParameter(),
50-
getLimitParameter()
51-
);
52-
}
53-
5420
@Override
5521
public String getSql() {
5622
// Not all queries goes through the appendSql

0 commit comments

Comments
 (0)