package org.raidenjpa.query.join; import static org.junit.Assert.*; import java.util.Collections; import java.util.Comparator; import java.util.List; import org.junit.Test; import org.raidenjpa.AbstractTestCase; import org.raidenjpa.query.executor.ComparatorUtil; import org.raidenjpa.util.QueryHelper; public class GroupByTest extends AbstractTestCase { @Test public void testCountWithoutGroupBy() { createABC(); createA("a1"); createA("a2"); String jpql; QueryHelper query; List<?> result; jpql = "SELECT count(*) FROM A a"; query = new QueryHelper(jpql); result = query.getResultList(); assertEquals(1, result.size()); assertEquals(3l, result.get(0)); } @Test public void testCountColumnWithoutGroupBy() { createABC(); createA("a1"); createA("a2"); String jpql; QueryHelper query; List<?> result; jpql = "SELECT count(a.id) FROM A a"; query = new QueryHelper(jpql); result = query.getResultList(); assertEquals(1, result.size()); assertEquals(3l, result.get(0)); } @Test public void testCountWithGroupBy() { createA("a1", 1); createA("a1", 0); createA("a2", 0); String jpql; QueryHelper query; List<?> result; jpql = "SELECT count(*) FROM A a GROUP BY a.stringValue"; query = new QueryHelper(jpql); result = query.getResultList(); assertEquals(2, result.size()); sort(result); assertEquals(1l, result.get(0)); assertEquals(2l, result.get(1)); jpql = "SELECT a.stringValue, count(*) FROM A a GROUP BY a.stringValue"; query = new QueryHelper(jpql); result = query.getResultList(); assertEquals(2, result.size()); sortByFirstValue(result); assertResult(result, 0, "a1", 2l); assertResult(result, 1, "a2", 1l); jpql = "SELECT a.stringValue, a.intValue, count(*) FROM A a GROUP BY a.stringValue, a.intValue"; query = new QueryHelper(jpql); result = query.getResultList(); assertEquals(3, result.size()); sortByFirstAndSecond(result); assertResult(result, 0, "a1", 0, 1l); assertResult(result, 1, "a1", 1, 1l); assertResult(result, 2, "a2", 0, 1l); } @Test public void testCountWithoutRows() { String jpql; QueryHelper query; List<?> result; jpql = "SELECT count(*) FROM A a"; query = new QueryHelper(jpql); result = query.getResultList(); assertEquals(0l, result.get(0)); jpql = "SELECT count(*) FROM A a GROUP BY a.stringValue"; query = new QueryHelper(jpql); result = query.getResultList(); assertTrue(result.isEmpty()); } @Test public void testMax() { createA("a1", 1); createA("a1", 5); createA("a2", 2); createA("a1", 1); createA("a3"); String jpql; QueryHelper query; List<?> result; jpql = "SELECT max(a.intValue) FROM A a"; query = new QueryHelper(jpql); result = query.getResultList(); assertEquals(1, result.size()); assertEquals(5, result.get(0)); } @Test public void testOrderAfterGroup() { createA("a1", 1); createA("a1", 5); createA("a2", 2); createA("a1", 1); String jpql; QueryHelper query; List<?> result; jpql = "SELECT a.stringValue, count(*) FROM A a GROUP BY a.stringValue ORDER BY max(a.intValue)"; query = new QueryHelper(jpql); result = query.getResultList(); assertEquals("a2", ((Object[]) result.get(0))[0]); assertEquals("a1", ((Object[]) result.get(1))[0]); jpql = "SELECT a.stringValue, count(*) FROM A a GROUP BY a.stringValue ORDER BY max(a.intValue) desc"; query = new QueryHelper(jpql); result = query.getResultList(); assertEquals("a1", ((Object[]) result.get(0))[0]); assertEquals("a2", ((Object[]) result.get(1))[0]); } @Test public void testGroupWithoutAggreateFunciton() { createA("a1", 1); createA("a1", 5); createA("a2", 2); createA("a1", 1); String jpql; QueryHelper query; List<?> result; jpql = "SELECT a.stringValue FROM A a GROUP BY a.stringValue"; query = new QueryHelper(jpql); result = query.getResultList(); assertEquals(2, result.size()); } @SuppressWarnings("unchecked") private void sortByFirstAndSecond(List<?> result) { Collections.sort((List<Object[]>) result, new Comparator<Object[]>() { public int compare(Object[] o1, Object[] o2) { int compareTo = ((String) o1[0]).compareTo((String) o2[0]); if (compareTo != 0) { return compareTo; } else { return ComparatorUtil.compare(o1[1], o2[1]); } } }); } private void assertResult(List<?> result, int index, String stringValue, int intValue, long count) { assertEquals(stringValue, ((Object[]) result.get(index))[0]); assertEquals(intValue, ((Object[]) result.get(index))[1]); assertEquals(count, ((Object[]) result.get(index))[2]); } private void assertResult(List<?> result, int index, String stringValue, long count) { assertEquals(stringValue, ((Object[]) result.get(index))[0]); assertEquals(count, ((Object[]) result.get(index))[1]); } @SuppressWarnings("unchecked") private void sortByFirstValue(List<?> result) { Collections.sort((List<Object[]>) result, new Comparator<Object[]>() { public int compare(Object[] o1, Object[] o2) { return ((String) o1[0]).compareTo((String) o2[0]); } }); } @SuppressWarnings({ "unchecked", "rawtypes" }) private void sort(List<?> result) { Collections.sort((List<Comparable>) result); } @Test public void testErrorMessageIfNotContainsItensInGroupBy() { } }