You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2007/04/01 15:33:07 UTC

svn commit: r524591 - in /cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test: java/org/apache/cayenne/access/DataContextEJBQLJoinsTest.java resources/dml/access.DataContextEJBQLJoinsTest.xml

Author: aadamchik
Date: Sun Apr  1 06:33:06 2007
New Revision: 524591

URL: http://svn.apache.org/viewvc?view=rev&rev=524591
Log:
CAY-452: EJB QL Cayenne Query
starting on the joins support - initial unit tests

Added:
    cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/DataContextEJBQLJoinsTest.java
    cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/resources/dml/access.DataContextEJBQLJoinsTest.xml

Added: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/DataContextEJBQLJoinsTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/DataContextEJBQLJoinsTest.java?view=auto&rev=524591
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/DataContextEJBQLJoinsTest.java (added)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/DataContextEJBQLJoinsTest.java Sun Apr  1 06:33:06 2007
@@ -0,0 +1,89 @@
+/*****************************************************************
+ *   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.
+ ****************************************************************/
+package org.apache.cayenne.access;
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.art.Artist;
+import org.apache.cayenne.DataObjectUtils;
+import org.apache.cayenne.query.EJBQLQuery;
+import org.apache.cayenne.unit.CayenneCase;
+
+public class DataContextEJBQLJoinsTest extends CayenneCase {
+
+    protected void setUp() throws Exception {
+        deleteTestData();
+    }
+
+    public void testThetaJoins() throws Exception {
+        createTestData("testThetaJoins");
+
+//        String ejbql = "SELECT DISTINCT a "
+//                + "FROM Artist a, Painting b "
+//                + "WHERE a.artistName = b.paintingTitle";
+//
+//        List artists = createDataContext().performQuery(new EJBQLQuery(ejbql));
+//        assertEquals(2, artists.size());
+//
+//        Set names = new HashSet(2);
+//        Iterator it = artists.iterator();
+//        while (it.hasNext()) {
+//            Artist a = (Artist) it.next();
+//            names.add(a.getArtistName());
+//        }
+//
+//        assertTrue(names.contains("AA1"));
+//        assertTrue(names.contains("BB2"));
+    }
+
+    public void testInnerJoins() throws Exception {
+        createTestData("testInnerJoins");
+
+//        String ejbql = "SELECT a "
+//                + "FROM Artist a INNER JOIN a.paintingArray p "
+//                + "WHERE a.artistName = 'A1'";
+//
+//        List artists = createDataContext().performQuery(new EJBQLQuery(ejbql));
+//        assertEquals(1, artists.size());
+//        assertEquals(33001, DataObjectUtils.intPKForObject((Artist) artists.get(0)));
+    }
+
+    public void testOuterJoins() throws Exception {
+        createTestData("testInnerJoins");
+
+        // String ejbql = "SELECT a "
+        // + "FROM Artist a LEFT JOIN a.paintingArray p "
+        // + "WHERE a.artistName = 'A1'";
+        //
+        // List artists = createDataContext().performQuery(new EJBQLQuery(ejbql));
+        // assertEquals(2, artists.size());
+        // Set ids = new HashSet(2);
+        // Iterator it = artists.iterator();
+        // while (it.hasNext()) {
+        // Artist a = (Artist) it.next();
+        // ids.add(DataObjectUtils.pkForObject(a));
+        // }
+        //
+        //        assertTrue(ids.contains(new Integer(33001)));
+        //        assertTrue(ids.contains(new Integer(33005)));
+    }
+}

Added: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/resources/dml/access.DataContextEJBQLJoinsTest.xml
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/resources/dml/access.DataContextEJBQLJoinsTest.xml?view=auto&rev=524591
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/resources/dml/access.DataContextEJBQLJoinsTest.xml (added)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/resources/dml/access.DataContextEJBQLJoinsTest.xml Sun Apr  1 06:33:06 2007
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
+
+<beans default-lazy-init="true">	
+	<bean id="A1" class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
+		<constructor-arg type="java.lang.Class"><value>org.apache.art.Artist</value></constructor-arg>
+		<constructor-arg><value>
+		insert into ARTIST (ARTIST_ID, ARTIST_NAME) values (33001, 'AA1')
+		</value></constructor-arg>
+	</bean>
+	
+	<bean id="A2" class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
+		<constructor-arg type="java.lang.Class"><value>org.apache.art.Artist</value></constructor-arg>
+		<constructor-arg><value>
+		insert into ARTIST (ARTIST_ID, ARTIST_NAME) values (33002, 'AA2')
+		</value></constructor-arg>
+	</bean>
+	
+	<bean id="A3" class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
+		<constructor-arg type="java.lang.Class"><value>org.apache.art.Artist</value></constructor-arg>
+		<constructor-arg><value>
+		insert into ARTIST (ARTIST_ID, ARTIST_NAME) values (33003, 'BB1')
+		</value></constructor-arg>
+	</bean>
+	
+	<bean id="A4" class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
+		<constructor-arg type="java.lang.Class"><value>org.apache.art.Artist</value></constructor-arg>
+		<constructor-arg><value>
+		insert into ARTIST (ARTIST_ID, ARTIST_NAME) values (33004, 'BB2')
+		</value></constructor-arg>
+	</bean>
+	
+	<bean id="A5" class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
+		<constructor-arg type="java.lang.Class"><value>org.apache.art.Artist</value></constructor-arg>
+		<constructor-arg><value>
+		insert into ARTIST (ARTIST_ID, ARTIST_NAME) values (33005, 'AA1')
+		</value></constructor-arg>
+	</bean>
+	
+	<bean id="P11" class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
+		<constructor-arg type="java.lang.Class"><value>org.apache.art.Painting</value></constructor-arg>
+		<constructor-arg><value>
+		INSERT INTO PAINTING (PAINTING_ID, PAINTING_TITLE, ARTIST_ID, ESTIMATED_PRICE) VALUES (33001, 'P1', 33001, 3000)
+		</value></constructor-arg>
+	</bean>
+	
+	<bean id="P12" class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
+		<constructor-arg type="java.lang.Class"><value>org.apache.art.Painting</value></constructor-arg>
+		<constructor-arg><value>
+		INSERT INTO PAINTING (PAINTING_ID, PAINTING_TITLE, ARTIST_ID, ESTIMATED_PRICE) VALUES (33002, 'P2', 33002, 5000)
+		</value></constructor-arg>
+	</bean>
+	
+	<bean id="P13" class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
+		<constructor-arg type="java.lang.Class"><value>org.apache.art.Painting</value></constructor-arg>
+		<constructor-arg><value>
+		INSERT INTO PAINTING (PAINTING_ID, PAINTING_TITLE, ARTIST_ID, ESTIMATED_PRICE) VALUES (33003, 'AA1', 33001, 3000)
+		</value></constructor-arg>
+	</bean>
+	
+	<bean id="P23" class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
+		<constructor-arg type="java.lang.Class"><value>org.apache.art.Painting</value></constructor-arg>
+		<constructor-arg><value>
+		INSERT INTO PAINTING (PAINTING_ID, PAINTING_TITLE, ARTIST_ID, ESTIMATED_PRICE) VALUES (33004, 'BB2', 33002, 3000)
+		</value></constructor-arg>
+	</bean>
+	
+
+	<!-- ======================================= -->
+	<!-- Data Sets -->
+	<!-- ======================================= -->	
+	
+	<bean id="testThetaJoins" class="java.util.ArrayList">
+		<constructor-arg>
+			<list>
+				<ref bean="A1"/>
+				<ref bean="A2"/>
+				<ref bean="A3"/>
+				<ref bean="A4"/>
+				<ref bean="P11"/>
+				<ref bean="P12"/>
+				<ref bean="P13"/>
+				<ref bean="P23"/>
+			</list>
+		</constructor-arg>
+	</bean>
+	
+	<bean id="testInnerJoins" class="java.util.ArrayList">
+		<constructor-arg>
+			<list>
+				<ref bean="A1"/>
+				<ref bean="A5"/>
+				<ref bean="P11"/>
+			</list>
+		</constructor-arg>
+	</bean>
+</beans>
\ No newline at end of file



Re: svn commit: r524591 - in /cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test: java/org/apache/cayenne/access/DataContextEJBQLJoinsTest.java resources/dml/access.DataContextEJBQLJoinsTest.xml

Posted by Mike Kienenberger <mk...@gmail.com>.
Hmm.   Not sure.  I seem to recall that there's some kind of visitor
pattern being used for node processing in the translator, but I don't
know if that's a close enough match.

Well, if nothing else, there's some generated-SQL unit tests we can reuse :-)

The new pattern seems a lot more amenable to supporting outer joins.
Perhaps it makes more sense to just rewrite it from scratch.

On 4/1/07, Andrus Adamchik <an...@objectstyle.org> wrote:
> The translator is based on EJB QL visitor interface [1] and generates
> a SQLTemplate. I am not sure this can be reused either?
>
> Andrus
>
> [1] http://svn.apache.org/repos/asf/cayenne/main/trunk/framework/
> cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/ejbql/
> EJBQLExpressionVisitor.java
>
>
> On Apr 1, 2007, at 9:21 PM, Mike Kienenberger wrote:
> > Oh.  Maybe I'm confused.  Are we talking about the expression
> > language?  Or the translator code?   If just the EL, then there's
> > nothing worth saving there.
> >
> > On 4/1/07, Andrus Adamchik <an...@objectstyle.org> wrote:
> >> Hi Mike,
> >>
> >> Could you post a summary of how this works?
> >>
> >> I suspect there won't be much code reuse with EJB QL implementation
> >> (although functionally EJB QL should be able to replace any of the
> >> expression stuff).
> >>
> >> Andrus
> >>
> >>
> >> On Apr 1, 2007, at 8:50 PM, Mike Kienenberger wrote:
> >>
> >> > Andrus,
> >> >
> >> > Are you interested in the joins support (and outer join support)
> >> that
> >> > I added to 1.2?   I can try to get it integrated into either 2.0 or
> >> > 3.0 later this week if you want.   The biggest weakness was the
> >> > expression language support backing it.
>
>

Re: svn commit: r524591 - in /cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test: java/org/apache/cayenne/access/DataContextEJBQLJoinsTest.java resources/dml/access.DataContextEJBQLJoinsTest.xml

Posted by Andrus Adamchik <an...@objectstyle.org>.
The translator is based on EJB QL visitor interface [1] and generates  
a SQLTemplate. I am not sure this can be reused either?

Andrus

[1] http://svn.apache.org/repos/asf/cayenne/main/trunk/framework/ 
cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/ejbql/ 
EJBQLExpressionVisitor.java


On Apr 1, 2007, at 9:21 PM, Mike Kienenberger wrote:
> Oh.  Maybe I'm confused.  Are we talking about the expression
> language?  Or the translator code?   If just the EL, then there's
> nothing worth saving there.
>
> On 4/1/07, Andrus Adamchik <an...@objectstyle.org> wrote:
>> Hi Mike,
>>
>> Could you post a summary of how this works?
>>
>> I suspect there won't be much code reuse with EJB QL implementation
>> (although functionally EJB QL should be able to replace any of the
>> expression stuff).
>>
>> Andrus
>>
>>
>> On Apr 1, 2007, at 8:50 PM, Mike Kienenberger wrote:
>>
>> > Andrus,
>> >
>> > Are you interested in the joins support (and outer join support)  
>> that
>> > I added to 1.2?   I can try to get it integrated into either 2.0 or
>> > 3.0 later this week if you want.   The biggest weakness was the
>> > expression language support backing it.


Re: svn commit: r524591 - in /cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test: java/org/apache/cayenne/access/DataContextEJBQLJoinsTest.java resources/dml/access.DataContextEJBQLJoinsTest.xml

Posted by Mike Kienenberger <mk...@gmail.com>.
Oh.  Maybe I'm confused.  Are we talking about the expression
language?  Or the translator code?   If just the EL, then there's
nothing worth saving there.

