/*
* Hibernate OGM, Domain model persistence for NoSQL datastores
*
* 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.ogm.test.dialectinvocations;
import static org.fest.assertions.Assertions.assertThat;
import static org.junit.Assert.assertNotNull;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.ogm.backendtck.dialectinvocations.AbstractGridDialectOperationInvocationsTest;
import org.hibernate.ogm.dialect.batch.spi.BatchableGridDialect;
import org.hibernate.ogm.dialect.batch.spi.GroupingByEntityDialect;
import org.hibernate.ogm.dialect.impl.GridDialects;
import org.hibernate.ogm.dialect.query.spi.QueryableGridDialect;
import org.hibernate.ogm.dialect.spi.GridDialect;
import org.hibernate.ogm.utils.TestForIssue;
import org.junit.Test;
/**
* Asserts the number and order of grid dialect operations.
* @author Gunnar Morling
*/
@TestForIssue(jiraKey = "OGM-1152")
public class GridDialectOperationInvocationsTest extends AbstractGridDialectOperationInvocationsTest {
@Test
public void insertUpdateAndDelete() throws Exception {
GridDialect gridDialect = getGridDialect();
Session session = openSession();
Transaction transaction = session.beginTransaction();
// insert
StockItem item = new StockItem();
item.setId( "item-1" );
item.setItemName( "Fairway Wood 19°" );
item.setCount( 25 );
session.persist( item );
transaction.commit();
session.clear();
transaction = session.beginTransaction();
// load and update
StockItem loadedItem = (StockItem) session.get( StockItem.class, item.getId() );
assertNotNull( "Cannot load persisted object", loadedItem );
loadedItem.setCount( 24 );
transaction.commit();
session.clear();
transaction = session.beginTransaction();
// delete
loadedItem = (StockItem) session.get( StockItem.class, item.getId() );
assertNotNull( "Cannot load persisted object", loadedItem );
session.delete( loadedItem );
transaction.commit();
session.clear();
session.close();
if ( GridDialects.hasFacet( gridDialect, GroupingByEntityDialect.class ) || GridDialects.hasFacet( gridDialect, BatchableGridDialect.class ) ) {
if ( isDuplicateInsertPreventionStrategyNative( gridDialect ) ) {
assertThat( getOperations() ).containsExactly(
"createTuple",
"executeBatch[group[insertOrUpdateTuple]]",
"getTuple",
"executeBatch[group[insertOrUpdateTuple]]",
"getTuple",
"executeBatch[removeTuple]"
);
}
else {
assertThat( getOperations() ).containsExactly(
"getTuple",
"createTuple",
"executeBatch[group[insertOrUpdateTuple]]",
"getTuple",
"executeBatch[group[insertOrUpdateTuple]]",
"getTuple",
"executeBatch[removeTuple]"
);
}
}
else {
assertThat( getOperations() ).containsExactly(
"getTuple",
"createTuple",
"insertOrUpdateTuple",
"getTuple",
"insertOrUpdateTuple",
"getTuple",
"removeTuple"
);
}
}
@Test
public void insertAndUpdateInSameTransaction() throws Exception {
GridDialect gridDialect = getGridDialect();
Session session = openSession();
Transaction transaction = session.beginTransaction();
// insert
StockItem item = new StockItem();
item.setId( "item-1" );
item.setItemName( "Fairway Wood 19°" );
item.setCount( 25 );
session.persist( item );
session.flush();
// update
item.setCount( 24 );
transaction.commit();
session.clear();
transaction = session.beginTransaction();
StockItem loadedItem = (StockItem) session.get( StockItem.class, item.getId() );
assertNotNull( "Cannot load persisted object", loadedItem );
session.delete( loadedItem );
transaction.commit();
session.close();
if ( GridDialects.hasFacet( gridDialect, GroupingByEntityDialect.class ) || GridDialects.hasFacet( gridDialect, BatchableGridDialect.class ) ) {
if ( isDuplicateInsertPreventionStrategyNative( gridDialect ) ) {
assertThat( getOperations() ).containsExactly(
"createTuple",
"executeBatch[group[insertOrUpdateTuple]]",
"executeBatch[group[insertOrUpdateTuple]]",
"getTuple",
"executeBatch[removeTuple]"
);
}
else {
assertThat( getOperations() ).containsExactly(
"getTuple",
"createTuple",
"executeBatch[group[insertOrUpdateTuple]]",
"executeBatch[group[insertOrUpdateTuple]]",
"getTuple",
"executeBatch[removeTuple]"
);
}
}
else {
assertThat( getOperations() ).containsExactly(
"getTuple",
"createTuple",
"insertOrUpdateTuple",
"insertOrUpdateTuple",
"getTuple",
"removeTuple"
);
}
}
@Test
public void insertSearchUpdateDelete() throws Exception {
GridDialect gridDialect = getGridDialect();
Session session = openSession();
Transaction transaction = session.beginTransaction();
// insert
StockItem item = new StockItem();
item.setId( "item-1" );
item.setItemName( "Fairway Wood 19°" );
item.setCount( 25 );
session.persist( item );
transaction.commit();
session.clear();
transaction = session.beginTransaction();
// search and update
StockItem loadedItem = (StockItem) session.createQuery( "from StockItem si" ).uniqueResult();
assertNotNull( "Cannot load persisted object", loadedItem );
loadedItem.setCount( 24 );
transaction.commit();
session.clear();
transaction = session.beginTransaction();
loadedItem = (StockItem) session.get( StockItem.class, item.getId() );
assertNotNull( "Cannot load persisted object", loadedItem );
assertThat( loadedItem.getCount() ).isEqualTo( 24 );
session.delete( loadedItem );
transaction.commit();
session.close();
if ( GridDialects.hasFacet( gridDialect, GroupingByEntityDialect.class ) || GridDialects.hasFacet( gridDialect, BatchableGridDialect.class ) ) {
if ( GridDialects.hasFacet( gridDialect, QueryableGridDialect.class ) ) {
assertThat( getOperations() ).containsExactly(
"createTuple",
"executeBatch[group[insertOrUpdateTuple]]",
"executeBackendQuery",
"executeBatch[group[insertOrUpdateTuple]]",
"getTuple",
"executeBatch[removeTuple]"
);
}
else if ( isDuplicateInsertPreventionStrategyNative( gridDialect ) ) {
assertThat( getOperations() ).containsExactly(
"createTuple",
"executeBatch[group[insertOrUpdateTuple]]",
"getTuple",
"executeBatch[group[insertOrUpdateTuple]]",
"getTuple",
"executeBatch[removeTuple]"
);
}
else {
assertThat( getOperations() ).containsExactly(
"getTuple",
"createTuple",
"executeBatch[group[insertOrUpdateTuple]]",
"getTuple",
"executeBatch[group[insertOrUpdateTuple]]",
"getTuple",
"executeBatch[removeTuple]"
);
}
}
else {
assertThat( getOperations() ).containsExactly(
"getTuple",
"createTuple",
"insertOrUpdateTuple",
"getTuple",
"insertOrUpdateTuple",
"getTuple",
"removeTuple"
);
}
}
@Override
protected Class<?>[] getAnnotatedClasses() {
return new Class<?>[] { StockItem.class };
}
}