It may be time to revisit current AshwoodEntitySorter and start building/sorting DB operations based on the object graph change log. Relationships between objects participating in a given transaction will likely provide us with a better insight about sorting then analyzing the underlying entities by themselves (something that we do now). The we can execute a mix of INSERT/UPDATE/DELETE in an order defined dynamically based on a commit set at hand.
Perhaps it will also help us in resolving dependency cycles, where there's no single valid operation order for simple operations (e.g. creating both department and its manager who is also a department employee). This can be solved by running an INSERT with null FK on one side of the cycle followed by UPDATE with the right PK. Also current AshwoodEntitySorter approach is geared towards merging all semantically identical operations in batched PreparedStatements, thus improving performance of large commits. If we are to do something new, we'll need to take this into account. So there are tradeoffs and challenges and this won't be an easy task. But if anyone feels like applying their graph theory knowledge to a non-trivial problem, please speak up :) Andrus > On Jun 30, 2016, at 8:43 PM, Andrus Adamchik <and...@objectstyle.org> wrote: > > There are cases when INSERT -> UPDATE -> DELETE is the only order that would > satisfy the constraints. Such as when UPDATE nullifies FKs to the record that > is later deleted. So this was a conscious decision. Too simplistic of course, > as we've seen here. So a smarter algorithm is in order. But just reversing it > to DELETE -> UPDATE -> INSERT (or picking any other fixed order for that > matter) is going to break apps that work currently. > > Andrus > > >> On Jun 22, 2016, at 9:32 PM, Michael Gentry <blackn...@gmail.com> wrote: >> >> I believe I inquired about the ordering years ago and I think Andrus gave a >> reason why, but it escapes me at the moment. Perhaps he will remember and >> chime in here. >> >> mrg >> >> >> On Wed, Jun 22, 2016 at 6:58 PM, Aristedes Maniatis <a...@maniatis.org> >> wrote: >> >>> On 23/06/2016 5:25am, Lon Varscsak wrote: >>>> Okay, I’ve found where it’s at (DataDomainFlushAction.preprocess). I >>> don’t >>>> see an easy way to override this, without just forking (which is totally >>>> doable). Does anyone know why the default order of operations is INSERT >>> -> >>>> UPDATE -> DELETE? Because if there’s no specific reason, it seems like >>> we >>>> could change this to support DBs that don’t have deferred constraints. >>> (or >>>> provide a hook to reorder these) >>> >>> >>> That's a pretty old piece of code, probably before my time. The history is >>> unfortunately broken by a move back in 2013 [1] but it would be interesting >>> to go back to the origins of that file and see if any commit message sheds >>> light on why that ordering was chosen. It does seem an odd choice, but >>> perhaps there was a reason. >>> >>> Before you fork Cayenne let's see if we can improve this behaviour for the >>> entire community. >>> >>> >>> [1] >>> https://github.com/apache/cayenne/commits/b0631deb251f036840d1ca3aee6d4ae50f2441bf/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainFlushAction.java >>> >>> -- >>> --------------------------> >>> Aristedes Maniatis >>> GPG fingerprint CBFB 84B4 738D 4E87 5E5C 5EFA EF6A 7D2E 3E49 102A >>> >