On 4/1/07, Andrus Adamchik <an...@objectstyle.org> wrote:
> Hi Mike,
>
> Could you post a summary of how this works?
>
> I suspect there won't be much code reuse with EJB QL implementation
> (although functionally EJB QL should be able to replace any of the
> expression stuff).
>
> Andrus
>
>
> On Apr 1, 2007, at 8:50 PM, Mike Kienenberger wrote:
>
> > Andrus,
> >
> > Are you interested in the joins support (and outer join support) that
> > I added to 1.2?   I can try to get it integrated into either 2.0 or
> > 3.0 later this week if you want.   The biggest weakness was the
> > expression language support backing it.
> >
> > On 4/1/07, aadamchik@apache.org <aa...@apache.org> wrote:
> >> Author: aadamchik
> >> Date: Sun Apr  1 06:33:06 2007
> >> New Revision: 524591
> >>
> >> URL: http://svn.apache.org/viewvc?view=rev&rev=524591
> >> Log:
> >> CAY-452: EJB QL Cayenne Query
> >> starting on the joins support - initial unit tests
> >>
> >> Added:
> >>     cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/
> >> test/java/org/apache/cayenne/access/DataContextEJBQLJoinsTest.java
> >>     cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/
> >> test/resources/dml/access.DataContextEJBQLJoinsTest.xml
> >>
> >> Added: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/
> >> test/java/org/apache/cayenne/access/DataContextEJBQLJoinsTest.java
> >> URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/
> >> cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/
> >> DataContextEJBQLJoinsTest.java?view=auto&rev=524591
> >> =====================================================================
> >> =========
> >> --- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/
> >> test/java/org/apache/cayenne/access/DataContextEJBQLJoinsTest.java
> >> (added)
> >> +++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/
> >> test/java/org/apache/cayenne/access/DataContextEJBQLJoinsTest.java
> >> Sun Apr  1 06:33:06 2007
> >> @@ -0,0 +1,89 @@
> >> +/*****************************************************************
> >> + *   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.
> >> + ****************************************************************/
> >> +package org.apache.cayenne.access;
> >> +
> >> +import java.util.HashSet;
> >> +import java.util.Iterator;
> >> +import java.util.List;
> >> +import java.util.Set;
> >> +
> >> +import org.apache.art.Artist;
> >> +import org.apache.cayenne.DataObjectUtils;
> >> +import org.apache.cayenne.query.EJBQLQuery;
> >> +import org.apache.cayenne.unit.CayenneCase;
> >> +
> >> +public class DataContextEJBQLJoinsTest extends CayenneCase {
> >> +
> >> +    protected void setUp() throws Exception {
> >> +        deleteTestData();
> >> +    }
> >> +
> >> +    public void testThetaJoins() throws Exception {
> >> +        createTestData("testThetaJoins");
> >> +
> >> +//        String ejbql = "SELECT DISTINCT a "
> >> +//                + "FROM Artist a, Painting b "
> >> +//                + "WHERE a.artistName = b.paintingTitle";
> >> +//
> >> +//        List artists = createDataContext().performQuery(new
> >> EJBQLQuery(ejbql));
> >> +//        assertEquals(2, artists.size());
> >> +//
> >> +//        Set names = new HashSet(2);
> >> +//        Iterator it = artists.iterator();
> >> +//        while (it.hasNext()) {
> >> +//            Artist a = (Artist) it.next();
> >> +//            names.add(a.getArtistName());
> >> +//        }
> >> +//
> >> +//        assertTrue(names.contains("AA1"));
> >> +//        assertTrue(names.contains("BB2"));
> >> +    }
> >> +
> >> +    public void testInnerJoins() throws Exception {
> >> +        createTestData("testInnerJoins");
> >> +
> >> +//        String ejbql = "SELECT a "
> >> +//                + "FROM Artist a INNER JOIN a.paintingArray p "
> >> +//                + "WHERE a.artistName = 'A1'";
> >> +//
> >> +//        List artists = createDataContext().performQuery(new
> >> EJBQLQuery(ejbql));
> >> +//        assertEquals(1, artists.size());
> >> +//        assertEquals(33001, DataObjectUtils.intPKForObject
> >> ((Artist) artists.get(0)));
> >> +    }
> >> +
> >> +    public void testOuterJoins() throws Exception {
> >> +        createTestData("testInnerJoins");
> >> +
> >> +        // String ejbql = "SELECT a "
> >> +        // + "FROM Artist a LEFT JOIN a.paintingArray p "
> >> +        // + "WHERE a.artistName = 'A1'";
> >> +        //
> >> +        // List artists = createDataContext().performQuery(new
> >> EJBQLQuery(ejbql));
> >> +        // assertEquals(2, artists.size());
> >> +        // Set ids = new HashSet(2);
> >> +        // Iterator it = artists.iterator();
> >> +        // while (it.hasNext()) {
> >> +        // Artist a = (Artist) it.next();
> >> +        // ids.add(DataObjectUtils.pkForObject(a));
> >> +        // }
> >> +        //
> >> +        //        assertTrue(ids.contains(new Integer(33001)));
> >> +        //        assertTrue(ids.contains(new Integer(33005)));
> >> +    }
> >> +}
> >>
> >> Added: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/
> >> test/resources/dml/access.DataContextEJBQLJoinsTest.xml
> >> URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/
> >> cayenne-jdk1.4-unpublished/src/test/resources/dml/
> >> access.DataContextEJBQLJoinsTest.xml?view=auto&rev=524591
> >> =====================================================================
> >> =========
> >> --- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/
> >> test/resources/dml/access.DataContextEJBQLJoinsTest.xml (added)
> >> +++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/
> >> test/resources/dml/access.DataContextEJBQLJoinsTest.xml Sun Apr  1
> >> 06:33:06 2007
> >> @@ -0,0 +1,97 @@
> >> +<?xml version="1.0" encoding="UTF-8" ?>
> >> +<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://
> >> www.springframework.org/dtd/spring-beans.dtd">
> >> +
> >> +<beans default-lazy-init="true">
> >> +       <bean id="A1"
> >> class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
> >> +               <constructor-arg
> >> type="java.lang.Class"><value>org.apache.art.Artist</value></
> >> constructor-arg>
> >> +               <constructor-arg><value>
> >> +               insert into ARTIST (ARTIST_ID, ARTIST_NAME) values
> >> (33001, 'AA1')
> >> +               </value></constructor-arg>
> >> +       </bean>
> >> +
> >> +       <bean id="A2"
> >> class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
> >> +               <constructor-arg
> >> type="java.lang.Class"><value>org.apache.art.Artist</value></
> >> constructor-arg>
> >> +               <constructor-arg><value>
> >> +               insert into ARTIST (ARTIST_ID, ARTIST_NAME) values
> >> (33002, 'AA2')
> >> +               </value></constructor-arg>
> >> +       </bean>
> >> +
> >> +       <bean id="A3"
> >> class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
> >> +               <constructor-arg
> >> type="java.lang.Class"><value>org.apache.art.Artist</value></
> >> constructor-arg>
> >> +               <constructor-arg><value>
> >> +               insert into ARTIST (ARTIST_ID, ARTIST_NAME) values
> >> (33003, 'BB1')
> >> +               </value></constructor-arg>
> >> +       </bean>
> >> +
> >> +       <bean id="A4"
> >> class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
> >> +               <constructor-arg
> >> type="java.lang.Class"><value>org.apache.art.Artist</value></
> >> constructor-arg>
> >> +               <constructor-arg><value>
> >> +               insert into ARTIST (ARTIST_ID, ARTIST_NAME) values
> >> (33004, 'BB2')
> >> +               </value></constructor-arg>
> >> +       </bean>
> >> +
> >> +       <bean id="A5"
> >> class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
> >> +               <constructor-arg
> >> type="java.lang.Class"><value>org.apache.art.Artist</value></
> >> constructor-arg>
> >> +               <constructor-arg><value>
> >> +               insert into ARTIST (ARTIST_ID, ARTIST_NAME) values
> >> (33005, 'AA1')
> >> +               </value></constructor-arg>
> >> +       </bean>
> >> +
> >> +       <bean id="P11"
> >> class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
> >> +               <constructor-arg
> >> type="java.lang.Class"><value>org.apache.art.Painting</value></
> >> constructor-arg>
> >> +               <constructor-arg><value>
> >> +               INSERT INTO PAINTING (PAINTING_ID, PAINTING_TITLE,
> >> ARTIST_ID, ESTIMATED_PRICE) VALUES (33001, 'P1', 33001, 3000)
> >> +               </value></constructor-arg>
> >> +       </bean>
> >> +
> >> +       <bean id="P12"
> >> class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
> >> +               <constructor-arg
> >> type="java.lang.Class"><value>org.apache.art.Painting</value></
> >> constructor-arg>
> >> +               <constructor-arg><value>
> >> +               INSERT INTO PAINTING (PAINTING_ID, PAINTING_TITLE,
> >> ARTIST_ID, ESTIMATED_PRICE) VALUES (33002, 'P2', 33002, 5000)
> >> +               </value></constructor-arg>
> >> +       </bean>
> >> +
> >> +       <bean id="P13"
> >> class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
> >> +               <constructor-arg
> >> type="java.lang.Class"><value>org.apache.art.Painting</value></
> >> constructor-arg>
> >> +               <constructor-arg><value>
> >> +               INSERT INTO PAINTING (PAINTING_ID, PAINTING_TITLE,
> >> ARTIST_ID, ESTIMATED_PRICE) VALUES (33003, 'AA1', 33001, 3000)
> >> +               </value></constructor-arg>
> >> +       </bean>
> >> +
> >> +       <bean id="P23"
> >> class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
> >> +               <constructor-arg
> >> type="java.lang.Class"><value>org.apache.art.Painting</value></
> >> constructor-arg>
> >> +               <constructor-arg><value>
> >> +               INSERT INTO PAINTING (PAINTING_ID, PAINTING_TITLE,
> >> ARTIST_ID, ESTIMATED_PRICE) VALUES (33004, 'BB2', 33002, 3000)
> >> +               </value></constructor-arg>
> >> +       </bean>
> >> +
> >> +
> >> +       <!-- ======================================= -->
> >> +       <!-- Data Sets -->
> >> +       <!-- ======================================= -->
> >> +
> >> +       <bean id="testThetaJoins" class="java.util.ArrayList">
> >> +               <constructor-arg>
> >> +                       <list>
> >> +                               <ref bean="A1"/>
> >> +                               <ref bean="A2"/>
> >> +                               <ref bean="A3"/>
> >> +                               <ref bean="A4"/>
> >> +                               <ref bean="P11"/>
> >> +                               <ref bean="P12"/>
> >> +                               <ref bean="P13"/>
> >> +                               <ref bean="P23"/>
> >> +                       </list>
> >> +               </constructor-arg>
> >> +       </bean>
> >> +
> >> +       <bean id="testInnerJoins" class="java.util.ArrayList">
> >> +               <constructor-arg>
> >> +                       <list>
> >> +                               <ref bean="A1"/>
> >> +                               <ref bean="A5"/>
> >> +                               <ref bean="P11"/>
> >> +                       </list>
> >> +               </constructor-arg>
> >> +       </bean>
> >> +</beans>
> >> \ No newline at end of file
> >>
> >>
> >>
> >
>
>

Re: svn commit: r524591 - in /cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test: java/org/apache/cayenne/access/DataContextEJBQLJoinsTest.java resources/dml/access.DataContextEJBQLJoinsTest.xml

Posted by Andrus Adamchik <an...@objectstyle.org>.
Hi Mike,

Could you post a summary of how this works?

I suspect there won't be much code reuse with EJB QL implementation  
(although functionally EJB QL should be able to replace any of the  
expression stuff).

Andrus


On Apr 1, 2007, at 8:50 PM, Mike Kienenberger wrote:

> Andrus,
>
> Are you interested in the joins support (and outer join support) that
> I added to 1.2?   I can try to get it integrated into either 2.0 or
> 3.0 later this week if you want.   The biggest weakness was the
> expression language support backing it.
>
> On 4/1/07, aadamchik@apache.org <aa...@apache.org> wrote:
>> Author: aadamchik
>> Date: Sun Apr  1 06:33:06 2007
>> New Revision: 524591
>>
>> URL: http://svn.apache.org/viewvc?view=rev&rev=524591
>> Log:
>> CAY-452: EJB QL Cayenne Query
>> starting on the joins support - initial unit tests
>>
>> Added:
>>     cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/ 
>> test/java/org/apache/cayenne/access/DataContextEJBQLJoinsTest.java
>>     cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/ 
>> test/resources/dml/access.DataContextEJBQLJoinsTest.xml
>>
>> Added: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/ 
>> test/java/org/apache/cayenne/access/DataContextEJBQLJoinsTest.java
>> URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/ 
>> cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/ 
>> DataContextEJBQLJoinsTest.java?view=auto&rev=524591
>> ===================================================================== 
>> =========
>> --- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/ 
>> test/java/org/apache/cayenne/access/DataContextEJBQLJoinsTest.java  
>> (added)
>> +++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/ 
>> test/java/org/apache/cayenne/access/DataContextEJBQLJoinsTest.java  
>> Sun Apr  1 06:33:06 2007
>> @@ -0,0 +1,89 @@
>> +/*****************************************************************
>> + *   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.
>> + ****************************************************************/
>> +package org.apache.cayenne.access;
>> +
>> +import java.util.HashSet;
>> +import java.util.Iterator;
>> +import java.util.List;
>> +import java.util.Set;
>> +
>> +import org.apache.art.Artist;
>> +import org.apache.cayenne.DataObjectUtils;
>> +import org.apache.cayenne.query.EJBQLQuery;
>> +import org.apache.cayenne.unit.CayenneCase;
>> +
>> +public class DataContextEJBQLJoinsTest extends CayenneCase {
>> +
>> +    protected void setUp() throws Exception {
>> +        deleteTestData();
>> +    }
>> +
>> +    public void testThetaJoins() throws Exception {
>> +        createTestData("testThetaJoins");
>> +
>> +//        String ejbql = "SELECT DISTINCT a "
>> +//                + "FROM Artist a, Painting b "
>> +//                + "WHERE a.artistName = b.paintingTitle";
>> +//
>> +//        List artists = createDataContext().performQuery(new  
>> EJBQLQuery(ejbql));
>> +//        assertEquals(2, artists.size());
>> +//
>> +//        Set names = new HashSet(2);
>> +//        Iterator it = artists.iterator();
>> +//        while (it.hasNext()) {
>> +//            Artist a = (Artist) it.next();
>> +//            names.add(a.getArtistName());
>> +//        }
>> +//
>> +//        assertTrue(names.contains("AA1"));
>> +//        assertTrue(names.contains("BB2"));
>> +    }
>> +
>> +    public void testInnerJoins() throws Exception {
>> +        createTestData("testInnerJoins");
>> +
>> +//        String ejbql = "SELECT a "
>> +//                + "FROM Artist a INNER JOIN a.paintingArray p "
>> +//                + "WHERE a.artistName = 'A1'";
>> +//
>> +//        List artists = createDataContext().performQuery(new  
>> EJBQLQuery(ejbql));
>> +//        assertEquals(1, artists.size());
>> +//        assertEquals(33001, DataObjectUtils.intPKForObject 
>> ((Artist) artists.get(0)));
>> +    }
>> +
>> +    public void testOuterJoins() throws Exception {
>> +        createTestData("testInnerJoins");
>> +
>> +        // String ejbql = "SELECT a "
>> +        // + "FROM Artist a LEFT JOIN a.paintingArray p "
>> +        // + "WHERE a.artistName = 'A1'";
>> +        //
>> +        // List artists = createDataContext().performQuery(new  
>> EJBQLQuery(ejbql));
>> +        // assertEquals(2, artists.size());
>> +        // Set ids = new HashSet(2);
>> +        // Iterator it = artists.iterator();
>> +        // while (it.hasNext()) {
>> +        // Artist a = (Artist) it.next();
>> +        // ids.add(DataObjectUtils.pkForObject(a));
>> +        // }
>> +        //
>> +        //        assertTrue(ids.contains(new Integer(33001)));
>> +        //        assertTrue(ids.contains(new Integer(33005)));
>> +    }
>> +}
>>
>> Added: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/ 
>> test/resources/dml/access.DataContextEJBQLJoinsTest.xml
>> URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/ 
>> cayenne-jdk1.4-unpublished/src/test/resources/dml/ 
>> access.DataContextEJBQLJoinsTest.xml?view=auto&rev=524591
>> ===================================================================== 
>> =========
>> --- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/ 
>> test/resources/dml/access.DataContextEJBQLJoinsTest.xml (added)
>> +++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/ 
>> test/resources/dml/access.DataContextEJBQLJoinsTest.xml Sun Apr  1  
>> 06:33:06 2007
>> @@ -0,0 +1,97 @@
>> +<?xml version="1.0" encoding="UTF-8" ?>
>> +<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http:// 
>> www.springframework.org/dtd/spring-beans.dtd">
>> +
>> +<beans default-lazy-init="true">
>> +       <bean id="A1"  
>> class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
>> +               <constructor-arg  
>> type="java.lang.Class"><value>org.apache.art.Artist</value></ 
>> constructor-arg>
>> +               <constructor-arg><value>
>> +               insert into ARTIST (ARTIST_ID, ARTIST_NAME) values  
>> (33001, 'AA1')
>> +               </value></constructor-arg>
>> +       </bean>
>> +
>> +       <bean id="A2"  
>> class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
>> +               <constructor-arg  
>> type="java.lang.Class"><value>org.apache.art.Artist</value></ 
>> constructor-arg>
>> +               <constructor-arg><value>
>> +               insert into ARTIST (ARTIST_ID, ARTIST_NAME) values  
>> (33002, 'AA2')
>> +               </value></constructor-arg>
>> +       </bean>
>> +
>> +       <bean id="A3"  
>> class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
>> +               <constructor-arg  
>> type="java.lang.Class"><value>org.apache.art.Artist</value></ 
>> constructor-arg>
>> +               <constructor-arg><value>
>> +               insert into ARTIST (ARTIST_ID, ARTIST_NAME) values  
>> (33003, 'BB1')
>> +               </value></constructor-arg>
>> +       </bean>
>> +
>> +       <bean id="A4"  
>> class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
>> +               <constructor-arg  
>> type="java.lang.Class"><value>org.apache.art.Artist</value></ 
>> constructor-arg>
>> +               <constructor-arg><value>
>> +               insert into ARTIST (ARTIST_ID, ARTIST_NAME) values  
>> (33004, 'BB2')
>> +               </value></constructor-arg>
>> +       </bean>
>> +
>> +       <bean id="A5"  
>> class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
>> +               <constructor-arg  
>> type="java.lang.Class"><value>org.apache.art.Artist</value></ 
>> constructor-arg>
>> +               <constructor-arg><value>
>> +               insert into ARTIST (ARTIST_ID, ARTIST_NAME) values  
>> (33005, 'AA1')
>> +               </value></constructor-arg>
>> +       </bean>
>> +
>> +       <bean id="P11"  
>> class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
>> +               <constructor-arg  
>> type="java.lang.Class"><value>org.apache.art.Painting</value></ 
>> constructor-arg>
>> +               <constructor-arg><value>
>> +               INSERT INTO PAINTING (PAINTING_ID, PAINTING_TITLE,  
>> ARTIST_ID, ESTIMATED_PRICE) VALUES (33001, 'P1', 33001, 3000)
>> +               </value></constructor-arg>
>> +       </bean>
>> +
>> +       <bean id="P12"  
>> class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
>> +               <constructor-arg  
>> type="java.lang.Class"><value>org.apache.art.Painting</value></ 
>> constructor-arg>
>> +               <constructor-arg><value>
>> +               INSERT INTO PAINTING (PAINTING_ID, PAINTING_TITLE,  
>> ARTIST_ID, ESTIMATED_PRICE) VALUES (33002, 'P2', 33002, 5000)
>> +               </value></constructor-arg>
>> +       </bean>
>> +
>> +       <bean id="P13"  
>> class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
>> +               <constructor-arg  
>> type="java.lang.Class"><value>org.apache.art.Painting</value></ 
>> constructor-arg>
>> +               <constructor-arg><value>
>> +               INSERT INTO PAINTING (PAINTING_ID, PAINTING_TITLE,  
>> ARTIST_ID, ESTIMATED_PRICE) VALUES (33003, 'AA1', 33001, 3000)
>> +               </value></constructor-arg>
>> +       </bean>
>> +
>> +       <bean id="P23"  
>> class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
>> +               <constructor-arg  
>> type="java.lang.Class"><value>org.apache.art.Painting</value></ 
>> constructor-arg>
>> +               <constructor-arg><value>
>> +               INSERT INTO PAINTING (PAINTING_ID, PAINTING_TITLE,  
>> ARTIST_ID, ESTIMATED_PRICE) VALUES (33004, 'BB2', 33002, 3000)
>> +               </value></constructor-arg>
>> +       </bean>
>> +
>> +
>> +       <!-- ======================================= -->
>> +       <!-- Data Sets -->
>> +       <!-- ======================================= -->
>> +
>> +       <bean id="testThetaJoins" class="java.util.ArrayList">
>> +               <constructor-arg>
>> +                       <list>
>> +                               <ref bean="A1"/>
>> +                               <ref bean="A2"/>
>> +                               <ref bean="A3"/>
>> +                               <ref bean="A4"/>
>> +                               <ref bean="P11"/>
>> +                               <ref bean="P12"/>
>> +                               <ref bean="P13"/>
>> +                               <ref bean="P23"/>
>> +                       </list>
>> +               </constructor-arg>
>> +       </bean>
>> +
>> +       <bean id="testInnerJoins" class="java.util.ArrayList">
>> +               <constructor-arg>
>> +                       <list>
>> +                               <ref bean="A1"/>
>> +                               <ref bean="A5"/>
>> +                               <ref bean="P11"/>
>> +                       </list>
>> +               </constructor-arg>
>> +       </bean>
>> +</beans>
>> \ No newline at end of file
>>
>>
>>
>


