Skip to content

Commit

Permalink
HHH-15944 Joins on non-managed-type polymorphisms don't work
Browse files Browse the repository at this point in the history
  • Loading branch information
dreab8 authored and beikov committed Feb 6, 2023
1 parent c49da77 commit 5295c5a
Show file tree
Hide file tree
Showing 19 changed files with 529 additions and 56 deletions.

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -15,18 +15,33 @@
import org.hibernate.query.sqm.tree.delete.SqmDeleteStatement;
import org.hibernate.query.sqm.tree.domain.NonAggregatedCompositeSimplePath;
import org.hibernate.query.sqm.tree.domain.SqmAnyValuedSimplePath;
import org.hibernate.query.sqm.tree.domain.SqmBagJoin;
import org.hibernate.query.sqm.tree.domain.SqmBasicValuedSimplePath;
import org.hibernate.query.sqm.tree.domain.SqmCorrelatedBagJoin;
import org.hibernate.query.sqm.tree.domain.SqmCorrelatedCrossJoin;
import org.hibernate.query.sqm.tree.domain.SqmCorrelatedEntityJoin;
import org.hibernate.query.sqm.tree.domain.SqmCorrelatedListJoin;
import org.hibernate.query.sqm.tree.domain.SqmCorrelatedMapJoin;
import org.hibernate.query.sqm.tree.domain.SqmCorrelatedPluralPartJoin;
import org.hibernate.query.sqm.tree.domain.SqmCorrelatedRoot;
import org.hibernate.query.sqm.tree.domain.SqmCorrelatedRootJoin;
import org.hibernate.query.sqm.tree.domain.SqmCorrelatedSetJoin;
import org.hibernate.query.sqm.tree.domain.SqmCorrelatedSingularJoin;
import org.hibernate.query.sqm.tree.domain.SqmCorrelation;
import org.hibernate.query.sqm.tree.domain.SqmDerivedRoot;
import org.hibernate.query.sqm.tree.domain.SqmEmbeddedValuedSimplePath;
import org.hibernate.query.sqm.tree.domain.SqmEntityValuedSimplePath;
import org.hibernate.query.sqm.tree.domain.SqmFkExpression;
import org.hibernate.query.sqm.tree.domain.SqmIndexedCollectionAccessPath;
import org.hibernate.query.sqm.tree.domain.SqmListJoin;
import org.hibernate.query.sqm.tree.domain.SqmMapEntryReference;
import org.hibernate.query.sqm.tree.domain.SqmElementAggregateFunction;
import org.hibernate.query.sqm.tree.domain.SqmIndexAggregateFunction;
import org.hibernate.query.sqm.tree.domain.SqmMapJoin;
import org.hibernate.query.sqm.tree.domain.SqmPluralPartJoin;
import org.hibernate.query.sqm.tree.domain.SqmPluralValuedSimplePath;
import org.hibernate.query.sqm.tree.domain.SqmSetJoin;
import org.hibernate.query.sqm.tree.domain.SqmSingularJoin;
import org.hibernate.query.sqm.tree.domain.SqmTreatedPath;
import org.hibernate.query.sqm.tree.expression.JpaCriteriaParameter;
import org.hibernate.query.sqm.tree.expression.SqmAny;
Expand Down Expand Up @@ -142,6 +157,58 @@ public interface SemanticQueryWalker<T> {

T visitQualifiedAttributeJoin(SqmAttributeJoin<?, ?> joinedFromElement);

default T visitCorrelatedCrossJoin(SqmCorrelatedCrossJoin<?> join) {
return visitCrossJoin( join );
}

default T visitCorrelatedEntityJoin(SqmCorrelatedEntityJoin<?> join) {
return visitQualifiedEntityJoin( join );
}

default T visitCorrelatedPluralPartJoin(SqmCorrelatedPluralPartJoin<?, ?> join) {
return visitPluralPartJoin( join );
}

default T visitBagJoin(SqmBagJoin<?,?> join){
return visitQualifiedAttributeJoin( join );
}

default T visitCorrelatedBagJoin(SqmCorrelatedBagJoin<?, ?> join) {
return visitQualifiedAttributeJoin( join );
}

default T visitCorrelatedListJoin(SqmCorrelatedListJoin<?, ?> join) {
return visitQualifiedAttributeJoin( join );
}

default T visitCorrelatedMapJoin(SqmCorrelatedMapJoin<?, ?, ?> join) {
return visitQualifiedAttributeJoin( join );
}

default T visitCorrelatedSetJoin(SqmCorrelatedSetJoin<?, ?> join) {
return visitQualifiedAttributeJoin( join );
}

default T visitCorrelatedSingularJoin(SqmCorrelatedSingularJoin<?, ?> join) {
return visitQualifiedAttributeJoin( join );
}

default T visitListJoin(SqmListJoin<?, ?> join) {
return visitQualifiedAttributeJoin( join );
}

default T visitMapJoin(SqmMapJoin<?, ?, ?> join) {
return visitQualifiedAttributeJoin( join );
}

default T visitSetJoin(SqmSetJoin<?, ?> join) {
return visitQualifiedAttributeJoin( join );
}

default T visitSingularJoin(SqmSingularJoin<?, ?> join) {
return visitQualifiedAttributeJoin( join );
}

T visitQualifiedDerivedJoin(SqmDerivedJoin<?> joinedFromElement);

T visitBasicValuedPath(SqmBasicValuedSimplePath<?> path);
Expand Down Expand Up @@ -170,6 +237,13 @@ public interface SemanticQueryWalker<T> {

T visitCorrelation(SqmCorrelation<?, ?> correlation);

default T visitCorrelatedRootJoin(SqmCorrelatedRootJoin<?> correlatedRootJoin){
return visitCorrelation( correlatedRootJoin );
}

default T visitCorrelatedRoot(SqmCorrelatedRoot<?> correlatedRoot){
return visitCorrelation( correlatedRoot );
}

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Query spec
Expand Down Expand Up @@ -319,4 +393,5 @@ public interface SemanticQueryWalker<T> {
T visitMapEntryFunction(SqmMapEntryReference<?, ?> function);

T visitFullyQualifiedClass(Class<?> namedClass);

}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

import org.hibernate.metamodel.model.domain.BagPersistentAttribute;
import org.hibernate.metamodel.model.domain.EntityDomainType;
import org.hibernate.query.sqm.SemanticQueryWalker;
import org.hibernate.spi.NavigablePath;
import org.hibernate.query.criteria.JpaCollectionJoin;
import org.hibernate.query.criteria.JpaExpression;
Expand Down Expand Up @@ -81,6 +82,11 @@ public BagPersistentAttribute<O,E> getModel() {
return getReferencedPathSource();
}

@Override
public <X> X accept(SemanticQueryWalker<X> walker) {
return walker.visitBagJoin( this );
}

@Override
public BagPersistentAttribute<O,E> getAttribute() {
//noinspection unchecked
Expand Down Expand Up @@ -149,4 +155,5 @@ public SqmAttributeJoin<O, E> makeCopy(SqmCreationProcessingState creationProces
nodeBuilder()
);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import org.hibernate.query.hql.spi.SqmCreationProcessingState;
import org.hibernate.query.hql.spi.SqmPathRegistry;
import org.hibernate.query.sqm.NodeBuilder;
import org.hibernate.query.sqm.SemanticQueryWalker;
import org.hibernate.query.sqm.tree.SqmCopyContext;
import org.hibernate.query.sqm.tree.SqmJoinType;
import org.hibernate.query.sqm.tree.from.SqmFrom;
Expand Down Expand Up @@ -74,6 +75,11 @@ public SqmCorrelatedBagJoin<O, T> copy(SqmCopyContext context) {
return path;
}

@Override
public <X> X accept(SemanticQueryWalker<X> walker) {
return walker.visitCorrelatedBagJoin( this );
}

@Override
public SqmBagJoin<O, T> getCorrelationParent() {
return correlationParent;
Expand Down Expand Up @@ -108,4 +114,5 @@ public SqmCorrelatedBagJoin<O, T> makeCopy(SqmCreationProcessingState creationPr
pathRegistry.findFromByPath( correlationParent.getNavigablePath() )
);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import org.hibernate.metamodel.model.domain.EntityDomainType;
import org.hibernate.query.hql.spi.SqmCreationProcessingState;
import org.hibernate.query.hql.spi.SqmPathRegistry;
import org.hibernate.query.sqm.SemanticQueryWalker;
import org.hibernate.query.sqm.tree.SqmCopyContext;
import org.hibernate.query.sqm.tree.from.SqmCrossJoin;
import org.hibernate.query.sqm.tree.from.SqmRoot;
Expand Down Expand Up @@ -94,4 +95,10 @@ public SqmCorrelatedCrossJoin<T> makeCopy(SqmCreationProcessingState creationPro
pathRegistry.findFromByPath( correlationParent.getNavigablePath() )
);
}

@Override
public <X> X accept(SemanticQueryWalker<X> walker) {
return walker.visitCorrelatedCrossJoin( this );
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import org.hibernate.metamodel.model.domain.EntityDomainType;
import org.hibernate.query.hql.spi.SqmCreationProcessingState;
import org.hibernate.query.hql.spi.SqmPathRegistry;
import org.hibernate.query.sqm.SemanticQueryWalker;
import org.hibernate.query.sqm.tree.SqmCopyContext;
import org.hibernate.query.sqm.tree.SqmJoinType;
import org.hibernate.query.sqm.tree.from.SqmEntityJoin;
Expand Down Expand Up @@ -67,6 +68,11 @@ public SqmCorrelatedEntityJoin<T> copy(SqmCopyContext context) {
return path;
}

@Override
public <X> X accept(SemanticQueryWalker<X> walker) {
return walker.visitCorrelatedEntityJoin(this);
}

@Override
public SqmEntityJoin<T> getCorrelationParent() {
return correlationParent;
Expand Down Expand Up @@ -99,4 +105,5 @@ public SqmCorrelatedEntityJoin<T> makeCopy(SqmCreationProcessingState creationPr
pathRegistry.findFromByPath( correlationParent.getNavigablePath() )
);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import org.hibernate.query.hql.spi.SqmCreationProcessingState;
import org.hibernate.query.hql.spi.SqmPathRegistry;
import org.hibernate.query.sqm.NodeBuilder;
import org.hibernate.query.sqm.SemanticQueryWalker;
import org.hibernate.query.sqm.tree.SqmCopyContext;
import org.hibernate.query.sqm.tree.SqmJoinType;
import org.hibernate.query.sqm.tree.from.SqmFrom;
Expand Down Expand Up @@ -108,4 +109,9 @@ public SqmCorrelatedListJoin<O, T> makeCopy(SqmCreationProcessingState creationP
pathRegistry.findFromByPath( correlationParent.getNavigablePath() )
);
}

@Override
public <X> X accept(SemanticQueryWalker<X> walker) {
return walker.visitCorrelatedListJoin( this );
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import org.hibernate.query.hql.spi.SqmCreationProcessingState;
import org.hibernate.query.hql.spi.SqmPathRegistry;
import org.hibernate.query.sqm.NodeBuilder;
import org.hibernate.query.sqm.SemanticQueryWalker;
import org.hibernate.query.sqm.tree.SqmCopyContext;
import org.hibernate.query.sqm.tree.SqmJoinType;
import org.hibernate.query.sqm.tree.from.SqmFrom;
Expand Down Expand Up @@ -108,4 +109,9 @@ public SqmCorrelatedMapJoin<O, K, V> makeCopy(SqmCreationProcessingState creatio
pathRegistry.findFromByPath( correlationParent.getNavigablePath() )
);
}

@Override
public <X> X accept(SemanticQueryWalker<X> walker) {
return walker.visitCorrelatedMapJoin( this );
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
*/
package org.hibernate.query.sqm.tree.domain;

import org.hibernate.query.sqm.SemanticQueryWalker;
import org.hibernate.query.sqm.tree.SqmCopyContext;
import org.hibernate.query.sqm.tree.SqmJoinType;
import org.hibernate.query.sqm.tree.from.SqmFrom;
Expand Down Expand Up @@ -46,6 +47,16 @@ public SqmCorrelatedPluralPartJoin<O, T> copy(SqmCopyContext context) {
return path;
}

@Override
public <X> X accept(SemanticQueryWalker<X> walker) {
return walker.visitCorrelatedPluralPartJoin( this );
}

@Override
public SqmFrom<?, T> getLhs() {
return (SqmFrom<?, T>) super.getLhs();
}

@Override
public SqmPluralPartJoin<O, T> getCorrelationParent() {
return correlationParent;
Expand All @@ -65,4 +76,5 @@ public boolean isCorrelated() {
public SqmRoot<O> getCorrelatedRoot() {
return correlatedRootJoin;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
/**
* @author Steve Ebersole
*/
public class SqmCorrelatedRoot<T> extends SqmRoot<T> implements SqmPathWrapper<T,T>, SqmCorrelation<T,T> {
public class SqmCorrelatedRoot<T> extends SqmRoot<T> implements SqmPathWrapper<T, T>, SqmCorrelation<T, T> {

private final SqmRoot<T> correlationParent;

Expand Down Expand Up @@ -80,6 +80,6 @@ public SqmRoot<T> getCorrelatedRoot() {

@Override
public <X> X accept(SemanticQueryWalker<X> walker) {
return walker.visitCorrelation( this );
return walker.visitCorrelatedRoot( this );
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
*/
public class SqmCorrelatedRootJoin<T> extends SqmRoot<T> implements SqmCorrelation<T, T> {

SqmCorrelatedRootJoin(
public SqmCorrelatedRootJoin(
NavigablePath navigablePath,
SqmPathSource<T> referencedNavigable,
NodeBuilder nodeBuilder) {
Expand Down Expand Up @@ -89,6 +89,7 @@ public SqmRoot<T> getCorrelatedRoot() {

@Override
public <X> X accept(SemanticQueryWalker<X> walker) {
return walker.visitCorrelation( this );
return walker.visitCorrelatedRootJoin( this );
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import org.hibernate.query.hql.spi.SqmCreationProcessingState;
import org.hibernate.query.hql.spi.SqmPathRegistry;
import org.hibernate.query.sqm.NodeBuilder;
import org.hibernate.query.sqm.SemanticQueryWalker;
import org.hibernate.query.sqm.tree.SqmCopyContext;
import org.hibernate.query.sqm.tree.SqmJoinType;
import org.hibernate.query.sqm.tree.from.SqmFrom;
Expand Down Expand Up @@ -108,4 +109,9 @@ public SqmCorrelatedSetJoin<O, T> makeCopy(SqmCreationProcessingState creationPr
pathRegistry.findFromByPath( correlationParent.getNavigablePath() )
);
}

@Override
public <X> X accept(SemanticQueryWalker<X> walker) {
return walker.visitCorrelatedSetJoin( this );
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import org.hibernate.query.hql.spi.SqmCreationProcessingState;
import org.hibernate.query.hql.spi.SqmPathRegistry;
import org.hibernate.query.sqm.NodeBuilder;
import org.hibernate.query.sqm.SemanticQueryWalker;
import org.hibernate.query.sqm.tree.SqmCopyContext;
import org.hibernate.query.sqm.tree.SqmJoinType;
import org.hibernate.query.sqm.tree.from.SqmFrom;
Expand Down Expand Up @@ -108,4 +109,9 @@ public SqmCorrelatedSingularJoin<O, T> makeCopy(SqmCreationProcessingState creat
pathRegistry.findFromByPath( correlationParent.getNavigablePath() )
);
}

@Override
public <X> X accept(SemanticQueryWalker<X> walker) {
return walker.visitCorrelatedSingularJoin( this );
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,5 @@
*/
public interface SqmCorrelation<O, T> extends SqmFrom<O, T>, SqmPathWrapper<T, T> {
SqmRoot<O> getCorrelatedRoot();

}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

import org.hibernate.metamodel.model.domain.EntityDomainType;
import org.hibernate.metamodel.model.domain.ListPersistentAttribute;
import org.hibernate.query.sqm.SemanticQueryWalker;
import org.hibernate.spi.NavigablePath;
import org.hibernate.query.criteria.JpaExpression;
import org.hibernate.query.criteria.JpaListJoin;
Expand Down Expand Up @@ -84,6 +85,11 @@ public ListPersistentAttribute<O, E> getModel() {
return getReferencedPathSource();
}

@Override
public <X> X accept(SemanticQueryWalker<X> walker) {
return walker.visitListJoin( this );
}

@Override
public ListPersistentAttribute<O,E> getAttribute() {
//noinspection unchecked
Expand Down Expand Up @@ -156,4 +162,5 @@ public SqmAttributeJoin<O, E> makeCopy(SqmCreationProcessingState creationProces
nodeBuilder()
);
}

}

0 comments on commit 5295c5a

Please sign in to comment.