/* * 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.query.nativequery; import static org.fest.assertions.Assertions.assertThat; import java.util.List; import org.fest.assertions.Fail; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.ogm.OgmSession; import org.hibernate.ogm.utils.OgmTestCase; import org.hibernate.ogm.utils.TestForIssue; import org.junit.After; import org.junit.Before; import org.junit.Test; import com.mongodb.BasicDBList; /** * Test the execution of native queries on MongoDB using the {@link Session} * * @author Davide D'Alto <davide@hibernate.org> */ public class MongoDBSessionCLIQueryTest extends OgmTestCase { private final OscarWildePoem portia = new OscarWildePoem( 1L, "Portia", "Oscar Wilde", 1881 ); private final OscarWildePoem athanasia = new OscarWildePoem( 2L, "Athanasia", "Oscar Wilde", 1879, "ebook" ); private final OscarWildePoem imperatrix = new OscarWildePoem( 3L, "Ave Imperatrix", "Oscar Wilde", 1882,"audible", "ebook", "paperback" ); @Before public void init() { try ( Session session = openSession() ) { Transaction tx = session.beginTransaction(); session.persist( portia ); session.persist( athanasia ); session.persist( imperatrix ); tx.commit(); } } @After public void tearDown() throws InterruptedException { try ( Session session = openSession() ) { Transaction tx = session.beginTransaction(); delete( session, portia ); delete( session, athanasia ); delete( session, imperatrix ); tx.commit(); } } private void delete(final Session session, final OscarWildePoem poem) { Object entity = session.get( OscarWildePoem.class, poem.getId() ); if ( entity != null ) { session.delete( entity ); } } @Test public void testFindWithPair() throws Exception { try ( OgmSession session = openSession() ) { Transaction transaction = session.beginTransaction(); String nativeQuery = "db." + OscarWildePoem.TABLE_NAME + ".find({ 'author' : 'Oscar Wilde' })"; Query query = session.createNativeQuery( nativeQuery ).addEntity( OscarWildePoem.class ); @SuppressWarnings("unchecked") List<OscarWildePoem> result = query.list(); assertThat( result ).onProperty( "id" ).containsOnly( portia.getId(), imperatrix.getId(), athanasia.getId() ); transaction.commit(); } } @Test public void testFindOneWithPair() throws Exception { try ( OgmSession session = openSession() ) { Transaction transaction = session.beginTransaction(); String nativeQuery = "db." + OscarWildePoem.TABLE_NAME + ".findOne({ 'author' : 'Oscar Wilde' })"; Query query = session.createNativeQuery( nativeQuery ).addEntity( OscarWildePoem.class ); @SuppressWarnings("unchecked") List<OscarWildePoem> result = query.list(); assertThat( result.size() ).isEqualTo( 1 ); transaction.commit(); } } @Test public void testAggregate() throws Exception { try ( OgmSession session = openSession() ) { Transaction transaction = session.beginTransaction(); String nativeQuery = "db." + OscarWildePoem.TABLE_NAME + ".aggregate([{ '$match': {'author': 'Oscar Wilde' } }, { '$sort': {'name': -1 } } ])"; Query query = session.createNativeQuery( nativeQuery ).addEntity( OscarWildePoem.class ); @SuppressWarnings("unchecked") List<OscarWildePoem> result = query.list(); assertThat( result ).onProperty( "id" ).containsExactly( portia.getId(), imperatrix.getId(), athanasia.getId() ); transaction.commit(); } } @Test public void testFindAndModify() throws Exception { try ( OgmSession session = openSession() ) { Transaction transaction = session.beginTransaction(); String nativeQuery = "db." + OscarWildePoem.TABLE_NAME + ".findAndModify({ 'query': {'_id': 1}, 'update': { '$set': { 'author': 'Oscar Wilder' } }, 'new': true })"; Query query = session.createNativeQuery( nativeQuery ).addEntity( OscarWildePoem.class ); @SuppressWarnings("unchecked") List<OscarWildePoem> result = query.list(); assertThat( result.size() ).isEqualTo( 1 ); assertThat( result.get( 0 ).getAuthor() ).isEqualTo( "Oscar Wilder" ); transaction.commit(); } } @Test public void testFindAndModifyNoMatch() throws Exception { try ( OgmSession session = openSession() ) { Transaction transaction = session.beginTransaction(); String nativeQuery = "db." + OscarWildePoem.TABLE_NAME + ".findAndModify({ 'query': {'_id': 11}, 'update': { '$set': { 'author': 'Oscar Wilder' } }, 'new': true })"; Query query = session.createNativeQuery( nativeQuery ).addEntity( OscarWildePoem.class ); @SuppressWarnings("unchecked") List<OscarWildePoem> result = query.list(); assertThat( result.size() ).isEqualTo( 0 ); transaction.commit(); } } @Test @SuppressWarnings("unchecked") public void testFindAndModifyNoMatchUpsertThenRemoveThenFindOne() throws Exception { try ( OgmSession session = openSession() ) { Transaction transaction = session.beginTransaction(); String nativeQuery = "db." + OscarWildePoem.TABLE_NAME + ".findAndModify({ 'query': {'_id': { '$numberLong': '11' } }, 'update': { '$set': { 'author': 'Oscar Wilder', 'name': 'The one and wildest', 'rating': '1' } }, 'new': true, 'upsert': true })"; Query query = session.createNativeQuery( nativeQuery ).addEntity( OscarWildePoem.class ); List<OscarWildePoem> result = query.list(); assertThat( result.size() ).isEqualTo( 1 ); assertThat( result.get( 0 ).getId() ).isEqualTo( 11 ); assertThat( result.get( 0 ).getAuthor() ).isEqualTo( "Oscar Wilder" ); assertThat( result.get( 0 ).getName() ).isEqualTo( "The one and wildest" ); // Need to remove here because subsequent tests assume the initial dataset. nativeQuery = "db." + OscarWildePoem.TABLE_NAME + ".remove({ '_id': { '$numberLong': '11' } })"; query = session.createNativeQuery( nativeQuery ); int n = query.executeUpdate(); assertThat( n ).isEqualTo( 1 ); // And check that it is gone. nativeQuery = "db." + OscarWildePoem.TABLE_NAME + ".findOne({ '_id': { '$numberLong': '11' } })"; query = session.createNativeQuery( nativeQuery ).addEntity( OscarWildePoem.class ); result = query.list(); assertThat( result.size() ).isEqualTo( 0 ); transaction.commit(); } } @Test @SuppressWarnings("unchecked") public void testInsertThenRemove() throws Exception { try ( OgmSession session = openSession() ) { Transaction transaction = session.beginTransaction(); String nativeQuery = "db." + OscarWildePoem.TABLE_NAME + ".insert({ '_id': { '$numberLong': '11' }, 'author': 'Oscar Wilder', 'name': 'The one and wildest', 'rating': '1' } )"; Query query = session.createNativeQuery( nativeQuery ); int n = query.executeUpdate(); assertThat( n ).isEqualTo( 1 ); // Try again. try { n = query.executeUpdate(); Fail.fail( "Unique key constraint violation exception expected." ); } catch (Exception e) { /* Expected */ } // Check that it was inserted. nativeQuery = "db." + OscarWildePoem.TABLE_NAME + ".findOne( { 'name': 'The one and wildest' } )"; query = session.createNativeQuery( nativeQuery ).addEntity( OscarWildePoem.class ); List<OscarWildePoem> result = query.list(); assertThat( result.size() ).isEqualTo( 1 ); assertThat( result.get( 0 ).getId() ).isEqualTo( 11 ); assertThat( result.get( 0 ).getAuthor() ).isEqualTo( "Oscar Wilder" ); assertThat( result.get( 0 ).getName() ).isEqualTo( "The one and wildest" ); // Need to remove here because subsequent tests assume the initial dataset. nativeQuery = "db." + OscarWildePoem.TABLE_NAME + ".remove({ '_id': { '$numberLong': '11' } })"; query = session.createNativeQuery( nativeQuery ); n = query.executeUpdate(); assertThat( n ).isEqualTo( 1 ); // And check that it is gone. nativeQuery = "db." + OscarWildePoem.TABLE_NAME + ".findOne({ '_id': { '$numberLong': '11' } })"; query = session.createNativeQuery( nativeQuery ).addEntity( OscarWildePoem.class ); result = query.list(); assertThat( result.size() ).isEqualTo( 0 ); transaction.commit(); } } @Test @SuppressWarnings("unchecked") public void testInsertMultipleThenRemove() throws Exception { try ( OgmSession session = openSession() ) { Transaction transaction = session.beginTransaction(); String nativeQuery = "db." + OscarWildePoem.TABLE_NAME + ".insert( [ { '_id': { '$numberLong': '11' }, 'author': 'Oscar Wilder', 'name': 'The one and wildest', 'rating': '1' }, { '_id': { '$numberLong': '12' }, 'author': 'Friedrich Schiller', 'name': 'An die Freude', 'rating': '1' } ], { 'ordered': false } )"; Query query = session.createNativeQuery( nativeQuery ); int n = query.executeUpdate(); assertThat( n ).isEqualTo( 2 ); // Try again. try { n = query.executeUpdate(); Fail.fail( "Unique key constraint violation exception expected." ); } catch (Exception e) { /* Expected */ } // Check that all were inserted. nativeQuery = "db." + OscarWildePoem.TABLE_NAME + ".findOne( { 'name': 'The one and wildest' } )"; query = session.createNativeQuery( nativeQuery ).addEntity( OscarWildePoem.class ); List<OscarWildePoem> result = query.list(); assertThat( result.size() ).isEqualTo( 1 ); assertThat( result.get( 0 ).getId() ).isEqualTo( 11 ); assertThat( result.get( 0 ).getAuthor() ).isEqualTo( "Oscar Wilder" ); assertThat( result.get( 0 ).getName() ).isEqualTo( "The one and wildest" ); nativeQuery = "db." + OscarWildePoem.TABLE_NAME + ".findOne( { 'name': 'An die Freude' } )"; query = session.createNativeQuery( nativeQuery ).addEntity( OscarWildePoem.class ); result = query.list(); assertThat( result.size() ).isEqualTo( 1 ); assertThat( result.get( 0 ).getId() ).isEqualTo( 12 ); assertThat( result.get( 0 ).getAuthor() ).isEqualTo( "Friedrich Schiller" ); assertThat( result.get( 0 ).getName() ).isEqualTo( "An die Freude" ); // Need to remove here because subsequent tests assume the initial dataset. nativeQuery = "db." + OscarWildePoem.TABLE_NAME + ".remove({ '_id': { '$numberLong': '11' } })"; query = session.createNativeQuery( nativeQuery ); n = query.executeUpdate(); assertThat( n ).isEqualTo( 1 ); nativeQuery = "db." + OscarWildePoem.TABLE_NAME + ".remove({ '_id': { '$numberLong': '12' } })"; query = session.createNativeQuery( nativeQuery ); n = query.executeUpdate(); assertThat( n ).isEqualTo( 1 ); // And check that they are gone. nativeQuery = "db." + OscarWildePoem.TABLE_NAME + ".findOne({ '_id': { '$numberLong': '11' } })"; query = session.createNativeQuery( nativeQuery ).addEntity( OscarWildePoem.class ); result = query.list(); assertThat( result.size() ).isEqualTo( 0 ); nativeQuery = "db." + OscarWildePoem.TABLE_NAME + ".findOne({ '_id': { '$numberLong': '12' } })"; query = session.createNativeQuery( nativeQuery ).addEntity( OscarWildePoem.class ); result = query.list(); assertThat( result.size() ).isEqualTo( 0 ); transaction.commit(); } } @Test public void testFindWithAnd() throws Exception { try ( OgmSession session = openSession() ) { Transaction transaction = session.beginTransaction(); String nativeQuery = "db." + OscarWildePoem.TABLE_NAME + ".find({ '$and': [{ 'author': 'Oscar Wilde' }, { 'name': 'Portia' }]})"; Query query = session.createNativeQuery( nativeQuery ).addEntity( OscarWildePoem.class ); @SuppressWarnings("unchecked") List<OscarWildePoem> result = query.list(); assertThat( result ).onProperty( "id" ).containsOnly( portia.getId() ); transaction.commit(); } } @Test @TestForIssue(jiraKey = "OGM-1024") public void testAggregateWithMatchAndSort() { try ( OgmSession session = openSession() ) { Transaction transaction = session.beginTransaction(); String nativeQuery = "db." + OscarWildePoem.TABLE_NAME + ".aggregate([{ '$match': {'$or': [ {'author':'Oscar Wilde'}, {'name': 'Portia' }]}}, { '$sort' : { 'name' : -1 } }])"; Query query = session.createNativeQuery( nativeQuery ).addEntity( OscarWildePoem.class ); @SuppressWarnings("unchecked") List<OscarWildePoem> result = query.list(); assertThat( result ).onProperty( "id" ).containsExactly( portia.getId(), imperatrix.getId(), athanasia.getId() ); transaction.commit(); } } @Test @TestForIssue(jiraKey = "OGM-1024") public void testAggregateWithMatchSortAndRegex() { try ( OgmSession session = openSession() ) { Transaction transaction = session.beginTransaction(); String nativeQuery = "db." + OscarWildePoem.TABLE_NAME + ".aggregate([{ '$match': {'$or': [ {'author': { '$regex': 'Oscar.*', '$options': 'i'}}, {'name': { '$regex': 'Po.*'} }]}}, { '$sort' : { 'name' : -1 } }])"; Query query = session.createNativeQuery( nativeQuery ).addEntity( OscarWildePoem.class ); @SuppressWarnings("unchecked") List<OscarWildePoem> result = query.list(); assertThat( result ).onProperty( "id" ).containsExactly( portia.getId(), imperatrix.getId(), athanasia.getId() ); transaction.commit(); } } @Test public void testFindWithMax() { try ( OgmSession session = openSession() ) { Transaction transaction = session.beginTransaction(); String queryJson = "'$query': { 'author': 'Oscar Wilde' } "; String max = " '$max': { 'year' : 1881 } "; String nativeQuery = "db." + OscarWildePoem.TABLE_NAME + ".find({" + queryJson + "," + max + "})"; Query query = session.createNativeQuery( nativeQuery ).addEntity( OscarWildePoem.class ); @SuppressWarnings("unchecked") List<OscarWildePoem> result = query.list(); assertThat( result ).onProperty( "id" ).containsExactly( athanasia.getId() ); transaction.commit(); } } @Test public void testFindWithMin() { try ( OgmSession session = openSession() ) { Transaction transaction = session.beginTransaction(); String queryJson = "'$query': { 'author': 'Oscar Wilde' } "; String min = " '$min': { 'year' : 1882 } "; String nativeQuery = "db." + OscarWildePoem.TABLE_NAME + ".find({" + queryJson + "," + min + "})"; Query query = session.createNativeQuery( nativeQuery ).addEntity( OscarWildePoem.class ); @SuppressWarnings("unchecked") List<OscarWildePoem> result = query.list(); assertThat( result ).onProperty( "id" ).containsExactly( imperatrix.getId() ); transaction.commit(); } } @Test public void testFindWithModifiersWithEntity() { try ( OgmSession session = openSession() ) { Transaction transaction = session.beginTransaction(); StringBuilder queryWithModifiers = new StringBuilder(); queryWithModifiers.append( "'$query': { } " ); queryWithModifiers.append( ", '$max': { 'year' : 1881 } " ); queryWithModifiers.append( ", '$explain': false " ); queryWithModifiers.append( ", '$snapshot': false " ); queryWithModifiers.append( ", 'hint': { 'year' : 1881 } " ); queryWithModifiers.append( ", 'maxScan': 11234" ); queryWithModifiers.append( ", '$comment': 'Testing comment' " ); String nativeQuery = "db." + OscarWildePoem.TABLE_NAME + ".find({" + queryWithModifiers.toString() + "})"; Query query = session.createNativeQuery( nativeQuery ).addEntity( OscarWildePoem.class ); @SuppressWarnings("unchecked") List<OscarWildePoem> result = query.list(); assertThat( result ).onProperty( "id" ).containsExactly( athanasia.getId() ); transaction.commit(); } } @Test public void testFindWithExplain() { try ( OgmSession session = openSession() ) { Transaction transaction = session.beginTransaction(); StringBuilder queryWithModifiers = new StringBuilder(); queryWithModifiers.append( "'$query': { 'author': 'Oscar Wilde' } " ); queryWithModifiers.append( ", '$max': { 'year' : 1881 } " ); queryWithModifiers.append( ", '$explain': true " ); String nativeQuery = "db." + OscarWildePoem.TABLE_NAME + ".find({" + queryWithModifiers.toString() + "})"; Query query = session.createNativeQuery( nativeQuery ); @SuppressWarnings("unchecked") List<Object[]> result = query.list(); // I'm not sure we can test the content because this is the result of the explain command // and I believe it might change among versions assertThat( result.get( 0 ) ).isNotEmpty(); transaction.commit(); } } @Test @TestForIssue(jiraKey = "OGM-1024") public void testAggregateWithUnwindGroupAndSort() { try ( OgmSession session = openSession() ) { Transaction transaction = session.beginTransaction(); String match = "{ '$match': { 'author':{'$regex':'o.*', '$options': 'i'}}}"; String unwind = "{'$unwind': '$mediums'}"; String group = "{ '$group': {'_id' : '$_id' ,'clicks' : {'$push':'$mediums'} } }"; String sort = "{ '$sort': { '_id' : -1 } }"; String nativeQuery = "db." + OscarWildePoem.TABLE_NAME + ".aggregate([" + match + "," + unwind + "," + group + "," + sort + "])"; Query query = session.createNativeQuery( nativeQuery ); @SuppressWarnings("unchecked") List<Object[]> result = query.list(); assertThat( result ).hasSize( 2 ); BasicDBList expectedImperatrix = new BasicDBList(); expectedImperatrix.addAll( imperatrix.getMediums() ); assertThat( result.get( 0 ) ).isEqualTo( new Object[]{ imperatrix.getId(), expectedImperatrix } ); BasicDBList expectedAthanasia = new BasicDBList(); expectedAthanasia.addAll( athanasia.getMediums() ); assertThat( result.get( 1 ) ).isEqualTo( new Object[] { athanasia.getId(), expectedAthanasia } ); transaction.commit(); } } @Test @TestForIssue(jiraKey = "OGM-1024") public void testAggregateWithMatchSortAndRegexWithMaxResults() { try ( OgmSession session = openSession() ) { Transaction transaction = session.beginTransaction(); String nativeQuery = "db." + OscarWildePoem.TABLE_NAME + ".aggregate([{ '$match': {'$or': [ {'author': { '$regex': 'Oscar.*'}}, {'name': { '$regex': 'Po.*'} }]}}, { '$sort' : { 'name' : 1 } }])"; Query query = session.createNativeQuery( nativeQuery ).addEntity( OscarWildePoem.class ); @SuppressWarnings("unchecked") List<OscarWildePoem> result = query.setMaxResults( 2 ).list(); assertThat( result ).onProperty( "id" ).containsOnly( athanasia.getId(), imperatrix.getId() ); transaction.commit(); } } @Test @TestForIssue(jiraKey = "OGM-1024") public void testAggregateWithMatchSortAndRegexWithFirstResult() { try ( OgmSession session = openSession() ) { Transaction transaction = session.beginTransaction(); String nativeQuery = "db." + OscarWildePoem.TABLE_NAME + ".aggregate([{ '$match': {'author': { '$regex': '.*' } }}, { '$sort' : { 'name' : -1 } }])"; Query query = session.createNativeQuery( nativeQuery ).addEntity( OscarWildePoem.class ); @SuppressWarnings("unchecked") List<OscarWildePoem> result = query.setFirstResult( 1 ).list(); assertThat( result ).onProperty( "id" ).containsExactly( imperatrix.getId(), athanasia.getId() ); transaction.commit(); } } @Test @TestForIssue(jiraKey = "OGM-1024") public void testAggregateWithMatchSortAndRegexWithFirstResultAndMaxResults() { try ( OgmSession session = openSession() ) { Transaction transaction = session.beginTransaction(); String nativeQuery = "db." + OscarWildePoem.TABLE_NAME + ".aggregate([{ '$match': {'$or': [ {'author': { '$regex': 'Oscar.*'}}, {'name': { '$regex': 'Po.*'} }]}}, { '$sort' : { 'name' : -1 } }])"; Query query = session.createNativeQuery( nativeQuery ).addEntity( OscarWildePoem.class ); @SuppressWarnings("unchecked") List<OscarWildePoem> result = query.setMaxResults( 1 ).setFirstResult( 1 ).list(); assertThat( result ).onProperty( "id" ).containsExactly( imperatrix.getId() ); transaction.commit(); } } @Test @TestForIssue(jiraKey = "OGM-1024") public void testAggregateWithMatchSortAndRegexWithOptions() { try ( OgmSession session = openSession() ) { Transaction transaction = session.beginTransaction(); String nativeQuery = "db." + OscarWildePoem.TABLE_NAME + ".aggregate([{ '$match': {'$and': [ {'author': { '$regex': 'oscar.*', '$options': 'i' }}, {'name': { '$regex': 'po.*', '$options': 'i'} }]}}, { '$sort' : { 'name' : -1 } }])"; Query query = session.createNativeQuery( nativeQuery ).addEntity( OscarWildePoem.class ); @SuppressWarnings("unchecked") List<OscarWildePoem> result = query.list(); assertThat( result ).onProperty( "id" ).containsExactly( portia.getId() ); transaction.commit(); session.clear(); } } @Test public void testFindWithNor() throws Exception { try ( OgmSession session = openSession() ) { Transaction transaction = session.beginTransaction(); String nativeQuery = "db." + OscarWildePoem.TABLE_NAME + ".find( { '$nor' : [ { 'name' : 'Athanasia'}, { 'name' : 'Portia' }]})"; Query query = session.createNativeQuery( nativeQuery ).addEntity( OscarWildePoem.class ); @SuppressWarnings("unchecked") List<OscarWildePoem> result = query.list(); assertThat( result ).onProperty( "id" ).containsOnly( imperatrix.getId() ); transaction.commit(); session.clear(); } } @Test public void testFindWithNot() throws Exception { try ( OgmSession session = openSession() ) { Transaction transaction = session.beginTransaction(); String nativeQuery = "db." + OscarWildePoem.TABLE_NAME + ".find( { 'name' : { '$not' : { '$eq' : 'Athanasia' }}})"; Query query = session.createNativeQuery( nativeQuery ).addEntity( OscarWildePoem.class ); @SuppressWarnings("unchecked") List<OscarWildePoem> result = query.list(); assertThat( result ).onProperty( "id" ).containsOnly( portia.getId(), imperatrix.getId() ); transaction.commit(); session.clear(); } } @Test public void testCountEntitiesQuery() throws Exception { try ( OgmSession session = openSession() ) { Transaction transaction = session.beginTransaction(); String nativeQuery = "db." + OscarWildePoem.TABLE_NAME + ".count({ 'author' : 'Oscar Wilde' })"; Object result = session.createNativeQuery( nativeQuery ).uniqueResult(); assertThat( result ).isEqualTo( 3L ); transaction.commit(); session.clear(); } } @Test public void testExceptionWhenReturnedEntityIsMissingAndUniqueResultIsExpected() throws Exception { try ( OgmSession session = openSession() ) { Transaction transaction = session.beginTransaction(); String nativeQuery = "db." + OscarWildePoem.TABLE_NAME + ".find({ '$and': [ { 'name' : 'Portia' }, { 'author' : 'Oscar Wilde' } ] })"; try { session.createNativeQuery( nativeQuery ).uniqueResult(); transaction.commit(); } catch (Exception he) { transaction.rollback(); String message = he.getMessage(); assertThat( message ).as( "The native query doesn't define a returned entity, there should be a specific exception" ).contains( "OGM001217" ); } } } @Test @TestForIssue(jiraKey = "OGM-1027") public void testNumberLongSupport() throws Exception { try ( OgmSession session = openSession() ) { Transaction transaction = session.beginTransaction(); String nativeQuery = "db." + OscarWildePoem.TABLE_NAME + ".update({ '_id': 1}, { '$inc': { 'counter' : NumberLong(5) } })"; Object result = session.createNativeQuery( nativeQuery ).executeUpdate(); assertThat( result ).isEqualTo( 1 ); nativeQuery = "db." + OscarWildePoem.TABLE_NAME + ".update({ '_id': 1}, { '$inc': { 'counter' : new NumberLong(5) } })"; result = session.createNativeQuery( nativeQuery ).executeUpdate(); assertThat( result ).isEqualTo( 1 ); transaction.commit(); session.clear(); } } @Test @SuppressWarnings("unchecked") @TestForIssue(jiraKey = "OGM-1027") public void testInsertMultipleWithNumberLongThenRemove() throws Exception { try ( OgmSession session = openSession() ) { Transaction transaction = session.beginTransaction(); String nativeQuery = "db." + OscarWildePoem.TABLE_NAME + ".insert( [ { '_id': NumberLong(11), 'author': 'Oscar Wilder', 'name': 'The one and wildest', 'rating': '1' }, { '_id': NumberLong(12), 'author': 'Friedrich Schiller', 'name': 'An die Freude', 'rating': '1' } ], { 'ordered': false } )"; Query query = session.createNativeQuery( nativeQuery ); int n = query.executeUpdate(); assertThat( n ).isEqualTo( 2 ); // Check that all were inserted. nativeQuery = "db." + OscarWildePoem.TABLE_NAME + ".findOne( { 'name': 'The one and wildest' } )"; query = session.createNativeQuery( nativeQuery ).addEntity( OscarWildePoem.class ); List<OscarWildePoem> result = query.list(); assertThat( result.size() ).isEqualTo( 1 ); assertThat( result.get( 0 ).getId() ).isEqualTo( 11 ); assertThat( result.get( 0 ).getAuthor() ).isEqualTo( "Oscar Wilder" ); assertThat( result.get( 0 ).getName() ).isEqualTo( "The one and wildest" ); nativeQuery = "db." + OscarWildePoem.TABLE_NAME + ".findOne( { 'name': 'An die Freude' } )"; query = session.createNativeQuery( nativeQuery ).addEntity( OscarWildePoem.class ); result = query.list(); assertThat( result.size() ).isEqualTo( 1 ); assertThat( result.get( 0 ).getId() ).isEqualTo( 12 ); assertThat( result.get( 0 ).getAuthor() ).isEqualTo( "Friedrich Schiller" ); assertThat( result.get( 0 ).getName() ).isEqualTo( "An die Freude" ); // Need to remove here because subsequent tests assume the initial dataset. nativeQuery = "db." + OscarWildePoem.TABLE_NAME + ".remove({ '_id': NumberLong(11) })"; query = session.createNativeQuery( nativeQuery ); n = query.executeUpdate(); assertThat( n ).isEqualTo( 1 ); nativeQuery = "db." + OscarWildePoem.TABLE_NAME + ".remove({ '_id': NumberLong(12) })"; query = session.createNativeQuery( nativeQuery ); n = query.executeUpdate(); assertThat( n ).isEqualTo( 1 ); // And check that they are gone. nativeQuery = "db." + OscarWildePoem.TABLE_NAME + ".findOne({ '_id': NumberLong(11) })"; query = session.createNativeQuery( nativeQuery ).addEntity( OscarWildePoem.class ); result = query.list(); assertThat( result.size() ).isEqualTo( 0 ); nativeQuery = "db." + OscarWildePoem.TABLE_NAME + ".findOne({ '_id': NumberLong(12) })"; query = session.createNativeQuery( nativeQuery ).addEntity( OscarWildePoem.class ); result = query.list(); assertThat( result.size() ).isEqualTo( 0 ); transaction.commit(); session.clear(); } } @Override protected Class<?>[] getAnnotatedClasses() { return new Class[] { OscarWildePoem.class }; } @Test @TestForIssue(jiraKey = "OGM-1247") public void testDistinctQueryWithCriteriaAndCollation() throws Exception { try ( OgmSession session = openSession() ) { Transaction transaction = session.beginTransaction(); String nativeQuery = "db." + OscarWildePoem.TABLE_NAME + ".distinct('name',{'author':'Oscar Wilde'},{'collation': { 'locale' : 'en', 'caseLevel' : false, 'caseFirst' : 'upper'}})"; @SuppressWarnings("unchecked") List<String> result = (List<String>) session.createNativeQuery( nativeQuery ).uniqueResult(); assertThat( result ).containsOnly( portia.getName(), imperatrix.getName(), athanasia.getName() ); transaction.commit(); session.clear(); } } @Test @TestForIssue(jiraKey = "OGM-1247") public void testDistinctQueryWithoutCriteriaAndWIthCollation() throws Exception { try ( OgmSession session = openSession() ) { Transaction transaction = session.beginTransaction(); String nativeQuery = "db." + OscarWildePoem.TABLE_NAME + ".distinct('name',{},{'collation': { 'locale' : 'en', 'caseLevel' : false, 'caseFirst' : 'upper'}})"; @SuppressWarnings("unchecked") List<String> result = (List<String>) session.createNativeQuery( nativeQuery ).uniqueResult(); assertThat( result ).containsOnly( portia.getName(), imperatrix.getName(), athanasia.getName() ); transaction.commit(); session.clear(); } } @Test @TestForIssue(jiraKey = "OGM-1247") public void testDistinctQueryWithInCriteriaAndCollation() throws Exception { try ( OgmSession session = openSession() ) { Transaction transaction = session.beginTransaction(); String nativeQuery = "db." + OscarWildePoem.TABLE_NAME + ".distinct('name', { '_id': {'$in' : [ " + portia.getId() + ", " + imperatrix.getId() + "]} }, {'collation': { 'locale' : 'en', 'caseLevel' : false, 'caseFirst' : 'upper'}})"; @SuppressWarnings("unchecked") List<String> result = (List<String>) session.createNativeQuery( nativeQuery ).uniqueResult(); assertThat( result ).containsOnly( portia.getName(), imperatrix.getName() ); transaction.commit(); session.clear(); } } @Test @TestForIssue(jiraKey = "OGM-1247") public void testSimpleDistinctQuery() throws Exception { try ( OgmSession session = openSession() ) { Transaction transaction = session.beginTransaction(); String nativeQuery = "db." + OscarWildePoem.TABLE_NAME + ".distinct('author')"; @SuppressWarnings("unchecked") List<String> result = (List<String>) session.createNativeQuery( nativeQuery ).uniqueResult(); assertThat( result ).containsOnly( "Oscar Wilde" ); transaction.commit(); session.clear(); } } @Test @TestForIssue(jiraKey = "OGM-1247") public void testDistinctQueryWithCriteria() throws Exception { try ( OgmSession session = openSession() ) { Transaction transaction = session.beginTransaction(); String nativeQuery = "db." + OscarWildePoem.TABLE_NAME + ".distinct('name',{'author':'Oscar Wilde'})"; @SuppressWarnings("unchecked") List<String> result = (List<String>) session.createNativeQuery( nativeQuery ).uniqueResult(); assertThat( result ).containsOnly( portia.getName(), athanasia.getName(), imperatrix.getName() ); transaction.commit(); session.clear(); } } }