Skip to content

Commit

Permalink
--wip-- test instantiating mapping producer in abstract delegate
Browse files Browse the repository at this point in the history
  • Loading branch information
mbladel committed Dec 21, 2023
1 parent cfc3993 commit a178865
Show file tree
Hide file tree
Showing 17 changed files with 99 additions and 139 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ default boolean hasIdentityInsertKeyword() {
default GetGeneratedKeysDelegate buildGetGeneratedKeysDelegate(
PostInsertIdentityPersister persister,
Dialect dialect) {
return buildGetGeneratedKeysDelegate( (EntityPersister) persister, dialect );
return buildGetGeneratedKeysDelegate( persister );
}

/**
Expand All @@ -149,5 +149,5 @@ default GetGeneratedKeysDelegate buildGetGeneratedKeysDelegate(
*
* @return the dialect specific GetGeneratedKeys delegate
*/
GetGeneratedKeysDelegate buildGetGeneratedKeysDelegate(EntityPersister persister, Dialect dialect);
GetGeneratedKeysDelegate buildGetGeneratedKeysDelegate(EntityPersister persister);
}
Original file line number Diff line number Diff line change
Expand Up @@ -55,9 +55,7 @@ public String getIdentityInsertString() {
}

@Override
public GetGeneratedKeysDelegate buildGetGeneratedKeysDelegate(
EntityPersister persister,
Dialect dialect) {
return new GetGeneratedKeysDelegate( persister, dialect, true, EventType.INSERT );
public GetGeneratedKeysDelegate buildGetGeneratedKeysDelegate(EntityPersister persister) {
return new GetGeneratedKeysDelegate( persister, true, EventType.INSERT );
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,14 @@
@Deprecated(forRemoval = true) @Remove
public class Oracle12cGetGeneratedKeysDelegate extends GetGeneratedKeysDelegate {
/**
* @deprecated Use {@link #Oracle12cGetGeneratedKeysDelegate(EntityPersister, Dialect)} instead.
* @deprecated Use {@link #Oracle12cGetGeneratedKeysDelegate(EntityPersister)} instead.
*/
@Deprecated( forRemoval = true, since = "6.5" )
public Oracle12cGetGeneratedKeysDelegate(PostInsertIdentityPersister persister, Dialect dialect) {
this( (EntityPersister) persister, dialect );
this( persister );
}

public Oracle12cGetGeneratedKeysDelegate(EntityPersister persister, Dialect dialect) {
super( persister, dialect, false, EventType.INSERT );
public Oracle12cGetGeneratedKeysDelegate(EntityPersister persister) {
super( persister, false, EventType.INSERT );
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@ public String getIdentityColumnString(int type) {
}

@Override
public GetGeneratedKeysDelegate buildGetGeneratedKeysDelegate(EntityPersister persister, Dialect dialect) {
return new GetGeneratedKeysDelegate( persister, dialect, false, EventType.INSERT );
public GetGeneratedKeysDelegate buildGetGeneratedKeysDelegate(EntityPersister persister) {
return new GetGeneratedKeysDelegate( persister, false, EventType.INSERT );
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public class SybaseJconnIdentityColumnSupport extends AbstractTransactSQLIdentit
public static final SybaseJconnIdentityColumnSupport INSTANCE = new SybaseJconnIdentityColumnSupport();

@Override
public GetGeneratedKeysDelegate buildGetGeneratedKeysDelegate(EntityPersister persister, Dialect dialect) {
return new SybaseJConnGetGeneratedKeysDelegate( persister, dialect );
public GetGeneratedKeysDelegate buildGetGeneratedKeysDelegate(EntityPersister persister) {
return new SybaseJConnGetGeneratedKeysDelegate( persister );
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -120,16 +120,15 @@ default InsertGeneratedIdentifierDelegate getGeneratedIdentifierDelegate(PostIns
final Dialect dialect = persister.getFactory().getJdbcServices().getDialect();
if ( dialect.supportsInsertReturningGeneratedKeys()
&& persister.getFactory().getSessionFactoryOptions().isGetGeneratedKeysEnabled() ) {
return new GetGeneratedKeysDelegate( persister, dialect, false, EventType.INSERT );
return new GetGeneratedKeysDelegate( persister, false, EventType.INSERT );
}
else if ( dialect.supportsInsertReturning() && noCustomSql( persister, EventType.INSERT ) ) {
return new InsertReturningDelegate( persister, dialect, EventType.INSERT );
return new InsertReturningDelegate( persister, EventType.INSERT );
}
else {
// let's just hope the entity has a @NaturalId!
return new UniqueKeySelectingDelegate(
persister,
dialect,
getUniqueKeyPropertyNames( persister ),
EventType.INSERT
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,44 +6,48 @@
*/
package org.hibernate.generator.values;

import java.util.function.Consumer;

import org.hibernate.dialect.Dialect;
import org.hibernate.generator.EventType;
import org.hibernate.metamodel.mapping.ModelPart;
import org.hibernate.generator.values.internal.GeneratedValuesHelper;
import org.hibernate.generator.values.internal.GeneratedValuesMappingProducer;
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.sql.results.jdbc.spi.JdbcValuesMappingProducer;

import static org.hibernate.generator.values.internal.GeneratedValuesHelper.createMappingProducer;

/**
* @author Marco Belladelli
*/
public abstract class AbstractGeneratedValuesMutationDelegate implements GeneratedValuesMutationDelegate {
protected final EntityPersister persister;
private final EventType timing;
protected final GeneratedValuesMappingProducer jdbcValuesMappingProducer;

public AbstractGeneratedValuesMutationDelegate(EntityPersister persister, EventType timing) {
this( persister, timing, false );
}

public AbstractGeneratedValuesMutationDelegate(EntityPersister persister, EventType timing, boolean inferredKeys) {
this.persister = persister;
this.timing = timing;
this.jdbcValuesMappingProducer = GeneratedValuesHelper.createMappingProducer(
persister,
timing,
supportsArbitraryValues(),
supportsRowId(),
!inferredKeys
);
}

@Override
public EventType getTiming() {
return timing;
}

protected JdbcValuesMappingProducer getMappingProducer(Consumer<ModelPart> modelPartConsumer) {
return getMappingProducer( modelPartConsumer, true );
@Override
public JdbcValuesMappingProducer getGeneratedValuesMappingProducer() {
return jdbcValuesMappingProducer;
}

protected JdbcValuesMappingProducer getMappingProducer(Consumer<ModelPart> modelPartConsumer, boolean useIndex) {
return createMappingProducer(
persister,
timing,
supportsArbitraryValues(),
supportsRowId(),
useIndex,
modelPartConsumer
);
protected Dialect dialect() {
return persister.getFactory().getJdbcServices().getDialect();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
import org.hibernate.sql.results.graph.basic.BasicResult;
import org.hibernate.sql.results.jdbc.spi.JdbcValuesMetadata;

import static org.hibernate.generator.values.internal.GeneratedValuesHelper.getActualSelectionExpression;
import static org.hibernate.query.results.ResultsHelper.impl;
import static org.hibernate.query.results.ResultsHelper.jdbcPositionToValuesArrayPosition;

Expand Down Expand Up @@ -98,10 +97,14 @@ public BasicResult<?> buildResult(
);
}

public BasicValuedModelPart getModelPart() {
return modelPart;
}

private static int columnIndex(JdbcValuesMetadata jdbcResultsMetadata, BasicValuedModelPart modelPart) {
try {
return jdbcPositionToValuesArrayPosition( jdbcResultsMetadata.resolveColumnPosition(
getActualSelectionExpression( modelPart )
modelPart.getSelectionExpression()
) );
}
catch (Exception e) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.function.Consumer;

import org.hibernate.HibernateException;
import org.hibernate.Internal;
Expand Down Expand Up @@ -237,17 +236,15 @@ public boolean shouldReturnProxies() {
* @param supportsRowId if we should process {@link org.hibernate.metamodel.mapping.EntityRowIdMapping rowid}s
* @param useIndex {@code true} if we can use the index of the generated model part to access the result set,
* {@code false} if we should retrieve the index through the column expression
* @param modelPartConsumer optional {@link Consumer consumer} that will obtain generated model parts
*
* @return the instantiated jdbc values mapping producer
*/
public static JdbcValuesMappingProducer createMappingProducer(
public static GeneratedValuesMappingProducer createMappingProducer(
EntityPersister persister,
EventType timing,
boolean supportsArbitraryValues,
boolean supportsRowId,
boolean useIndex,
Consumer<ModelPart> modelPartConsumer) {
boolean useIndex) {
// This is just a mock table group needed to correctly resolve expressions
final NavigablePath parentNavigablePath = new NavigablePath( persister.getEntityName() );
final TableGroup tableGroup = new TableGroupImpl(
Expand All @@ -268,16 +265,15 @@ public static JdbcValuesMappingProducer createMappingProducer(
final ModelPart modelPart = generatedProperties.get( i );
final BasicValuedModelPart basicModelPart = modelPart.asBasicValuedModelPart();
if ( basicModelPart != null ) {
// todo marco : test
final BasicValuedModelPart actual = getActualGeneratedModelPart( basicModelPart );
final GeneratedValueBasicResultBuilder resultBuilder = new GeneratedValueBasicResultBuilder(
parentNavigablePath.append( basicModelPart.getSelectableName() ),
basicModelPart,
parentNavigablePath.append( actual.getSelectableName() ),
actual,
tableGroup,
useIndex ? i : null
);
mappingProducer.addResultBuilder( resultBuilder );
if ( modelPartConsumer != null ) {
modelPartConsumer.accept( getActualGeneratedModelPart( basicModelPart ) );
}
}
else {
throw new UnsupportedOperationException( "Unsupported generated ModelPart: " + modelPart.getPartName() );
Expand All @@ -297,10 +293,6 @@ public static BasicValuedModelPart getActualGeneratedModelPart(BasicValuedModelP
modelPart;
}

public static String getActualSelectionExpression(BasicValuedModelPart modelPart) {
return getActualGeneratedModelPart( modelPart ).getSelectionExpression();
}

/**
* Returns a list of {@link ModelPart}s that represent the actual generated values
* based on timing and the support flags passed in input.
Expand Down Expand Up @@ -348,7 +340,7 @@ public static GeneratedValuesMutationDelegate getGeneratedValuesDelegate(
&& noCustomSql( persister, timing ) ) {
// Special case for RowId on INSERT, since GetGeneratedKeysDelegate doesn't support it
// make InsertReturningDelegate the preferred method if the dialect supports it
return new InsertReturningDelegate( persister, dialect, timing );
return new InsertReturningDelegate( persister, timing );
}

if ( !hasGeneratedProperties ) {
Expand All @@ -357,16 +349,15 @@ && noCustomSql( persister, timing ) ) {

if ( dialect.supportsInsertReturningGeneratedKeys()
&& persister.getFactory().getSessionFactoryOptions().isGetGeneratedKeysEnabled() ) {
return new GetGeneratedKeysDelegate( persister, dialect, false, timing );
return new GetGeneratedKeysDelegate( persister, false, timing );
}
else if ( supportsReturning( dialect, timing ) && noCustomSql( persister, timing ) ) {
return new InsertReturningDelegate( persister, dialect, timing );
return new InsertReturningDelegate( persister, timing );
}
else if ( timing == EventType.INSERT && persister.getNaturalIdentifierProperties() != null
&& !persister.getEntityMetamodel().isNaturalIdentifierInsertGenerated() ) {
return new UniqueKeySelectingDelegate(
persister,
dialect,
getNaturalIdPropertyNames( persister ),
timing
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@

import org.hibernate.engine.spi.LoadQueryInfluencers;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.generator.values.GeneratedValueBasicResultBuilder;
import org.hibernate.generator.values.GeneratedValuesMutationDelegate;
import org.hibernate.generator.values.internal.GeneratedValuesHelper;
import org.hibernate.query.results.DomainResultCreationStateImpl;
import org.hibernate.query.results.JdbcValuesMappingImpl;
import org.hibernate.query.results.ResultBuilder;
Expand All @@ -32,7 +32,7 @@
* @see GeneratedValuesHelper#getGeneratedValues
*/
public class GeneratedValuesMappingProducer implements JdbcValuesMappingProducer {
private final List<ResultBuilder> resultBuilders = new ArrayList<>();
private final List<GeneratedValueBasicResultBuilder> resultBuilders = new ArrayList<>();

@Override
public JdbcValuesMapping resolve(
Expand Down Expand Up @@ -78,10 +78,14 @@ public JdbcValuesMapping resolve(
);
}

public void addResultBuilder(ResultBuilder resultBuilder) {
public void addResultBuilder(GeneratedValueBasicResultBuilder resultBuilder) {
resultBuilders.add( resultBuilder );
}

public List<GeneratedValueBasicResultBuilder> getResultBuilders() {
return resultBuilders;
}

@Override
public void addAffectedTableNames(Set<String> affectedTableNames, SessionFactoryImplementor sessionFactory) {
// nothing to do
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,10 +56,10 @@ public InsertGeneratedIdentifierDelegate getGeneratedIdentifierDelegate(PostInse
// Try to use generic delegates if the dialects supports them
if ( dialect.supportsInsertReturningGeneratedKeys()
&& persister.getFactory().getSessionFactoryOptions().isGetGeneratedKeysEnabled() ) {
return new GetGeneratedKeysDelegate( persister, dialect, false, EventType.INSERT );
return new GetGeneratedKeysDelegate( persister, false, EventType.INSERT );
}
else if ( dialect.supportsInsertReturning() && noCustomSql( persister, EventType.INSERT ) ) {
return new InsertReturningDelegate( persister, dialect, EventType.INSERT );
return new InsertReturningDelegate( persister, EventType.INSERT );
}
// Fall back to delegates which only handle identifiers
else if ( persister.getFactory().getSessionFactoryOptions().isGetGeneratedKeysEnabled() ) {
Expand All @@ -69,13 +69,12 @@ else if ( persister.getNaturalIdentifierProperties() != null
&& !persister.getEntityMetamodel().isNaturalIdentifierInsertGenerated() ) {
return new UniqueKeySelectingDelegate(
persister,
dialect,
getNaturalIdPropertyNames( persister ),
EventType.INSERT
);
}
else {
return new BasicSelectingDelegate( persister, dialect );
return new BasicSelectingDelegate( persister );
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,10 @@ public AbstractReturningDelegate(EntityPersister persister, EventType timing) {
super( persister, timing );
}

public AbstractReturningDelegate(EntityPersister persister, EventType timing, boolean inferredKeys) {
super( persister, timing, inferredKeys );
}

@Override
public GeneratedValues performMutation(
PreparedStatementDetails statementDetails,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,30 +15,25 @@
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.sql.model.ast.builder.TableInsertBuilderStandard;
import org.hibernate.sql.model.ast.builder.TableMutationBuilder;
import org.hibernate.sql.results.jdbc.spi.JdbcValuesMappingProducer;

/**
* Delegate for dealing with {@code IDENTITY} columns where the dialect requires an
* additional command execution to retrieve the generated {@code IDENTITY} value
*/
public class BasicSelectingDelegate extends AbstractSelectingDelegate {
final private EntityPersister persister;
private final Dialect dialect;
private final JdbcValuesMappingProducer jdbcValuesMappingProducer;

/**
* @deprecated Use {@link #BasicSelectingDelegate(EntityPersister, Dialect)} instead.
* @deprecated Use {@link #BasicSelectingDelegate(EntityPersister)} instead.
*/
@Deprecated( forRemoval = true, since = "6.5" )
public BasicSelectingDelegate(PostInsertIdentityPersister persister, Dialect dialect) {
this( (EntityPersister) persister, dialect );
this( persister );
}

public BasicSelectingDelegate(EntityPersister persister, Dialect dialect) {
public BasicSelectingDelegate(EntityPersister persister) {
super( persister, EventType.INSERT );
this.persister = persister;
this.dialect = dialect;
this.jdbcValuesMappingProducer = getMappingProducer( null );
}

@Override
Expand All @@ -50,14 +45,9 @@ public TableMutationBuilder<?> createTableMutationBuilder(

@Override
protected String getSelectSQL() {
if ( persister.getIdentitySelectString() == null && !dialect.getIdentityColumnSupport().supportsInsertSelectIdentity() ) {
if ( persister.getIdentitySelectString() == null && !dialect().getIdentityColumnSupport().supportsInsertSelectIdentity() ) {
throw CoreLogging.messageLogger( BasicSelectingDelegate.class ).nullIdentitySelectString();
}
return persister.getIdentitySelectString();
}

@Override
public JdbcValuesMappingProducer getGeneratedValuesMappingProducer() {
return jdbcValuesMappingProducer;
}
}
Loading

0 comments on commit a178865

Please sign in to comment.