001: package simpleorm.data.test;
002:
003: import simpleorm.data.*;
004: import simpleorm.data.ddlutilsaddaptor.DDdlUtlisConnection;
005: import simpleorm.data.dynabeanadaptor.DDynaConnection;
006: import simpleorm.data.dynabeanadaptor.DDynaDatabase;
007:
008: import java.util.Iterator;
009:
010: import org.hsqldb.jdbc.jdbcDataSource;
011:
012: /**
013: * Basic sample and example of Data Interface.<p>
014: *
015: * Three providers: DdlUtilsConnection, DDynaCollection and custom MyConnection.
016: * The latter also provides an example of writing a manual provider, should that be desired.
017: */
018: public class DBasicTest {
019:
020: /** Could subtype DRecordInstance etc. if necessary. */
021: static public class MyRecord extends DRecordInstance {
022: static public final DRecordMeta MY_RECORD = new DRecordMeta(
023: MyRecord.class, "MY_RECORD");
024: static final DFieldMeta ID = MY_RECORD.addField(
025: new DFieldMeta("ID", DType.INTEGER))
026: .setPrimaryKey(true);
027: static final DFieldMeta NAME = MY_RECORD
028: .addField(new DFieldMeta("NAME", DType.STRING));
029: static final DFieldMeta DESCRIPTION = MY_RECORD
030: .addField(new DFieldMeta("DESCRIPTION", DType.STRING));
031: //static final DFieldMeta KEY = MY_RECORD.addField(new DFieldMeta("KEY", DType.BYTES));
032: static final DFieldMeta UNQUERIED = MY_RECORD
033: .addField(new DFieldMeta("UNQUERIED", DType.STRING));
034: static final DFieldMeta PARENT = MY_RECORD
035: .addField(new DFieldMeta("PARENT", DType.INTEGER));
036:
037: static final DForeignKeyMeta PARENT_FK = MY_RECORD
038: .addRefingFKey(PARENT);
039:
040: String getName() {
041: return getString(NAME);
042: } // get/seters optional and not recommended, just an example.
043:
044: public MyRecord() {
045: super (MY_RECORD);
046: }
047:
048: public @Override
049: void onPreUpSert(DConnection connection, QueryMode mode) {
050: System.err.println("onPreUpSert " + mode + this );
051: }
052:
053: }
054:
055: static class MySubRecord extends MyRecord {
056: // static final DRecordMeta MY_RECORD = new DRecordMeta("MY_RECORD");
057: // static final DFieldMeta ID = MY_RECORD.addField(new DFieldMeta("ID", DType.INTEGER))
058: // .setPrimaryKey(true);
059: // static final DFieldMeta NAME = MY_RECORD.addField(new DFieldMeta("NAME", DType.STRING));
060: // static final DFieldMeta KEY = MY_RECORD.addField(new DFieldMeta("KEY", DType.BYTES));
061: //
062: // public MySubRecord() {
063: // super(MY_RECORD);
064: // }
065: }
066:
067: public static void main(String[] args) throws Exception {
068:
069: //todo enable simple commons logging so that ddlutils error messages are displayed! (eg. no primary key).
070:
071: /// Example of manual bean, not normally used.
072: testAdaptor(new MyConnection());
073:
074: /// Example of an automated dyna bean / hash map database
075: testAdaptor(new DDynaConnection(new DDynaDatabase()));
076:
077: /// Main example using Ddl Utils.
078: testAdaptor(newDdlUtilConnection());
079: }
080:
081: private static DDdlUtlisConnection newDdlUtilConnection() {
082: DDdlUtlisConnection dcon = new DDdlUtlisConnection();
083:
084: jdbcDataSource dataSource = new jdbcDataSource();
085: dataSource.setUser("sa");
086: dataSource
087: .setDatabase("jdbc:hsqldb:file:testdb/ddlutils_hsqldb");
088:
089: dcon.addTableToSchema(MyRecord.MY_RECORD);
090: dcon.setDataSource(dataSource);
091:
092: dcon.createModel();
093: return dcon;
094: }
095:
096: static void testAdaptor(DConnection connection) throws Exception {
097:
098: System.err.println("\n======================================= "
099: + connection.getClass().getSimpleName());
100:
101: MyRecord rec1 = addRec(connection, 1, "Fred", "First");
102: MyRecord rec2 = addRec(connection, 2, "Nerk", "Second");
103: MyRecord rec3 = addRec(connection, 3, "Bert", "Thrid");
104: MyRecord rec4 = addRec(connection, 4, "Fred", "Fourth");
105: System.err.println("Record " + rec1);
106: assertEquals("Fred", rec1.getObject(rec1.NAME));
107: rec4.setObject(rec4.DESCRIPTION, "FourthX");
108: connection.update(rec4);
109:
110: DQuery qry = new DQuery(MyRecord.MY_RECORD).addSelect(rec1.ID)
111: .addSelect(rec1.NAME).addSelect(rec1.DESCRIPTION).eq(
112: rec1.NAME, "Fred").addOrderBy(rec1.NAME)
113: .setOffset(0).setLockRecords(false);
114: // assertEquals(qry.compare(rec1, rec3), 1); // > ## returns 4?
115: // assertEquals(qry.compare(rec3, rec4), -1); // <
116: assertEquals(qry.compare(rec3, rec3), 0);
117: assertEquals(!rec1.equals(rec2), true);
118: assertEquals(rec1.hashCode() != rec2.hashCode(), true);
119:
120: Iterator recI = qry.execute(connection);
121: MyRecord lrec = null;
122: int count = 0;
123: while (recI.hasNext()) {
124: lrec = (MyRecord) recI.next();
125: System.err.println("Queried " + ++count + " :"
126: + lrec.toLongString());
127: }
128: assertEquals(2, count);
129: assertEquals(lrec, rec4);
130: assertEquals(lrec == rec4, false);
131: String descr4 = lrec.getString(lrec.DESCRIPTION);
132: assertEquals(descr4, "FourthX");
133:
134: DQuery qry2 = new DQuery(MyRecord.MY_RECORD).addSelect(rec1.ID)
135: .addSelect(rec1.NAME).eq(rec1.ID, 2);
136: MyRecord q2r2 = (MyRecord) qry2.executeOnlyRecord(connection);
137: assertEquals(q2r2, rec2);
138:
139: MyRecord q3r3 = (MyRecord) new DQuery(MyRecord.MY_RECORD)
140: .queryPrimaryKey(connection, 3);
141: assertEquals(q3r3, rec3);
142:
143: }
144:
145: static MyRecord addRec(DConnection connection, int id, String name,
146: String description) {
147: MyRecord rec1 = (MyRecord) connection
148: .newInstance(MyRecord.MY_RECORD); // ## MESSY
149: rec1.setObject(rec1.ID, id);
150: rec1.setObject(rec1.NAME, name);
151: rec1.setObject(rec1.DESCRIPTION, description);
152: rec1.setObject(rec1.UNQUERIED, "UnQueried" + id);
153: connection.insert(rec1);
154: return rec1;
155: }
156:
157: static void assertEquals(Object expected, Object actual) {
158: System.err.println("Asserting " + expected);
159: if (expected == null ? actual != null : !expected
160: .equals(actual))
161: throw new DException("assertEquals Failed " + expected
162: + " != " + actual);
163: }
164:
165: }
|