Skip to content

Commit

Permalink
make Dialect implement TypeContributor and FunctionContributor
Browse files Browse the repository at this point in the history
there is little *concrete* benefit to this change, and it's slightly break-y but:

- it removes a dependence on the @Incubating type QueryEngine from Dialect
- we eat our own dogfood, that is, use our own abstractions
- it appears that this was how it was *originally* intended to be
  • Loading branch information
gavinking committed Jan 4, 2023
1 parent 9080a38 commit ecf4d30
Show file tree
Hide file tree
Showing 50 changed files with 517 additions and 506 deletions.
Expand Up @@ -8,6 +8,7 @@

import java.sql.Types;

import org.hibernate.boot.model.FunctionContributions;
import org.hibernate.boot.model.TypeContributions;
import org.hibernate.community.dialect.identity.CUBRIDIdentityColumnSupport;
import org.hibernate.community.dialect.sequence.CUBRIDSequenceSupport;
Expand All @@ -24,7 +25,6 @@
import org.hibernate.engine.jdbc.dialect.spi.DialectResolutionInfo;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.query.SemanticException;
import org.hibernate.query.spi.QueryEngine;
import org.hibernate.query.sqm.IntervalType;
import org.hibernate.query.sqm.TemporalUnit;
import org.hibernate.service.ServiceRegistry;
Expand Down Expand Up @@ -203,10 +203,10 @@ public int getFloatPrecision() {
}

@Override
public void initializeFunctionRegistry(QueryEngine queryEngine) {
super.initializeFunctionRegistry( queryEngine );
public void initializeFunctionRegistry(FunctionContributions functionContributions) {
super.initializeFunctionRegistry(functionContributions);

CommonFunctionFactory functionFactory = new CommonFunctionFactory(queryEngine);
CommonFunctionFactory functionFactory = new CommonFunctionFactory(functionContributions);
functionFactory.trim2();
functionFactory.space();
functionFactory.reverse();
Expand Down
Expand Up @@ -12,6 +12,7 @@
import java.sql.Types;

import org.hibernate.LockMode;
import org.hibernate.boot.model.FunctionContributions;
import org.hibernate.cfg.Environment;
import org.hibernate.community.dialect.identity.CacheIdentityColumnSupport;
import org.hibernate.community.dialect.sequence.CacheSequenceSupport;
Expand Down Expand Up @@ -40,7 +41,6 @@
import org.hibernate.exception.spi.ViolatedConstraintNameExtractor;
import org.hibernate.internal.util.JdbcExceptionHelper;
import org.hibernate.persister.entity.Lockable;
import org.hibernate.query.spi.QueryEngine;
import org.hibernate.query.sqm.IntervalType;
import org.hibernate.query.sqm.TemporalUnit;
import org.hibernate.sql.ast.SqlAstTranslator;
Expand Down Expand Up @@ -110,11 +110,11 @@ public int getDefaultStatementBatchSize() {
return 15;
}

private static void useJdbcEscape(QueryEngine queryEngine, String name) {
private static void useJdbcEscape(FunctionContributions queryEngine, String name) {
//Yep, this seems to be truly necessary for certain functions
queryEngine.getSqmFunctionRegistry().wrapInJdbcEscape(
queryEngine.getFunctionRegistry().wrapInJdbcEscape(
name,
queryEngine.getSqmFunctionRegistry().findFunctionDescriptor(name)
queryEngine.getFunctionRegistry().findFunctionDescriptor(name)
);
}

Expand Down Expand Up @@ -149,10 +149,10 @@ public int getDefaultDecimalPrecision() {
}

@Override
public void initializeFunctionRegistry(QueryEngine queryEngine) {
super.initializeFunctionRegistry( queryEngine );
public void initializeFunctionRegistry(FunctionContributions functionContributions) {
super.initializeFunctionRegistry(functionContributions);

CommonFunctionFactory functionFactory = new CommonFunctionFactory(queryEngine);
CommonFunctionFactory functionFactory = new CommonFunctionFactory(functionContributions);
functionFactory.repeat();
functionFactory.trim2();
functionFactory.substr();
Expand Down Expand Up @@ -182,42 +182,42 @@ public void initializeFunctionRegistry(QueryEngine queryEngine) {
functionFactory.varPopSamp();
functionFactory.lastDay();

queryEngine.getSqmFunctionRegistry().registerBinaryTernaryPattern(
functionContributions.getFunctionRegistry().registerBinaryTernaryPattern(
"locate",
queryEngine.getTypeConfiguration().getBasicTypeRegistry().resolve( StandardBasicTypes.INTEGER ),
functionContributions.getTypeConfiguration().getBasicTypeRegistry().resolve( StandardBasicTypes.INTEGER ),
"$find(?2,?1)",
"$find(?2,?1,?3)",
STRING, STRING, INTEGER,
queryEngine.getTypeConfiguration()
functionContributions.getTypeConfiguration()
).setArgumentListSignature("(pattern, string[, start])");
functionFactory.bitLength_pattern( "($length(?1)*8)" );

useJdbcEscape(queryEngine, "sin");
useJdbcEscape(queryEngine, "cos");
useJdbcEscape(queryEngine, "tan");
useJdbcEscape(queryEngine, "asin");
useJdbcEscape(queryEngine, "acos");
useJdbcEscape(queryEngine, "atan");
useJdbcEscape(queryEngine, "atan2");
useJdbcEscape(queryEngine, "exp");
useJdbcEscape(queryEngine, "log");
useJdbcEscape(queryEngine, "log10");
useJdbcEscape(queryEngine, "pi");
useJdbcEscape(queryEngine, "truncate");

useJdbcEscape(queryEngine, "left");
useJdbcEscape(queryEngine, "right");

useJdbcEscape(queryEngine, "hour");
useJdbcEscape(queryEngine, "minute");
useJdbcEscape(queryEngine, "second");
useJdbcEscape(queryEngine, "week");
useJdbcEscape(queryEngine, "quarter");
useJdbcEscape(queryEngine, "dayname");
useJdbcEscape(queryEngine, "monthname");
useJdbcEscape(queryEngine, "dayofweek");
useJdbcEscape(queryEngine, "dayofmonth");
useJdbcEscape(queryEngine, "dayofyear");
useJdbcEscape(functionContributions, "sin");
useJdbcEscape(functionContributions, "cos");
useJdbcEscape(functionContributions, "tan");
useJdbcEscape(functionContributions, "asin");
useJdbcEscape(functionContributions, "acos");
useJdbcEscape(functionContributions, "atan");
useJdbcEscape(functionContributions, "atan2");
useJdbcEscape(functionContributions, "exp");
useJdbcEscape(functionContributions, "log");
useJdbcEscape(functionContributions, "log10");
useJdbcEscape(functionContributions, "pi");
useJdbcEscape(functionContributions, "truncate");

useJdbcEscape(functionContributions, "left");
useJdbcEscape(functionContributions, "right");

useJdbcEscape(functionContributions, "hour");
useJdbcEscape(functionContributions, "minute");
useJdbcEscape(functionContributions, "second");
useJdbcEscape(functionContributions, "week");
useJdbcEscape(functionContributions, "quarter");
useJdbcEscape(functionContributions, "dayname");
useJdbcEscape(functionContributions, "monthname");
useJdbcEscape(functionContributions, "dayofweek");
useJdbcEscape(functionContributions, "dayofmonth");
useJdbcEscape(functionContributions, "dayofyear");

}

Expand Down
Expand Up @@ -25,6 +25,7 @@
import org.hibernate.LockOptions;
import org.hibernate.PessimisticLockException;
import org.hibernate.QueryTimeoutException;
import org.hibernate.boot.model.FunctionContributions;
import org.hibernate.boot.model.TypeContributions;
import org.hibernate.dialect.DatabaseVersion;
import org.hibernate.dialect.Dialect;
Expand Down Expand Up @@ -59,7 +60,6 @@
import org.hibernate.exception.spi.ViolatedConstraintNameExtractor;
import org.hibernate.internal.CoreMessageLogger;
import org.hibernate.internal.util.JdbcExceptionHelper;
import org.hibernate.query.spi.QueryEngine;
import org.hibernate.query.sqm.IntervalType;
import org.hibernate.query.sqm.NullOrdering;
import org.hibernate.query.sqm.TemporalUnit;
Expand Down Expand Up @@ -359,10 +359,10 @@ public void contributeTypes(TypeContributions typeContributions, ServiceRegistry
}

@Override
public void initializeFunctionRegistry(QueryEngine queryEngine) {
super.initializeFunctionRegistry(queryEngine);
public void initializeFunctionRegistry(FunctionContributions functionContributions) {
super.initializeFunctionRegistry(functionContributions);

final CommonFunctionFactory functionFactory = new CommonFunctionFactory( queryEngine );
final CommonFunctionFactory functionFactory = new CommonFunctionFactory(functionContributions);
functionFactory.ascii();
functionFactory.char_chr();
functionFactory.overlay();
Expand Down Expand Up @@ -399,9 +399,9 @@ public void initializeFunctionRegistry(QueryEngine queryEngine) {
functionFactory.corr();
functionFactory.regrLinearRegressionAggregates();

queryEngine.getSqmFunctionRegistry().register(
functionContributions.getFunctionRegistry().register(
"format",
new FormatFunction( "experimental_strftime", queryEngine.getTypeConfiguration() )
new FormatFunction( "experimental_strftime", functionContributions.getTypeConfiguration() )
);
functionFactory.windowFunctions();
functionFactory.listagg_stringAgg( "string" );
Expand Down
Expand Up @@ -14,6 +14,7 @@
import java.util.List;

import org.hibernate.LockOptions;
import org.hibernate.boot.model.FunctionContributions;
import org.hibernate.boot.model.TypeContributions;
import org.hibernate.dialect.DB2Dialect;
import org.hibernate.dialect.DB2StructJdbcType;
Expand All @@ -36,7 +37,6 @@
import org.hibernate.dialect.sequence.DB2SequenceSupport;
import org.hibernate.dialect.sequence.LegacyDB2SequenceSupport;
import org.hibernate.dialect.sequence.SequenceSupport;
import org.hibernate.dialect.unique.AlterTableUniqueDelegate;
import org.hibernate.dialect.unique.AlterTableUniqueIndexDelegate;
import org.hibernate.dialect.unique.SkipNullableUniqueDelegate;
import org.hibernate.dialect.unique.UniqueDelegate;
Expand All @@ -52,7 +52,6 @@
import org.hibernate.metamodel.spi.RuntimeModelCreationContext;
import org.hibernate.procedure.internal.DB2CallableStatementSupport;
import org.hibernate.procedure.spi.CallableStatementSupport;
import org.hibernate.query.spi.QueryEngine;
import org.hibernate.query.sqm.IntervalType;
import org.hibernate.query.sqm.TemporalUnit;
import org.hibernate.query.sqm.mutation.internal.cte.CteInsertStrategy;
Expand Down Expand Up @@ -248,10 +247,10 @@ public boolean supportsDistinctFromPredicate() {
}

@Override
public void initializeFunctionRegistry(QueryEngine queryEngine) {
super.initializeFunctionRegistry( queryEngine );
public void initializeFunctionRegistry(FunctionContributions functionContributions) {
super.initializeFunctionRegistry(functionContributions);

CommonFunctionFactory functionFactory = new CommonFunctionFactory(queryEngine);
CommonFunctionFactory functionFactory = new CommonFunctionFactory(functionContributions);
// AVG by default uses the input type, so we possibly need to cast the argument type, hence a special function
functionFactory.avg_castingNonDoubleArguments( this, SqlAstNodeRenderingMode.DEFAULT );

Expand All @@ -267,17 +266,17 @@ public void initializeFunctionRegistry(QueryEngine queryEngine) {
functionFactory.trim2();
functionFactory.space();
functionFactory.repeat();
queryEngine.getSqmFunctionRegistry().namedDescriptorBuilder( "substr" )
functionContributions.getFunctionRegistry().namedDescriptorBuilder( "substr" )
.setInvariantType(
queryEngine.getTypeConfiguration().getBasicTypeRegistry().resolve( StandardBasicTypes.STRING )
functionContributions.getTypeConfiguration().getBasicTypeRegistry().resolve( StandardBasicTypes.STRING )
)
.setArgumentCountBetween( 2, 3 )
.setParameterTypes(FunctionParameterType.STRING, FunctionParameterType.INTEGER, FunctionParameterType.INTEGER)
.setArgumentListSignature( "(STRING string, INTEGER start[, INTEGER length])" )
.register();
queryEngine.getSqmFunctionRegistry().register(
functionContributions.getFunctionRegistry().register(
"substring",
new DB2SubstringFunction( queryEngine.getTypeConfiguration() )
new DB2SubstringFunction( functionContributions.getTypeConfiguration() )
);
functionFactory.translate();
functionFactory.bitand();
Expand Down Expand Up @@ -316,17 +315,17 @@ public void initializeFunctionRegistry(QueryEngine queryEngine) {
}
else {
// Before version 11, the position function required the use of the code units
queryEngine.getSqmFunctionRegistry().register(
functionContributions.getFunctionRegistry().register(
"position",
new DB2PositionFunction( queryEngine.getTypeConfiguration() )
new DB2PositionFunction( functionContributions.getTypeConfiguration() )
);
// Before version 11, the overlay function required the use of the code units
functionFactory.overlayLength_overlay( true );
// ordered set aggregate functions are only available as of version 11, and we can't reasonably emulate them
// so no percent_rank, cume_dist, median, mode, percentile_cont or percentile_disc
queryEngine.getSqmFunctionRegistry().registerAlternateKey( "stddev_pop", "stddev" );
functionContributions.getFunctionRegistry().registerAlternateKey( "stddev_pop", "stddev" );
functionFactory.stddevSamp_sumCount();
queryEngine.getSqmFunctionRegistry().registerAlternateKey( "var_pop", "variance" );
functionContributions.getFunctionRegistry().registerAlternateKey( "var_pop", "variance" );
functionFactory.varSamp_sumCount();
functionFactory.dateTrunc_trunc();
}
Expand All @@ -336,27 +335,27 @@ public void initializeFunctionRegistry(QueryEngine queryEngine) {
functionFactory.bitLength_pattern( "length(?1)*8" );

// DB2 wants parameter operands to be casted to allow lengths bigger than 255
queryEngine.getSqmFunctionRegistry().register(
functionContributions.getFunctionRegistry().register(
"concat",
new CastingConcatFunction(
this,
"||",
true,
SqlAstNodeRenderingMode.NO_PLAIN_PARAMETER,
queryEngine.getTypeConfiguration()
functionContributions.getTypeConfiguration()
)
);
// For the count distinct emulation distinct
queryEngine.getSqmFunctionRegistry().register(
functionContributions.getFunctionRegistry().register(
"count",
new CountFunction(
this,
queryEngine.getTypeConfiguration(),
functionContributions.getTypeConfiguration(),
SqlAstNodeRenderingMode.DEFAULT,
"||",
queryEngine.getTypeConfiguration().getDdlTypeRegistry().getDescriptor( VARCHAR )
functionContributions.getTypeConfiguration().getDdlTypeRegistry().getDescriptor( VARCHAR )
.getCastTypeName(
queryEngine.getTypeConfiguration()
functionContributions.getTypeConfiguration()
.getBasicTypeRegistry()
.resolve( StandardBasicTypes.STRING ),
null,
Expand All @@ -367,22 +366,22 @@ public void initializeFunctionRegistry(QueryEngine queryEngine) {
)
);

queryEngine.getSqmFunctionRegistry().register(
functionContributions.getFunctionRegistry().register(
"format",
new DB2FormatEmulation( queryEngine.getTypeConfiguration() )
new DB2FormatEmulation( functionContributions.getTypeConfiguration() )
);

queryEngine.getSqmFunctionRegistry().patternDescriptorBuilder( "atan2", "atan2(?2,?1)" )
functionContributions.getFunctionRegistry().patternDescriptorBuilder( "atan2", "atan2(?2,?1)" )
.setInvariantType(
queryEngine.getTypeConfiguration().getBasicTypeRegistry().resolve( StandardBasicTypes.DOUBLE )
functionContributions.getTypeConfiguration().getBasicTypeRegistry().resolve( StandardBasicTypes.DOUBLE )
)
.setExactArgumentCount( 2 )
.setParameterTypes( FunctionParameterType.NUMERIC, FunctionParameterType.NUMERIC )
.register();

queryEngine.getSqmFunctionRegistry().namedDescriptorBuilder( "posstr" )
functionContributions.getFunctionRegistry().namedDescriptorBuilder( "posstr" )
.setInvariantType(
queryEngine.getTypeConfiguration().getBasicTypeRegistry().resolve( StandardBasicTypes.INTEGER )
functionContributions.getTypeConfiguration().getBasicTypeRegistry().resolve( StandardBasicTypes.INTEGER )
)
.setExactArgumentCount( 2 )
.setParameterTypes(FunctionParameterType.STRING, FunctionParameterType.STRING)
Expand Down
Expand Up @@ -6,6 +6,7 @@
*/
package org.hibernate.community.dialect;

import org.hibernate.boot.model.FunctionContributions;
import org.hibernate.dialect.DatabaseVersion;
import org.hibernate.dialect.function.CommonFunctionFactory;
import org.hibernate.dialect.identity.DB2390IdentityColumnSupport;
Expand All @@ -23,7 +24,6 @@
import org.hibernate.engine.jdbc.dialect.spi.DialectResolutionInfo;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.mapping.Column;
import org.hibernate.query.spi.QueryEngine;
import org.hibernate.sql.ast.SqlAstTranslator;
import org.hibernate.sql.ast.SqlAstTranslatorFactory;
import org.hibernate.sql.ast.spi.StandardSqlAstTranslatorFactory;
Expand Down Expand Up @@ -56,10 +56,10 @@ public DB2iLegacyDialect(DatabaseVersion version) {
}

@Override
public void initializeFunctionRegistry(QueryEngine queryEngine) {
super.initializeFunctionRegistry( queryEngine );
public void initializeFunctionRegistry(FunctionContributions functionContributions) {
super.initializeFunctionRegistry(functionContributions);
if ( getVersion().isSameOrAfter( 7, 2 ) ) {
CommonFunctionFactory functionFactory = new CommonFunctionFactory(queryEngine);
CommonFunctionFactory functionFactory = new CommonFunctionFactory(functionContributions);
functionFactory.listagg( null );
functionFactory.inverseDistributionOrderedSetAggregates();
functionFactory.hypotheticalOrderedSetAggregates_windowEmulation();
Expand Down
Expand Up @@ -7,6 +7,7 @@
package org.hibernate.community.dialect;


import org.hibernate.boot.model.FunctionContributions;
import org.hibernate.dialect.DatabaseVersion;
import org.hibernate.dialect.TimeZoneSupport;
import org.hibernate.dialect.function.CommonFunctionFactory;
Expand All @@ -24,7 +25,6 @@
import org.hibernate.engine.jdbc.dialect.spi.DialectResolutionInfo;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.mapping.Column;
import org.hibernate.query.spi.QueryEngine;
import org.hibernate.query.sqm.IntervalType;
import org.hibernate.query.sqm.TemporalUnit;
import org.hibernate.sql.ast.SqlAstTranslator;
Expand Down Expand Up @@ -62,10 +62,10 @@ public DB2zLegacyDialect(DatabaseVersion version) {
}

@Override
public void initializeFunctionRegistry(QueryEngine queryEngine) {
super.initializeFunctionRegistry( queryEngine );
public void initializeFunctionRegistry(FunctionContributions functionContributions) {
super.initializeFunctionRegistry(functionContributions);
if ( getVersion().isSameOrAfter( 12 ) ) {
CommonFunctionFactory functionFactory = new CommonFunctionFactory(queryEngine);
CommonFunctionFactory functionFactory = new CommonFunctionFactory(functionContributions);
functionFactory.listagg( null );
functionFactory.inverseDistributionOrderedSetAggregates();
functionFactory.hypotheticalOrderedSetAggregates_windowEmulation();
Expand Down

0 comments on commit ecf4d30

Please sign in to comment.