HHH-16668 Fix SqmWindow copy of partition and order lists

This commit is contained in:
Marco Belladelli 2023-05-25 10:51:59 +02:00
parent 8c1839f7dc
commit 5e13845f00
2 changed files with 18 additions and 15 deletions

View File

@ -28,6 +28,7 @@ import jakarta.persistence.criteria.Order;
import static org.hibernate.query.sqm.FrameExclusion.NO_OTHERS; import static org.hibernate.query.sqm.FrameExclusion.NO_OTHERS;
import static org.hibernate.query.sqm.FrameKind.CURRENT_ROW; import static org.hibernate.query.sqm.FrameKind.CURRENT_ROW;
import static org.hibernate.query.sqm.FrameKind.UNBOUNDED_PRECEDING; import static org.hibernate.query.sqm.FrameKind.UNBOUNDED_PRECEDING;
import static org.hibernate.query.sqm.FrameMode.GROUPS;
import static org.hibernate.query.sqm.FrameMode.RANGE; import static org.hibernate.query.sqm.FrameMode.RANGE;
import static org.hibernate.query.sqm.FrameMode.ROWS; import static org.hibernate.query.sqm.FrameMode.ROWS;
@ -114,28 +115,28 @@ public class SqmWindow extends AbstractSqmNode implements JpaWindow, SqmVisitabl
@Override @Override
public JpaWindow frameRows(JpaWindowFrame startFrame, JpaWindowFrame endFrame) { public JpaWindow frameRows(JpaWindowFrame startFrame, JpaWindowFrame endFrame) {
return this.setFrames(FrameMode.ROWS, startFrame, endFrame); return this.setFrames( ROWS, startFrame, endFrame );
} }
@Override @Override
public JpaWindow frameRange(JpaWindowFrame startFrame, JpaWindowFrame endFrame) { public JpaWindow frameRange(JpaWindowFrame startFrame, JpaWindowFrame endFrame) {
return this.setFrames(FrameMode.RANGE, startFrame, endFrame); return this.setFrames( RANGE, startFrame, endFrame );
} }
@Override @Override
public JpaWindow frameGroups(JpaWindowFrame startFrame, JpaWindowFrame endFrame) { public JpaWindow frameGroups(JpaWindowFrame startFrame, JpaWindowFrame endFrame) {
return this.setFrames(FrameMode.GROUPS, startFrame, endFrame); return this.setFrames( GROUPS, startFrame, endFrame );
} }
private SqmWindow setFrames(FrameMode frameMode, JpaWindowFrame startFrame, JpaWindowFrame endFrame) { private SqmWindow setFrames(FrameMode frameMode, JpaWindowFrame startFrame, JpaWindowFrame endFrame) {
this.mode = frameMode; this.mode = frameMode;
if (startFrame != null) { if ( startFrame != null ) {
this.startKind = startFrame.getKind(); this.startKind = startFrame.getKind();
this.startExpression = (SqmExpression<?>) startFrame.getExpression(); this.startExpression = (SqmExpression<?>) startFrame.getExpression();
} }
if (endFrame != null) { if ( endFrame != null ) {
this.endKind = endFrame.getKind(); this.endKind = endFrame.getKind();
this.endExpression = (SqmExpression<?>) endFrame.getExpression(); this.endExpression = (SqmExpression<?>) endFrame.getExpression();
} }
@ -150,15 +151,15 @@ public class SqmWindow extends AbstractSqmNode implements JpaWindow, SqmVisitabl
@Override @Override
public JpaWindow partitionBy(Expression<?>... expressions) { public JpaWindow partitionBy(Expression<?>... expressions) {
for (Expression<?> expression : expressions) { for ( Expression<?> expression : expressions ) {
this.partitions.add((SqmExpression<?>) expression); this.partitions.add( (SqmExpression<?>) expression );
} }
return this; return this;
} }
@Override @Override
public JpaWindow orderBy(Order... orders) { public JpaWindow orderBy(Order... orders) {
for (Order order : orders) { for ( Order order : orders ) {
this.orderList.add( (SqmSortSpecification) order ); this.orderList.add( (SqmSortSpecification) order );
} }
return this; return this;
@ -169,13 +170,13 @@ public class SqmWindow extends AbstractSqmNode implements JpaWindow, SqmVisitabl
if ( existing != null ) { if ( existing != null ) {
return existing; return existing;
} }
final List<SqmExpression<?>> partitionsCopy = new ArrayList<>( this.partitions.size() ); final List<SqmExpression<?>> partitionsCopy = new ArrayList<>( partitions.size() );
for ( SqmExpression<?> partition : this.partitions ) { for ( SqmExpression<?> partition : partitions ) {
partitions.add( partition.copy( context ) ); partitionsCopy.add( partition.copy( context ) );
} }
final List<SqmSortSpecification> orderListCopy = new ArrayList<>( this.orderList.size() ); final List<SqmSortSpecification> orderListCopy = new ArrayList<>( orderList.size() );
for ( SqmSortSpecification sortSpecification : this.orderList ) { for ( SqmSortSpecification sortSpecification : orderList ) {
orderList.add( sortSpecification.copy( context ) ); orderListCopy.add( sortSpecification.copy( context ) );
} }
return context.registerCopy( return context.registerCopy(
this, this,

View File

@ -9,6 +9,7 @@ package org.hibernate.orm.test.query.criteria;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import org.hibernate.cfg.AvailableSettings;
import org.hibernate.dialect.DB2Dialect; import org.hibernate.dialect.DB2Dialect;
import org.hibernate.dialect.SQLServerDialect; import org.hibernate.dialect.SQLServerDialect;
import org.hibernate.query.criteria.HibernateCriteriaBuilder; import org.hibernate.query.criteria.HibernateCriteriaBuilder;
@ -23,6 +24,7 @@ import org.hibernate.testing.orm.junit.RequiresDialectFeature;
import org.hibernate.testing.orm.junit.ServiceRegistry; import org.hibernate.testing.orm.junit.ServiceRegistry;
import org.hibernate.testing.orm.junit.SessionFactory; import org.hibernate.testing.orm.junit.SessionFactory;
import org.hibernate.testing.orm.junit.SessionFactoryScope; import org.hibernate.testing.orm.junit.SessionFactoryScope;
import org.hibernate.testing.orm.junit.Setting;
import org.hibernate.testing.orm.junit.SkipForDialect; import org.hibernate.testing.orm.junit.SkipForDialect;
import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
@ -39,7 +41,7 @@ import static org.junit.jupiter.api.Assertions.assertNull;
/** /**
* @author Marco Belladelli * @author Marco Belladelli
*/ */
@ServiceRegistry @ServiceRegistry(settings = @Setting(name = AvailableSettings.CRITERIA_COPY_TREE, value = "true"))
@DomainModel(standardModels = StandardDomainModel.GAMBIT) @DomainModel(standardModels = StandardDomainModel.GAMBIT)
@SessionFactory @SessionFactory
@RequiresDialectFeature(feature = DialectFeatureChecks.SupportsWindowFunctions.class) @RequiresDialectFeature(feature = DialectFeatureChecks.SupportsWindowFunctions.class)