OK, I have tried to generalize it, without changing anything significant.
Basically, the legacy architecture has a Student entity/table, a Person entity/table (which represents Adults only, NOT students), a StudentPerson entity/table which is essentially a join containing extra info not currently relevant. There is also a Family entity/table and each Student and Person has a to-one to Family.
Not all Person/Student combinations in a Family have a corresponding row in StudentPerson, hence to dual path to find these Persons.
The code:
public void setSelectedSchools(NSMutableArray<School> newSelectedSchools) { this.selectedSchools = newSelectedSchools;
if (newSelectedSchools == null || newSelectedSchools.count() == 0) { newSelectedSchools = schools().mutableClone(); } // this should get persons who have students in the schools listed // i.e. family.students.activeSchools || studentPersons.student.activeSchools EOQualifier schoolViaStudentPersonQualifier = Person.STUDENT_PERSONS.dot( StudentPerson.STUDENT.dot(Student.SCHOOLS)).in(newSelectedSchools); EOQualifier schoolViaFamilyQualifier = Person.FAMILY.dot( Family.STUDENTS.dot(Student.SCHOOLS)).in(newSelectedSchools); EOQualifier schoolQualifier = new ERXOrQualifier(new NSArray<EOQualifier>(schoolViaFamilyQualifier, schoolViaStudentPersonQualifier));
displayGroup().setQualifierForKey(schoolQualifier, schoolQualifierKey);
}
and:
public void setRelatedStudentsByStudentFirstName(String studentFirst){ relatedStudentsByStudentFirstName = studentFirst; EOQualifier relatedStudentsByStudentFirstNameQualifier; if(studentFirst == null || studentFirst.equals("")){ displayGroup().setQualifierForKey(null, relatedStudentsByStudentFirstNameQualifierKey); } else { NSMutableArray<EOQualifier>qualifiers = new NSMutableArray<EOQualifier>(); qualifiers.add(Person.STUDENT_PERSONS.dot(StudentPerson.STUDENT).dot(Student.FIRSTNAME).like(studentFirst)); qualifiers.add(Person.FAMILY.dot(Family.STUDENTS).dot(Student.FIRSTNAME).like(studentFirst));
relatedStudentsByStudentFirstNameQualifier = new ERXOrQualifier(qualifiers); displayGroup().setQualifierForKey(relatedStudentsByStudentFirstNameQualifier, relatedStudentsByStudentFirstNameQualifierKey); }
}
From the log (formatted):
DG qualifier: ( ( ( (family.students.schools = (School)'<School pk:"1">') or (family.students.schools = (School)'<School pk:"2">') or (family.students.schools = (School)'<School pk:"3">') or (family.students.schools = (School)'<School pk:"4">') or (family.students.schools = (School)'<School pk:"5">') or (family.students.schools = (School)'<School pk:"6">') or (family.students.schools = (School)'<School pk:"7">') or (family.students.schools.Schools = (School)'<School pk:"8">') or (family.students.schools = (School)'<School pk:"9">') or (family.students.schools = (School)'<School pk:"10">') ) or ( (StudentPersons.Student.Schools = (School)'<School pk:"1">') or (StudentPersons.Student.Schools = (School)'<School pk:"2">') or (StudentPersons.Student.Schools = (School)'<School pk:"3">') or (StudentPersons.Student.Schools = (School)'<School pk:"4">') or (StudentPersons.Student.Schools = (School)'<School pk:"5">') or (StudentPersons.Student.Schools = (School)'<School pk:"6">') or (StudentPersons.Student.Schools = (School)'<School pk:"7">') or (StudentPersons.Student.Schools = (School)'<School pk:"8">') or (StudentPersons.Student.Schools = (School)'<School pk:"9">') or (StudentPersons.Student.Schools = (School)'<School pk:"10">') ) ) and ( (StudentPersons.Student.firstname like 'Hillary') or (samsFamily.Students.firstname like 'Hillary') ) )
On Dec 28, 2009, at 12:53 PM, Chuck Hill wrote: On Dec 28, 2009, at 9:06 AM, Andrew R. Kinnie wrote: As a followup, I get the correct number of rows if I comment out any code which sorts the displayGroup using attributes other than the id column of the entity populating the displayGroup.
Without sorting, and with setUsesDistinct(true); I get 23 rows. Navigation works.
If I then try to sort the displayGroup (using in this case the entity's lastname then firstname attributes) I get the oracle error, because the inner most select statement generated by Wonder/EOF has a distinct, but is trying to orderby attributes that are in the outermost select but not the inner most select where the distinct statement is.
Is this a bug in Wonder where setUsesDistinct(true); does not work with sorting?
Am I missing something?
What is the qualifier? If you are using one of the Wonder qualifiers, you may have found a bug or may be using them incorrectly. Chuck -- Chuck Hill Senior Consultant / VP Development Practical WebObjects - for developers who want to increase their overall knowledge of WebObjects or who are trying to solve specific problems. http://www.global-village.net/products/practical_webobjects
|