Skip to content

Commit

Permalink
--wip-- custom rendering modes for hsqldb and db2
Browse files Browse the repository at this point in the history
  • Loading branch information
mbladel committed Jan 4, 2024
1 parent d0b0ff0 commit d16bbb7
Show file tree
Hide file tree
Showing 5 changed files with 43 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
import org.hibernate.dialect.function.DB2FormatEmulation;
import org.hibernate.dialect.function.DB2PositionFunction;
import org.hibernate.dialect.function.DB2SubstringFunction;
import org.hibernate.dialect.function.TrimFunction;
import org.hibernate.dialect.identity.DB2IdentityColumnSupport;
import org.hibernate.dialect.identity.IdentityColumnSupport;
import org.hibernate.dialect.pagination.DB2LimitHandler;
Expand Down Expand Up @@ -403,6 +404,13 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
.setArgumentListSignature("(STRING string, STRING pattern)")
.register();

//trim() requires trim characters to be constant literals
functionContributions.getFunctionRegistry().register( "trim", new TrimFunction(
this,
functionContributions.getTypeConfiguration(),
SqlAstNodeRenderingMode.INLINE_PARAMETERS
) );

functionFactory.windowFunctions();
if ( getDB2Version().isSameOrAfter( 9, 5 ) ) {
functionFactory.listagg( null );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import org.hibernate.boot.model.FunctionContributions;
import org.hibernate.dialect.*;
import org.hibernate.dialect.function.CommonFunctionFactory;
import org.hibernate.dialect.function.TrimFunction;
import org.hibernate.dialect.identity.HSQLIdentityColumnSupport;
import org.hibernate.dialect.identity.IdentityColumnSupport;
import org.hibernate.dialect.lock.LockingStrategy;
Expand Down Expand Up @@ -268,6 +269,13 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
functionFactory.arrayTrim_trim_array();
functionFactory.arrayFill_hsql();
functionFactory.arrayToString_hsql();

//trim() requires parameters to be cast when used as trim character
functionContributions.getFunctionRegistry().register( "trim", new TrimFunction(
this,
functionContributions.getTypeConfiguration(),
SqlAstNodeRenderingMode.NO_PLAIN_PARAMETER
) );
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
import org.hibernate.dialect.function.DB2FormatEmulation;
import org.hibernate.dialect.function.DB2PositionFunction;
import org.hibernate.dialect.function.DB2SubstringFunction;
import org.hibernate.dialect.function.TrimFunction;
import org.hibernate.dialect.identity.DB2IdentityColumnSupport;
import org.hibernate.dialect.identity.IdentityColumnSupport;
import org.hibernate.dialect.pagination.DB2LimitHandler;
Expand Down Expand Up @@ -391,6 +392,13 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
.setArgumentListSignature("(STRING string, STRING pattern)")
.register();

//trim() requires trim characters to be constant literals
functionContributions.getFunctionRegistry().register( "trim", new TrimFunction(
this,
functionContributions.getTypeConfiguration(),
SqlAstNodeRenderingMode.INLINE_PARAMETERS
) );

functionFactory.windowFunctions();
functionFactory.listagg( null );
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

import org.hibernate.boot.model.FunctionContributions;
import org.hibernate.dialect.function.CommonFunctionFactory;
import org.hibernate.dialect.function.TrimFunction;
import org.hibernate.dialect.identity.HSQLIdentityColumnSupport;
import org.hibernate.dialect.identity.IdentityColumnSupport;
import org.hibernate.dialect.pagination.LimitHandler;
Expand Down Expand Up @@ -208,6 +209,13 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
functionFactory.arrayTrim_trim_array();
functionFactory.arrayFill_hsql();
functionFactory.arrayToString_hsql();

//trim() requires parameters to be cast when used as trim character
functionContributions.getFunctionRegistry().register( "trim", new TrimFunction(
this,
functionContributions.getTypeConfiguration(),
SqlAstNodeRenderingMode.NO_PLAIN_PARAMETER
) );
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import org.hibernate.query.sqm.produce.function.StandardFunctionReturnTypeResolvers;
import org.hibernate.query.sqm.produce.function.internal.PatternRenderer;
import org.hibernate.query.sqm.sql.internal.SqmParameterInterpretation;
import org.hibernate.sql.ast.SqlAstNodeRenderingMode;
import org.hibernate.sql.ast.SqlAstTranslator;
import org.hibernate.sql.ast.spi.SqlAppender;
import org.hibernate.sql.ast.tree.SqlAstNode;
Expand All @@ -44,10 +45,17 @@
* @author Gavin King
*/
public class TrimFunction extends AbstractSqmSelfRenderingFunctionDescriptor {

private final Dialect dialect;
private SqlAstNodeRenderingMode argumentRenderingMode;

public TrimFunction(Dialect dialect, TypeConfiguration typeConfiguration) {
this( dialect, typeConfiguration, SqlAstNodeRenderingMode.DEFAULT );
}

public TrimFunction(
Dialect dialect,
TypeConfiguration typeConfiguration,
SqlAstNodeRenderingMode argumentRenderingMode) {
super(
"trim",
new ArgumentTypesValidator(
Expand All @@ -60,6 +68,7 @@ public TrimFunction(Dialect dialect, TypeConfiguration typeConfiguration) {
StandardFunctionArgumentTypeResolvers.invariant( typeConfiguration, TRIM_SPEC, STRING, STRING )
);
this.dialect = dialect;
this.argumentRenderingMode = argumentRenderingMode;
}

@Override
Expand All @@ -78,7 +87,7 @@ public void render(
final List<? extends SqlAstNode> args = explicitChar ?
List.of( sourceExpr, trimCharacter ) :
Collections.singletonList( sourceExpr );
new PatternRenderer( trim ).render( sqlAppender, args, walker );
new PatternRenderer( trim, argumentRenderingMode ).render( sqlAppender, args, walker );
}

private static boolean isExplicitChar(SqlAstNode trimCharacter) {
Expand Down

0 comments on commit d16bbb7

Please sign in to comment.