1
// $Id: JoinedSubclassFilterTest.java 10977 2006-12-12 23:28:04Z steve.ebersole@jboss.com $
2
package org.hibernate.test.subclassfilter;
4
import java.util.ArrayList;
5
import java.util.HashSet;
6
import java.util.Iterator;
9
import junit.framework.Test;
11
import org.hibernate.Transaction;
12
import org.hibernate.classic.Session;
13
import org.hibernate.junit.functional.FunctionalTestCase;
14
import org.hibernate.junit.functional.FunctionalTestClassTestSuite;
17
* Implementation of JoinedSubclassFilterTest.
19
* @author Steve Ebersole
21
public class JoinedSubclassFilterTest extends FunctionalTestCase {
23
public JoinedSubclassFilterTest(String name) {
27
public final String[] getMappings() {
28
return new String[] { "subclassfilter/joined-subclass.hbm.xml" };
31
public static Test suite() {
32
return new FunctionalTestClassTestSuite( JoinedSubclassFilterTest.class );
35
public void testFiltersWithJoinedSubclass() {
36
Session s = openSession();
37
s.enableFilter( "region" ).setParameter( "userRegion", "US" );
38
Transaction t = s.beginTransaction();
43
List results = s.createQuery( "from Person" ).list();
44
assertEquals( "Incorrect qry result count", 4, results.size() );
47
results = s.createQuery( "from Employee" ).list();
48
assertEquals( "Incorrect qry result count", 2, results.size() );
49
Iterator itr = results.iterator();
50
while ( itr.hasNext() ) {
52
final Person p = ( Person ) itr.next();
53
if ( p.getName().equals( "John Doe" ) ) {
54
Employee john = ( Employee ) p;
55
assertEquals( "Incorrect fecthed minions count", 2, john.getMinions().size() );
61
// TODO : currently impossible to define a collection-level filter w/ joined-subclass elements that will filter based on a superclass column and function correctly in (theta only?) outer joins;
62
// this is consistent with the behaviour of a collection-level where.
63
// this might be one argument for "pulling" the attached class-level filters into collection assocations,
64
// although we'd need some way to apply the appropriate alias in that scenario.
65
results = new ArrayList( new HashSet( s.createQuery( "from Person as p left join fetch p.minions" ).list() ) );
66
assertEquals( "Incorrect qry result count", 4, results.size() );
67
itr = results.iterator();
68
while ( itr.hasNext() ) {
70
final Person p = ( Person ) itr.next();
71
if ( p.getName().equals( "John Doe" ) ) {
72
Employee john = ( Employee ) p;
73
assertEquals( "Incorrect fecthed minions count", 2, john.getMinions().size() );
79
results = new ArrayList( new HashSet( s.createQuery( "from Employee as p left join fetch p.minions" ).list() ) );
80
assertEquals( "Incorrect qry result count", 2, results.size() );
81
itr = results.iterator();
82
while ( itr.hasNext() ) {
84
final Person p = ( Person ) itr.next();
85
if ( p.getName().equals( "John Doe" ) ) {
86
Employee john = ( Employee ) p;
87
assertEquals( "Incorrect fecthed minions count", 2, john.getMinions().size() );
96
t = s.beginTransaction();
97
s.createQuery( "delete Customer where contactOwner is not null" ).executeUpdate();
98
s.createQuery( "delete Employee where manager is not null" ).executeUpdate();
99
s.createQuery( "delete Person" ).executeUpdate();
104
private void prepareTestData(Session s) {
105
Employee john = new Employee("John Doe");
106
john.setCompany( "JBoss" );
107
john.setDepartment( "hr" );
108
john.setTitle( "hr guru" );
109
john.setRegion( "US" );
111
Employee polli = new Employee("Polli Wog");
112
polli.setCompany( "JBoss" );
113
polli.setDepartment( "hr" );
114
polli.setTitle( "hr novice" );
115
polli.setRegion( "US" );
116
polli.setManager( john );
117
john.getMinions().add( polli );
119
Employee suzie = new Employee( "Suzie Q" );
120
suzie.setCompany( "JBoss" );
121
suzie.setDepartment( "hr" );
122
suzie.setTitle( "hr novice" );
123
suzie.setRegion( "EMEA" );
124
suzie.setManager( john );
125
john.getMinions().add( suzie );
127
Customer cust = new Customer( "John Q Public" );
128
cust.setCompany( "Acme" );
129
cust.setRegion( "US" );
130
cust.setContactOwner( john );
132
Person ups = new Person( "UPS guy" );
133
ups.setCompany( "UPS" );
134
ups.setRegion( "US" );