/*
* 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.datastore.mongodb.test;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.fest.assertions.Assertions;
import org.hibernate.Session;
import org.hibernate.ogm.backendtck.simpleentity.Helicopter;
import org.hibernate.ogm.cfg.OgmProperties;
import org.hibernate.ogm.datastore.mongodb.MongoDBDialect;
import org.hibernate.ogm.datastore.mongodb.impl.MongoDBDatastoreProvider;
import org.hibernate.ogm.dialect.batch.spi.BatchableGridDialect;
import org.hibernate.ogm.dialect.batch.spi.OperationsQueue;
import org.hibernate.ogm.utils.OgmTestCase;
import org.junit.After;
import org.junit.Test;
/**
* Test that the expected number of operations are queued during a flush event
*
* @author Davide D'Alto <davide@hibernate.org>
*/
public class BatchInsertTest extends OgmTestCase {
@Test
public void testImplicitFlushWithInserts() throws Exception {
int numInsert = 3;
Session session = openSession();
session.beginTransaction();
for ( int i = 0; i < numInsert; i++ ) {
session.persist( helicopter( "H" + i ) );
}
session.getTransaction().commit();
session.close();
Assertions.assertThat( LeakingMongoDBDialect.queueSize ).isEqualTo( numInsert );
}
@Test
public void testImplicitFlushWithUpdates() throws Exception {
int numInsert = 3;
Session session = openSession();
session.beginTransaction();
Helicopter helicopter = helicopter( "H_tmp" );
session.persist( helicopter );
for ( int i = 0; i < numInsert; i++ ) {
session.persist( helicopter( "H_" + i ) );
}
helicopter.setName( "H_" + numInsert );
session.getTransaction().commit();
session.close();
Assertions.assertThat( LeakingMongoDBDialect.queueSize ).isEqualTo( numInsert + 1 );
}
@Test
public void testImplicitFlushWithDeletes() throws Exception {
int numDelete = 3;
Session session = openSession();
session.beginTransaction();
for ( int i = 0; i < numDelete; i++ ) {
session.persist( helicopter( "H_" + i ) );
}
session.getTransaction().commit();
session.close();
LeakingMongoDBDialect.queueSize = -1;
session = openSession();
session.beginTransaction();
List<Helicopter> helicopters = session.createQuery( "FROM Helicopter" ).list();
for ( Helicopter helicopter : helicopters ) {
session.delete( helicopter );
}
session.getTransaction().commit();
session.close();
Assertions.assertThat( LeakingMongoDBDialect.queueSize ).isEqualTo( numDelete );
}
@Test
public void testImplicitFlushWithInsertsAndDelete() throws Exception {
int numInsert = 3;
Session session = openSession();
session.beginTransaction();
List<Helicopter> helicopters = new ArrayList<Helicopter>();
for ( int i = 0; i < numInsert; i++ ) {
Helicopter helicopter = helicopter( "H_" + i );
session.persist( helicopter );
helicopters.add( helicopter );
}
for ( Helicopter helicopter : helicopters ) {
session.delete( helicopter );
}
session.getTransaction().commit();
session.close();
Assertions.assertThat( LeakingMongoDBDialect.queueSize ).isEqualTo( 2 * numInsert );
}
@After
public void clean() {
Session session = openSession();
session.beginTransaction();
List<Helicopter> helicopters = session.createQuery( "FROM Helicopter" ).list();
for ( Helicopter helicopter : helicopters ) {
session.delete( helicopter );
}
session.getTransaction().commit();
session.close();
}
private Helicopter helicopter(String name) {
Helicopter helicopter = new Helicopter();
helicopter.setName( name );
return helicopter;
}
@Override
protected Class<?>[] getAnnotatedClasses() {
return new Class<?>[] { Helicopter.class };
}
@Override
protected void configure(Map<String, Object> settings) {
settings.put( OgmProperties.GRID_DIALECT, LeakingMongoDBDialect.class );
}
public static class LeakingMongoDBDialect extends MongoDBDialect implements BatchableGridDialect {
static volatile int queueSize = 0;
public LeakingMongoDBDialect(MongoDBDatastoreProvider provider) {
super( provider );
}
@Override
public void executeBatch(OperationsQueue queue) {
queueSize = queue.size();
super.executeBatch( queue );
}
}
}