blob: 51ad1958a749d78224ae68d477296339fdde1142 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010-2013 Oracle. All rights reserved.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
* which accompanies this distribution.
* The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* Contributors:
* dclarke - initial
******************************************************************************/
package eclipselink.example.jpa.employee.test.services;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import eclipselink.example.jpa.employee.model.Employee;
import eclipselink.example.jpa.employee.model.SamplePopulation;
import eclipselink.example.jpa.employee.services.Diagnostics;
import eclipselink.example.jpa.employee.services.Diagnostics.SQLTrace;
import eclipselink.example.jpa.employee.services.EmployeeCriteria;
import eclipselink.example.jpa.employee.services.EntityPaging;
import eclipselink.example.jpa.employee.test.PersistenceTesting;
/**
* TODO
*
* @author dclarke
* @since EclipseLink 2.4.2
*/
public class StreamEmployeesTest {
@Test
public void streamAllNext() {
EntityManager em = getEmf().createEntityManager();
Diagnostics diagnostics = Diagnostics.getInstance(getEmf());
SQLTrace start = diagnostics.start();
Assert.assertTrue(start.getEntries().isEmpty());
EmployeeCriteria criteria = new EmployeeCriteria();
criteria.setFirstName(null);
criteria.setLastName(null);
criteria.setPageSize(5);
criteria.setPagingType(EntityPaging.Type.CURSOR.name());
EntityPaging<Employee> stream = criteria.getPaging(getEmf());
Assert.assertEquals(25, stream.size());
SQLTrace end = diagnostics.stop();
Assert.assertNotNull(end);
Assert.assertSame(start, end);
Assert.assertFalse(end.getEntries().isEmpty());
Assert.assertEquals(1, end.getEntries().size());
Assert.assertEquals(5, stream.getNumPages());
// Verify the ids assuming they are sequentially assigned starting at 1.
int currentId = 1;
for (int index = 0; index < 5; index++) {
Assert.assertTrue(stream.hasNext());
List<Employee> emps = stream.next();
Assert.assertEquals(5, emps.size());
for (Employee e : emps) {
System.out.println("> " + e);
Assert.assertEquals(currentId++, e.getId());
}
}
Assert.assertEquals(1, end.getEntries().size());
Assert.assertFalse(stream.hasNext());
try {
stream.next();
} catch (IllegalStateException e) {
return;
} finally {
em.close();
}
Assert.fail("IllegalStateException not thrown on next()");
}
@Test
public void streamAllNext10() {
EntityManager em = getEmf().createEntityManager();
Diagnostics diagnostics = Diagnostics.getInstance(getEmf());
SQLTrace start = diagnostics.start();
Assert.assertTrue(start.getEntries().isEmpty());
EmployeeCriteria criteria = new EmployeeCriteria();
criteria.setFirstName(null);
criteria.setLastName(null);
criteria.setPageSize(10);
criteria.setPagingType(EntityPaging.Type.CURSOR.name());
EntityPaging<Employee> stream = criteria.getPaging(getEmf());
Assert.assertEquals(25, stream.size());
SQLTrace end = diagnostics.stop();
Assert.assertNotNull(end);
Assert.assertSame(start, end);
Assert.assertFalse(end.getEntries().isEmpty());
Assert.assertEquals(1, end.getEntries().size());
Assert.assertEquals(3, stream.getNumPages());
// Verify the ids assuming they are sequentially assigned starting at 1.
int currentId = 1;
for (int index = 0; index < 3; index++) {
Assert.assertTrue(stream.hasNext());
List<Employee> emps = stream.next();
if (index < 2) {
Assert.assertEquals(10, emps.size());
} else {
Assert.assertEquals(5, emps.size());
}
for (Employee e : emps) {
System.out.println("> " + e);
Assert.assertEquals(currentId++, e.getId());
}
}
Assert.assertEquals(1, end.getEntries().size());
Assert.assertFalse(stream.hasNext());
try {
stream.next();
} catch (IllegalStateException e) {
return;
} finally {
em.close();
}
Assert.fail("IllegalStateException not thrown on next()");
}
@Test
public void streamAllPrevious() {
EntityManager em = getEmf().createEntityManager();
Diagnostics diagnostics = Diagnostics.getInstance(getEmf());
SQLTrace start = diagnostics.start();
Assert.assertTrue(start.getEntries().isEmpty());
EmployeeCriteria criteria = new EmployeeCriteria();
criteria.setFirstName(null);
criteria.setLastName(null);
criteria.setPageSize(5);
criteria.setPagingType(EntityPaging.Type.CURSOR.name());
EntityPaging<Employee> stream = criteria.getPaging(getEmf());
Assert.assertEquals(25, stream.size());
SQLTrace end = diagnostics.stop();
Assert.assertNotNull(end);
Assert.assertSame(start, end);
Assert.assertFalse(end.getEntries().isEmpty());
Assert.assertEquals(1, end.getEntries().size());
Assert.assertEquals(5, stream.getNumPages());
// skip to end
List<List<Employee>> pages = new ArrayList<List<Employee>>();
pages.add(stream.next());
Assert.assertEquals(1, stream.getCurrentPage());
pages.add(stream.next());
Assert.assertEquals(2, stream.getCurrentPage());
pages.add(stream.next());
Assert.assertEquals(3, stream.getCurrentPage());
pages.add(stream.next());
Assert.assertEquals(4, stream.getCurrentPage());
pages.add(stream.next());
Assert.assertEquals(5, stream.getCurrentPage());
for (int index = 4; index > 0; index--) {
Assert.assertEquals(index + 1, stream.getCurrentPage());
Assert.assertTrue("No previous found at page: " + index + " stream at: " + stream.getCurrentPage(), stream.hasPrevious());
List<Employee> emps = stream.previous();
if (index == 1) {
Assert.assertFalse(stream.hasPrevious());
} else {
Assert.assertTrue("No previous found at page: " + index + " stream at: " + stream.getCurrentPage(), stream.hasPrevious());
}
Assert.assertEquals(5, emps.size());
Assert.assertEquals(index, stream.getCurrentPage());
List<Employee> nextPage = pages.get(index - 1);
for (int pi = 0; pi < 5; pi++) {
Employee emp = emps.get(pi);
Employee nextEmp = nextPage.get(pi);
Assert.assertSame(nextEmp, emp);
System.out.println(index + "> " + emp);
}
}
Assert.assertEquals(1, end.getEntries().size());
Assert.assertTrue(stream.hasNext());
Assert.assertFalse(stream.hasPrevious());
try {
stream.previous();
} catch (IllegalStateException e) {
return;
} finally {
em.close();
}
Assert.fail("IllegalStateException not thrown on previous()");
}
@Test
public void streamAllPreviousGet() {
EntityManager em = getEmf().createEntityManager();
Diagnostics diagnostics = Diagnostics.getInstance(getEmf());
SQLTrace start = diagnostics.start();
Assert.assertTrue(start.getEntries().isEmpty());
EmployeeCriteria criteria = new EmployeeCriteria();
criteria.setFirstName(null);
criteria.setLastName(null);
criteria.setPageSize(5);
criteria.setPagingType(EntityPaging.Type.CURSOR.name());
EntityPaging<Employee> stream = criteria.getPaging(getEmf());
Assert.assertEquals(25, stream.size());
SQLTrace end = diagnostics.stop();
Assert.assertNotNull(end);
Assert.assertSame(start, end);
Assert.assertFalse(end.getEntries().isEmpty());
Assert.assertEquals(1, end.getEntries().size());
Assert.assertEquals(5, stream.getNumPages());
// skip to end
List<List<Employee>> pages = new ArrayList<List<Employee>>();
pages.add(stream.next());
Assert.assertEquals(1, stream.getCurrentPage());
pages.add(stream.next());
Assert.assertEquals(2, stream.getCurrentPage());
pages.add(stream.next());
Assert.assertEquals(3, stream.getCurrentPage());
pages.add(stream.next());
Assert.assertEquals(4, stream.getCurrentPage());
pages.add(stream.next());
Assert.assertEquals(5, stream.getCurrentPage());
for (int index = 4; index > 0; index--) {
Assert.assertEquals(index + 1, stream.getCurrentPage());
Assert.assertTrue("No previous found at page: " + index + " stream at: " + stream.getCurrentPage(), stream.hasPrevious());
List<Employee> emps = stream.get(index);
if (index == 1) {
Assert.assertFalse(stream.hasPrevious());
} else {
Assert.assertTrue("No previous found at page: " + index + " stream at: " + stream.getCurrentPage(), stream.hasPrevious());
}
Assert.assertEquals(5, emps.size());
Assert.assertEquals(index, stream.getCurrentPage());
List<Employee> nextPage = pages.get(index - 1);
for (int pi = 0; pi < 5; pi++) {
Employee emp = emps.get(pi);
Employee nextEmp = nextPage.get(pi);
Assert.assertSame(nextEmp, emp);
System.out.println(index + "> " + emp);
}
}
Assert.assertEquals(1, end.getEntries().size());
Assert.assertTrue(stream.hasNext());
Assert.assertFalse(stream.hasPrevious());
try {
stream.previous();
} catch (IllegalStateException e) {
return;
} finally {
em.close();
}
Assert.fail("IllegalStateException not thrown on previous()");
}
private static EntityManagerFactory emf;
public static EntityManagerFactory getEmf() {
return emf;
}
@BeforeClass
public static void createEMF() {
emf = PersistenceTesting.createEMF(true);
EntityManager em = emf.createEntityManager();
new SamplePopulation().createNewEmployees(em, 25);
Number count = em.createNamedQuery("Employee.count", Number.class).getSingleResult();
Assert.assertEquals(25, count.intValue());
em.close();
emf.getCache().evictAll();
}
@AfterClass
public static void closeEMF() {
if (emf != null && emf.isOpen()) {
emf.close();
}
emf = null;
}
}