]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.db.procore/src/fi/vtt/simantics/procore/internal/ClusterBuilderImpl2.java
Some fixes/cleanup for cluster table size caching logic.
[simantics/platform.git] / bundles / org.simantics.db.procore / src / fi / vtt / simantics / procore / internal / ClusterBuilderImpl2.java
index b2745299a674a01e24563bd8cf47905a0721cfd2..c1cf58796c9ab2557a2e9913aef6b95e6eb26c4c 100644 (file)
-package fi.vtt.simantics.procore.internal;\r
-\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.WriteOnlyGraph;\r
-import org.simantics.db.exception.DatabaseException;\r
-import org.simantics.db.exception.RuntimeDatabaseException;\r
-import org.simantics.db.impl.ClusterSupport;\r
-import org.simantics.db.impl.ClusterTraitsBase;\r
-import org.simantics.db.impl.ResourceImpl;\r
-import org.simantics.db.impl.graph.WriteGraphImpl;\r
-import org.simantics.db.procore.cluster.ClusterImpl;\r
-import org.simantics.db.service.ClusterBuilder2;\r
-import org.simantics.db.service.SerialisationSupport;\r
-\r
-import fi.vtt.simantics.procore.internal.SessionImplSocket.WriteOnlySupport;\r
-\r
-public class ClusterBuilderImpl2 implements ClusterBuilder2 {\r
-\r
-    final private ClusterSupport cs;\r
-    final private SerialisationSupport ss;\r
-    final private ClusterStream stream;\r
-    final private WriteOnlySupport support;\r
-    final private ClusterImpl[] clusterArray;\r
-    private boolean allowImmutables;\r
-    \r
-    ClusterBuilderImpl2(SessionImplSocket session, boolean allowImmutables) {\r
-\r
-        WriteState<?> state = session.writeState;\r
-        if(state != null) {\r
-            WriteGraphImpl graph = state.getGraph();\r
-            support = (WriteOnlySupport)graph.writeSupport;\r
-            stream = support.stream;\r
-        } else {\r
-            support = null;\r
-            stream = null;\r
-        }\r
-        \r
-        this.ss = session.getService(SerialisationSupport.class);\r
-        this.clusterArray = session.clusterTable.getClusterArray();\r
-        this.cs = session.getService(ClusterSupport.class);\r
-        this.allowImmutables = allowImmutables;\r
-        \r
-    }\r
-\r
-    ClusterBuilderImpl2(SessionImplSocket session) {\r
-        this(session, false);\r
-    }\r
-\r
-    @Override\r
-    public void newCluster() throws DatabaseException {\r
-        support.flushCluster();\r
-    }\r
-\r
-    @Override\r
-    public void selectCluster(long cluster) throws DatabaseException {\r
-        support.selectCluster(cluster);\r
-    }\r
-    \r
-    @Override\r
-    public void newCluster(int setHandle) throws DatabaseException {\r
-       support.setDefaultClusterSet(resource(setHandle));\r
-        support.flushCluster();\r
-    }\r
-    \r
-    @Override\r
-    public void createClusterSet(int resource) throws DatabaseException {\r
-       support.createClusterSet(null, resource(resource));\r
-    }\r
-    \r
-    @Override\r
-    public int newResource() throws DatabaseException {\r
-       Resource result = support.createResource(null); \r
-       return handle(result);\r
-    }\r
-\r
-    @Override\r
-    public int newResource(int set) throws DatabaseException {\r
-       Resource result = support.createResource(null, resource(set));\r
-       return ss.getTransientId(result);\r
-    }\r
-    \r
-    @Override\r
-    public int resource(Resource res) throws DatabaseException {\r
-        ResourceImpl r = (ResourceImpl)res;\r
-        int clusterKey = ClusterTraitsBase.getClusterKeyFromResourceKeyNoThrow(r.id);\r
-        ClusterImpl cluster = clusterArray[clusterKey];\r
-        if(cluster.cc == null) cluster.cc = new ClusterChange(stream, cluster);\r
-        return r.id;\r
-    }\r
-\r
-    @Override\r
-    public void addStatement(WriteOnlyGraph graph, int subject, int predicate, int object) throws DatabaseException {\r
-        int clusterKey = ClusterTraitsBase.getClusterKeyFromResourceKeyNoThrow(subject);\r
-        ClusterImpl cluster = clusterArray[clusterKey];\r
-        if(!cluster.isLoaded()) cluster = (ClusterImpl)cs.getClusterByResourceKey(subject);\r
-        if(cluster.isWriteOnly()) addStatement(cluster, subject, predicate, object);\r
-        else {\r
-            WriteGraphImpl impl = (WriteGraphImpl)graph;\r
-            if(!cluster.getImmutable() || allowImmutables)\r
-                impl.writeSupport.claim(graph.getProvider(), subject, predicate, object);\r
-        }\r
-    }\r
-    \r
-    private void addStatement(ClusterImpl cluster, int resourceKey, int predicate, int object) {\r
-        \r
-        if(cluster.getImmutable()) return;\r
-        \r
-        Change change = cluster.change;\r
-        change.addStatementIndex0(resourceKey, ClusterChange.ADD_OPERATION);\r
-        applyPredicate(cluster, predicate);\r
-        applyObject(cluster, object);\r
-        cluster.cc.addChange(change);\r
-        \r
-    }\r
-    \r
-    public void applyPredicate(ClusterImpl impl, int predicate) {\r
-        \r
-        int clusterKey = ClusterTraitsBase.getClusterKeyFromResourceKeyNoThrow(predicate);\r
-        ClusterImpl cluster = clusterArray[clusterKey]; \r
-        \r
-        impl.change.addStatementIndex1(predicate, cluster.clusterUID, (byte)0, impl.foreignLookup);\r
-        \r
-    }\r
-\r
-    public void applyObject(ClusterImpl impl, int object) {\r
-\r
-        int clusterKey = ClusterTraitsBase.getClusterKeyFromResourceKeyNoThrow(object);\r
-        ClusterImpl cluster = clusterArray[clusterKey]; \r
-        \r
-        impl.change.addStatementIndex2(object, cluster.clusterUID, (byte)0, impl.foreignLookup);\r
-        \r
-    }\r
-\r
-    @Override\r
-    public Resource resource(int key) {\r
-        try {\r
-            return ss.getResource(key);\r
-        } catch (DatabaseException e) {\r
-            throw new RuntimeDatabaseException(e);\r
-        }\r
-    }\r
-    \r
-    @Override\r
-    public int handle(Resource r) {\r
-        return ((ResourceImpl)r).id;\r
-    }\r
-\r
-    byte[] buffer = new byte[65536];\r
-    int bufferOffset = 0;\r
-    int valueSubject = 0;\r
-    int valueOffset = 0;\r
-    \r
-    @Override\r
-    public void beginValue(int subject) {\r
-        valueSubject = subject;\r
-        bufferOffset = 0;\r
-        valueOffset = 0;\r
-    }\r
-        \r
-    @Override\r
-    public void appendValue(int byteValue) throws DatabaseException {\r
-        buffer[bufferOffset++] = (byte)byteValue;\r
-        if(bufferOffset == 65536) {\r
-            int clusterKey = ClusterTraitsBase.getClusterKeyFromResourceKeyNoThrow(valueSubject);\r
-            ClusterImpl cluster = clusterArray[clusterKey]; \r
-            cluster.modiValueEx(valueSubject, valueOffset, 65536, buffer, 0, cs);\r
-            bufferOffset = 0;\r
-            valueOffset += 65536;\r
-        }\r
-    }\r
-\r
-    @Override\r
-    public void endValue() throws DatabaseException {\r
-        if(bufferOffset > 0) {\r
-            int clusterKey = ClusterTraitsBase.getClusterKeyFromResourceKeyNoThrow(valueSubject);\r
-            ClusterImpl cluster = clusterArray[clusterKey]; \r
-            if(valueOffset == 0) {\r
-                if(cluster.isWriteOnly()) cluster.cc.setValue((short)(valueSubject & 0xFFF), buffer, bufferOffset);\r
-                else {\r
-                    support.claimValue(null, valueSubject, buffer, bufferOffset);\r
-                }\r
-            } else {\r
-                cluster.modiValueEx(valueSubject, valueOffset, bufferOffset, buffer, 0, cs);\r
-            }\r
-        }\r
-    }\r
-    \r
-}\r
+package fi.vtt.simantics.procore.internal;
+
+import org.simantics.db.Resource;
+import org.simantics.db.WriteOnlyGraph;
+import org.simantics.db.exception.DatabaseException;
+import org.simantics.db.exception.RuntimeDatabaseException;
+import org.simantics.db.impl.ClusterSupport;
+import org.simantics.db.impl.ClusterTraitsBase;
+import org.simantics.db.impl.ResourceImpl;
+import org.simantics.db.impl.graph.WriteGraphImpl;
+import org.simantics.db.procore.cluster.ClusterImpl;
+import org.simantics.db.service.ClusterBuilder2;
+import org.simantics.db.service.SerialisationSupport;
+
+import fi.vtt.simantics.procore.internal.SessionImplSocket.WriteOnlySupport;
+
+public class ClusterBuilderImpl2 implements ClusterBuilder2 {
+
+    final private ClusterSupport cs;
+    final private SerialisationSupport ss;
+    final private ClusterStream stream;
+    final private WriteOnlySupport support;
+    final private ClusterImpl[] clusterArray;
+    private boolean allowImmutables;
+    
+    ClusterBuilderImpl2(SessionImplSocket session, boolean allowImmutables) {
+
+        WriteState<?> state = session.writeState;
+        if(state != null) {
+            WriteGraphImpl graph = state.getGraph();
+            support = (WriteOnlySupport)graph.writeSupport;
+            stream = support.stream;
+        } else {
+            support = null;
+            stream = null;
+        }
+        
+        this.ss = session.getService(SerialisationSupport.class);
+        this.clusterArray = session.clusterTable.getClusterArray();
+        this.cs = session.getService(ClusterSupport.class);
+        this.allowImmutables = allowImmutables;
+        
+    }
+
+    ClusterBuilderImpl2(SessionImplSocket session) {
+        this(session, false);
+    }
+
+    @Override
+    public void newCluster() throws DatabaseException {
+        support.flushCluster();
+    }
+
+    @Override
+    public void selectCluster(long cluster) throws DatabaseException {
+        support.selectCluster(cluster);
+    }
+    
+    @Override
+    public void newCluster(int setHandle) throws DatabaseException {
+       support.setDefaultClusterSet(resource(setHandle));
+        support.flushCluster();
+    }
+    
+    @Override
+    public void createClusterSet(int resource) throws DatabaseException {
+       support.createClusterSet(null, resource(resource));
+    }
+    
+    @Override
+    public int newResource() throws DatabaseException {
+       Resource result = support.createResource(null); 
+       return handle(result);
+    }
+
+    @Override
+    public int newResource(int set) throws DatabaseException {
+       Resource result = support.createResource(null, resource(set));
+       return ss.getTransientId(result);
+    }
+    
+    @Override
+    public int resource(Resource res) throws DatabaseException {
+        ResourceImpl r = (ResourceImpl)res;
+        int clusterKey = ClusterTraitsBase.getClusterKeyFromResourceKeyNoThrow(r.id);
+        ClusterImpl cluster = clusterArray[clusterKey];
+        if(cluster.cc == null) cluster.cc = new ClusterChange(stream, cluster);
+        return r.id;
+    }
+
+    @Override
+    public void addStatement(WriteOnlyGraph graph, int subject, int predicate, int object) throws DatabaseException {
+        int clusterKey = ClusterTraitsBase.getClusterKeyFromResourceKeyNoThrow(subject);
+        ClusterImpl cluster = clusterArray[clusterKey];
+        if(!cluster.isLoaded()) cluster = (ClusterImpl)cs.getClusterByResourceKey(subject);
+        if(cluster.isWriteOnly()) addStatement(cluster, subject, predicate, object);
+        else {
+            WriteGraphImpl impl = (WriteGraphImpl)graph;
+            if(!cluster.getImmutable() || allowImmutables)
+                impl.writeSupport.claim(graph.getProvider(), subject, predicate, object);
+        }
+    }
+    
+    private void addStatement(ClusterImpl cluster, int resourceKey, int predicate, int object) {
+        
+        if(cluster.getImmutable()) return;
+        
+        Change change = cluster.change;
+        change.addStatementIndex0(resourceKey, ClusterChange.ADD_OPERATION);
+        applyPredicate(cluster, predicate);
+        applyObject(cluster, object);
+        cluster.cc.addChange(change);
+        
+    }
+    
+    public void applyPredicate(ClusterImpl impl, int predicate) {
+        
+        int clusterKey = ClusterTraitsBase.getClusterKeyFromResourceKeyNoThrow(predicate);
+        ClusterImpl cluster = clusterArray[clusterKey]; 
+        
+        impl.change.addStatementIndex1(predicate, cluster.clusterUID, (byte)0, impl.foreignLookup);
+        
+    }
+
+    public void applyObject(ClusterImpl impl, int object) {
+
+        int clusterKey = ClusterTraitsBase.getClusterKeyFromResourceKeyNoThrow(object);
+        ClusterImpl cluster = clusterArray[clusterKey]; 
+        
+        impl.change.addStatementIndex2(object, cluster.clusterUID, (byte)0, impl.foreignLookup);
+        
+    }
+
+    @Override
+    public Resource resource(int key) {
+        try {
+            return ss.getResource(key);
+        } catch (DatabaseException e) {
+            throw new RuntimeDatabaseException(e);
+        }
+    }
+    
+    @Override
+    public int handle(Resource r) {
+        return ((ResourceImpl)r).id;
+    }
+
+    byte[] buffer = new byte[65536];
+    int bufferOffset = 0;
+    int valueSubject = 0;
+    int valueOffset = 0;
+    
+    @Override
+    public void beginValue(int subject) {
+        valueSubject = subject;
+        bufferOffset = 0;
+        valueOffset = 0;
+    }
+        
+    @Override
+    public void appendValue(int byteValue) throws DatabaseException {
+        buffer[bufferOffset++] = (byte)byteValue;
+        if(bufferOffset == 65536) {
+            int clusterKey = ClusterTraitsBase.getClusterKeyFromResourceKeyNoThrow(valueSubject);
+            ClusterImpl cluster = clusterArray[clusterKey]; 
+            cluster.modiValueEx(valueSubject, valueOffset, 65536, buffer, 0, cs);
+            bufferOffset = 0;
+            valueOffset += 65536;
+        }
+    }
+
+    @Override
+    public void endValue() throws DatabaseException {
+        if(bufferOffset > 0) {
+            int clusterKey = ClusterTraitsBase.getClusterKeyFromResourceKeyNoThrow(valueSubject);
+            ClusterImpl cluster = clusterArray[clusterKey]; 
+            if(valueOffset == 0) {
+                if(cluster.isWriteOnly()) cluster.cc.setValue((short)(valueSubject & 0xFFF), buffer, bufferOffset);
+                else {
+                    support.claimValue(null, valueSubject, buffer, bufferOffset);
+                }
+            } else {
+                cluster.modiValueEx(valueSubject, valueOffset, bufferOffset, buffer, 0, cs);
+            }
+        }
+    }
+    
+}