package ch.elexis.data; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.IOException; import java.sql.PreparedStatement; import java.util.ArrayList; import java.util.List; import org.junit.After; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import ch.elexis.core.exceptions.PersistenceException; import ch.rgw.tools.JdbcLink; public class Test_Query extends AbstractPersistentObjectTest { static final String FIRST_NAME = "first"; static final String SECOND_NAME = "second"; static final String THIRD_NAME = "third"; private Organisation org1; private Organisation org2; private Organisation org3; public Test_Query(JdbcLink link){ super(link); } @Before public void before(){ // create a instance of an PersistentObject ex. Organisation to test the query org1 = new Organisation(SECOND_NAME, SECOND_NAME + "_zusatz"); org2 = new Organisation(FIRST_NAME, FIRST_NAME + "_zusatz"); org3 = new Organisation(THIRD_NAME, THIRD_NAME + "_zusatz"); } @After public void after(){ org1.delete(); org2.delete(); org3.delete(); } @Test public void testConstructor(){ Query<Organisation> query = new Query<Organisation>(Organisation.class); // clear will access the template which is set in constructor ... // if it does not fail with an exception the constructor worked ... query.clear(); query = new Query<Organisation>(Organisation.class, Organisation.FLD_NAME1, FIRST_NAME); // clear will access the template which is set in constructor ... // if it does not fail with an exception the constructor worked ... query.clear(); } @Test public void testConstructorFail(){ try { new Query<PersistentObjectImpl>(PersistentObjectImpl.class); fail("Expected Exception not thrown!"); } catch (PersistenceException pe) { } try { new Query<PersistentObjectImpl>(PersistentObjectImpl.class, "", ""); fail("Expected Exception not thrown!"); } catch (PersistenceException pe) { } } @Test public void testGetPreparedStatement(){ PreparedStatement ps = getLink().getPreparedStatement( "SELECT " + Organisation.FLD_NAME1 + " FROM " + Organisation.TABLENAME); Query<Organisation> query = new Query<Organisation>(Organisation.class); ArrayList<String> result = query.execute(ps, new String[0]); int nrOrgs = result.size(); Organisation organisation = new Organisation("NeueOrganistation", "Zusatznamen2"); result = query.execute(ps, new String[0]); getLink().releasePreparedStatement(ps); assertEquals(nrOrgs + 1, result.size()); organisation.delete(); } @Test public void testOrderBy(){ Query<Organisation> query = new Query<Organisation>(Organisation.class); query.clear(); query.orderBy(false, Organisation.FLD_NAME1); List<Organisation> result = query.execute(); assertEquals(3, result.size()); assertEquals(FIRST_NAME, result.get(0).get(Organisation.FLD_NAME1)); assertEquals(SECOND_NAME, result.get(1).get(Organisation.FLD_NAME1)); assertEquals(THIRD_NAME, result.get(2).get(Organisation.FLD_NAME1)); query.clear(); query.orderBy(true, Organisation.FLD_NAME1); result = query.execute(); assertEquals(3, result.size()); assertEquals(FIRST_NAME, result.get(2).get(Organisation.FLD_NAME1)); assertEquals(SECOND_NAME, result.get(1).get(Organisation.FLD_NAME1)); assertEquals(THIRD_NAME, result.get(0).get(Organisation.FLD_NAME1)); } @Test public void testOrderByReverse(){ Query<Organisation> query = new Query<Organisation>(Organisation.class); query.clear(); query.orderBy(true, Organisation.FLD_NAME1); List<Organisation> result = query.execute(); assertEquals(3, result.size()); assertEquals(FIRST_NAME, result.get(2).get(Organisation.FLD_NAME1)); assertEquals(SECOND_NAME, result.get(1).get(Organisation.FLD_NAME1)); assertEquals(THIRD_NAME, result.get(0).get(Organisation.FLD_NAME1)); } @Test public void testExecute(){ Query<Organisation> query = new Query<Organisation>(Organisation.class); query.clear(); query.add(Organisation.FLD_NAME1, "=", FIRST_NAME); List<Organisation> result = query.execute(); assertEquals(1, result.size()); } @Ignore public void testExecuteOnDBConnection() throws IOException{ Query<Organisation> query = new Query<Organisation>(Organisation.class); query.clear(); query.add(Organisation.FLD_NAME1, "=", FIRST_NAME); // create a new DBConnection DBConnection connection = new DBConnection(); connection.setDBConnectString("jdbc:h2:mem:test_query_mem"); connection.setDBUser("sa"); connection.setDBPassword(""); assertTrue(connection.connect()); // initElexisDatabase(connection); List<Organisation> result = query.execute(connection); assertEquals(0, result.size()); DBConnection initialConnection = PersistentObject.getDefaultConnection(); // change default connection of PersistenObject and create an Organization PersistentObject.connect(connection); new Organisation(FIRST_NAME, "orgzusatz1"); result = query.execute(connection); assertEquals(1, result.size()); // cleanup new connection and reset to initial connection PersistentObject.disconnect(); PersistentObject.connect(initialConnection); } @Test public void testQueryExpression(){ PreparedStatement ps = getLink().prepareStatement( "SELECT " + Organisation.FLD_NAME1 + " FROM " + Organisation.TABLENAME); Query<Organisation> query = new Query<Organisation>(Organisation.class); ArrayList<String> result = query.execute(ps, new String[0]); int nrOrgs = result.size(); System.out.println("Before creating new organistaion found " + nrOrgs + " Organisation"); for (String s : result) { System.out.println("Organisation: found " + s); } Organisation organisation = new Organisation("NeueOrganistation", "Zusatznamen2"); result = query.execute(ps, new String[0]); System.out .println("After creating new organistaion found " + result.size() + " Organisation"); for (String s : result) { System.out.println("Organisation: found " + s); } assertEquals(nrOrgs + 1, result.size()); organisation.delete(); } @Test public void testQueryNotNullExpression(){ Artikel art = new Artikel("TestARtikel", "Eigenartikel"); art.set(Artikel.FLD_SUB_ID, "notNull"); new Artikel("TestARtikel", "Eigenartikel"); Query<Artikel> qbe = new Query<Artikel>(Artikel.class); qbe.startGroup(); qbe.add(Artikel.FLD_SUB_ID, Query.NOT_EQUAL, null); qbe.or(); qbe.add(Artikel.FLD_EAN, Query.NOT_EQUAL, null); qbe.add(Artikel.FLD_EXTID, Query.NOT_EQUAL, null); qbe.endGroup(); List<Artikel> execute = qbe.execute(); assertEquals(1, execute.size()); art.delete(); } @Test public void testQueryWithApostrophe() { Patient testPatient = new Patient("D'Andrea", "Max", "1.1.2000", "m"); assertEquals("D'Andrea", testPatient.getName()); Query<Person> qre = new Query<Person>(Person.class); qre.add(Person.FLD_NAME1, Query.EQUALS, "D'Andrea"); List<Person> result = qre.execute(); assertEquals(1, result.size()); assertEquals("D'Andrea", result.get(0).getName()); testPatient.delete(); } @Test public void testQueryMappedExpression(){ final String MappingName = "TitelSuffix"; PreparedStatement ps = getLink().getPreparedStatement( "SELECT " + Organisation.FLD_NAME1 + " FROM " + Organisation.TABLENAME); // Setup Query which will return always true Query<Organisation> query = new Query<Organisation>(Organisation.class); query.clear(); query.add(Organisation.FLD_COUNTRY, Query.LESS_OR_EQUAL, MappingName); System.out.println( "Must query via " + MappingName + ". Fieldname is " + Organisation.FLD_LAW_CODE); System.out.println("getActualQuery: " + query.getActualQuery()); ArrayList<String> result = query.execute(ps, new String[0]); assertTrue(result.size() >= 3); // Setup Query which will return always false Query<Organisation> query2 = new Query<Organisation>(Organisation.class); query2.clear(); query2.add(Organisation.FLD_COUNTRY, Query.GREATER, MappingName); List<Organisation> result2 = query2.execute(); assertEquals(0, result2.size()); } private class PersistentObjectImpl extends PersistentObject { @SuppressWarnings("unused") public String getTestGet(){ return "test"; } @Override public String getLabel(){ // TODO Auto-generated method stub return null; } @Override protected String getTableName(){ return null; } } }