do you have any idea why it doesn’t like the second version:

this works:

public static synchronized EOQualifier thatAreForPersonByInstrument(Person 
person) {
     EOQualifier theQualifier1 = 
Book.INSTRUMENT_BOOKS.containsAnyObjectSatisfying(
                     
InstrumentBook.INSTRUMENT.eq(Instrument.fetchInstrument(person.editingContext(),
 Instrument.INSTRUMENT_NAME.eq("French Horn"))));
      return theQualifier1;
}


this fails with    Exception caught: Unknown qualifier type 
‘er.extensions.eof.qualifiers.ERXExistsQualifier’:


public static synchronized EOQualifier thatAreForPersonByInstrument(Person 
person) {

     EOQualifier theQualifier1 = 
Book.INSTRUMENT_BOOKS.containsAnyObjectSatisfying(
                                
InstrumentBook.INSTRUMENT.dot(Instrument.PERSON_INSTRUMENTS.containsAnyObjectSatisfying(PersonInstrument.PERSON.eq(person))));
     return theQualifier1;
}



On Feb 6, 2015, at 11:04 AM, David Avendasora <[email protected]> wrote:

> How recent is your Wonder? The exists qualifier  is relatively new (past 
> couple years). 
> 
> If you give me a stack track trace I might be able to further diagnose it.
> 
> Thanks!
> 
> Dave
> 
>> On Feb 6, 2015, at 9:03 AM, Theodore Petrosky <[email protected]> wrote:
>> 
>> before I beat myself up too much. I have ERExtensions in the class path. Why 
>> would I get this error:
>> 
>> java.lang.UnsupportedOperationException: Unknown qualifier type 
>> 'er.extensions.eof.qualifiers.ERXExistsQualifier’.
>> 
>> 
>> On Feb 5, 2015, at 4:51 PM, David Avendasora <[email protected]> 
>> wrote:
>> 
>>>> On Feb 5, 2015, at 1:38 PM, Theodore Petrosky <[email protected]> wrote:
>>>> 
>>>> David,
>>>> 
>>>> I am deliberately not responding to the list. Would you be interested in 
>>>> helping me get my head around this? If yes, what I can do, is when we are 
>>>> complete with this part, I will document it and submit it to the wiki docs.
>>>> 
>>>> What do you think, I can create a concrete example. The goal would be to 
>>>> add the static EOQualifier methods and create the rules that access them.’
>>> 
>>> I help with what I can. I’m pretty busy, but qualifiers are kinda my thing. 
>>> :-)
>>> 
>>>  I would really like it if you also posted this to the list as that is 
>>> where a lot of people search.
>>> 
>>>> like this guy a static method on Person:
>>>> 
>>>> Person <->> PersonInstrument <<-> Instrument <->> InstrumentBook <<-> Book
>>>> 
>>>> Then:
>>>> public static synchronized EOQualifier thatAreForPersonByInstrument(Person 
>>>> person) {
>>>>    return Book.INSTRUMENT_BOOKS.containsAnyObjectSatisfying( 
>>>>           InstrumentBook.INSTRUMENT.dot( 
>>>>           Instrument.PERSON_INSTRUMENTS.containsAnyObjectSatisfying( 
>>>>           PersonInstrument.PERSON.is( person ) ) ) );
>>>> }
>>>> 
>>>> how would you create a rule to access use this.
>>> 
>>> When I’ve done D2W stuff where I don’t want the full list of values for a 
>>> relationship, I used the “restrictedChoiceKey"
>>> 
>>> 90 : ((pageConfiguration like 'Create*' or pageConfiguration like 'Edit*') 
>>> and (propertyKey = 'book')) => restrictedChoiceKey = 
>>> "object.availableBooks" [com.webobjects.directtoweb.Assignment]
>>> 
>>> You specify the regular relationship key of the relationship you want to 
>>> set in this case "(propertyKey = 'book’)" , but set the rule’s key to 
>>> "restrictedChoiceKey” and point it to a different keypath that contains the 
>>> qualified (and sorted, if needed) list of valid values, in this case 
>>> “object.availableBooks”.  (the “object” in the binding keypath just means 
>>> to look on the same object that the “propertyKey” binding is for. 
>>> 
>>> In the code below, I’m assuming “Person” is also the class that has the 
>>> “book” propertyKey, if it isn’t you’ll just have to change how you get the 
>>> person object.
>>> 
>>> The method would look something like this:
>>> 
>>> public NSArray<Book> availableBooks() {
>>>     NSArray<Book> allBooks = [however you get the list of all books from 
>>> the DB];
>>>     EOQualifier thatAreAvailableToPerson = 
>>> Book.thatAreForPersonByInstrument(this);
>>>     MSArray<Book> availableBooks = ERXQ.filtered(allBooks, 
>>> thatAreAvailableToPerson);
>>>     return availableBooks;
>>> }
>>> 
>>> That’s really about it.
>>> 
>>> I hope this helps, and please do post this back to the list in some form!
>>> 
>>> Dave
>>> 
>>>> 
>>>> Ted
>>>> 
>>>> On Feb 5, 2015, at 9:09 AM, David Avendasora <[email protected]> 
>>>> wrote:
>>>> 
>>>>> ERXExistsQualifier to the rescue!
>>>>> 
>>>>>> On Jan 29, 2015, at 9:12 AM, Theodore Petrosky <[email protected]> wrote:
>>>>>> 
>>>>>> The Person has an instrument. The Book has an instrument. so the popup 
>>>>>> list should be only those books with the same instrument.
>>>>> 
>>>>> To match instances of book that are for an instrument that is related to 
>>>>> a given person:
>>>>> 
>>>>> If this is your model:
>>>>> Person <<-> Instrument <->> Book
>>>>> 
>>>>> Then:
>>>>> public static synchronized EOQualifier 
>>>>> thatAreForPersonByInstrument(Person person) {
>>>>>   return 
>>>>> Book.INSTRUMENT.dot(Instrument.PERSONS.containsAnyObjectSatisfying( 
>>>>> person ) );
>>>>> }
>>>>> 
>>>>> OR If this is your model (seems more likely):
>>>>> 
>>>>> Person <->> PersonInstrument <<-> Instrument <->> InstrumentBook <<-> Book
>>>>> 
>>>>> Then:
>>>>> public static synchronized EOQualifier 
>>>>> thatAreForPersonByInstrument(Person person) {
>>>>>   return Book.INSTRUMENT_BOOKS.containsAnyObjectSatisfying( 
>>>>>          InstrumentBook.INSTRUMENT.dot( 
>>>>>          Instrument.PERSON_INSTRUMENTS.containsAnyObjectSatisfying( 
>>>>>          PersonInstrument.PERSON.is( person ) ) ) );
>>>>> }
>>>>> 
>>>>>> But one layer deeper. a Person is assigned to one or many Shows. the 
>>>>>> Books belong to a show. So if Person 1 only play one show and plays 
>>>>>> viola (I know its a handicapped Person), the popup list only shows that 
>>>>>> one book as available to assign.
>>>>> 
>>>>> Person <->> ShowPerson <<-> Show <->> Book
>>>>> 
>>>>> public static synchronized EOQualifier thatAreForPersonByShow(Person 
>>>>> person) {
>>>>>   return Book.SHOW.dot( 
>>>>>                Show.SHOW_PERSON.containsAnyObjectSatisfying( 
>>>>>          ShowPerson.PERSON.is( person ) ) );
>>>>> }
>>>>> 
>>>>> And to combine them together:
>>>>> 
>>>>> public static synchronized EOQualifier thatAreForPerson(Person person) {
>>>>>   return Book.thatAreForPersonByInstrument( person )
>>>>>              .and( thatAreForPersonByShow( person ) );
>>>>> }
>>>>> 
>>>>> By making these static methods, not only can you use that in your fetch 
>>>>> specification, but you can also use it to check to see if a book is 
>>>>> available to a person (for example, in validateForSave, or wherever else):
>>>>> 
>>>>> public boolean isVisibleTo(Person person) {
>>>>>   return thatAreForPerson(person).evaluateWithObject(this);
>>>>> }
>>>>> 
>>>>> Dave
>>>>> 
>>>>> 
>>>>> —————————————————————————————
>>>>> WebObjects - so easy that even Dave Avendasora can do it!™
>>>>> —————————————————————————————
>>>>> David Avendasora
>>>>> Senior Software Abuser
>>>>> Nekesto, Inc.
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>> 
>>> 
>>> 
>>> —————————————————————————————
>>> WebObjects - so easy that even Dave Avendasora can do it!™
>>> —————————————————————————————
>>> David Avendasora
>>> Senior Software Abuser
>>> Nekesto, Inc.
>>> 
>> 
> 
> 
> —————————————————————————————
> WebObjects - so easy that even Dave Avendasora can do it!™
> —————————————————————————————
> David Avendasora
> Senior Software Abuser
> Nekesto, Inc.
> 
> 
> 
> 
> 

 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list      ([email protected])
Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/webobjects-dev/archive%40mail-archive.com

This email sent to [email protected]

Reply via email to