All Downloads are FREE. Search and download functionalities are using the official Maven repository.

junit.googlecode.genericdao.search.PagingAndSortingTest Maven / Gradle / Ivy

The newest version!
/* Copyright 2013 David Wolverton
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *     http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package junit.googlecode.genericdao.search;

import static org.junit.Assert.*;

import com.googlecode.genericdao.search.Search;
import com.googlecode.genericdao.search.Sort;
import test.googlecode.genericdao.model.Person;
import test.googlecode.genericdao.search.BaseSearchTest;

import javax.persistence.NonUniqueResultException;

import org.junit.Test;

import java.util.List;

public class PagingAndSortingTest extends BaseSearchTest {
	@SuppressWarnings("unchecked")
	@Test
	public void testBasicPaging() {
		initDB();

		Search s = new Search(Person.class);
		s.addSortAsc("lastName");
		s.addSortAsc("firstName");

		assertListEqual(new Person[] { grandmaA, grandpaA, joeA, mamaA, papaA, sallyA, joeB, mamaB, margaretB, papaB },
				target.search(s));

		s.setMaxResults(3);
		assertListEqual(new Person[] { grandmaA, grandpaA, joeA }, target.search(s));

		s.setFirstResult(4);
		assertListEqual(new Person[] { papaA, sallyA, joeB }, target.search(s));

		s.setMaxResults(-1);
		assertListEqual(new Person[] { papaA, sallyA, joeB, mamaB, margaretB, papaB }, target.search(s));

		s.setMaxResults(4);
		s.setPage(1);
		s.setFirstResult(2); // first result should override page
		assertListEqual(new Person[] { joeA, mamaA, papaA, sallyA }, target.search(s));

		s.setFirstResult(-1);
		assertListEqual(new Person[] { papaA, sallyA, joeB, mamaB }, target.search(s));

		s.setPage(0);
		assertListEqual(new Person[] { grandmaA, grandpaA, joeA, mamaA }, target.search(s));

		s.setPage(2);
		assertListEqual(new Person[] { margaretB, papaB }, target.search(s));

		s.clearPaging();
		assertListEqual(new Person[] { grandmaA, grandpaA, joeA, mamaA, papaA, sallyA, joeB, mamaB, margaretB, papaB },
				target.search(s));

		s.setPage(1); // page should have no effect when max results is not
		// set
		assertListEqual(new Person[] { grandmaA, grandpaA, joeA, mamaA, papaA, sallyA, joeB, mamaB, margaretB, papaB },
				target.search(s));
	}

	@SuppressWarnings("unchecked")
	@Test
	public void testSorting() {
		initDB();

		// test single sort
		Search s = new Search(Person.class);
		// remove duplicate ages for ease of testing
		s.addFilterNotIn("id", grandmaA.getId(), joeB.getId(), papaB.getId());

		s.addSortAsc("age");
		assertListOrderEqual(new Person[] { sallyA, joeA, margaretB, mamaB, papaA, mamaA, grandpaA }, target.search(s));

		s.clearSorts();
		s.addSortDesc("age");
		assertListOrderEqual(new Person[] { grandpaA, mamaA, papaA, mamaB, margaretB, joeA, sallyA }, target.search(s));

		s.removeSort("age");
		s.addSortAsc("dob");
		assertListOrderEqual(new Person[] { grandpaA, mamaA, papaA, mamaB, margaretB, joeA, sallyA }, target.search(s));

		// Test nested sort
		s.clear();
		s.addFilterIn("id", sallyA.getId(), mamaB.getId(), grandmaA.getId());

		s.addSortAsc("home.address.street");
		assertListOrderEqual(new Person[] { grandmaA, mamaB, sallyA }, target.search(s));

		// Test multiple sort
		s.clearFilters();
		s.addSort("firstName", false);
		assertListOrderEqual(new Person[] { grandmaA, grandpaA, joeB, mamaB, margaretB, papaB, joeA, mamaA, papaA,
				sallyA }, target.search(s));

		// Test ignore case
		s.clear();
		// Set Margaret's first name to "margaret" (lowercase). When ignoring
		// case, Margaret < Sally, but when taking case into account,
		// Sally < margaret
		find(Person.class, margaretB.getId()).setFirstName("margaret");
		s.addFilterIn("id", margaretB.getId(), sallyA.getId());

		List results;
		// without ignore case
		// [some databases (i.e. MySQL) automatically ignore case for ordering,
		// so we won't include this test for those]
		if (!dbIgnoresCase) {
			s.addSortAsc("firstName");
			results = target.search(s);
			assertEquals(sallyA.getId(), results.get(0).getId());
			assertEquals(margaretB.getId(), results.get(1).getId());
		}

		// with ignore case
		s.removeSort("firstName");
		s.addSortAsc("firstName", true);
		results = target.search(s);
		assertEquals(margaretB.getId(), results.get(0).getId());
		assertEquals(sallyA.getId(), results.get(1).getId());

	}
	
	
	@SuppressWarnings("unchecked")
	@Test
	public void testCustomSorts() {
		initDB();

		Search s = new Search(Person.class);
		// remove duplicate ages for ease of testing
		s.addFilterNotIn("id", grandmaA.getId(), joeB.getId(), papaB.getId());
		// Folks: sallyA, joeA, margaretB, mamaB, papaA, mamaA, grandpaA
		// Ages:  9       10    14         38     39     40     65
		
		// Test simple sorting 
		s.addSort(Sort.customExpressionAsc("{age}"));
		assertListOrderEqual(new Person[] { sallyA, joeA, margaretB, mamaB, papaA, mamaA, grandpaA }, target.search(s));

		s.clearSorts();
		s.addSort(Sort.customExpressionDesc("{age}"));
		assertListOrderEqual(new Person[] { grandpaA, mamaA, papaA, mamaB, margaretB, joeA, sallyA }, target.search(s));
		
		// Test sorting with more complex expression
		s.clearSorts();
		s.addSort(Sort.customExpressionAsc("abs(40 - {age})"));
		assertListOrderEqual(new Person[] { mamaA, papaA, mamaB, grandpaA, margaretB, joeA, sallyA }, target.search(s));
		
		s.clearSorts();
		s.addSort(Sort.customExpressionDesc("abs(40 - {age})"));
		assertListOrderEqual(new Person[] { sallyA, joeA, margaretB, grandpaA, mamaB, papaA, mamaA }, target.search(s));
		
		// Test multiple custEx sorts
		s.clearSorts();
		s.addSort(Sort.customExpressionAsc("{lastName}"));
		s.addSort(Sort.customExpressionAsc("abs(40 - {age})"));
		assertListOrderEqual(new Person[] { mamaA, papaA, grandpaA, joeA, sallyA, mamaB, margaretB }, target.search(s));
		
		// Test mix of custEx and regular sorts
		s.clearSorts();
		s.addSort(Sort.customExpressionAsc("lastName"));
		s.addSort(Sort.customExpressionAsc("abs(40 - {age})"));
		assertListOrderEqual(new Person[] { mamaA, papaA, grandpaA, joeA, sallyA, mamaB, margaretB }, target.search(s));
		
		// Test expression w/o custEx flag
		s.clearSorts();
		s.addSort(Sort.asc("{lastName}"));
		try {
			target.search(s);
			fail("Invalid characters in property name, an exception should be thrown.");
		} catch (RuntimeException ex) {
		}
		
		s.clearSorts();
		s.addSort(Sort.desc("abs(40 - {age})"));
		try {
			target.search(s);
			fail("Invalid characters in property name, an exception should be thrown.");
		} catch (RuntimeException ex) {
		}	
		
		// Test custEx and ignore case (ignore case is "ignored" with custEx)

		// [some databases (i.e. MySQL) automatically ignore case for ordering,
		// so we won't include this test for those]
		if (!dbIgnoresCase) {
			// Set Margaret's first name to "margaret" (lowercase). When ignoring
			// case, Margaret < Sally, but when taking case into account,
			// Sally < margaret
			find(Person.class, margaretB.getId()).setFirstName("margaret");
			s.addFilterIn("id", margaretB.getId(), sallyA.getId());
			
			Sort sort = new Sort(true, "{firstName}", false);
			sort.setIgnoreCase(true);
			s.clearSorts();
			s.addSort(sort);
			
			// Even though we set ignore case, case should not be ignored
			// because ignore case is not used with a custom expression.
			List results = target.search(s);
			assertEquals(sallyA.getId(), results.get(0).getId());
			assertEquals(margaretB.getId(), results.get(1).getId());
		}
	}

	@Test
	public void testPagingWithSearchUnique() {
        initDB();

        //searchUnique with paging
		// First test the filters, must return Bob and Fred
		Search s = new Search(Person.class);
		s.addFilterEqual("lastName", "Beta");
		s.addSortAsc("firstName");
		assertListEqual(new Person[] { joeB, mamaB, margaretB, papaB }, target.search(s));
		// Then test to order by firstName in Asc order and limit results to 1, must return Bob
		try {
            s.setMaxResults(1);
            assertEquals(joeB, target.searchUnique(s));
		} catch (NonUniqueResultException e) {
            fail("searchUnique should apply paging to the results.");
        }
		// Then execute the same test, but in Desc order, must return Fred
		try {
            s.clearSorts();
            s.addSortDesc("firstName");
            s.setMaxResults(1);
            assertEquals(papaB, target.searchUnique(s));
		} catch (NonUniqueResultException e) {
            fail("searchUnique should apply paging to the results.");
        }

    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy