]> gerrit.simantics Code Review - simantics/platform.git/commitdiff
Exclude fully weak relations to external resources in model TG export 52/1052/1
authorAntti Villberg <antti.villberg@semantum.fi>
Thu, 28 Sep 2017 11:13:29 +0000 (14:13 +0300)
committerAntti Villberg <antti.villberg@semantum.fi>
Thu, 28 Sep 2017 11:13:29 +0000 (14:13 +0300)
refs #7516

Change-Id: I63759780310eab31f3b7f8417c8c48080857bfa9

bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/util/DomainProcessor3.java
bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/util/ModelTransferableGraphSourceRequest.java

index 7a0a5f06bee35eb5c4eebf87691dd8e8bdf97c3a..20856d4ced9de92d68b013cb6c545bfc95bdfdff 100644 (file)
@@ -2,6 +2,7 @@ package org.simantics.db.layer0.util;
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -20,6 +21,7 @@ import org.simantics.db.ReadGraph;
 import org.simantics.db.Resource;
 import org.simantics.db.ResourceMap;
 import org.simantics.db.Statement;
+import org.simantics.db.common.StandardStatement;
 import org.simantics.db.common.primitiverequest.Value;
 import org.simantics.db.common.procedure.adapter.TransientCacheListener;
 import org.simantics.db.common.utils.NameUtils;
@@ -61,7 +63,7 @@ public class DomainProcessor3 {
     Map<Resource,Boolean> isRelatedToPredicates = null;
     Set<Resource> deadPredicates = null;
     Set<Resource> strongInverseSet = null;
-
+    List<Statement> unresolvedWeakLinks = new ArrayList<>();
     TIntIntHashMap ids = null;
     ResourceMap<ExtentStatus> status = null;
     Map<Datatype, byte[]> bindings = new HashMap<Datatype, byte[]>();
@@ -367,8 +369,9 @@ public class DomainProcessor3 {
 
                 // The inverse is also weak (or there is no inverse)
                 if(!strongInverseSet.contains(predicate)) {
-
-                    addToStream(predicate, object);
+                       
+                       unresolvedWeakLinks.add(new StandardStatement(subject, predicate, object));
+                    //addToStream(predicate, object);
 
                     if(objectStatus == null) {
                         status.put(object, ExtentStatus.PENDING);
index 5760f1a026cfa7ab2a5a054c27e6311b13cfe6e1..b7fe6ed7b29f4cf3c9b45358e13eb9f32544dc31 100644 (file)
@@ -438,8 +438,12 @@ public class ModelTransferableGraphSourceRequest extends UniqueRead<ModelTransfe
                                state.externals.add(transientId);
                        } else if(ExtentStatus.PENDING == status) {
                                String uri = graph.getPossibleURI(r);
-                               if(uri != null)
-                                       state.externals.add(transientId);
+                               if(uri != null) {
+                                       // All internal resources with uri have been discovered already => this must then be external
+                                       //state.externals.add(transientId);
+                                       // Pending resources are found through weak links - if they are still pending at this stage do not add an external
+                                       processor.status.put(r, ExtentStatus.EXTERNAL);
+                               }
                                else {
                                        state.pending.add(transientId);
                                        System.err.println("Pending status in export: " + NameUtils.getSafeName(graph, r, true) + " (" + graph.getPossibleURI(r) + ")");
@@ -447,6 +451,21 @@ public class ModelTransferableGraphSourceRequest extends UniqueRead<ModelTransfe
                        }
                }
 
+               // Now that we know the status of the resources lets process weak statements 
+               for(Statement stm : processor.unresolvedWeakLinks) {
+                       ExtentStatus status = processor.status.get(stm.getObject());
+                       if(ExtentStatus.INTERNAL == status) {
+                               // Weak links between internals are exported
+                               int transientId = support.getTransientId(stm.getSubject());
+                               processor.addToStream(stm.getPredicate(), stm.getObject());
+                               try {
+                                       processor.flushStatementStream(transientId, state);
+                               } catch (IOException e) {
+                                       throw new DatabaseException(e);
+                               }
+                       }
+               }
+
                if (state.monitor.isCanceled())
                        throw new CancelTransactionException();