Skip to content

Commit

Permalink
Fix various issues with @ElementCollection
Browse files Browse the repository at this point in the history
  • Loading branch information
dreab8 committed Jul 30, 2020
1 parent d246a4b commit d3978a0
Show file tree
Hide file tree
Showing 63 changed files with 1,451 additions and 1,137 deletions.
Expand Up @@ -222,7 +222,8 @@ public void setType(
XClass modelPropertyTypeXClass,
String declaringClassName,
ConverterDescriptor converterDescriptor) {
if ( modelPropertyTypeXClass == null ) {
boolean isArray = modelXProperty.isArray();
if ( modelPropertyTypeXClass == null && !isArray ) {
// we cannot guess anything
return;
}
Expand All @@ -232,7 +233,7 @@ public void setType(
}
assert columns.length == 1;

final XClass modelTypeXClass = modelXProperty.isArray()
final XClass modelTypeXClass = isArray
? modelXProperty.getElementClass()
: modelPropertyTypeXClass;

Expand Down Expand Up @@ -383,10 +384,18 @@ private void prepareCollectionElement(XProperty attributeXProperty, XClass eleme

// todo (6.0) : @SqlType / @SqlTypeDescriptor

Class<T> javaType;
//noinspection unchecked
final Class<T> javaType = buildingContext.getBootstrapContext()
.getReflectionManager()
.toClass( elementTypeXClass );
if ( elementTypeXClass == null && attributeXProperty.isArray() ) {
javaType = buildingContext.getBootstrapContext()
.getReflectionManager()
.toClass( attributeXProperty.getElementClass() );
}
else {
javaType = buildingContext.getBootstrapContext()
.getReflectionManager()
.toClass( elementTypeXClass );
}

implicitJavaTypeAccess = typeConfiguration -> javaType;

Expand Down
Expand Up @@ -33,7 +33,7 @@ public class StandardCollectionSemanticsResolver implements CollectionSemanticsR
@Override
public CollectionSemantics resolveRepresentation(Collection bootDescriptor) {
if ( bootDescriptor instanceof PrimitiveArray ) {
throw new NotYetImplementedFor6Exception();
return StandardArraySemantics.INSTANCE;
}

if ( bootDescriptor instanceof Array ) {
Expand Down
Expand Up @@ -434,12 +434,11 @@ else if ( ownerName != null && propertyName != null ) {
);
}
else {
impliedJavaType = null;
return null;
}

return impliedJavaType == null
? null
: typeConfiguration.getJavaTypeDescriptorRegistry().resolveDescriptor( impliedJavaType );
resolvedJavaClass = impliedJavaType;
return typeConfiguration.getJavaTypeDescriptorRegistry().resolveDescriptor( impliedJavaType );
}


Expand Down
Expand Up @@ -8,6 +8,7 @@

import java.util.Collections;
import java.util.List;
import java.util.function.Consumer;

import org.hibernate.LockMode;
import org.hibernate.engine.FetchStyle;
Expand All @@ -23,6 +24,7 @@
import org.hibernate.persister.collection.CollectionPersister;
import org.hibernate.query.EntityIdentifierNavigablePath;
import org.hibernate.query.NavigablePath;
import org.hibernate.sql.ast.Clause;
import org.hibernate.sql.ast.spi.SqlExpressionResolver;
import org.hibernate.sql.ast.spi.SqlSelection;
import org.hibernate.sql.ast.tree.expression.ColumnReference;
Expand Down Expand Up @@ -230,7 +232,13 @@ public FetchTiming getTiming() {
return FetchTiming.IMMEDIATE;
}

//
@Override
public void visitJdbcTypes(
Consumer<JdbcMapping> action, Clause clause, TypeConfiguration typeConfiguration) {
action.accept( getJdbcMapping() );
}

//
// @Override
// public BasicType getBasicType() {
// return mapper;
Expand Down
Expand Up @@ -162,7 +162,7 @@ public Fetch generateFetch(
fetchParent,
FetchTiming.IMMEDIATE,
selected,
false,
true,
creationState
);
}
Expand Down
Expand Up @@ -32,6 +32,7 @@
import org.hibernate.metamodel.mapping.EmbeddableValuedModelPart;
import org.hibernate.metamodel.mapping.EntityMappingType;
import org.hibernate.metamodel.mapping.ForeignKeyDescriptor;
import org.hibernate.metamodel.mapping.JdbcMapping;
import org.hibernate.metamodel.mapping.ManagedMappingType;
import org.hibernate.metamodel.mapping.ModelPart;
import org.hibernate.metamodel.mapping.PluralAttributeMapping;
Expand All @@ -47,6 +48,7 @@
import org.hibernate.persister.entity.Joinable;
import org.hibernate.property.access.spi.PropertyAccess;
import org.hibernate.query.NavigablePath;
import org.hibernate.sql.ast.Clause;
import org.hibernate.sql.ast.SqlAstJoinType;
import org.hibernate.sql.ast.spi.FromClauseAccess;
import org.hibernate.sql.ast.spi.SqlAliasBase;
Expand All @@ -71,6 +73,7 @@
import org.hibernate.sql.results.graph.collection.internal.EagerCollectionFetch;
import org.hibernate.sql.results.graph.collection.internal.SelectEagerCollectionFetch;
import org.hibernate.type.EntityType;
import org.hibernate.type.spi.TypeConfiguration;

import org.jboss.logging.Logger;

Expand Down Expand Up @@ -857,6 +860,15 @@ public void visitSubParts(Consumer<ModelPart> consumer, EntityMappingType treatT
}
}

@Override
public void visitJdbcTypes(
Consumer<JdbcMapping> action, Clause clause, TypeConfiguration typeConfiguration) {
elementDescriptor.visitJdbcTypes( action, clause, typeConfiguration );
if ( indexDescriptor != null ) {
indexDescriptor.visitJdbcTypes( action, clause, typeConfiguration );
}
}

@Override
public int getNumberOfFetchables() {
return indexDescriptor == null ? 1 : 2;
Expand Down
Expand Up @@ -14,6 +14,7 @@
import org.hibernate.mapping.OneToOne;
import org.hibernate.mapping.ToOne;
import org.hibernate.metamodel.mapping.AssociationKey;
import org.hibernate.metamodel.mapping.CollectionPart;
import org.hibernate.metamodel.mapping.EntityAssociationMapping;
import org.hibernate.metamodel.mapping.EntityIdentifierMapping;
import org.hibernate.metamodel.mapping.EntityMappingType;
Expand Down Expand Up @@ -495,11 +496,16 @@ public EntityFetch generateFetch(
private TableGroup createTableGroupJoin(
NavigablePath fetchablePath,
LockMode lockMode,
DomainResultCreationState creationState, TableGroup parentTableGroup) {
DomainResultCreationState creationState,
TableGroup parentTableGroup) {
final SqlAstJoinType sqlAstJoinType;

if ( isNullable ) {
sqlAstJoinType = SqlAstJoinType.LEFT;
}
else if ( parentTableGroup.getModelPart() instanceof EmbeddedCollectionPart ) {
sqlAstJoinType = SqlAstJoinType.LEFT;
}
else {
sqlAstJoinType = SqlAstJoinType.INNER;
}
Expand Down
Expand Up @@ -25,4 +25,5 @@ public interface OrderByFragment {
* @param creationState The SQL AST creation state
*/
void apply(QuerySpec ast, TableGroup tableGroup, SqlAstCreationState creationState);

}
@@ -0,0 +1,44 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
*/
package org.hibernate.metamodel.mapping.ordering;

import java.util.List;

import org.hibernate.metamodel.mapping.ordering.ast.OrderingSpecification;
import org.hibernate.sql.ast.spi.SqlAstCreationState;
import org.hibernate.sql.ast.tree.from.TableGroup;
import org.hibernate.sql.ast.tree.select.QuerySpec;

/**
* @author Steve Ebersole
*/
public class OrderByFragmentImpl implements OrderByFragment {
private final List<OrderingSpecification> fragmentSpecs;

public OrderByFragmentImpl(List<OrderingSpecification> fragmentSpecs) {
this.fragmentSpecs = fragmentSpecs;
}

public List<OrderingSpecification> getFragmentSpecs() {
return fragmentSpecs;
}

@Override
public void apply(QuerySpec ast, TableGroup tableGroup, SqlAstCreationState creationState) {
for ( int i = 0; i < fragmentSpecs.size(); i++ ) {
final OrderingSpecification orderingSpec = fragmentSpecs.get( i );

orderingSpec.getExpression().apply(
ast,
tableGroup,
orderingSpec.getCollation(),
orderingSpec.getSortOrder(),
creationState
);
}
}
}
Expand Up @@ -6,16 +6,10 @@
*/
package org.hibernate.metamodel.mapping.ordering;

import java.util.List;

import org.hibernate.grammars.ordering.OrderingLexer;
import org.hibernate.grammars.ordering.OrderingParser;
import org.hibernate.metamodel.mapping.PluralAttributeMapping;
import org.hibernate.metamodel.mapping.ordering.ast.OrderingSpecification;
import org.hibernate.metamodel.mapping.ordering.ast.ParseTreeVisitor;
import org.hibernate.sql.ast.spi.SqlAstCreationState;
import org.hibernate.sql.ast.tree.from.TableGroup;
import org.hibernate.sql.ast.tree.select.QuerySpec;

import org.jboss.logging.Logger;

Expand All @@ -31,22 +25,21 @@
* Responsible for performing the translation of the order-by fragment associated
* with an order set or map.
*
* @author Steve Ebersole
* @see javax.persistence.OrderBy
* @see org.hibernate.annotations.OrderBy
*
* @author Steve Ebersole
*/
public class OrderByFragmentTranslator {
private static final Logger LOG = Logger.getLogger( OrderByFragmentTranslator.class.getName() );

/**
* Perform the translation of the user-supplied fragment, returning the translation.
*
* @return The translation.
*
* @apiNote The important distinction to this split between (1) translating and (2) resolving aliases is that
* both happen at different times. This is performed at boot-time while building the CollectionPersister
* happens at runtime while loading the described collection
*
* @return The translation.
*/
public static OrderByFragment translate(
String fragment,
Expand All @@ -64,26 +57,7 @@ public static OrderByFragment translate(

final ParseTreeVisitor visitor = new ParseTreeVisitor( pluralAttributeMapping, context );

final List<OrderingSpecification> specs = visitor.visitOrderByFragment( parseTree );

return new OrderByFragment() {
private final List<OrderingSpecification> fragmentSpecs = specs;

@Override
public void apply(QuerySpec ast, TableGroup tableGroup, SqlAstCreationState creationState) {
for ( int i = 0; i < fragmentSpecs.size(); i++ ) {
final OrderingSpecification orderingSpec = fragmentSpecs.get( i );

orderingSpec.getExpression().apply(
ast,
tableGroup,
orderingSpec.getCollation(),
orderingSpec.getSortOrder(),
creationState
);
}
}
};
return new OrderByFragmentImpl( visitor.visitOrderByFragment( parseTree ) );
}


Expand All @@ -100,7 +74,7 @@ private static OrderingParser.OrderByFragmentContext buildParseTree(TranslationC
try {
return parser.orderByFragment();
}
catch ( ParseCancellationException e) {
catch (ParseCancellationException e) {
// reset the input token stream and parser state
lexer.reset();
parser.reset();
Expand Down
Expand Up @@ -6,6 +6,7 @@
*/
package org.hibernate.metamodel.mapping.ordering.ast;

import org.hibernate.metamodel.mapping.EmbeddableMappingType;
import org.hibernate.metamodel.mapping.EmbeddableValuedModelPart;
import org.hibernate.metamodel.mapping.ModelPart;
import org.hibernate.metamodel.mapping.ordering.TranslationContext;
Expand Down Expand Up @@ -47,11 +48,9 @@ public SequencePart resolvePathPart(
String name,
boolean isTerminal,
TranslationContext translationContext) {
if ( referencedModelPart.getPartMappingType() instanceof EmbeddableValuedModelPart ) {
final EmbeddableValuedModelPart embeddableValuedPart =
(EmbeddableValuedModelPart) referencedModelPart.getPartMappingType();

final ModelPart subPart = embeddableValuedPart.findSubPart( name, null );
if ( referencedModelPart instanceof EmbeddableValuedModelPart ) {
final EmbeddableMappingType embeddableMappingType = (EmbeddableMappingType) referencedModelPart.getPartMappingType();
final ModelPart subPart = embeddableMappingType.findSubPart( name, null );
if ( subPart == null ) {
throw new PathResolutionException(
"Could not resolve path token : " + referencedModelPart + " -> " + name
Expand Down
Expand Up @@ -105,9 +105,8 @@ public OrderingExpression visitExpression(ExpressionContext ctx) {

for ( int i = 0; i < numberOfParts; i++ ) {
final TerminalNode partNode = ctx.dotIdentifier().IDENTIFIER().get( i );
partNode.getText();
pathConsumer.consumeIdentifier(
ctx.identifier().getText(),
partNode.getText(),
firstPass,
true
);
Expand Down
Expand Up @@ -22,7 +22,13 @@
import org.hibernate.internal.util.StringHelper;
import org.hibernate.internal.util.collections.Stack;
import org.hibernate.internal.util.collections.StandardStack;
import org.hibernate.metamodel.mapping.Association;
import org.hibernate.metamodel.mapping.CollectionPart;
import org.hibernate.metamodel.mapping.ForeignKeyDescriptor;
import org.hibernate.metamodel.mapping.JdbcMapping;
import org.hibernate.metamodel.mapping.ModelPartContainer;
import org.hibernate.metamodel.mapping.PluralAttributeMapping;
import org.hibernate.metamodel.mapping.internal.BasicValuedCollectionPart;
import org.hibernate.persister.entity.Loadable;
import org.hibernate.query.QueryLiteralRendering;
import org.hibernate.query.UnaryArithmeticOperator;
Expand Down Expand Up @@ -462,7 +468,21 @@ public void visitTableGroup(TableGroup tableGroup) {
appendSql( tableGroup.getPrimaryTableReference().getIdentificationVariable() );
appendSql( '.' );
//TODO: pretty sure the typecast to Loadable is quite wrong here
appendSql( ( (Loadable) tableGroup.getModelPart() ).getIdentifierColumnNames()[0] );

ModelPartContainer modelPart = tableGroup.getModelPart();
if ( modelPart instanceof Loadable ) {
appendSql( ( (Loadable) tableGroup.getModelPart() ).getIdentifierColumnNames()[0] );
}
else if ( modelPart instanceof PluralAttributeMapping ) {
CollectionPart elementDescriptor = ( (PluralAttributeMapping) modelPart ).getElementDescriptor();
if ( elementDescriptor instanceof BasicValuedCollectionPart ) {
String mappedColumnExpression = ( (BasicValuedCollectionPart) elementDescriptor ).getMappedColumnExpression();
appendSql( mappedColumnExpression );
}
}
else {
throw new NotYetImplementedFor6Exception( getClass() );
}
}

@Override
Expand Down
Expand Up @@ -11,7 +11,6 @@

import org.hibernate.metamodel.mapping.EmbeddableMappingType;
import org.hibernate.metamodel.mapping.EmbeddableValuedModelPart;
import org.hibernate.metamodel.mapping.EntityIdentifierMapping;
import org.hibernate.metamodel.mapping.SingularAttributeMapping;
import org.hibernate.metamodel.mapping.StateArrayContributorMapping;
import org.hibernate.query.NavigablePath;
Expand Down
Expand Up @@ -9,15 +9,13 @@
import org.hibernate.sql.results.graph.AssemblerCreationState;
import org.hibernate.sql.results.graph.FetchParentAccess;
import org.hibernate.sql.results.graph.embeddable.AbstractEmbeddableInitializer;
import org.hibernate.sql.results.graph.embeddable.EmbeddableInitializer;
import org.hibernate.sql.results.graph.embeddable.EmbeddableResultGraphNode;

/**
* @author Steve Ebersole
*/
public class EmbeddableFetchInitializer
extends AbstractEmbeddableInitializer
implements EmbeddableInitializer {
extends AbstractEmbeddableInitializer {
public EmbeddableFetchInitializer(
FetchParentAccess fetchParentAccess,
EmbeddableResultGraphNode resultDescriptor,
Expand Down

0 comments on commit d3978a0

Please sign in to comment.