Re: svn commit: r524591 - in /cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test: java/org/apache/cayenne/access/DataContextEJBQLJoinsTest.java resources/dml/access.DataContextEJBQLJoinsTest.xml

Posted by Mike Kienenberger <mk...@gmail.com>.
Andrus,

Are you interested in the joins support (and outer join support) that
I added to 1.2?   I can try to get it integrated into either 2.0 or
3.0 later this week if you want.   The biggest weakness was the
expression language support backing it.

On 4/1/07, aadamchik@apache.org <aa...@apache.org> wrote:
> Author: aadamchik
> Date: Sun Apr  1 06:33:06 2007
> New Revision: 524591
>
> URL: http://svn.apache.org/viewvc?view=rev&rev=524591
> Log:
> CAY-452: EJB QL Cayenne Query
> starting on the joins support - initial unit tests
>
> Added:
>     cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/DataContextEJBQLJoinsTest.java
>     cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/resources/dml/access.DataContextEJBQLJoinsTest.xml
>
> Added: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/DataContextEJBQLJoinsTest.java
> URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/DataContextEJBQLJoinsTest.java?view=auto&rev=524591
> ==============================================================================
> --- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/DataContextEJBQLJoinsTest.java (added)
> +++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/DataContextEJBQLJoinsTest.java Sun Apr  1 06:33:06 2007
> @@ -0,0 +1,89 @@
> +/*****************************************************************
> + *   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.
> + ****************************************************************/
> +package org.apache.cayenne.access;
> +
> +import java.util.HashSet;
> +import java.util.Iterator;
> +import java.util.List;
> +import java.util.Set;
> +
> +import org.apache.art.Artist;
> +import org.apache.cayenne.DataObjectUtils;
> +import org.apache.cayenne.query.EJBQLQuery;
> +import org.apache.cayenne.unit.CayenneCase;
> +
> +public class DataContextEJBQLJoinsTest extends CayenneCase {
> +
> +    protected void setUp() throws Exception {
> +        deleteTestData();
> +    }
> +
> +    public void testThetaJoins() throws Exception {
> +        createTestData("testThetaJoins");
> +
> +//        String ejbql = "SELECT DISTINCT a "
> +//                + "FROM Artist a, Painting b "
> +//                + "WHERE a.artistName = b.paintingTitle";
> +//
> +//        List artists = createDataContext().performQuery(new EJBQLQuery(ejbql));
> +//        assertEquals(2, artists.size());
> +//
> +//        Set names = new HashSet(2);
> +//        Iterator it = artists.iterator();
> +//        while (it.hasNext()) {
> +//            Artist a = (Artist) it.next();
> +//            names.add(a.getArtistName());
> +//        }
> +//
> +//        assertTrue(names.contains("AA1"));
> +//        assertTrue(names.contains("BB2"));
> +    }
> +
> +    public void testInnerJoins() throws Exception {
> +        createTestData("testInnerJoins");
> +
> +//        String ejbql = "SELECT a "
> +//                + "FROM Artist a INNER JOIN a.paintingArray p "
> +//                + "WHERE a.artistName = 'A1'";
> +//
> +//        List artists = createDataContext().performQuery(new EJBQLQuery(ejbql));
> +//        assertEquals(1, artists.size());
> +//        assertEquals(33001, DataObjectUtils.intPKForObject((Artist) artists.get(0)));
> +    }
> +
> +    public void testOuterJoins() throws Exception {
> +        createTestData("testInnerJoins");
> +
> +        // String ejbql = "SELECT a "
> +        // + "FROM Artist a LEFT JOIN a.paintingArray p "
> +        // + "WHERE a.artistName = 'A1'";
> +        //
> +        // List artists = createDataContext().performQuery(new EJBQLQuery(ejbql));
> +        // assertEquals(2, artists.size());
> +        // Set ids = new HashSet(2);
> +        // Iterator it = artists.iterator();
> +        // while (it.hasNext()) {
> +        // Artist a = (Artist) it.next();
> +        // ids.add(DataObjectUtils.pkForObject(a));
> +        // }
> +        //
> +        //        assertTrue(ids.contains(new Integer(33001)));
> +        //        assertTrue(ids.contains(new Integer(33005)));
> +    }
> +}
>
> Added: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/resources/dml/access.DataContextEJBQLJoinsTest.xml
> URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/resources/dml/access.DataContextEJBQLJoinsTest.xml?view=auto&rev=524591
> ==============================================================================
> --- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/resources/dml/access.DataContextEJBQLJoinsTest.xml (added)
> +++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/resources/dml/access.DataContextEJBQLJoinsTest.xml Sun Apr  1 06:33:06 2007
> @@ -0,0 +1,97 @@
> +<?xml version="1.0" encoding="UTF-8" ?>
> +<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
> +
> +<beans default-lazy-init="true">
> +       <bean id="A1" class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
> +               <constructor-arg type="java.lang.Class"><value>org.apache.art.Artist</value></constructor-arg>
> +               <constructor-arg><value>
> +               insert into ARTIST (ARTIST_ID, ARTIST_NAME) values (33001, 'AA1')
> +               </value></constructor-arg>
> +       </bean>
> +
> +       <bean id="A2" class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
> +               <constructor-arg type="java.lang.Class"><value>org.apache.art.Artist</value></constructor-arg>
> +               <constructor-arg><value>
> +               insert into ARTIST (ARTIST_ID, ARTIST_NAME) values (33002, 'AA2')
> +               </value></constructor-arg>
> +       </bean>
> +
> +       <bean id="A3" class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
> +               <constructor-arg type="java.lang.Class"><value>org.apache.art.Artist</value></constructor-arg>
> +               <constructor-arg><value>
> +               insert into ARTIST (ARTIST_ID, ARTIST_NAME) values (33003, 'BB1')
> +               </value></constructor-arg>
> +       </bean>
> +
> +       <bean id="A4" class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
> +               <constructor-arg type="java.lang.Class"><value>org.apache.art.Artist</value></constructor-arg>
> +               <constructor-arg><value>
> +               insert into ARTIST (ARTIST_ID, ARTIST_NAME) values (33004, 'BB2')
> +               </value></constructor-arg>
> +       </bean>
> +
> +       <bean id="A5" class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
> +               <constructor-arg type="java.lang.Class"><value>org.apache.art.Artist</value></constructor-arg>
> +               <constructor-arg><value>
> +               insert into ARTIST (ARTIST_ID, ARTIST_NAME) values (33005, 'AA1')
> +               </value></constructor-arg>
> +       </bean>
> +
> +       <bean id="P11" class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
> +               <constructor-arg type="java.lang.Class"><value>org.apache.art.Painting</value></constructor-arg>
> +               <constructor-arg><value>
> +               INSERT INTO PAINTING (PAINTING_ID, PAINTING_TITLE, ARTIST_ID, ESTIMATED_PRICE) VALUES (33001, 'P1', 33001, 3000)
> +               </value></constructor-arg>
> +       </bean>
> +
> +       <bean id="P12" class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
> +               <constructor-arg type="java.lang.Class"><value>org.apache.art.Painting</value></constructor-arg>
> +               <constructor-arg><value>
> +               INSERT INTO PAINTING (PAINTING_ID, PAINTING_TITLE, ARTIST_ID, ESTIMATED_PRICE) VALUES (33002, 'P2', 33002, 5000)
> +               </value></constructor-arg>
> +       </bean>
> +
> +       <bean id="P13" class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
> +               <constructor-arg type="java.lang.Class"><value>org.apache.art.Painting</value></constructor-arg>
> +               <constructor-arg><value>
> +               INSERT INTO PAINTING (PAINTING_ID, PAINTING_TITLE, ARTIST_ID, ESTIMATED_PRICE) VALUES (33003, 'AA1', 33001, 3000)
> +               </value></constructor-arg>
> +       </bean>
> +
> +       <bean id="P23" class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
> +               <constructor-arg type="java.lang.Class"><value>org.apache.art.Painting</value></constructor-arg>
> +               <constructor-arg><value>
> +               INSERT INTO PAINTING (PAINTING_ID, PAINTING_TITLE, ARTIST_ID, ESTIMATED_PRICE) VALUES (33004, 'BB2', 33002, 3000)
> +               </value></constructor-arg>
> +       </bean>
> +
> +
> +       <!-- ======================================= -->
> +       <!-- Data Sets -->
> +       <!-- ======================================= -->
> +
> +       <bean id="testThetaJoins" class="java.util.ArrayList">
> +               <constructor-arg>
> +                       <list>
> +                               <ref bean="A1"/>
> +                               <ref bean="A2"/>
> +                               <ref bean="A3"/>
> +                               <ref bean="A4"/>
> +                               <ref bean="P11"/>
> +                               <ref bean="P12"/>
> +                               <ref bean="P13"/>
> +                               <ref bean="P23"/>
> +                       </list>
> +               </constructor-arg>
> +       </bean>
> +
> +       <bean id="testInnerJoins" class="java.util.ArrayList">
> +               <constructor-arg>
> +                       <list>
> +                               <ref bean="A1"/>
> +                               <ref bean="A5"/>
> +                               <ref bean="P11"/>
> +                       </list>
> +               </constructor-arg>
> +       </bean>
> +</beans>
> \ No newline at end of file
>
>
>

