Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
import io.vertx.sqlclient.PropertyKind;
import io.vertx.sqlclient.Row;
import io.vertx.sqlclient.RowSet;
import io.vertx.sqlclient.Tuple;
import io.vertx.sqlclient.desc.ColumnDescriptor;
import io.vertx.sqlclient.impl.RowBase;

Expand All @@ -56,13 +57,71 @@
*/
public class ResultSetAdaptor implements ResultSet {

private final Iterator<Row> iterator;
private final Iterator<? extends Row> iterator;

private final List<ColumnDescriptor> columnDescriptors;
private final List<String> columnNames;
private Row row;
private boolean wasNull;

public ResultSetAdaptor(Object id, Class<?> idClass, String columnName) {
requireNonNull( id );
this.iterator = List.of( new RowAdaptor( id, idClass, columnName ) ).iterator();
this.columnNames = columnName == null ? emptyList() : List.of( columnName );
this.columnDescriptors = List.of( toColumnDescriptor( idClass, columnName ) );
}

private static class RowAdaptor implements Row {
private final Object id;
private final Class<?> idClass;
private final String columnName;

public RowAdaptor(Object id, Class<?> idClass, String columnName) {
this.id = id;
this.idClass = idClass;
this.columnName = columnName;
}

@Override
public Object getValue(String column) {
return id;
}

@Override
public String getColumnName(int pos) {
return columnName;
}

@Override
public int getColumnIndex(String column) {
return 0;
}

@Override
public Object getValue(int pos) {
return id;
}

@Override
public Tuple addValue(Object value) {
return null;
}

@Override
public int size() {
return 1;
}

@Override
public void clear() {
}

@Override
public List<Class<?>> types() {
return List.of( idClass );
}
}

public ResultSetAdaptor(RowSet<Row> rows) {
requireNonNull( rows );
this.iterator = rows.iterator();
Expand All @@ -83,7 +142,11 @@ private ResultSetAdaptor(RowSet<Row> rows, Row row, String idColumnName, Class<?
requireNonNull( idColumnName );
this.iterator = List.of( row ).iterator();
this.columnNames = List.of( idColumnName );
ColumnDescriptor columnDescriptor = new ColumnDescriptor() {
this.columnDescriptors = List.of( toColumnDescriptor( idClass, idColumnName ) );
}

private static ColumnDescriptor toColumnDescriptor(Class<?> idClass, String idColumnName) {
return new ColumnDescriptor() {
@Override
public String name() {
return idColumnName;
Expand All @@ -104,7 +167,6 @@ public JDBCType jdbcType() {
return null;
}
};
this.columnDescriptors = List.of( columnDescriptor );
}

private static class RowFromId extends RowBase {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
import java.util.concurrent.CompletionStage;


import org.hibernate.reactive.adaptor.impl.ResultSetAdaptor;

import io.vertx.sqlclient.spi.DatabaseMetadata;

import static org.hibernate.reactive.util.impl.CompletionStages.voidFuture;
Expand Down Expand Up @@ -169,11 +171,7 @@ public CompletionStage<ResultSet> insertAndSelectIdentifierAsResultSet(
Class<?> idClass,
String idColumnName) {
return insertAndSelectIdentifier( sql, paramValues, idClass, idColumnName )
.thenApply( this::convertToResultSet );
}

private ResultSet convertToResultSet(Object o) {
return null;
.thenApply( id -> new ResultSetAdaptor( id, idClass, idColumnName ) );
}

public CompletionStage<ReactiveConnection.Result> select(String sql) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
/* Hibernate, Relational Persistence for Idiomatic Java
*
* SPDX-License-Identifier: Apache-2.0
* Copyright: Red Hat Inc. and Hibernate Authors
*/
package org.hibernate.reactive;

import java.util.Arrays;
import java.util.Collection;
import java.util.List;

import org.hibernate.cfg.AvailableSettings;
import org.hibernate.cfg.Configuration;

import org.junit.jupiter.api.Test;

import io.vertx.junit5.VertxTestContext;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;

import static org.assertj.core.api.Assertions.assertThat;


public class IdentityGenerationWithBatchingTest extends BaseReactiveTest {

@Override
protected Collection<Class<?>> annotatedEntities() {
return List.of( Book.class );
}

@Override
protected Configuration constructConfiguration() {
Configuration configuration = super.constructConfiguration();
configuration.setProperty( AvailableSettings.STATEMENT_BATCH_SIZE, "5" );
return configuration;
}

@Test
public void test(VertxTestContext context) {
String[] titles = {
"Around the World in Eighty Days",
"The Book of M: A Novel",
"The Poppy War",
"The poetry home repair manual",
"Relish"
};
test( context, getMutinySessionFactory()
.withTransaction( s -> s.persistAll( asBooks( titles ) ) )
.chain( () -> getMutinySessionFactory().withSession( s -> s.createSelectionQuery( "from Book order by id ASC", Book.class ).getResultList() ) )
.invoke( results -> {
String[] resultTitles = results.stream().map( Book::getTitle ).toArray( String[]::new );
assertThat( resultTitles ).containsExactly( titles );
Long savedId = 0L;
for ( Book book : results ) {
assertThat( book.getId() ).isNotNull().isGreaterThan( savedId );
savedId = book.getId();
}
} )
);
}

private Book[] asBooks(String[] titles) {
return Arrays.asList( titles ).stream().map( Book::new ).toArray( Book[]::new );
}

@Entity(name = "Book")
@Table(name = "books")
static class Book {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private String title;

public Book() {
}

public Book(String title) {
this.title = title;
}

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getTitle() {
return title;
}

public void setTitle(String title) {
this.title = title;
}

@Override
public String toString() {
return id + ":" + title;
}
}
}