You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ojb-dev@db.apache.org by br...@apache.org on 2005/03/11 21:44:56 UTC
cvs commit: db-ojb/src/test/org/apache/ojb/broker ReferenceTest.java
brj 2005/03/11 12:44:56
Modified: src/schema ojbtest-schema.xml
src/test/org/apache/ojb/broker ReferenceTest.java
Log:
extended reference test
Revision Changes Path
1.95 +7 -4 db-ojb/src/schema/ojbtest-schema.xml
Index: ojbtest-schema.xml
===================================================================
RCS file: /home/cvs/db-ojb/src/schema/ojbtest-schema.xml,v
retrieving revision 1.94
retrieving revision 1.95
diff -u -r1.94 -r1.95
--- ojbtest-schema.xml 11 Mar 2005 19:44:40 -0000 1.94
+++ ojbtest-schema.xml 11 Mar 2005 20:44:56 -0000 1.95
@@ -848,22 +848,25 @@
<table name="REF_OBJ_A">
<column name="OBJ_ID" required="true" primaryKey="true" type="INTEGER"/>
<column name="NAME" type="VARCHAR" size="150"/>
+ <column name="FK_COL_REF" type="INTEGER"/>
<column name="FK_REF" type="INTEGER"/>
</table>
<table name="REF_OBJ_B">
<column name="OBJ_ID" required="true" primaryKey="true" type="INTEGER"/>
<column name="NAME" type="VARCHAR" size="150"/>
+ <column name="FK_COL_REF" type="INTEGER"/>
<column name="FK_REF" type="INTEGER"/>
</table>
-
+
<table name="REF_OBJ_C">
<column name="OBJ_ID" required="true" primaryKey="true" type="INTEGER"/>
<column name="NAME" type="VARCHAR" size="150"/>
+ <column name="NAME_C" type="VARCHAR" size="150"/>
+ <column name="FK_COL_REF" type="INTEGER"/>
<column name="FK_REF" type="INTEGER"/>
</table>
-
<!-- =================================================== -->
<!-- PrimaryKeyForeignKeyTest - PB-api -->
<!-- =================================================== -->
@@ -1568,7 +1571,7 @@
javaName="articleName"/>
<column name="Lieferanten_Nr" type="INTEGER"
javaName="supplierId"/>
- <column name="KatName" type="VARCHAR" size="150"
+ <column name="KatName" type="VARCHAR" size="150"
javaName="productGroupName"/>
<column name="Liefereinheit" type="VARCHAR" size="150"
javaName="unit"/>
1.20 +310 -53 db-ojb/src/test/org/apache/ojb/broker/ReferenceTest.java
Index: ReferenceTest.java
===================================================================
RCS file: /home/cvs/db-ojb/src/test/org/apache/ojb/broker/ReferenceTest.java,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -r1.19 -r1.20
--- ReferenceTest.java 20 Nov 2004 09:30:33 -0000 1.19
+++ ReferenceTest.java 11 Mar 2005 20:44:56 -0000 1.20
@@ -1,8 +1,10 @@
package org.apache.ojb.broker;
import java.io.Serializable;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
+import java.util.List;
import org.apache.ojb.broker.metadata.ClassDescriptor;
import org.apache.ojb.broker.metadata.ObjectReferenceDescriptor;
@@ -39,6 +41,294 @@
}
}
+ /**
+ * Test the usage of interface as class-ref in collection-descriptor
+ * when using inheritance.
+ */
+ public void testInterfaceAsCollectionRef_1()
+ {
+ // if(skipKnownIssueProblem("query using path via reference, like 'ref1.ref2.name'")) return;
+ String name = "testQueryWithCollectionRef_" + System.currentTimeMillis();
+ RefObject a = new ObjA();
+ RefObject a2 = new ObjA();
+ RefObject b = new ObjB();
+ RefObject b2 = new ObjB();
+ // this object has a 1:n relation
+ ObjC c1 = new ObjC();
+ // only used in the c object reference collection
+ RefObject d1 = new ObjC();
+ RefObject d2 = new ObjC();
+ ObjC c2 = new ObjC();
+
+ c1.setName(name+"_third");
+ b.setName(name+"_second_1");
+ b2.setName(name+"_second_2");
+ a.setName(name+"_first_1");
+ a2.setName(name+"_first_2");
+ d1.setName(name+"_d1");
+ d2.setName(name+"_d2");
+ c2.setName(name + "_c2");
+
+ c1.setNameC(name + "_1");
+ c2.setNameC(name + "_2");
+
+ a.setRef(b);
+ b.setRef(c1);
+ a2.setRef(b2);
+
+ List refList = new ArrayList();
+ refList.add(a);
+ refList.add(b2);
+ refList.add(d1);
+ c1.setReferences(refList);
+ List refList2 = new ArrayList();
+ refList2.add(d2);
+ c2.setReferences(refList2);
+
+ broker.beginTransaction();
+ broker.store(a);
+ broker.store(a2);
+ broker.store(c2);
+ broker.commitTransaction();
+
+ // check existence of objects
+ Criteria crit = new Criteria();
+ crit.addLike("name", name + "%");
+ Query q = QueryFactory.newQuery(RefObject.class, crit);
+ Collection result = broker.getCollectionByQuery(q);
+ assertEquals(8, result.size());
+
+ // expect all 'C' objects with 1:n reference object
+ // with name '..._d1' --> 'c1'
+ crit = new Criteria();
+ crit.addEqualTo("references.name", name+"_d1");
+ q = QueryFactory.newQuery(ObjC.class, crit);
+ result = broker.getCollectionByQuery(q);
+ assertEquals(1, result.size());
+ ObjC newC = (ObjC) result.iterator().next();
+ assertEquals(name + "_1", newC.getNameC());
+
+ // expect all 'C' objects with 1:n reference object
+ // with nameC '..._%' --> 'c1' 'c2'
+ crit = new Criteria();
+ crit.addLike("nameC", name+"_%");
+ q = QueryFactory.newQuery(ObjC.class, crit);
+ result = broker.getCollectionByQuery(q);
+ assertEquals(2, result.size());
+
+ // expect all 'B' objects with 1:1 to an RefObject which
+ // has an 1:n reference object
+ // with name '..._d1' --> 'b'
+ crit = new Criteria();
+ crit.addEqualTo("ref.references.name", name+"_d1");
+ // add this because only 'C' objects have a 1:n reference
+ crit.addPathClass("ref", ObjC.class);
+ q = QueryFactory.newQuery(ObjB.class, crit);
+ result = broker.getCollectionByQuery(q);
+ assertEquals(1, result.size());
+ ObjB newB = (ObjB) result.iterator().next();
+ assertNotNull(newB.getRef());
+ assertTrue(newB.getRef() instanceof ObjC);
+ newC = (ObjC) newB.getRef();
+ assertEquals(3, newC.getReferences().size());
+
+ // expect all 'B' objects with 1:1 to an RefObject which
+ // has an 1:n reference object
+ // with name '..._d1' --> 'b'
+ crit = new Criteria();
+ crit.addLike("ref.nameC", name+"_%");
+ // add this because only 'C' objects have a 1:n reference
+ crit.addPathClass("ref", ObjC.class);
+ q = QueryFactory.newQuery(ObjB.class, crit);
+ result = broker.getCollectionByQuery(q);
+ assertEquals(1, result.size());
+ newB = (ObjB) result.iterator().next();
+ assertNotNull(newB.getRef());
+ assertTrue(newB.getRef() instanceof ObjC);
+ newC = (ObjC) newB.getRef();
+ assertEquals(3, newC.getReferences().size());
+
+ // expect all A's which have a B called '_second_1'
+ crit = new Criteria();
+ crit.addLike("name", name+"_%");
+ crit.addEqualTo("ref.name", name+"_second_1");
+ crit.addPathClass("ref", ObjB.class);
+ q = QueryFactory.newQuery(ObjA.class, crit);
+ result = broker.getCollectionByQuery(q);
+ assertEquals(1, result.size());
+
+ // expect all A's which have a B called '_second_1' and
+ // a C called '_third'
+ crit = new Criteria();
+ crit.addLike("name", name+"_%");
+ crit.addEqualTo("ref.name", name+"_second_1");
+ crit.addEqualTo("ref.ref.name", name+"_third");
+ crit.addPathClass("ref", ObjB.class);
+ crit.addPathClass("ref.ref", ObjC.class);
+ q = QueryFactory.newQuery(ObjA.class, crit);
+ result = broker.getCollectionByQuery(q);
+ assertEquals(1, result.size());
+
+ // expect all A's which third level 'ref' has a 'references'
+ // field collection, this is only valid for 'C' class objects
+ // and references contain '..._d1' object --> 'a'
+ crit = new Criteria();
+ crit.addLike("name", name+"_%");
+ crit.addEqualTo("ref.ref.references.name", name+"_d1");
+ crit.addPathClass("ref", ObjB.class);
+ crit.addPathClass("ref.ref", ObjC.class);
+ q = QueryFactory.newQuery(ObjA.class, crit);
+ result = broker.getCollectionByQuery(q);
+ assertEquals(1, result.size());
+ for(Iterator iterator = result.iterator(); iterator.hasNext();)
+ {
+ RefObject ref = (RefObject) iterator.next();
+ assertTrue(ref instanceof ObjA);
+ String refName = ref.getName();
+ assertTrue(!(refName.indexOf(name)<0));
+ }
+
+ // expect all A's with reference object named '_second%' and
+ // which third level 'ref' has a 'references'
+ // field collection, this is only valid for 'C' class objects
+ // and references contain '..._second%' objects --> 'a'
+ crit = new Criteria();
+ crit.addLike("name", name+"_%");
+ crit.addLike("ref.name", name+"_second%");
+ crit.addLike("ref.ref.references.name", name+"_second%");
+ crit.addPathClass("ref", ObjB.class);
+ crit.addPathClass("ref.ref", ObjC.class);
+ q = QueryFactory.newQuery(ObjA.class, crit);
+ result = broker.getCollectionByQuery(q);
+ assertEquals(1, result.size());
+ for(Iterator iterator = result.iterator(); iterator.hasNext();)
+ {
+ RefObject ref = (RefObject) iterator.next();
+ assertTrue(ref instanceof ObjA);
+ String refName = ref.getName();
+ assertTrue(!(refName.indexOf(name)<0));
+ }
+ }
+
+ /**
+ * Test the usage of interface as class-ref in collection-descriptor
+ * when using inheritance.
+ */
+ public void testInterfaceAsCollectionRef_2()
+ {
+ // if(skipKnownIssueProblem("query using path via reference, like 'ref1.ref2.name'")) return;
+ String name = "testQueryWithCollectionRef_" + System.currentTimeMillis();
+ RefObject a = new ObjA();
+ RefObject a2 = new ObjA();
+ RefObject b = new ObjB();
+ RefObject b2 = new ObjB();
+ // this object has a 1:n relation
+ ObjC c = new ObjC();
+ // only used in the c object reference collection
+ RefObject d = new ObjC();
+
+ c.setName(name+"_third");
+ b.setName(name+"_second_1");
+ b2.setName(name+"_second_2");
+ a.setName(name+"_first_1");
+ a2.setName(name+"_first_2");
+ d.setName(name+"_none");
+
+ a.setRef(b);
+ b.setRef(c);
+ a2.setRef(b2);
+
+ List refList = new ArrayList();
+ refList.add(a);
+ refList.add(b2);
+ refList.add(d);
+ c.setReferences(refList);
+
+ broker.beginTransaction();
+ broker.store(a);
+ broker.store(a2);
+ broker.commitTransaction();
+
+ // check existence of objects
+ Criteria crit = new Criteria();
+ crit.addEqualTo("name", name+"_third");
+ Query q = QueryFactory.newQuery(RefObject.class, crit);
+ Collection result = broker.getCollectionByQuery(q);
+ assertEquals(1, result.size());
+ ObjC newC = (ObjC) result.iterator().next();
+ assertNotNull(newC.getReferences());
+ assertEquals(3, newC.getReferences().size());
+
+ // test n-level depth
+ //*****************************************
+ crit = new Criteria();
+ crit.addEqualTo("ref.ref.name", name+"_third");
+ q = QueryFactory.newQuery(ObjA.class, crit);
+ result = broker.getCollectionByQuery(q);
+ assertEquals(1, result.size());
+ //*****************************************
+
+ crit = new Criteria();
+ crit.addLike("references.name", name+"_first%");
+ q = QueryFactory.newQuery(ObjC.class, crit);
+ result = broker.getCollectionByQuery(q);
+ assertEquals(1, result.size());
+
+ // expect all A's with name "_first_2" or with second
+ // level 'ref' "_third" in this case object 'a' and 'a2'
+ crit = new Criteria();
+ crit.addEqualTo("name", name+"_first_2");
+ Criteria critOr = new Criteria();
+ critOr.addEqualTo("ref.ref.name", name+"_third");
+ crit.addOrCriteria(critOr);
+ q = QueryFactory.newQuery(ObjA.class, crit);
+ result = broker.getCollectionByQuery(q);
+ assertEquals(2, result.size());
+ for(Iterator iterator = result.iterator(); iterator.hasNext();)
+ {
+ RefObject ref = (RefObject) iterator.next();
+ assertTrue(ref instanceof ObjA);
+ String refName = ref.getName();
+ assertTrue(!(refName.indexOf(name)<0));
+ }
+
+ // expect all A's which second level 'ref' is "_third"
+ // in this case object 'a'
+ crit = new Criteria();
+ crit.addLike("name", name+"_%");
+ Criteria critAnd = new Criteria();
+ critAnd.addEqualTo("ref.ref.name", name+"_third");
+ crit.addAndCriteria(critAnd);
+ q = QueryFactory.newQuery(ObjA.class, crit);
+ result = broker.getCollectionByQuery(q);
+ assertEquals(1, result.size());
+ for(Iterator iterator = result.iterator(); iterator.hasNext();)
+ {
+ RefObject ref = (RefObject) iterator.next();
+ assertTrue(ref instanceof ObjA);
+ String refName = ref.getName();
+ assertTrue(!(refName.indexOf(name)<0));
+ }
+
+ // expect all A's with first level 'ref' "_second%"
+ // in this case object 'a' and 'a2'
+ crit = new Criteria();
+ crit.addLike("ref.name", name+"_second%");
+ critAnd = new Criteria();
+ critAnd.addLike("name", name+"%");
+ crit.addAndCriteria(critAnd);
+ q = QueryFactory.newQuery(ObjA.class, crit);
+ result = broker.getCollectionByQuery(q);
+ assertEquals(2, result.size());
+ for(Iterator iterator = result.iterator(); iterator.hasNext();)
+ {
+ RefObject ref = (RefObject) iterator.next();
+ assertTrue(ref instanceof ObjA);
+ String refName = ref.getName();
+ assertTrue(!(refName.indexOf(name)<0));
+ }
+ }
+
public void testDeepPathQuery()
{
// if(skipKnownIssueProblem("query using path via reference, like 'ref1.ref2.name'")) return;
@@ -1565,6 +1855,7 @@
Integer id;
String name;
RefObject ref;
+ Integer fkColRef;
public Integer getId()
{
@@ -1586,41 +1877,14 @@
this.name = name;
}
- public RefObject getRef()
- {
- return ref;
- }
-
- public void setRef(RefObject ref)
- {
- this.ref = ref;
- }
- }
-
- public static class ObjB implements RefObject
- {
- Integer id;
- String name;
- RefObject ref;
-
- public Integer getId()
- {
- return id;
- }
-
- public void setId(Integer id)
+ public Integer getFkColRef()
{
- this.id = id;
+ return fkColRef;
}
- public String getName()
+ public void setFkColRef(Integer fkColRef)
{
- return name;
- }
-
- public void setName(String name)
- {
- this.name = name;
+ this.fkColRef = fkColRef;
}
public RefObject getRef()
@@ -1634,40 +1898,33 @@
}
}
- public static class ObjC implements RefObject
+ public static class ObjB extends ObjA
{
- Integer id;
- String name;
- RefObject ref;
-
- public Integer getId()
- {
- return id;
- }
+ }
- public void setId(Integer id)
- {
- this.id = id;
- }
+ public static class ObjC extends ObjA
+ {
+ String nameC;
+ List references;
- public String getName()
+ public String getNameC()
{
- return name;
+ return nameC;
}
- public void setName(String name)
+ public void setNameC(String nameC)
{
- this.name = name;
+ this.nameC = nameC;
}
- public RefObject getRef()
+ public List getReferences()
{
- return ref;
+ return references;
}
- public void setRef(RefObject ref)
+ public void setReferences(List references)
{
- this.ref = ref;
+ this.references = references;
}
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-dev-help@db.apache.org