You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2012/04/01 13:32:09 UTC
svn commit: r1308081 -
/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/HierarchicalObjectResolver.java
Author: aadamchik
Date: Sun Apr 1 11:32:09 2012
New Revision: 1308081
URL: http://svn.apache.org/viewvc?rev=1308081&view=rev
Log:
CAY-1681 Third prefetch kind - DISJOINT_BY_ID
* performance optimization - loop independent code is run in the loop
* a possibly negligible performance optimization - reversing individual Db rels instead of flattened obj rel
* missing dot when creating prefetch path (not visible in our tests as flattened will have to be 3 steps long at least)
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/HierarchicalObjectResolver.java
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/HierarchicalObjectResolver.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/HierarchicalObjectResolver.java?rev=1308081&r1=1308080&r2=1308081&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/HierarchicalObjectResolver.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/HierarchicalObjectResolver.java Sun Apr 1 11:32:09 2012
@@ -59,7 +59,7 @@ class HierarchicalObjectResolver {
}
HierarchicalObjectResolver(DataContext context, QueryMetadata metadata,
- ClassDescriptor descriptor, boolean needToSaveDuplicates) {
+ ClassDescriptor descriptor, boolean needToSaveDuplicates) {
this(context, metadata);
this.descriptor = descriptor;
this.needToSaveDuplicates = needToSaveDuplicates;
@@ -132,36 +132,48 @@ class HierarchicalObjectResolver {
return true;
}
- PrefetchProcessorNode parentProcessorNode = (PrefetchProcessorNode) processorNode.getParent();
+ PrefetchProcessorNode parentProcessorNode = (PrefetchProcessorNode) processorNode
+ .getParent();
ObjRelationship relationship = processorNode.getIncoming().getRelationship();
- PrefetchSelectQuery query = new PrefetchSelectQuery(node.getPath(), relationship);
-
- for (Object dataRow : parentProcessorNode.getDataRows()) {
- List<DbRelationship> dbRelationships = relationship.getReverseRelationship().getDbRelationships();
- DbRelationship lastDbRelationship = dbRelationships.get(dbRelationships.size() - 1);
-
- String pathPrefix = "";
- if (dbRelationships.size() > 1) {
- // we need path prefix for flattened relationships
- List<DbRelationship> headingDbRelationships
- = dbRelationships.subList(0, dbRelationships.size() - 1);
- StringBuilder pathPrefixBuilder = new StringBuilder();
- for (DbRelationship dbRelationship : headingDbRelationships) {
- pathPrefixBuilder.append(dbRelationship.getName());
+ PrefetchSelectQuery query = new PrefetchSelectQuery(
+ node.getPath(),
+ relationship);
+
+ List<DbRelationship> dbRelationships = relationship.getDbRelationships();
+ DbRelationship lastDbRelationship = dbRelationships.get(0);
+
+ String pathPrefix = "";
+ if (dbRelationships.size() > 1) {
+
+ // we need path prefix for flattened relationships
+ StringBuilder buffer = new StringBuilder();
+ for (int i = dbRelationships.size() - 1; i >= 1; i--) {
+ if (buffer.length() > 0) {
+ buffer.append(".");
}
- pathPrefix = pathPrefixBuilder.toString() + ".";
+
+ buffer.append(dbRelationships
+ .get(i)
+ .getReverseRelationship()
+ .getName());
}
+ pathPrefix = buffer.append(".").toString();
+ }
+
+ for (Object dataRow : parentProcessorNode.getDataRows()) {
+
Expression allJoinsQualifier = null;
for (DbJoin join : lastDbRelationship.getJoins()) {
- // we have reversed db relationship here, so target and source are interchanged
- Object targetValue = ((DataRow) dataRow).get(join.getTargetName());
- Expression joinQualifier
- = ExpressionFactory.matchDbExp(pathPrefix + join.getSourceName(), targetValue);
+
+ Object targetValue = ((DataRow) dataRow).get(join.getSourceName());
+ Expression joinQualifier = ExpressionFactory.matchDbExp(pathPrefix
+ + join.getTargetName(), targetValue);
if (allJoinsQualifier == null) {
allJoinsQualifier = joinQualifier;
- } else {
+ }
+ else {
allJoinsQualifier = allJoinsQualifier.andExp(joinQualifier);
}
}
@@ -171,10 +183,9 @@ class HierarchicalObjectResolver {
query.setFetchingDataRows(true);
if (relationship.isSourceIndependentFromTargetChange()) {
- // setup extra result columns to be able to relate result rows to the parent
- // result objects.
- query.addResultPath("db:"
- + relationship.getReverseDbRelationshipPath());
+ // setup extra result columns to be able to relate result rows to the
+ // parent result objects.
+ query.addResultPath("db:" + relationship.getReverseDbRelationshipPath());
}
List dataRows = context.performQuery(query);