/*
* JBoss, Home of Professional Open Source.
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.test.cmp2.commerce;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Properties;
import java.util.Set;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.naming.Context;
import javax.naming.InitialContext;
import junit.framework.Test;
import org.jboss.ejb.EjbModule;
import org.jboss.ejb.plugins.cmp.ejbql.Catalog;
import org.jboss.ejb.plugins.cmp.jdbc.JDBCEJBQLCompiler;
import org.jboss.ejb.plugins.cmp.jdbc.metadata.JDBCQueryMetaData;
import org.jboss.ejb.plugins.cmp.jdbc.metadata.JDBCReadAheadMetaData;
import org.jboss.mx.util.MBeanServerLocator;
import org.jboss.test.JBossTestCase;
import org.jboss.test.util.ejb.EJBTestCase;
public class LimitOffsetTest extends EJBTestCase {
private JDBCEJBQLCompiler compiler;
private Class[] params = { int.class, int.class };
private JDBCQueryMetaData queryMetaData;
private OrderHome orderHome;
public static Test suite() throws Exception {
return JBossTestCase.getDeploySetup(LimitOffsetTest.class, "cmp2-commerce.jar");
}
public LimitOffsetTest(String name) {
super(name);
}
public void setUpEJB(Properties props) throws Exception
{
MBeanServer server = MBeanServerLocator.locateJBoss();
ObjectName name = new ObjectName("jboss.j2ee:jndiName=commerce/Order,service=EJB");
EjbModule ejbModule = (EjbModule) server.getAttribute(name, "EjbModule");
Catalog catalog = (Catalog) ejbModule.getModuleData("CATALOG");
compiler = new JDBCEJBQLCompiler(catalog);
queryMetaData = new JDBCQueryMetaData()
{
public Method getMethod()
{
throw new UnsupportedOperationException();
}
public boolean isResultTypeMappingLocal()
{
return true;
}
public JDBCReadAheadMetaData getReadAhead()
{
return new JDBCReadAheadMetaData("on-load", 100, "*");
}
public Class getQLCompilerClass()
{
throw new UnsupportedOperationException();
}
public boolean isLazyResultSetLoading()
{
return false;
}
};
Context ctx = new InitialContext();
orderHome = (OrderHome) ctx.lookup("commerce/Order");
for (Iterator i = orderHome.findAll().iterator(); i.hasNext(); )
{
Order order = (Order) i.next();
i.remove();
order.remove();
}
for (int i=100; i < 110; i++)
{
orderHome.create(new Long(i));
}
}
public void tearDownEJB(Properties props) throws Exception
{
for (Iterator i = orderHome.findAll().iterator(); i.hasNext(); )
{
Order order = (Order) i.next();
i.remove();
order.remove();
}
}
public void testCompiler() throws Exception
{
compiler.compileJBossQL("SELECT OBJECT(o) FROM OrderX o", Collection.class, params, queryMetaData);
assertEquals("SELECT t0_o.ORDER_NUMBER FROM ORDER_DATA t0_o", compiler.getSQL());
assertEquals(0, compiler.getLimitParam());
assertEquals(0, compiler.getOffsetParam());
compiler.compileJBossQL("SELECT OBJECT(o) FROM OrderX o OFFSET ?2", Collection.class, params, queryMetaData);
assertEquals("SELECT t0_o.ORDER_NUMBER FROM ORDER_DATA t0_o", compiler.getSQL());
assertEquals(2, compiler.getOffsetParam());
assertEquals(0, compiler.getLimitParam());
compiler.compileJBossQL("SELECT OBJECT(o) FROM OrderX o LIMIT ?1", Collection.class, params, queryMetaData);
assertEquals("SELECT t0_o.ORDER_NUMBER FROM ORDER_DATA t0_o", compiler.getSQL());
assertEquals(0, compiler.getOffsetParam());
assertEquals(1, compiler.getLimitParam());
compiler.compileJBossQL("SELECT OBJECT(o) FROM OrderX o OFFSET ?1 LIMIT ?2", Collection.class, params, queryMetaData);
assertEquals("SELECT t0_o.ORDER_NUMBER FROM ORDER_DATA t0_o", compiler.getSQL());
assertEquals(1, compiler.getOffsetParam());
assertEquals(2, compiler.getLimitParam());
try
{
compiler.compileJBossQL("SELECT OBJECT(o) FROM OrderX o OFFSET ?1", Collection.class,
new Class[] { long.class }, queryMetaData);
fail("Expected Exception due to non-int argument");
}
catch (Exception e)
{
// OK
}
}
public void testLimitOffset() throws Exception
{
Set result;
result = orderHome.getStuff("SELECT OBJECT(o) FROM OrderX o", new Object[] { } );
checkKeys(result, new long[] { 100, 101, 102, 103, 104, 105, 106, 107, 108, 109});
result = orderHome.getStuff("SELECT OBJECT(o) FROM OrderX o LIMIT ?1", new Object[] { new Integer(3) } );
checkKeys(result, new long[] { 100, 101, 102 });
result = orderHome.getStuff("SELECT OBJECT(o) FROM OrderX o OFFSET ?1", new Object[] { new Integer(3) } );
checkKeys(result, new long[] { 103, 104, 105, 106, 107, 108, 109 });
result = orderHome.getStuff("SELECT OBJECT(o) FROM OrderX o OFFSET ?1 LIMIT ?2", new Object[] { new Integer(0), new Integer(3) } );
checkKeys(result, new long[] { 100, 101, 102 });
result = orderHome.getStuff("SELECT OBJECT(o) FROM OrderX o OFFSET ?1 LIMIT ?2", new Object[] { new Integer(3), new Integer(3) } );
checkKeys(result, new long[] { 103, 104, 105 });
result = orderHome.getStuff("SELECT OBJECT(o) FROM OrderX o OFFSET ?1 LIMIT ?2", new Object[] { new Integer(6), new Integer(3) } );
checkKeys(result, new long[] { 106, 107, 108 });
result = orderHome.getStuff("SELECT OBJECT(o) FROM OrderX o OFFSET ?1 LIMIT ?2", new Object[] { new Integer(9), new Integer(3) } );
checkKeys(result, new long[] { 109 });
}
public void testFinderWithLimitOffset() throws Exception
{
Collection result;
result = orderHome.findWithLimitOffset(6, 3);
checkKeys(result, new long[] { 106, 107, 108 });
}
private void checkKeys(Collection c, long[] expected)
{
assertEquals(expected.length, c.size());
Set expectedSet = new HashSet(expected.length);
for (int i = 0; i < expected.length; i++)
{
long l = expected[i];
expectedSet.add(new Long(l));
}
Set actualSet = new HashSet(c.size());
for (Iterator iterator = c.iterator(); iterator.hasNext();)
{
Order order = (Order) iterator.next();
actualSet.add(order.getPrimaryKey());
}
assertEquals(expectedSet, actualSet);
}
}