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 2013/08/04 20:47:40 UTC
svn commit: r1510306 - in
/cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne:
access/DataDomainDBDiffBuilder.java access/ObjectDiff.java
map/DbRelationship.java
Author: aadamchik
Date: Sun Aug 4 18:47:39 2013
New Revision: 1510306
URL: http://svn.apache.org/r1510306
Log:
CAY-1861 Remove runtime relationships
tracking complimentary FK change for one-way to-many
(commit processing)
Modified:
cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/access/DataDomainDBDiffBuilder.java
cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/access/ObjectDiff.java
cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/map/DbRelationship.java
Modified: cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/access/DataDomainDBDiffBuilder.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/access/DataDomainDBDiffBuilder.java?rev=1510306&r1=1510305&r2=1510306&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/access/DataDomainDBDiffBuilder.java (original)
+++ cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/access/DataDomainDBDiffBuilder.java Sun Aug 4 18:47:39 2013
@@ -21,9 +21,11 @@ package org.apache.cayenne.access;
import java.util.HashMap;
import java.util.Map;
+import java.util.Map.Entry;
import org.apache.cayenne.ObjectId;
import org.apache.cayenne.access.DataDomainSyncBucket.PropagatedValueFactory;
+import org.apache.cayenne.exp.parser.ASTDbPath;
import org.apache.cayenne.graph.GraphChangeHandler;
import org.apache.cayenne.graph.GraphDiff;
import org.apache.cayenne.map.DbAttribute;
@@ -109,10 +111,17 @@ class DataDomainDBDiffBuilder implements
private void appendForeignKeys(Map<Object, Object> dbDiff) {
// populate changed FKs
if (currentArcDiff != null) {
- for (final Map.Entry<Object, Object> entry : currentArcDiff.entrySet()) {
- ObjRelationship relation = objEntity.getRelationship(entry.getKey().toString());
+ for (Entry<Object, Object> entry : currentArcDiff.entrySet()) {
- DbRelationship dbRelation = relation.getDbRelationships().get(0);
+ DbRelationship dbRelation;
+
+ String arcIdString = entry.getKey().toString();
+ ObjRelationship relation = objEntity.getRelationship(arcIdString);
+ if (relation == null) {
+ dbRelation = dbEntity.getRelationship(arcIdString.substring(ASTDbPath.DB_PREFIX.length()));
+ } else {
+ dbRelation = relation.getDbRelationships().get(0);
+ }
ObjectId targetId = (ObjectId) entry.getValue();
for (DbJoin join : dbRelation.getJoins()) {
@@ -151,32 +160,67 @@ class DataDomainDBDiffBuilder implements
}
public void arcCreated(Object nodeId, Object targetNodeId, Object arcId) {
+ String arcIdString = arcId.toString();
+ ObjRelationship relationship = objEntity.getRelationship(arcIdString);
- ObjRelationship relationship = objEntity.getRelationship(arcId.toString());
- if (!relationship.isSourceIndependentFromTargetChange()) {
- if (currentArcDiff == null) {
- currentArcDiff = new HashMap<Object, Object>();
+ if (relationship == null) {
+ // phantom FK
+ if (arcIdString.startsWith(ASTDbPath.DB_PREFIX)) {
+
+ DbRelationship dbRelationship = dbEntity.getRelationship(arcIdString.substring(ASTDbPath.DB_PREFIX
+ .length()));
+ if (!dbRelationship.isSourceIndependentFromTargetChange()) {
+ doArcCreated(targetNodeId, arcId);
+ }
+ } else {
+ throw new IllegalArgumentException("Bad arcId: " + arcId);
}
- currentArcDiff.put(arcId, targetNodeId);
+
+ } else if (!relationship.isSourceIndependentFromTargetChange()) {
+ doArcCreated(targetNodeId, arcId);
}
}
+ private void doArcCreated(Object targetNodeId, Object arcId) {
+ if (currentArcDiff == null) {
+ currentArcDiff = new HashMap<Object, Object>();
+ }
+ currentArcDiff.put(arcId, targetNodeId);
+ }
+
public void arcDeleted(Object nodeId, Object targetNodeId, Object arcId) {
- ObjRelationship relationship = objEntity.getRelationship(arcId.toString());
- if (!relationship.isSourceIndependentFromTargetChange()) {
+ String arcIdString = arcId.toString();
+ ObjRelationship relationship = objEntity.getRelationship(arcIdString);
- if (currentArcDiff == null) {
- currentArcDiff = new HashMap<Object, Object>();
- currentArcDiff.put(arcId, null);
- } else {
- // skip deletion record if a substitute arc was created prior to
- // deleting
- // the old arc...
- Object existingTargetId = currentArcDiff.get(arcId);
- if (existingTargetId == null || targetNodeId.equals(existingTargetId)) {
- currentArcDiff.put(arcId, null);
+ if (relationship == null) {
+ // phantom FK
+ if (arcIdString.startsWith(ASTDbPath.DB_PREFIX)) {
+
+ DbRelationship dbRelationship = dbEntity.getRelationship(arcIdString.substring(ASTDbPath.DB_PREFIX
+ .length()));
+ if (!dbRelationship.isSourceIndependentFromTargetChange()) {
+ doArcDeleted(targetNodeId, arcId);
}
+ } else {
+ throw new IllegalArgumentException("Bad arcId: " + arcId);
+ }
+
+ } else if (!relationship.isSourceIndependentFromTargetChange()) {
+ doArcDeleted(targetNodeId, arcId);
+ }
+ }
+
+ private void doArcDeleted(Object targetNodeId, Object arcId) {
+ if (currentArcDiff == null) {
+ currentArcDiff = new HashMap<Object, Object>();
+ currentArcDiff.put(arcId, null);
+ } else {
+ // skip deletion record if a substitute arc was created prior to
+ // deleting the old arc...
+ Object existingTargetId = currentArcDiff.get(arcId);
+ if (existingTargetId == null || targetNodeId.equals(existingTargetId)) {
+ currentArcDiff.put(arcId, null);
}
}
}
Modified: cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/access/ObjectDiff.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/access/ObjectDiff.java?rev=1510306&r1=1510305&r2=1510306&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/access/ObjectDiff.java (original)
+++ cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/access/ObjectDiff.java Sun Aug 4 18:47:39 2013
@@ -202,7 +202,8 @@ class ObjectDiff extends NodeDiff {
// TODO: andrus, 3.22.2006 - should we consider this a bug?
if (property == null && arcId.startsWith(ASTDbPath.DB_PREFIX)) {
- addDiff = addPhantomFkDiff(arcDiff);
+ addPhantomFkDiff(arcDiff);
+ addDiff = false;
} else if (property instanceof ToManyProperty) {
// record flattened op changes
@@ -257,7 +258,7 @@ class ObjectDiff extends NodeDiff {
}
}
- private boolean addPhantomFkDiff(ArcOperation arcDiff) {
+ private void addPhantomFkDiff(ArcOperation arcDiff) {
String arcId = arcDiff.getArcId().toString();
DbEntity dbEntity = classDescriptor.getEntity().getDbEntity();
@@ -265,11 +266,9 @@ class ObjectDiff extends NodeDiff {
.length()));
if (dbRelationship.isToMany()) {
- return false;
+ return;
}
- boolean addDiff = true;
-
if (currentArcSnapshot == null) {
currentArcSnapshot = new HashMap<String, Object>();
}
@@ -284,7 +283,6 @@ class ObjectDiff extends NodeDiff {
// "delete" cancels "create" and vice versa...
if (oldOp != null && oldOp.isDelete() != arcDiff.isDelete()) {
- addDiff = false;
phantomFks.remove(arcDiff);
if (otherDiffs != null) {
@@ -292,7 +290,6 @@ class ObjectDiff extends NodeDiff {
}
}
- return addDiff;
}
/**
@@ -380,6 +377,13 @@ class ObjectDiff extends NodeDiff {
}
}
+ // phantomFks are not in 'otherDiffs', while flattened diffs are
+ if (phantomFks != null) {
+ for (GraphDiff diff : phantomFks.keySet()) {
+ diff.apply(handler);
+ }
+ }
+
applySimplePropertyChanges(handler);
}
Modified: cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/map/DbRelationship.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/map/DbRelationship.java?rev=1510306&r1=1510305&r2=1510306&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/map/DbRelationship.java (original)
+++ cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/map/DbRelationship.java Sun Aug 4 18:47:39 2013
@@ -275,6 +275,19 @@ public class DbRelationship extends Rela
DbRelationship revRel = getReverseRelationship();
return (revRel != null) ? revRel.isToDependentPK() : false;
}
+
+ /**
+ * Returns a boolean indicating whether modifying a target of such
+ * relationship in any way will not change the underlying table row of the
+ * source.
+ *
+ * @since 3.2
+ */
+ public boolean isSourceIndependentFromTargetChange() {
+ // note - call "isToPK" at the end of the chain, since
+ // if it is to a dependent PK, we still should return true...
+ return isToMany() || isToDependentPK() || !isToPK();
+ }
/**
* Returns <code>true</code> if relationship from source to target points to