Skip to content

Commit

Permalink
HHH-17283 Correct tuple length for subqueries and attribute joins
Browse files Browse the repository at this point in the history
  • Loading branch information
mbladel committed Oct 20, 2023
1 parent c00ca3e commit 4d693f4
Show file tree
Hide file tree
Showing 7 changed files with 34 additions and 32 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,8 @@ public interface DomainType<J> extends SqmExpressible<J> {
default DomainType<J> getSqmType() {
return this;
}

default int getTupleLength() {
return 1;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,15 @@

import java.io.Serializable;

import org.hibernate.graph.internal.SubGraphImpl;
import org.hibernate.graph.spi.SubGraphImplementor;
import org.hibernate.metamodel.model.domain.AbstractManagedType;
import org.hibernate.metamodel.model.domain.DomainType;
import org.hibernate.metamodel.model.domain.EmbeddableDomainType;
import org.hibernate.metamodel.model.domain.spi.JpaMetamodelImplementor;
import org.hibernate.type.descriptor.java.JavaType;

import jakarta.persistence.metamodel.SingularAttribute;
import jakarta.persistence.metamodel.Type;

/**
* Implementation of {@link jakarta.persistence.metamodel.EmbeddableType}.
*
Expand All @@ -39,4 +41,12 @@ public EmbeddableTypeImpl(
public PersistenceType getPersistenceType() {
return PersistenceType.EMBEDDABLE;
}

public int getTupleLength() {
int count = 0;
for ( SingularAttribute<? super J, ?> attribute : getSingularAttributes() ) {
count += ( (DomainType<?>) attribute.getType() ).getTupleLength();
}
return count;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,23 +7,19 @@
package org.hibernate.query.sqm.tree.domain;

import org.hibernate.metamodel.model.domain.PersistentAttribute;
import org.hibernate.spi.NavigablePath;
import org.hibernate.query.criteria.JpaExpression;
import org.hibernate.query.criteria.JpaPredicate;
import org.hibernate.query.sqm.NodeBuilder;
import org.hibernate.query.sqm.SemanticQueryWalker;
import org.hibernate.query.sqm.SqmJoinable;
import org.hibernate.query.sqm.SqmPathSource;
import org.hibernate.query.sqm.spi.SqmCreationHelper;
import org.hibernate.query.sqm.tree.SqmCopyContext;
import org.hibernate.query.sqm.tree.SqmJoinType;
import org.hibernate.query.sqm.tree.from.SqmAttributeJoin;
import org.hibernate.query.sqm.tree.from.SqmFrom;
import org.hibernate.query.sqm.tree.predicate.SqmPredicate;
import org.hibernate.spi.NavigablePath;
import org.hibernate.type.descriptor.java.JavaType;

import org.jboss.logging.Logger;

import jakarta.persistence.criteria.Expression;
import jakarta.persistence.criteria.JoinType;
import jakarta.persistence.criteria.Predicate;
Expand Down Expand Up @@ -140,5 +136,4 @@ public SqmFrom<?, O> getParent() {
public JoinType getJoinType() {
return getSqmJoinType().getCorrespondingJpaJoinType();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@
*/
package org.hibernate.query.sqm.tree.domain;

import jakarta.persistence.metamodel.Attribute;
import jakarta.persistence.metamodel.SingularAttribute;
import org.hibernate.metamodel.model.domain.DomainType;
import org.hibernate.metamodel.model.domain.EmbeddableDomainType;
import org.hibernate.metamodel.model.domain.EntityDomainType;
Expand All @@ -22,8 +20,6 @@
import org.hibernate.spi.NavigablePath;
import org.hibernate.type.descriptor.java.JavaType;

import java.util.Set;

/**
* @author Steve Ebersole
*/
Expand Down Expand Up @@ -79,21 +75,6 @@ public SqmExpressible<T> getExpressible() {
return this;
}

@Override
public Integer getTupleLength() {
final EmbeddableDomainType<?> sqmPathType = (EmbeddableDomainType<?>) getReferencedPathSource().getSqmPathType();
final Set<? extends SingularAttribute<?, ?>> attributes = sqmPathType.getSingularAttributes();
return length(attributes);
}

private int length(Set<? extends SingularAttribute<?, ?>> attributes) {
int length = 0;
for (Attribute<?, ?> attribute : attributes) {
length += get(attribute.getName()).getTupleLength();
}
return length;
}

@Override
public DomainType<T> getSqmType() {
return getReferencedPathSource().getSqmType();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,10 +58,6 @@ default void visitSubSelectableNodes(Consumer<SqmSelectableNode<?>> jpaSelection
jpaSelectionConsumer.accept( this );
}

default Integer getTupleLength() {
return 1;
}

@Override
SqmExpression<Long> asLong();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import java.util.function.Consumer;
import jakarta.persistence.criteria.Selection;

import org.hibernate.metamodel.model.domain.DomainType;
import org.hibernate.query.criteria.JpaSelection;
import org.hibernate.query.sqm.tree.SqmCopyContext;
import org.hibernate.query.sqm.tree.SqmTypedNode;
Expand All @@ -32,4 +33,9 @@ public interface SqmSelectableNode<T> extends JpaSelection<T>, SqmTypedNode<T> {

@Override
SqmSelectableNode<T> copy(SqmCopyContext context);

default Integer getTupleLength() {
final DomainType<T> sqmType = getNodeType() == null ? null : getNodeType().getSqmType();
return sqmType == null ? 1 : sqmType.getTupleLength();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,17 @@ public SqmSubQuery<T> copy(SqmCopyContext context) {
@Override
public Integer getTupleLength() {
final SqmSelectClause selectClause = getQuerySpec().getSelectClause();
return selectClause == null ? null : selectClause.getSelectionItems().size();
return selectClause != null ?
getTupleLength( selectClause.getSelectionItems() ) :
null;
}

private int getTupleLength(List<SqmSelectableNode<?>> selectionItems) {
int count = 0;
for ( SqmSelectableNode<?> selection : selectionItems ) {
count += selection.getTupleLength();
}
return count;
}

@Override
Expand Down

0 comments on commit 4d693f4

Please sign in to comment.