Details
-
Improvement
-
Status: Open
-
Major
-
Resolution: Unresolved
-
None
-
None
Description
When used wisely prefetches can save significant amount of time in ROP. In situation where the server and client are separated over large distance any query takes some time, and in case of faulting few chained relationships we have seen improvements measured in minutes!
Now the problem is that such query result is not always used in the same context as it was fetched. Unfortunately when the localObject is used only the object is copied, loosing all the already faulted related records. Can the localObject accept one more parameter and allow deep merge of the localised tree? Maybe the list of relationships to merge into the new copy can be passed to the locaObject function as a array of String or something? Of course such deep localObject would work only on PersistentState.COMMITTED objects
Illustrating example:
SelectQuery sq = new SelectQuery(Country.class, someExpression);
sq.addPrefetch("cities").setSemantics(PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS);
sq.addPrefetch("cities.galleries").setSemantics(PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS);
sq.addPrefetch("cities.galleries.paintings").setSemantics(PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS);
sq.addPrefetch("cities.galleries.paintings.artist").setSemantics(PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS);
//this executes in one SQL query, very fast
List<Country> countries = getCurrentContext().performQuery(sq);
//user is selecting a random city for editing. For safety reasons the object has to be copied out of the original context.
City localisedCity = (City) newContext.localObject(countries.get(3).getCities().get(4).getObjectId(), null);
now the localisedCity has no faulted relatioships. this means that to assemble list of artists for the given city there going to be executed
- RelationshipQuery for galleries
- for each gallery RelatioshipQuery for paintings
- for each painting RelatiohshipQuery for artist