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, [EMAIL PROTECTED] <[EMAIL PROTECTED]> 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
