/*
* Copyright 2009-2016 Tilmann Zaeschke. All rights reserved.
*
* This file is part of ZooDB.
*
* ZooDB is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* ZooDB is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with ZooDB. If not, see <http://www.gnu.org/licenses/>.
*
* See the README and COPYING files for further information.
*/
package org.zoodb.test.jdo;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.junit.Assert.assertEquals;
import java.util.Collection;
import javax.jdo.JDOUserException;
import javax.jdo.PersistenceManager;
import javax.jdo.Query;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.zoodb.test.testutil.TestTools;
/**
* Tests for query setResult().
*
* @author ztilmann
*
*/
public class Test_120_QuerySetResult {
@BeforeClass
public static void setUp() {
TestTools.removeDb();
TestTools.createDb();
TestTools.defineSchema(TestClass.class);
}
@Before
public void before() {
PersistenceManager pm = TestTools.openPM();
pm.currentTransaction().begin();
pm.newQuery(TestClass.class).deletePersistentAll();
TestClass tc1 = new TestClass();
tc1.setData(1, false, 'c', (byte)127, (short)32001, 1234567890L, "xyz", new byte[]{1,2},
-1.1f, 35);
pm.makePersistent(tc1);
tc1 = new TestClass();
tc1.setData(12, false, 'd', (byte)126, (short)32002, 1234567890L, "xyz", new byte[]{1,2},
-0.1f, 34);
pm.makePersistent(tc1);
tc1 = new TestClass();
tc1.setData(123, false, 'e', (byte)125, (short)32003, 1234567890L, "xyz", new byte[]{1,2},
0.1f, 3.0);
pm.makePersistent(tc1);
tc1 = new TestClass();
tc1.setData(1234, false, 'f', (byte)124, (short)32004, 1234567890L, "xyz", new byte[]{1,2},
1.1f, -0.01);
pm.makePersistent(tc1);
tc1 = new TestClass();
tc1.setData(12345, false, 'g', (byte)123, (short)32005, 1234567890L, "xyz", new byte[]{1,2},
11.1f, -35);
pm.makePersistent(tc1);
pm.currentTransaction().commit();
TestTools.closePM();;
}
@After
public void afterTest() {
TestTools.closePM();
}
@AfterClass
public static void tearDown() {
TestTools.removeDb();
}
@Test
public void testFailuresSetResult() {
PersistenceManager pm = TestTools.openPM();
pm.currentTransaction().begin();
Query q = null;
q = pm.newQuery(TestClass.class);
q.setResult(null);
q.execute();
q.setResult("");
q.execute();
q.setResult(" ");
q.execute();
checkSetResultFails(pm, "avg()");
checkSetResultFails(pm, "avg(_int), ");
checkSetResultFails(pm, ", avg(_int)");
checkSetResultFails(pm, " , ");
checkSetResultFails(pm, "avg(_int), _long");
checkSetResultFails(pm, "_long, avg(_int)");
checkSetResultFails(pm, "avg()");
checkSetResultFails(pm, "avg()");
checkSetResultFails(pm, "avg()");
}
private void checkSetResultFails(PersistenceManager pm, String s) {
Query q = pm.newQuery(TestClass.class);
q.setResult(s);
try {
q.execute();
fail();
} catch (JDOUserException e) {
//good, we got an JDOUSerException()
}
}
/**
* AVG always returns the type of the aggregated field ?!?!
*/
@Test
public void testAVG() {
PersistenceManager pm = TestTools.openPM();
pm.currentTransaction().begin();
Query q = null;
q = pm.newQuery(TestClass.class);
q.setResult("avg(iDontKnow)");
try {
q.execute();
fail();
} catch (JDOUserException e) {
//good
}
//try internal extent
q = pm.newQuery(TestClass.class);
q.setResult("avg(_byte)");
byte avg = (Byte)q.execute();
assertEquals(125, avg);
q = pm.newQuery(TestClass.class, "_int > 0");
q.setResult("avg(_byte)");
avg = (Byte)q.execute();
assertEquals(125, avg);
q.setResult("avg(_byte), avg(_int), avg(_short), avg(_long), avg(_char), " +
"avg(_float), avg(_double)");
Object[] avgs = (Object[])q.execute();
assertEquals((byte)125, avgs[0]);
assertEquals((int)2743, avgs[1]);
assertEquals((short)32003, avgs[2]);
assertEquals((long)1234567890L, avgs[3]);
assertEquals((char)'e', avgs[4]);
assertEquals(Float.class, avgs[5].getClass());
assertTrue(2. < (Float)avgs[5] && 2.5 > (Float)avgs[5]);
assertEquals(Double.class, avgs[6].getClass());
assertTrue(7. < (Double)avgs[6] && 8. > (Double)avgs[6]);
TestTools.closePM();
}
/**
* SUM returns long/double for integral/float types.
*/
@Test
public void testSUM() {
PersistenceManager pm = TestTools.openPM();
pm.currentTransaction().begin();
Query q = null;
q = pm.newQuery(TestClass.class);
q.setResult("sum(iDontKnow)");
try {
q.execute();
fail();
} catch (JDOUserException e) {
//good
}
//try internal extent
q = pm.newQuery(TestClass.class);
q.setResult("sum(_byte)");
long sum = (Long)q.execute();
assertEquals(625, sum);
q = pm.newQuery(TestClass.class, "_int > 0");
q.setResult("sum(_byte)");
sum = (Long)q.execute();
assertEquals(625, sum);
q.setResult("sum(_byte), sum(_int), sum(_short), sum(_long), sum(_char), " +
"sum(_float), sum(_double)");
Object[] sums = (Object[])q.execute();
assertEquals((long)625, sums[0]);
assertEquals((long)13715, sums[1]);
assertEquals((long)160015, sums[2]);
assertEquals((long)6172839450L, sums[3]);
assertEquals((long)505, sums[4]);
assertEquals(Double.class, sums[5].getClass());
assertTrue(11. < (Double)sums[5] && 12. > (Double)sums[5]);
assertEquals(Double.class, sums[6].getClass());
assertTrue(36. < (Double)sums[6] && 37. > (Double)sums[6]);
TestTools.closePM();
}
/**
* MIN always returns the type of the aggregated field.
*/
@Test
public void testMIN() {
PersistenceManager pm = TestTools.openPM();
pm.currentTransaction().begin();
Query q = null;
q = pm.newQuery(TestClass.class);
q.setResult("min(iDontKnow)");
try {
q.execute();
fail();
} catch (JDOUserException e) {
//good
}
//try internal extent
q = pm.newQuery(TestClass.class);
q.setResult("min(_byte)");
byte min = (Byte)q.execute();
assertEquals(123, min);
q = pm.newQuery(TestClass.class, "_int > 0");
q.setResult("min(_byte)");
min = (Byte)q.execute();
assertEquals(123, min);
q.setResult("min(_byte), min(_int), min(_short), min(_long), min(_char), " +
"min(_float), min(_double)");
Object[] mins = (Object[])q.execute();
assertEquals((byte)123, mins[0]);
assertEquals((int)1, mins[1]);
assertEquals((short)32001, mins[2]);
assertEquals((long)1234567890L, mins[3]);
assertEquals((char)'c', mins[4]);
assertEquals(Float.class, mins[5].getClass());
assertTrue(-2. < (Float)mins[5] && -1 > (Float)mins[5]);
assertEquals(Double.class, mins[6].getClass());
assertTrue(-36. < (Double)mins[6] && -34. > (Double)mins[6]);
TestTools.closePM();
}
/**
* MAX always returns the type of the aggregated field.
*/
@Test
public void testMAX() {
PersistenceManager pm = TestTools.openPM();
pm.currentTransaction().begin();
Query q = null;
q = pm.newQuery(TestClass.class);
q.setResult("max(iDontKnow)");
try {
q.execute();
fail();
} catch (JDOUserException e) {
//good
}
//try internal extent
q = pm.newQuery(TestClass.class);
q.setResult("max(_byte)");
byte max = (Byte)q.execute();
assertEquals(127, max);
q = pm.newQuery(TestClass.class, "_int > 0");
q.setResult("max(_byte)");
max = (Byte)q.execute();
assertEquals(127, max);
q.setResult("max(_byte), max(_int), max(_short), max(_long), max(_char), " +
"max(_float), max(_double)");
Object[] maxs = (Object[])q.execute();
assertEquals((byte)127, maxs[0]);
assertEquals((int)12345, maxs[1]);
assertEquals((short)32005, maxs[2]);
assertEquals((long)1234567890L, maxs[3]);
assertEquals((char)'g', maxs[4]);
assertEquals(Float.class, maxs[5].getClass());
assertTrue(11. < (Float)maxs[5] && 12. > (Float)maxs[5]);
assertEquals(Double.class, maxs[6].getClass());
assertTrue(34. < (Double)maxs[6] && 36. > (Double)maxs[6]);
TestTools.closePM();
}
@Test
public void testCOUNT() {
PersistenceManager pm = TestTools.openPM();
pm.currentTransaction().begin();
Query q = null;
q = pm.newQuery(TestClass.class);
q.setResult("count(iDontKnow)");
try {
q.execute();
fail();
} catch (JDOUserException e) {
//good
}
//try internal extent
q = pm.newQuery(TestClass.class);
q.setResult("count(_byte)");
long cnt = (Long)q.execute();
assertEquals(5, cnt);
q = pm.newQuery(TestClass.class, "_int > 0");
q.setResult("count(_byte)");
cnt = (Long)q.execute();
assertEquals(5, cnt);
q.setResult("count(_byte), count(_int), count(_short), count(_long), count(_char), " +
"count(_float), count(_double)");
Object[] sums = (Object[])q.execute();
assertEquals((long)5, sums[0]);
assertEquals((long)5, sums[1]);
assertEquals((long)5, sums[2]);
assertEquals((long)5, sums[3]);
assertEquals((long)5, sums[4]);
assertEquals((long)5, sums[5]);
assertEquals((long)5, sums[6]);
TestTools.closePM();
}
@Test
public void testFIELD() {
PersistenceManager pm = TestTools.openPM();
pm.currentTransaction().begin();
Query q = null;
q = pm.newQuery(TestClass.class);
q.setResult("iDontKnow");
try {
q.execute();
fail();
} catch (JDOUserException e) {
//good
}
//try internal extent
q = pm.newQuery(TestClass.class);
q.setResult("_byte");
Collection<?> r = (Collection<?>)q.execute();
assertTrue(123 <= (Byte)r.iterator().next());
assertEquals(5, r.size());
q = pm.newQuery(TestClass.class, "_int > 0");
q.setResult("_byte");
r = (Collection<?>) q.execute();
assertTrue(123 <= (Byte)r.iterator().next());
assertEquals(5, r.size());
q.setResult("_byte, _int, _short, _long, _char, _float, _double");
r = (Collection<?>) q.execute();
Object[] avgs = (Object[]) r.iterator().next();
assertEquals(7, avgs.length);
assertEquals((byte)127, avgs[0]);
assertEquals((int)1, avgs[1]);
assertEquals((short)32001, avgs[2]);
assertEquals((long)1234567890L, avgs[3]);
assertEquals((char)'c', avgs[4]);
assertEquals(Float.class, avgs[5].getClass());
assertTrue(-2. < (Float)avgs[5] && -1. > (Float)avgs[5]);
assertEquals(Double.class, avgs[6].getClass());
assertTrue(34. < (Double)avgs[6] && 36. > (Double)avgs[6]);
TestTools.closePM();
}
}