package com.uwyn.rife.database.querymanagers.generic;
import com.uwyn.rife.database.Datasource;
import com.uwyn.rife.database.queries.Delete;
import com.uwyn.rife.database.queries.Select;
import com.uwyn.rife.database.querymanagers.generic.beans.BeanImpl;
import com.uwyn.rife.database.querymanagers.generic.beans.LinkBean;
import com.uwyn.rife.database.querymanagers.generic.beans.SimpleBean;
import java.math.BigDecimal;
import java.sql.Time;
import java.sql.Timestamp;
import java.util.Calendar;
import java.util.List;
import junit.framework.TestCase;
public class TestDeleteQuery extends TestCase
{
private Datasource mDatasource = null;
private GenericQueryManager<BeanImpl> mBigBeanManager = null;
private GenericQueryManager<SimpleBean> mManager = null;
private GenericQueryManager<LinkBean> mLinkManager = null;
public TestDeleteQuery(Datasource datasource, String datasourceName, String name)
{
super(name);
mDatasource = datasource;
}
protected void setUp()
{
mManager = GenericQueryManagerFactory.getInstance(mDatasource, SimpleBean.class);
mLinkManager = GenericQueryManagerFactory.getInstance(mDatasource, LinkBean.class);
mBigBeanManager = GenericQueryManagerFactory.getInstance(mDatasource, BeanImpl.class);
int poolsize = mDatasource.getPoolsize();
// disabling pool for firebird
if ("org.firebirdsql.jdbc.FBDriver".equals(mDatasource.getAliasedDriver()))
{
mDatasource.setPoolsize(0);
}
try
{
mManager.install();
mLinkManager.install();
mBigBeanManager.install();
}
finally
{
if ("org.firebirdsql.jdbc.FBDriver".equals(mDatasource.getAliasedDriver()))
{
mDatasource.setPoolsize(poolsize);
}
}
}
protected void tearDown()
{
int poolsize = mDatasource.getPoolsize();
// disabling pool for firebird
if ("org.firebirdsql.jdbc.FBDriver".equals(mDatasource.getAliasedDriver()))
{
mDatasource.setPoolsize(0);
}
try
{
mManager.remove();
mLinkManager.remove();
mBigBeanManager.remove();
}
finally
{
if ("org.firebirdsql.jdbc.FBDriver".equals(mDatasource.getAliasedDriver()))
{
mDatasource.setPoolsize(poolsize);
}
}
}
public void testCloneToStringAndClear()
{
DeleteQuery query = mBigBeanManager.getDeleteQuery().where("propertyString", "=", "bean set 1");
assertEquals(query.toString(), "DELETE FROM beanimpl WHERE propertyString = 'bean set 1'");
DeleteQuery queryclone = query.clone();
assertEquals(queryclone.toString(), "DELETE FROM beanimpl WHERE propertyString = 'bean set 1'");
queryclone.where("propertyString", "!=", "bean set 2");
assertEquals(queryclone.toString(), "DELETE FROM beanimpl WHERE propertyString = 'bean set 1' AND propertyString != 'bean set 2'");
queryclone.clear();
assertEquals(queryclone.toString(), "DELETE FROM beanimpl WHERE propertyString = 'bean set 1'");
query.clear();
assertEquals(query.toString(), "DELETE FROM beanimpl");
}
public void testGetParameters()
{
Delete delete = new Delete(mDatasource);
delete
.from("simplebean")
.whereParameter("testString", "=");
DeleteQuery query = new DeleteQuery(delete);
assertEquals(query.getParameters().getOrderedNames().size(), 1);
assertTrue(query.getParameters().getOrderedNames().contains("testString"));
assertEquals(query.getParameters().getOrderedNamesArray().length, 1);
assertEquals(query.getParameters().getOrderedNamesArray()[0], "testString");
}
public void testGetDatasource()
{
assertTrue(mDatasource.equals(mBigBeanManager.getDeleteQuery().getDatasource()));
}
public void testGetFrom()
{
assertTrue(mBigBeanManager
.getDeleteQuery()
.getFrom()
.equals(BeanImpl.class
.getName()
.replaceAll(BeanImpl.class
.getPackage()
.getName()+".", "")
.toLowerCase()));
}
public void testWhere()
{
BeanImpl bean1 = new BeanImpl();
Calendar cal = Calendar.getInstance();
cal.set(2004, 6, 19, 16, 27, 15);
cal.set(Calendar.MILLISECOND, 765);
bean1.setPropertyBigDecimal(new BigDecimal("384834838434.38483"));
bean1.setPropertyBoolean(false);
bean1.setPropertyBooleanObject(true);
bean1.setPropertyByte((byte)90);
bean1.setPropertyByteObject((byte)35);
bean1.setPropertyCalendar(cal);
bean1.setPropertyChar('w');
bean1.setPropertyCharacterObject('s');
bean1.setPropertyDate(cal.getTime());
bean1.setPropertyDouble(37478.34d);
bean1.setPropertyDoubleObject(384724.692d);
bean1.setPropertyFloat(34241.2f);
bean1.setPropertyFloatObject(3432.7f);
bean1.setPropertyLong(23432L);
bean1.setPropertyLongObject(23423L);
bean1.setPropertyShort((short)44);
bean1.setPropertyShortObject((short)69);
bean1.setPropertyIntegerObject(421);
bean1.setPropertySqlDate(new java.sql.Date(cal.getTime().getTime()));
bean1.setPropertyString("nostringhere");
bean1.setPropertyStringbuffer(new StringBuffer("buffbuffbuff"));
bean1.setPropertyTime(new Time(cal.getTime().getTime()));
bean1.setPropertyTimestamp(new Timestamp(cal.getTime().getTime()));
int bean1id = mBigBeanManager.save(bean1);
mBigBeanManager.save(BeanImpl.getPopulatedBean());
mBigBeanManager.delete(mBigBeanManager.getDeleteQuery().where("propertyString = 'nostringhere'"));
List<BeanImpl> list = mBigBeanManager.restore();
assertEquals(list.size(), 1);
bean1id = mBigBeanManager.save(bean1);
mBigBeanManager.delete(mBigBeanManager.getDeleteQuery().where("propertyBoolean", "=", false));
list = mBigBeanManager.restore();
assertEquals(list.size(), 1);
bean1id = mBigBeanManager.save(bean1);
mBigBeanManager.delete(mBigBeanManager.getDeleteQuery().where("propertyByte", "=", (byte)90));
list = mBigBeanManager.restore();
assertEquals(list.size(), 1);
bean1id = mBigBeanManager.save(bean1);
mBigBeanManager.delete(mBigBeanManager.getDeleteQuery().where("propertyChar", "=", 'w'));
list = mBigBeanManager.restore();
assertEquals(list.size(), 1);
bean1id = mBigBeanManager.save(bean1);
mBigBeanManager.delete(mBigBeanManager.getDeleteQuery().where("propertyDouble", "=", 37478.34d));
list = mBigBeanManager.restore();
assertEquals(list.size(), 1);
bean1id = mBigBeanManager.save(bean1);
if (!("org.postgresql.Driver".equals(mDatasource.getAliasedDriver())) &&
!("com.mysql.jdbc.Driver".equals(mDatasource.getAliasedDriver())) &&
!("org.hsqldb.jdbcDriver".equals(mDatasource.getAliasedDriver())) &&
!("org.h2.Driver".equals(mDatasource.getAliasedDriver())) &&
!("org.apache.derby.jdbc.EmbeddedDriver".equals(mDatasource.getAliasedDriver()))) // skip this for postgres, mysql, hsqldb, h2 and derby since it doesn't work
{
mBigBeanManager.delete(mBigBeanManager.getDeleteQuery().where("propertyFloat", "=", 34241.2f));
list = mBigBeanManager.restore();
assertEquals(list.size(), 1);
bean1id = mBigBeanManager.save(bean1);
}
mBigBeanManager.delete(mBigBeanManager.getDeleteQuery().where("propertyLong", "=", 23432L));
list = mBigBeanManager.restore();
assertEquals(list.size(), 1);
bean1id = mBigBeanManager.save(bean1);
mBigBeanManager.delete(mBigBeanManager.getDeleteQuery().where("propertyShort", "=", (short)44));
list = mBigBeanManager.restore();
assertEquals(list.size(), 1);
DeleteQuery query = new DeleteQuery(mBigBeanManager.getDeleteQuery().where("id", "=", bean1id).getDelegate());
mBigBeanManager.delete(query.where("propertyString = 'nostringhere'"));
list = mBigBeanManager.restore();
assertEquals(list.size(), 1);
bean1id = mBigBeanManager.save(bean1);
query = new DeleteQuery(mBigBeanManager.getDeleteQuery().where("id", "=", bean1id).getDelegate());
mBigBeanManager.delete(query.where("propertyBoolean", "=", false));
list = mBigBeanManager.restore();
assertEquals(list.size(), 1);
bean1id = mBigBeanManager.save(bean1);
query = new DeleteQuery(mBigBeanManager.getDeleteQuery().where("id", "=", bean1id).getDelegate());
mBigBeanManager.delete(query.where("propertyByte", "=", (byte)90));
list = mBigBeanManager.restore();
assertEquals(list.size(), 1);
bean1id = mBigBeanManager.save(bean1);
query = new DeleteQuery(mBigBeanManager.getDeleteQuery().where("id", "=", bean1id).getDelegate());
mBigBeanManager.delete(query.where("propertyChar", "=", 'w'));
list = mBigBeanManager.restore();
assertEquals(list.size(), 1);
bean1id = mBigBeanManager.save(bean1);
query = new DeleteQuery(mBigBeanManager.getDeleteQuery().where("id", "=", bean1id).getDelegate());
mBigBeanManager.delete(query.where("propertyDouble", "=", 37478.34d));
list = mBigBeanManager.restore();
assertEquals(list.size(), 1);
bean1id = mBigBeanManager.save(bean1);
query = new DeleteQuery(mBigBeanManager.getDeleteQuery().where("id", "=", bean1id).getDelegate());
if (!("org.postgresql.Driver".equals(mDatasource.getAliasedDriver())) &&
!("com.mysql.jdbc.Driver".equals(mDatasource.getAliasedDriver())) &&
!("org.hsqldb.jdbcDriver".equals(mDatasource.getAliasedDriver())) &&
!("org.h2.Driver".equals(mDatasource.getAliasedDriver())) &&
!("org.apache.derby.jdbc.EmbeddedDriver".equals(mDatasource.getAliasedDriver()))) // skip this for postgres, mysql, hsqldb, h2 and derby since it doesn't work
{
mBigBeanManager.delete(query.where("propertyFloat", "=", 34241.2f));
list = mBigBeanManager.restore();
assertEquals(list.size(), 1);
bean1id = mBigBeanManager.save(bean1);
query = new DeleteQuery(mBigBeanManager.getDeleteQuery().where("id", "=", bean1id).getDelegate());
}
mBigBeanManager.delete(query.where("id", "=", bean1id)); // primary key
list = mBigBeanManager.restore();
assertEquals(list.size(), 1);
bean1id = mBigBeanManager.save(bean1);
query = new DeleteQuery(mBigBeanManager.getDeleteQuery().where("id", "=", bean1id).getDelegate());
mBigBeanManager.delete(query.where("propertyLong", "=", 23432L));
list = mBigBeanManager.restore();
assertEquals(list.size(), 1);
bean1id = mBigBeanManager.save(bean1);
query = new DeleteQuery(mBigBeanManager.getDeleteQuery().where("id", "=", bean1id).getDelegate());
mBigBeanManager.delete(query.where("propertyShort", "=", (short)44));
list = mBigBeanManager.restore();
assertEquals(list.size(), 1);
}
public void testWhereAnd()
{
BeanImpl bean1 = new BeanImpl();
Calendar cal = Calendar.getInstance();
cal.set(2004, 6, 19, 16, 27, 15);
cal.set(Calendar.MILLISECOND, 765);
bean1.setPropertyBigDecimal(new BigDecimal("384834838434.38483"));
bean1.setPropertyBoolean(false);
bean1.setPropertyBooleanObject(true);
bean1.setPropertyByte((byte)90);
bean1.setPropertyByteObject((byte)35);
bean1.setPropertyCalendar(cal);
bean1.setPropertyChar('w');
bean1.setPropertyCharacterObject('s');
bean1.setPropertyDate(cal.getTime());
bean1.setPropertyDouble(37478.34d);
bean1.setPropertyDoubleObject(384724.692d);
bean1.setPropertyFloat(34241.2f);
bean1.setPropertyFloatObject(3432.7f);
bean1.setPropertyLong(23432L);
bean1.setPropertyLongObject(23423L);
bean1.setPropertyShort((short)44);
bean1.setPropertyShortObject((short)69);
bean1.setPropertyIntegerObject(421);
bean1.setPropertySqlDate(new java.sql.Date(cal.getTime().getTime()));
bean1.setPropertyString("nostringhere");
bean1.setPropertyStringbuffer(new StringBuffer("buffbuffbuff"));
bean1.setPropertyTime(new Time(cal.getTime().getTime()));
bean1.setPropertyTimestamp(new Timestamp(cal.getTime().getTime()));
int bean1id = mBigBeanManager.save(bean1);
mBigBeanManager.save(BeanImpl.getPopulatedBean());
mBigBeanManager.delete(
mBigBeanManager.getDeleteQuery()
.where("id", "=", bean1id)
.whereAnd("propertyString = 'nostringhere'")
.whereAnd("propertyBoolean", "=", false)
.whereAnd("propertyByte", "=", (byte)90)
.whereAnd("propertyChar", "=", 'w')
.whereAnd("propertyDouble", "=", 37478.34d)
.whereAnd("propertyLong", "=", 23432L)
.whereAnd("propertyString", "=", "nostringhere")
.whereAnd("propertyIntegerObject", "=", 421)
.whereAnd("propertyShort", "=", (short)44)
);
List<BeanImpl> list = mBigBeanManager.restore();
assertEquals(list.size(), 1);
if (!("org.postgresql.Driver".equals(mDatasource.getAliasedDriver())) &&
!("com.mysql.jdbc.Driver".equals(mDatasource.getAliasedDriver())) &&
!("org.hsqldb.jdbcDriver".equals(mDatasource.getAliasedDriver())) &&
!("org.h2.Driver".equals(mDatasource.getAliasedDriver())) &&
!("org.apache.derby.jdbc.EmbeddedDriver".equals(mDatasource.getAliasedDriver()))) // skip this for postgres, mysql, hsqldb, h2 and derby since it doesn't work
{
bean1id = mBigBeanManager.save(bean1);
mBigBeanManager.delete(mBigBeanManager.getDeleteQuery().where("id", "=", bean1id).whereAnd("propertyFloat", "=", 34241.2f));
list = mBigBeanManager.restore();
assertEquals(list.size(), 1);
}
}
public void testWhereOr()
{
BeanImpl bean1 = new BeanImpl();
Calendar cal = Calendar.getInstance();
cal.set(2004, 6, 19, 16, 27, 15);
cal.set(Calendar.MILLISECOND, 765);
bean1.setPropertyBigDecimal(new BigDecimal("384834838434.38483"));
bean1.setPropertyBoolean(false);
bean1.setPropertyBooleanObject(true);
bean1.setPropertyByte((byte)90);
bean1.setPropertyByteObject((byte)35);
bean1.setPropertyCalendar(cal);
bean1.setPropertyChar('w');
bean1.setPropertyCharacterObject('s');
bean1.setPropertyDate(cal.getTime());
bean1.setPropertyDouble(37478.34d);
bean1.setPropertyDoubleObject(384724.692d);
bean1.setPropertyFloat(34241.2f);
bean1.setPropertyFloatObject(3432.7f);
bean1.setPropertyLong(23432L);
bean1.setPropertyLongObject(23423L);
bean1.setPropertyShort((short)44);
bean1.setPropertyShortObject((short)69);
bean1.setPropertyIntegerObject(421);
bean1.setPropertySqlDate(new java.sql.Date(cal.getTime().getTime()));
bean1.setPropertyString("nostringhere");
bean1.setPropertyStringbuffer(new StringBuffer("buffbuffbuff"));
bean1.setPropertyTime(new Time(cal.getTime().getTime()));
bean1.setPropertyTimestamp(new Timestamp(cal.getTime().getTime()));
int bean1id = mBigBeanManager.save(bean1);
mBigBeanManager.save(BeanImpl.getPopulatedBean());
mBigBeanManager.delete(
mBigBeanManager.getDeleteQuery()
.where("id", "=", bean1id)
.whereOr("propertyString = 'nostringhere'")
.whereOr("propertyBoolean", "=", false)
.whereOr("propertyByte", "=", (byte)90)
.whereOr("propertyChar", "=", 'w')
.whereOr("propertyDouble", "=", 37478.34d)
.whereOr("propertyLong", "=", 23432L)
.whereOr("propertyIntegerObject", "=", 421)
.whereOr("propertyShort", "=", (short)44)
.whereOr("propertyString", "=", "nostringhere")
);
List<BeanImpl> list = mBigBeanManager.restore();
assertEquals(list.size(), 1);
if (!("com.mysql.jdbc.Driver".equals(mDatasource.getAliasedDriver())) &&
!("org.hsqldb.jdbcDriver".equals(mDatasource.getAliasedDriver()))) // skip this for mysql and hsqldb since it doesn't work
{
bean1id = mBigBeanManager.save(bean1);
mBigBeanManager.delete(mBigBeanManager.getDeleteQuery().where("id", "=", bean1id).whereOr("propertyFloat", "=", 34241.2f));
list = mBigBeanManager.restore();
assertEquals(list.size(), 1);
}
}
public void testWhereSubselect()
{
SimpleBean bean1 = new SimpleBean();
SimpleBean bean2 = new SimpleBean();
SimpleBean bean3 = new SimpleBean();
SimpleBean bean4 = new SimpleBean();
SimpleBean bean5 = new SimpleBean();
LinkBean linkbean1 = new LinkBean();
LinkBean linkbean2 = new LinkBean();
linkbean1.setTestString("linkbean 1");
linkbean2.setTestString("linkbean 2");
mLinkManager.save(linkbean1);
mLinkManager.save(linkbean2);
bean1.setTestString("bean set 1");
bean2.setTestString("bean set 1");
bean3.setTestString("bean set 1");
bean4.setTestString("bean set 2");
bean5.setTestString("bean set 2");
bean1.setLinkBean(linkbean1.getId());
bean2.setLinkBean(linkbean1.getId());
bean3.setLinkBean(linkbean1.getId());
bean4.setLinkBean(linkbean2.getId());
bean5.setLinkBean(linkbean2.getId());
mManager.save(bean1);
mManager.save(bean2);
mManager.save(bean3);
mManager.save(bean4);
mManager.save(bean5);
Select select = new Select(mDatasource);
select
.from(mLinkManager.getTable())
.field("id")
.where("id", "=", linkbean1.getId());
DeleteQuery query = mManager.getDeleteQuery();
query
.where("linkBean = ("+select.getSql()+")")
.whereSubselect(select);
if (!("com.mysql.jdbc.Driver".equals(mDatasource.getAliasedDriver()))) // skip this for mysql since it doesn't work
{
mManager.delete(query);
List<SimpleBean> list = mManager.restore();
assertEquals(list.size(), 2);
}
}
}