Re: svn commit: r524591 - in /cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test: java/org/apache/cayenne/access/DataContextEJBQLJoinsTest.java resources/dml/access.DataContextEJBQLJoinsTest.xml

Posted by Mike Kienenberger <mk...@gmail.com>.
Andrus,

Are you interested in the joins support (and outer join support) that
I added to 1.2?   I can try to get it integrated into either 2.0 or
3.0 later this week if you want.   The biggest weakness was the
expression language support backing it.

On 4/1/07, aadamchik@apache.org <aa...@apache.org> wrote:
> Author: aadamchik
> Date: Sun Apr  1 06:33:06 2007
> New Revision: 524591
>
> URL: http://svn.apache.org/viewvc?view=rev&rev=524591
> Log:
> CAY-452: EJB QL Cayenne Query
> starting on the joins support - initial unit tests
>
> Added:
>     cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/DataContextEJBQLJoinsTest.java
>     cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/resources/dml/access.DataContextEJBQLJoinsTest.xml
>
> Added: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/DataContextEJBQLJoinsTest.java
> URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/DataContextEJBQLJoinsTest.java?view=auto&rev=524591
> ==============================================================================
> --- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/DataContextEJBQLJoinsTest.java (added)
> +++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/DataContextEJBQLJoinsTest.java Sun Apr  1 06:33:06 2007
> @@ -0,0 +1,89 @@
> +/*****************************************************************
> + *   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.
> + ****************************************************************/
> +package org.apache.cayenne.access;
> +
> +import java.util.HashSet;
> +import java.util.Iterator;
> +import java.util.List;
> +import java.util.Set;
> +
> +import org.apache.art.Artist;
> +import org.apache.cayenne.DataObjectUtils;
> +import org.apache.cayenne.query.EJBQLQuery;
> +import org.apache.cayenne.unit.CayenneCase;
> +
> +public class DataContextEJBQLJoinsTest extends CayenneCase {
> +
> +    protected void setUp() throws Exception {
> +        deleteTestData();
> +    }
> +
> +    public void testThetaJoins() throws Exception {
> +        createTestData("testThetaJoins");
> +
> +//        String ejbql = "SELECT DISTINCT a "
> +//                + "FROM Artist a, Painting b "
> +//                + "WHERE a.artistName = b.paintingTitle";
> +//
> +//        List artists = createDataContext().performQuery(new EJBQLQuery(ejbql));
> +//        assertEquals(2, artists.size());
> +//
> +//        Set names = new HashSet(2);
> +//        Iterator it = artists.iterator();
> +//        while (it.hasNext()) {
> +//            Artist a = (Artist) it.next();
> +//            names.add(a.getArtistName());
> +//        }
> +//
> +//        assertTrue(names.contains("AA1"));
> +//        assertTrue(names.contains("BB2"));
> +    }
> +
> +    public void testInnerJoins() throws Exception {
> +        createTestData("testInnerJoins");
> +
> +//        String ejbql = "SELECT a "
> +//                + "FROM Artist a INNER JOIN a.paintingArray p "
> +//                + "WHERE a.artistName = 'A1'";
> +//
> +//        List artists = createDataContext().performQuery(new EJBQLQuery(ejbql));
> +//        assertEquals(1, artists.size());
> +//        assertEquals(33001, DataObjectUtils.intPKForObject((Artist) artists.get(0)));
> +    }
> +
> +    public void testOuterJoins() throws Exception {
> +        createTestData("testInnerJoins");
> +
> +        // String ejbql = "SELECT a "
> +        // + "FROM Artist a LEFT JOIN a.paintingArray p "
> +        // + "WHERE a.artistName = 'A1'";
> +        //
> +        // List artists = createDataContext().performQuery(new EJBQLQuery(ejbql));
> +        // assertEquals(2, artists.size());
> +        // Set ids = new HashSet(2);
> +        // Iterator it = artists.iterator();
> +        // while (it.hasNext()) {
> +        // Artist a = (Artist) it.next();
> +        // ids.add(DataObjectUtils.pkForObject(a));
> +        // }
> +        //
> +        //        assertTrue(ids.contains(new Integer(33001)));
> +        //        assertTrue(ids.contains(new Integer(33005)));
> +    }
> +}
>
> Added: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/resources/dml/access.DataContextEJBQLJoinsTest.xml
> URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/resources/dml/access.DataContextEJBQLJoinsTest.xml?view=auto&rev=524591
> ==============================================================================
> --- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/resources/dml/access.DataContextEJBQLJoinsTest.xml (added)
> +++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/resources/dml/access.DataContextEJBQLJoinsTest.xml Sun Apr  1 06:33:06 2007
> @@ -0,0 +1,97 @@
> +<?xml version="1.0" encoding="UTF-8" ?>
> +<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
> +
> +<beans default-lazy-init="true">
> +       <bean id="A1" class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
> +               <constructor-arg type="java.lang.Class"><value>org.apache.art.Artist</value></constructor-arg>
> +               <constructor-arg><value>
> +               insert into ARTIST (ARTIST_ID, ARTIST_NAME) values (33001, 'AA1')
> +               </value></constructor-arg>
> +       </bean>
> +
> +       <bean id="A2" class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
> +               <constructor-arg type="java.lang.Class"><value>org.apache.art.Artist</value></constructor-arg>
> +               <constructor-arg><value>
> +               insert into ARTIST (ARTIST_ID, ARTIST_NAME) values (33002, 'AA2')
> +               </value></constructor-arg>
> +       </bean>
> +
> +       <bean id="A3" class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
> +               <constructor-arg type="java.lang.Class"><value>org.apache.art.Artist</value></constructor-arg>
> +               <constructor-arg><value>
> +               insert into ARTIST (ARTIST_ID, ARTIST_NAME) values (33003, 'BB1')
> +               </value></constructor-arg>
> +       </bean>
> +
> +       <bean id="A4" class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
> +               <constructor-arg type="java.lang.Class"><value>org.apache.art.Artist</value></constructor-arg>
> +               <constructor-arg><value>
> +               insert into ARTIST (ARTIST_ID, ARTIST_NAME) values (33004, 'BB2')
> +               </value></constructor-arg>
> +       </bean>
> +
> +       <bean id="A5" class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
> +               <constructor-arg type="java.lang.Class"><value>org.apache.art.Artist</value></constructor-arg>
> +               <constructor-arg><value>
> +               insert into ARTIST (ARTIST_ID, ARTIST_NAME) values (33005, 'AA1')
> +               </value></constructor-arg>
> +       </bean>
> +
> +       <bean id="P11" class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
> +               <constructor-arg type="java.lang.Class"><value>org.apache.art.Painting</value></constructor-arg>
> +               <constructor-arg><value>
> +               INSERT INTO PAINTING (PAINTING_ID, PAINTING_TITLE, ARTIST_ID, ESTIMATED_PRICE) VALUES (33001, 'P1', 33001, 3000)
> +               </value></constructor-arg>
> +       </bean>
> +
> +       <bean id="P12" class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
> +               <constructor-arg type="java.lang.Class"><value>org.apache.art.Painting</value></constructor-arg>
> +               <constructor-arg><value>
> +               INSERT INTO PAINTING (PAINTING_ID, PAINTING_TITLE, ARTIST_ID, ESTIMATED_PRICE) VALUES (33002, 'P2', 33002, 5000)
> +               </value></constructor-arg>
> +       </bean>
> +
> +       <bean id="P13" class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
> +               <constructor-arg type="java.lang.Class"><value>org.apache.art.Painting</value></constructor-arg>
> +               <constructor-arg><value>
> +               INSERT INTO PAINTING (PAINTING_ID, PAINTING_TITLE, ARTIST_ID, ESTIMATED_PRICE) VALUES (33003, 'AA1', 33001, 3000)
> +               </value></constructor-arg>
> +       </bean>
> +
> +       <bean id="P23" class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
> +               <constructor-arg type="java.lang.Class"><value>org.apache.art.Painting</value></constructor-arg>
> +               <constructor-arg><value>
> +               INSERT INTO PAINTING (PAINTING_ID, PAINTING_TITLE, ARTIST_ID, ESTIMATED_PRICE) VALUES (33004, 'BB2', 33002, 3000)
> +               </value></constructor-arg>
> +       </bean>
> +
> +
> +       <!-- ======================================= -->
> +       <!-- Data Sets -->
> +       <!-- ======================================= -->
> +
> +       <bean id="testThetaJoins" class="java.util.ArrayList">
> +               <constructor-arg>
> +                       <list>
> +                               <ref bean="A1"/>
> +                               <ref bean="A2"/>
> +                               <ref bean="A3"/>
> +                               <ref bean="A4"/>
> +                               <ref bean="P11"/>
> +                               <ref bean="P12"/>
> +                               <ref bean="P13"/>
> +                               <ref bean="P23"/>
> +                       </list>
> +               </constructor-arg>
> +       </bean>
> +
> +       <bean id="testInnerJoins" class="java.util.ArrayList">
> +               <constructor-arg>
> +                       <list>
> +                               <ref bean="A1"/>
> +                               <ref bean="A5"/>
> +                               <ref bean="P11"/>
> +                       </list>
> +               </constructor-arg>
> +       </bean>
> +</beans>
> \ No newline at end of file
>
>
>