On Thu, Nov 26, 2015 at 10:39 PM, Jeroen van der Wal <jer...@stromboli.it> wrote:
> @Stephen: the sole responsibility of compareTo is to provide a natural > ordering based on comparing the values of it's own members against another > object of the same type. If you have ordering requirements beyond that > scope I suggest you add an order clause to the JDOQL query or use Guava's > Ordering [1] . > I think what I am doing is OK? I am saying order my Participations first by Activity and then by Participant. So I do want to make use of the natural ordering against members of the same type, its becomes cascaded ordering surely. I will read up on it more. > > @Dan: Personally I prefer using Guava's ComparisonChain since > ObjectContracts is not typesafe. > > [1] https://github.com/google/guava/wiki/OrderingExplained > > On 26 November 2015 at 12:08, Dan Haywood <d...@haywood-associates.co.uk> > wrote: > > > Only time I've seen these sorts of index issues is when the enhancer > didn't > > run correctly over the entire codebase. > > > > With respect to compareTo implementations, in Estatio we've got away with > > using the ObjectContracts.compareTo method. So, for example, in > LeaseItem, > > whose parent is Lease and which is also identified by the leaseType and > > sequence, the implementation is just > > > > ObjectContracts.compareTo(this, other, "lease", "type", sequence); > > > > For your Participation entity I would imagine that using > > > > ObjectContracts.compareTo(this, other, "activity", "participant"); > > > > would work. As I think you allude to, it could end up resolving more > data > > than is necessary, though, in order to do the comparisons of Activity and > > then Participant within. > > > > ~~~ > > If you wanted faster comparisons, you could denormalize by holding the > key > > fields from the Activity and Participant within Participation. For > > example, if Activity is comparable on "name", and Participant on > > "firstName", "lastName" (say), then the Participation entity could define > > "activityName", "participantFirstName", "participantLastName". Then the > > comparison of Participation will just use data that's already in memory. > > > > Of course, that introduces a related problem of maintaining these derived > > properties, but for that I would use domain events or lifecycle events. > > > > Alternatively, yes, you could sort by exposing the database Id of the > > Activity and Participant, though I think you'd still need to derive them > > down into Participation (I don't know of any way to actually surface the > > implied foreign key columns into the domain entity). Perhaps even easier > > is to grab the Isis OID (which is derived ultimately from the database > Id) > > and store that, using the BookmarkService: > > > > Participant p = ...; > > Bookmark participantBookmark = bookmarkService.bookmarkFor(p); > > setParticipantId(participantBookmark.toString()); > > > > > > > > HTH > > Dan > > > > > > > > > > > > > > > > > > On 26 November 2015 at 10:46, Stephen Cameron < > steve.cameron...@gmail.com> > > wrote: > > > > > Hi, > > > > > > I am trying to improve the compareTo() functions that I have written > and > > > ran into the following error. > > > > > > > > > - java.lang.ArrayIndexOutOfBoundsException > > > - 31 > > > - > > > > > > org.datanucleus.state.StateManagerImpl#isLoaded(StateManagerImpl.java:2893) > > > > > > - > > > > > > au.com.scds.chats.dom.module.activity.RecurringActivity#getStartDateTime(RecurringActivity.java:-1) > > > > > > - sun.reflect.GeneratedMethodAccessor75#invoke(null:-1) > > > - > > > > > > sun.reflect.DelegatingMethodAccessorImpl#invoke(DelegatingMethodAccessorImpl.java:43) > > > > > > - java.lang.reflect.Method#invoke(Method.java:497) > > > - > > > org.apache.isis.applib.util.Clause#getValueOf(ObjectContracts.java:365) > > > > > > - > > > > > > org.apache.isis.applib.util.ObjectContracts#compare(ObjectContracts.java:70) > > > > > > - > > > > > > org.apache.isis.applib.util.ObjectContracts#compare(ObjectContracts.java:63) > > > > > > - > > > > > > au.com.scds.chats.dom.module.activity.Activity#compareTo(Activity.java:120) > > > > > > - > > > > > > au.com.scds.chats.dom.module.activity.Activity#compareTo(Activity.java:54) > > > > > > - > > > > > > com.google.common.collect.ComparisonChain$1#compare(ComparisonChain.java:76) > > > > > > - > > > > > > au.com.scds.chats.dom.module.participant.Participation#compareTo(Participation.java:206) > > > > > > - > > > > > > au.com.scds.chats.dom.module.participant.Participation#compareTo(Participation.java:31) > > > > > > - java.util.TreeMap#compare(TreeMap.java:1290) > > > - java.util.TreeMap#put(TreeMap.java:538) > > > - java.util.TreeSet#add(TreeSet.java:255) > > > - > > > > > > org.datanucleus.store.types.wrappers.backed.SortedSet#loadFromStore(SortedSet.java:283) > > > > > > - > > > > > > org.datanucleus.store.types.wrappers.backed.SortedSet#iterator(SortedSet.java:477) > > > > > > - > > > > > > com.google.common.collect.Collections2$TransformedCollection#iterator(Collections2.java:269) > > > > > > - > > > > > > org.apache.isis.core.metamodel.facets.collections.CollectionFacetAbstract#iterator(CollectionFacetAbstract.java:46) > > > > > > - > > > > > > org.apache.isis.core.metamodel.facets.collections.CollectionFacetAbstract$1#iterator(CollectionFacetAbstract.java:54) > > > > > > - > > > > > > org.apache.isis.core.metamodel.adapter.ObjectAdapter$Util#visibleAdapters(ObjectAdapter.java:314) > > > > > > - > > > > > > org.apache.isis.core.metamodel.adapter.ObjectAdapter$Util#visibleAdapters(ObjectAdapter.java:302) > > > > > > - > > > > > > org.apache.isis.core.metamodel.facets.collections.accessor.CollectionAccessorFacetViaAccessor#getProperty(CollectionAccessorFacetViaAccessor.java:85) > > > > > > - > > > > > > org.apache.isis.core.metamodel.specloader.specimpl.OneToManyAssociationDefault#get(OneToManyAssociationDefault.java:161) > > > > > > > > > I have the comparison for Activity now of startDateTime then name then > > > region, so the comparison of Participations (a link table between > > Activity > > > and Participant) is of Activity first and then Participant. This gets > > quite > > > complex in terms of retrieving value graphs which might explain the > > error. > > > > > > Is there a better way, maybe I can use database id instead as they > > reflect > > > order of creation of records, which might be good enough for > > participation > > > sorting. I've tried to avoid using generated ID values in OO code but > > maybe > > > its a compromise I have to accept occassionally, instead of natural > keys. > > > > > > Just raising it for discussion. > > > > > > Thanks > > > > > >