Skip to content

Commit

Permalink
fix
Browse files Browse the repository at this point in the history
  • Loading branch information
DavideD committed Jun 24, 2024
1 parent f169d60 commit 2aab966
Show file tree
Hide file tree
Showing 6 changed files with 393 additions and 180 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
/* Hibernate, Relational Persistence for Idiomatic Java
*
* SPDX-License-Identifier: Apache-2.0
* Copyright: Red Hat Inc. and Hibernate Authors
*/
package org.hibernate.reactive.sql.results.graph.collection.internal;

public class ReactiveAbstractCollectionInitializer {
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,32 @@
*/
package org.hibernate.reactive.sql.results.graph.collection.internal;


import org.hibernate.collection.spi.PersistentCollection;
import org.hibernate.engine.FetchTiming;
import org.hibernate.metamodel.mapping.PluralAttributeMapping;
import org.hibernate.reactive.logging.impl.Log;
import org.hibernate.reactive.sql.results.graph.entity.internal.ReactiveEntityFetchJoinedImpl;
import org.hibernate.spi.NavigablePath;
import org.hibernate.sql.ast.tree.from.TableGroup;
import org.hibernate.sql.results.graph.AssemblerCreationState;
import org.hibernate.sql.results.graph.DomainResultCreationState;
import org.hibernate.sql.results.graph.Fetch;
import org.hibernate.sql.results.graph.Fetchable;
import org.hibernate.sql.results.graph.InitializerData;
import org.hibernate.sql.results.graph.InitializerParent;
import org.hibernate.sql.results.graph.collection.CollectionInitializer;
import org.hibernate.sql.results.graph.collection.internal.CollectionDomainResult;
import org.hibernate.sql.results.graph.entity.internal.EntityFetchJoinedImpl;
import org.hibernate.sql.results.jdbc.spi.RowProcessingState;

import static java.lang.invoke.MethodHandles.lookup;
import static org.hibernate.reactive.logging.impl.LoggerFactory.make;

public class ReactiveCollectionDomainResult extends CollectionDomainResult {

private static final Log LOG = make( Log.class, lookup() );

public ReactiveCollectionDomainResult(
NavigablePath loadingPath,
PluralAttributeMapping loadingAttribute,
Expand Down Expand Up @@ -48,4 +61,77 @@ public Fetch generateFetchableFetch(
}
return fetch;
}
}

@Override
public CollectionInitializer<?> createInitializer(
InitializerParent<?> parent,
AssemblerCreationState creationState) {
CollectionInitializer<?> initializer = super.createInitializer( parent, creationState );
return new ReactiveCollectionInitializerAdapter<>( initializer );
}

public static class ReactiveCollectionInitializerAdapter<T extends InitializerData>
implements CollectionInitializer<T> {

private final CollectionInitializer<T> delegate;

public ReactiveCollectionInitializerAdapter(CollectionInitializer<T> initializer) {
this.delegate = initializer;
}

@Override
public NavigablePath getNavigablePath() {
return delegate.getNavigablePath();
}

@Override
public PluralAttributeMapping getInitializedPart() {
return delegate.getInitializedPart();
}

@Override
public T getData(RowProcessingState rowProcessingState) {
return delegate.getData( rowProcessingState );
}

@Override
public void startLoading(RowProcessingState rowProcessingState) {
delegate.startLoading( rowProcessingState );
}

@Override
public void resolveKey(T data) {
throw LOG.nonReactiveMethodCall( "reactiveResolveKey" );
}

@Override
public void resolveInstance(T data) {
throw LOG.nonReactiveMethodCall( "reactiveResolveInstance" );
}

@Override
public void initializeInstance(T data) {
delegate.initializeInstance( data );
}

@Override
public void finishUpRow(T data) {
delegate.finishUpRow( data );
}

@Override
public boolean isPartOfKey() {
return delegate.isPartOfKey();
}

@Override
public boolean isResultInitializer() {
return delegate.isResultInitializer();
}

@Override
public PersistentCollection<?> getCollectionInstance(T data) {
return delegate.getCollectionInstance( data );
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
/* Hibernate, Relational Persistence for Idiomatic Java
*
* SPDX-License-Identifier: Apache-2.0
* Copyright: Red Hat Inc. and Hibernate Authors
*/
package org.hibernate.reactive.sql.results.graph.collection.internal;

import java.util.List;
import java.util.function.BiConsumer;

import org.hibernate.HibernateException;
import org.hibernate.LockMode;
import org.hibernate.collection.spi.PersistentList;
import org.hibernate.engine.spi.CollectionKey;
import org.hibernate.internal.log.LoggingHelper;
import org.hibernate.metamodel.mapping.PluralAttributeMapping;
import org.hibernate.spi.NavigablePath;
import org.hibernate.sql.results.graph.AssemblerCreationState;
import org.hibernate.sql.results.graph.DomainResult;
import org.hibernate.sql.results.graph.DomainResultAssembler;
import org.hibernate.sql.results.graph.Fetch;
import org.hibernate.sql.results.graph.Initializer;
import org.hibernate.sql.results.graph.InitializerData;
import org.hibernate.sql.results.graph.InitializerParent;
import org.hibernate.sql.results.graph.collection.internal.AbstractImmediateCollectionInitializer;
import org.hibernate.sql.results.graph.collection.internal.ListInitializer;
import org.hibernate.sql.results.jdbc.spi.RowProcessingState;

public class ReactiveListInitializer
extends AbstractImmediateCollectionInitializer<AbstractImmediateCollectionInitializer.ImmediateCollectionInitializerData> {
private static final String CONCRETE_NAME = ListInitializer.class.getSimpleName();

private final DomainResultAssembler<Integer> listIndexAssembler;
private final DomainResultAssembler<?> elementAssembler;

private final int listIndexBase;

public ReactiveListInitializer(
NavigablePath navigablePath,
PluralAttributeMapping attributeMapping,
InitializerParent<?> parent,
LockMode lockMode,
DomainResult<?> collectionKeyResult,
DomainResult<?> collectionValueKeyResult,
boolean isResultInitializer,
AssemblerCreationState creationState,
Fetch listIndexFetch,
Fetch elementFetch) {
super(
navigablePath,
attributeMapping,
parent,
lockMode,
collectionKeyResult,
collectionValueKeyResult,
isResultInitializer,
creationState
);
//noinspection unchecked
this.listIndexAssembler = (DomainResultAssembler<Integer>) listIndexFetch.createAssembler(
this,
creationState
);
this.elementAssembler = elementFetch.createAssembler( this, creationState );
this.listIndexBase = attributeMapping.getIndexMetadata().getListIndexBase();
}

@Override
protected String getSimpleConcreteImplName() {
return CONCRETE_NAME;
}

@Override
protected void forEachSubInitializer(
BiConsumer<Initializer<?>, RowProcessingState> consumer,
InitializerData data) {
super.forEachSubInitializer( consumer, data );
final Initializer<?> initializer = elementAssembler.getInitializer();
if ( initializer != null ) {
consumer.accept( initializer, data.getRowProcessingState() );
}
}

@Override
public PersistentList<?> getCollectionInstance(ImmediateCollectionInitializerData data) {
return (PersistentList<?>) super.getCollectionInstance( data );
}

@Override
protected void readCollectionRow(
CollectionKey collectionKey,
List<Object> loadingState,
RowProcessingState rowProcessingState) {
final Integer indexValue = listIndexAssembler.assemble( rowProcessingState );
if ( indexValue == null ) {
throw new HibernateException( "Illegal null value for list index encountered while reading: "
+ getCollectionAttributeMapping().getNavigableRole() );
}
final Object element = elementAssembler.assemble( rowProcessingState );
if ( element == null ) {
// If element is null, then NotFoundAction must be IGNORE
return;
}
int index = indexValue;

if ( listIndexBase != 0 ) {
index -= listIndexBase;
}

for ( int i = loadingState.size(); i <= index; ++i ) {
loadingState.add( i, null );
}

loadingState.set( index, element );
}

@Override
protected void initializeSubInstancesFromParent(ImmediateCollectionInitializerData data) {
final Initializer<?> initializer = elementAssembler.getInitializer();
if ( initializer != null ) {
final RowProcessingState rowProcessingState = data.getRowProcessingState();
final PersistentList<?> list = getCollectionInstance( data );
assert list != null;
for ( Object element : list ) {
initializer.initializeInstanceFromParent( element, rowProcessingState );
}
}
}

@Override
protected void resolveInstanceSubInitializers(ImmediateCollectionInitializerData data) {
final Initializer<?> initializer = elementAssembler.getInitializer();
if ( initializer != null ) {
final RowProcessingState rowProcessingState = data.getRowProcessingState();
final PersistentList<?> list = getCollectionInstance( data );
assert list != null;
for ( Object element : list ) {
initializer.resolveInstance( element, rowProcessingState );
}
}
}

@Override
public DomainResultAssembler<?> getIndexAssembler() {
return listIndexAssembler;
}

@Override
public DomainResultAssembler<?> getElementAssembler() {
return elementAssembler;
}

@Override
public String toString() {
return "ReactiveListInitializer(" + LoggingHelper.toLoggableString( getNavigablePath() ) + ")";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -808,22 +808,22 @@ public void resolveInstance(Object instance, EntityInitializerData data) {
public void resolveInstance(EntityInitializerData data) {
throw LOG.nonReactiveMethodCall( "reactiveResolveInstance" );
}
//
// @Override
// protected void resolveKey(EntityInitializerData data, boolean entityKeyOnly) {
// throw LOG.nonReactiveMethodCall( "reactiveResolveKey" );
// }
//
// @Override
// public void resolveKey(EntityInitializerData data) {
// throw LOG.nonReactiveMethodCall( "reactiveResolveKey" );
// }
//
// @Override
// public void resolveKey(RowProcessingState rowProcessingState) {
// throw LOG.nonReactiveMethodCall( "reactiveResolveKey" );
// }
//

@Override
protected void resolveKey(EntityInitializerData data, boolean entityKeyOnly) {
throw LOG.nonReactiveMethodCall( "reactiveResolveKey" );
}

@Override
public void resolveKey(EntityInitializerData data) {
throw LOG.nonReactiveMethodCall( "reactiveResolveKey" );
}

@Override
public void resolveKey(RowProcessingState rowProcessingState) {
throw LOG.nonReactiveMethodCall( "reactiveResolveKey" );
}


@Override
protected void resolveInstanceSubInitializers(EntityInitializerData data) {
Expand Down
Loading

0 comments on commit 2aab966

Please sign in to comment.