blob: d48d75a094e0e45ebf410b3cd43ab17ac449c5f6 [file] [log] [blame]
package org.apache.ddlutils.dynabean;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.beanutils.DynaBean;
import org.apache.ddlutils.TestDatabaseWriterBase;
import org.apache.ddlutils.io.DatabaseIO;
import org.apache.ddlutils.model.Table;
import org.apache.ddlutils.platform.ModelBasedResultSetIterator;
import org.apache.ddlutils.platform.sybase.SybasePlatform;
/**
* Tests the sql querying.
*
* @version $Revision: 289996 $
*/
public class TestDynaSqlQueries extends TestDatabaseWriterBase
{
/**
* {@inheritDoc}
*/
protected void setUp() throws Exception
{
super.setUp();
getPlatform().setDelimitedIdentifierModeOn(false);
}
/**
* Tests a simple SELECT query.
*/
public void testSimpleQuery() throws Exception
{
createDatabase(
"<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
"<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='ddlutils'>\n"+
" <table name='TestTable'>\n"+
" <column name='TheId' type='INTEGER' primaryKey='true' required='true'/>\n"+
" <column name='TheText' type='VARCHAR' size='15'/>\n"+
" </table>\n"+
"</database>");
insertData(
"<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
"<data>\n"+
" <TestTable TheId='1' TheText='Text 1'/>\n"+
" <TestTable TheId='2' TheText='Text 2'/>\n"+
" <TestTable TheId='3' TheText='Text 3'/>"+
"</data>");
ModelBasedResultSetIterator it = (ModelBasedResultSetIterator)getPlatform().query(getModel(),
"SELECT * FROM TestTable",
new Table[] { getModel().getTable(0) });
assertTrue(it.hasNext());
// we call the method a second time to assert that the result set does not get advanced twice
assertTrue(it.hasNext());
DynaBean bean = (DynaBean)it.next();
assertEquals(new Integer(1),
getPropertyValue(bean, "TheId"));
assertEquals("Text 1",
getPropertyValue(bean, "TheText"));
assertTrue(it.hasNext());
bean = (DynaBean)it.next();
assertEquals(new Integer(2),
getPropertyValue(bean, "TheId"));
assertEquals("Text 2",
getPropertyValue(bean, "TheText"));
assertTrue(it.hasNext());
bean = (DynaBean)it.next();
assertEquals(new Integer(3),
getPropertyValue(bean, "TheId"));
assertEquals("Text 3",
getPropertyValue(bean, "TheText"));
assertFalse(it.hasNext());
assertFalse(it.isConnectionOpen());
}
/**
* Tests a simple SELECT fetch.
*/
public void testSimpleFetch() throws Exception
{
createDatabase(
"<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
"<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='ddlutils'>\n"+
" <table name='TestTable'>\n"+
" <column name='TheId' type='INTEGER' primaryKey='true' required='true'/>\n"+
" <column name='TheText' type='VARCHAR' size='15'/>\n"+
" </table>\n"+
"</database>");
insertData(
"<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
"<data>\n"+
" <TestTable TheId='1' TheText='Text 1'/>\n"+
" <TestTable TheId='2' TheText='Text 2'/>\n"+
" <TestTable TheId='3' TheText='Text 3'/>"+
"</data>");
List beans = getPlatform().fetch(getModel(),
"SELECT * FROM TestTable",
new Table[] { getModel().getTable(0) });
assertEquals(3,
beans.size());
DynaBean bean = (DynaBean)beans.get(0);
assertEquals(new Integer(1),
getPropertyValue(bean, "TheId"));
assertEquals("Text 1",
getPropertyValue(bean, "TheText"));
bean = (DynaBean)beans.get(1);
assertEquals(new Integer(2),
getPropertyValue(bean, "TheId"));
assertEquals("Text 2",
getPropertyValue(bean, "TheText"));
bean = (DynaBean)beans.get(2);
assertEquals(new Integer(3),
getPropertyValue(bean, "TheId"));
assertEquals("Text 3",
getPropertyValue(bean, "TheText"));
}
/**
* Tests insertion & reading of auto-increment columns.
*/
public void testAutoIncrement() throws Exception
{
// we need special catering for Sybase which does not support identity for INTEGER columns
final String modelXml;
if (SybasePlatform.DATABASENAME.equals(getPlatform().getName()))
{
modelXml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
"<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='ddlutils'>\n"+
" <table name='TestTable'>\n"+
" <column name='TheId' type='NUMERIC' size='12,0' primaryKey='true' required='true' autoIncrement='true'/>\n"+
" <column name='TheText' type='VARCHAR' size='15'/>\n"+
" </table>\n"+
"</database>";
}
else
{
modelXml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
"<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='ddlutils'>\n"+
" <table name='TestTable'>\n"+
" <column name='TheId' type='INTEGER' primaryKey='true' required='true' autoIncrement='true'/>\n"+
" <column name='TheText' type='VARCHAR' size='15'/>\n"+
" </table>\n"+
"</database>";
}
createDatabase(modelXml);
// we're inserting the rows manually via beans since we do want to
// check the back-reading of the auto-increment columns
SqlDynaClass dynaClass = getModel().getDynaClassFor("TestTable");
DynaBean bean = null;
Object id1 = null;
Object id2 = null;
Object id3 = null;
bean = dynaClass.newInstance();
bean.set("TheText", "Text 1");
getPlatform().insert(getModel(), bean);
if (getPlatformInfo().isLastIdentityValueReadable())
{
// we cannot know the value for sure (though it usually will be 1)
id1 = getPropertyValue(bean, "TheId");
assertNotNull(id1);
}
bean = dynaClass.newInstance();
bean.set("TheText", "Text 2");
getPlatform().insert(getModel(), bean);
if (getPlatformInfo().isLastIdentityValueReadable())
{
// we cannot know the value for sure (though it usually will be 2)
id2 = getPropertyValue(bean, "TheId");
assertNotNull(id2);
}
bean = dynaClass.newInstance();
bean.set("TheText", "Text 3");
getPlatform().insert(getModel(), bean);
if (getPlatformInfo().isLastIdentityValueReadable())
{
// we cannot know the value for sure (though it usually will be 3)
id3 = getPropertyValue(bean, "TheId");
assertNotNull(id3);
}
List beans = getPlatform().fetch(getModel(),
"SELECT * FROM TestTable",
new Table[] { getModel().getTable(0) });
assertEquals(3,
beans.size());
bean = (DynaBean)beans.get(0);
if (getPlatformInfo().isLastIdentityValueReadable())
{
assertEquals(id1,
getPropertyValue(bean, "TheId"));
}
else
{
assertNotNull(getPropertyValue(bean, "TheId"));
}
assertEquals("Text 1",
getPropertyValue(bean, "TheText"));
bean = (DynaBean)beans.get(1);
if (getPlatformInfo().isLastIdentityValueReadable())
{
assertEquals(id2,
getPropertyValue(bean, "TheId"));
}
else
{
assertNotNull(getPropertyValue(bean, "TheId"));
}
assertEquals("Text 2",
getPropertyValue(bean, "TheText"));
bean = (DynaBean)beans.get(2);
if (getPlatformInfo().isLastIdentityValueReadable())
{
assertEquals(id3,
getPropertyValue(bean, "TheId"));
}
else
{
assertNotNull(getPropertyValue(bean, "TheId"));
}
assertEquals("Text 3",
getPropertyValue(bean, "TheText"));
}
/**
* Tests a more complicated SELECT query that leads to a JOIN in the database.
*/
public void testJoinQuery() throws Exception
{
createDatabase(
"<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
"<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='ddlutils'>\n"+
" <table name='TestTable1'>\n"+
" <column name='Id1' type='INTEGER' primaryKey='true' required='true'/>\n"+
" <column name='Id2' type='INTEGER'/>\n"+
" </table>\n"+
" <table name='TestTable2'>\n"+
" <column name='Id' type='INTEGER' primaryKey='true' required='true'/>\n"+
" <column name='Avalue' type='VARCHAR' size='15'/>\n"+
" </table>\n"+
"</database>");
insertData(
"<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
"<data>\n"+
" <TestTable1 Id1='1'/>\n"+
" <TestTable1 Id1='2' Id2='3'/>\n"+
" <TestTable2 Id='1' Avalue='Text 1'/>\n"+
" <TestTable2 Id='2' Avalue='Text 2'/>\n"+
" <TestTable2 Id='3' Avalue='Text 3'/>"+
"</data>");
ModelBasedResultSetIterator it = (ModelBasedResultSetIterator)getPlatform().query(getModel(),
"SELECT Id1, Avalue FROM TestTable1, TestTable2 WHERE Id2 = Id",
new Table[] { getModel().getTable(0), getModel().getTable(1) });
assertTrue(it.hasNext());
DynaBean bean = (DynaBean)it.next();
assertEquals(new Integer(2),
getPropertyValue(bean, "Id1"));
assertEquals("Text 3",
getPropertyValue(bean, "Avalue"));
assertFalse(it.hasNext());
assertFalse(it.isConnectionOpen());
}
/**
* Tests the insert method.
*/
public void testInsertSingle() throws Exception
{
createDatabase(
"<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
"<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='ddlutils'>\n"+
" <table name='TestTable'>\n"+
" <column name='TheId' type='INTEGER' primaryKey='true' required='true'/>\n"+
" <column name='TheText' type='VARCHAR' size='15'/>\n"+
" </table>\n"+
"</database>");
SqlDynaClass dynaClass = SqlDynaClass.newInstance(getModel().getTable(0));
DynaBean dynaBean = new SqlDynaBean(dynaClass);
dynaBean.set("TheId", new Integer(1));
dynaBean.set("TheText", "Text 1");
getPlatform().insert(getModel(), dynaBean);
List beans = getPlatform().fetch(getModel(),
"SELECT * FROM TestTable",
new Table[] { getModel().getTable(0) });
assertEquals(1,
beans.size());
DynaBean bean = (DynaBean)beans.get(0);
assertEquals(new Integer(1),
getPropertyValue(bean, "TheId"));
assertEquals("Text 1",
getPropertyValue(bean, "TheText"));
}
/**
* Tests the insert method.
*/
public void testInsertMultiple() throws Exception
{
createDatabase(
"<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
"<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='ddlutils'>\n"+
" <table name='TestTable'>\n"+
" <column name='TheId' type='INTEGER' primaryKey='true' required='true'/>\n"+
" <column name='TheText' type='VARCHAR' size='15'/>\n"+
" </table>\n"+
"</database>");
SqlDynaClass dynaClass = SqlDynaClass.newInstance(getModel().getTable(0));
DynaBean dynaBean1 = new SqlDynaBean(dynaClass);
DynaBean dynaBean2 = new SqlDynaBean(dynaClass);
DynaBean dynaBean3 = new SqlDynaBean(dynaClass);
dynaBean1.set("TheId", new Integer(1));
dynaBean1.set("TheText", "Text 1");
dynaBean2.set("TheId", new Integer(2));
dynaBean2.set("TheText", "Text 2");
dynaBean3.set("TheId", new Integer(3));
dynaBean3.set("TheText", "Text 3");
List dynaBeans = new ArrayList();
dynaBeans.add(dynaBean1);
dynaBeans.add(dynaBean2);
dynaBeans.add(dynaBean3);
getPlatform().insert(getModel(), dynaBeans);
List beans = getPlatform().fetch(getModel(),
"SELECT * FROM TestTable",
new Table[] { getModel().getTable(0) });
assertEquals(3,
beans.size());
DynaBean bean = (DynaBean)beans.get(0);
assertEquals(new Integer(1),
getPropertyValue(bean, "TheId"));
assertEquals("Text 1",
getPropertyValue(bean, "TheText"));
bean = (DynaBean)beans.get(1);
assertEquals(new Integer(2),
getPropertyValue(bean, "TheId"));
assertEquals("Text 2",
getPropertyValue(bean, "TheText"));
bean = (DynaBean)beans.get(2);
assertEquals(new Integer(3),
getPropertyValue(bean, "TheId"));
assertEquals("Text 3",
getPropertyValue(bean, "TheText"));
}
/**
* Tests the update method.
*/
public void testUpdate() throws Exception
{
createDatabase(
"<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
"<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='ddlutils'>\n"+
" <table name='TestTable'>\n"+
" <column name='TheId' type='INTEGER' primaryKey='true' required='true'/>\n"+
" <column name='TheText' type='VARCHAR' size='15'/>\n"+
" </table>\n"+
"</database>");
insertData(
"<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
"<data>\n"+
" <TestTable TheId='1' TheText='Text 1'/>\n"+
"</data>");
SqlDynaClass dynaClass = SqlDynaClass.newInstance(getModel().getTable(0));
DynaBean dynaBean = new SqlDynaBean(dynaClass);
dynaBean.set("TheId", new Integer(1));
dynaBean.set("TheText", "Text 10");
getPlatform().update(getModel(), dynaBean);
List beans = getPlatform().fetch(getModel(),
"SELECT * FROM TestTable",
new Table[] { getModel().getTable(0) });
assertEquals(1,
beans.size());
DynaBean bean = (DynaBean)beans.get(0);
assertEquals(new Integer(1),
getPropertyValue(bean, "TheId"));
assertEquals("Text 10",
getPropertyValue(bean, "TheText"));
}
/**
* Tests the exists method.
*/
public void testExists() throws Exception
{
createDatabase(
"<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
"<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='ddlutils'>\n"+
" <table name='TestTable'>\n"+
" <column name='TheId' type='INTEGER' primaryKey='true' required='true'/>\n"+
" <column name='TheText' type='VARCHAR' size='15'/>\n"+
" </table>\n"+
"</database>");
insertData(
"<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
"<data>\n"+
" <TestTable TheId='1' TheText='Text 1'/>\n"+
" <TestTable TheId='3' TheText='Text 3'/>\n"+
"</data>");
SqlDynaClass dynaClass = SqlDynaClass.newInstance(getModel().getTable(0));
DynaBean dynaBean1 = new SqlDynaBean(dynaClass);
DynaBean dynaBean2 = new SqlDynaBean(dynaClass);
DynaBean dynaBean3 = new SqlDynaBean(dynaClass);
dynaBean1.set("TheId", new Integer(1));
dynaBean1.set("TheText", "Text 1");
dynaBean2.set("TheId", new Integer(2));
dynaBean2.set("TheText", "Text 2");
dynaBean3.set("TheId", new Integer(3));
dynaBean3.set("TheText", "Text 30");
assertTrue(getPlatform().exists(getModel(), dynaBean1));
assertFalse(getPlatform().exists(getModel(), dynaBean2));
assertTrue(getPlatform().exists(getModel(), dynaBean3));
}
/**
* Tests the store method.
*/
public void testStoreNew() throws Exception
{
createDatabase(
"<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
"<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='ddlutils'>\n"+
" <table name='TestTable'>\n"+
" <column name='TheId' type='INTEGER' primaryKey='true' required='true'/>\n"+
" <column name='TheText' type='VARCHAR' size='15'/>\n"+
" </table>\n"+
"</database>");
SqlDynaClass dynaClass = SqlDynaClass.newInstance(getModel().getTable(0));
DynaBean dynaBean = new SqlDynaBean(dynaClass);
dynaBean.set("TheId", new Integer(1));
dynaBean.set("TheText", "Text 1");
getPlatform().store(getModel(), dynaBean);
List beans = getPlatform().fetch(getModel(),
"SELECT * FROM TestTable",
new Table[] { getModel().getTable(0) });
assertEquals(1,
beans.size());
DynaBean bean = (DynaBean)beans.get(0);
assertEquals(new Integer(1),
getPropertyValue(bean, "TheId"));
assertEquals("Text 1",
getPropertyValue(bean, "TheText"));
}
/**
* Tests the store method.
*/
public void testStoreExisting() throws Exception
{
createDatabase(
"<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
"<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='ddlutils'>\n"+
" <table name='TestTable'>\n"+
" <column name='TheId' type='INTEGER' primaryKey='true' required='true'/>\n"+
" <column name='TheText' type='VARCHAR' size='15'/>\n"+
" </table>\n"+
"</database>");
insertData(
"<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
"<data>\n"+
" <TestTable TheId='1' TheText='Text 1'/>\n"+
"</data>");
SqlDynaClass dynaClass = SqlDynaClass.newInstance(getModel().getTable(0));
DynaBean dynaBean = new SqlDynaBean(dynaClass);
dynaBean.set("TheId", new Integer(1));
dynaBean.set("TheText", "Text 10");
getPlatform().store(getModel(), dynaBean);
List beans = getPlatform().fetch(getModel(),
"SELECT * FROM TestTable",
new Table[] { getModel().getTable(0) });
assertEquals(1,
beans.size());
DynaBean bean = (DynaBean)beans.get(0);
assertEquals(new Integer(1),
getPropertyValue(bean, "TheId"));
assertEquals("Text 10",
getPropertyValue(bean, "TheText"));
}
}