]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.db.procore/src/org/simantics/db/procore/cluster/CompleteTableSmall.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.db.procore / src / org / simantics / db / procore / cluster / CompleteTableSmall.java
diff --git a/bundles/org.simantics.db.procore/src/org/simantics/db/procore/cluster/CompleteTableSmall.java b/bundles/org.simantics.db.procore/src/org/simantics/db/procore/cluster/CompleteTableSmall.java
new file mode 100644 (file)
index 0000000..c44558c
--- /dev/null
@@ -0,0 +1,93 @@
+package org.simantics.db.procore.cluster;\r
+\r
+import gnu.trove.set.hash.TIntHashSet;\r
+\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.impl.ClusterI;\r
+import org.simantics.db.impl.ClusterSupport;\r
+import org.simantics.db.impl.ClusterTraitsBase;\r
+import org.simantics.db.impl.Modifier;\r
+import org.simantics.db.impl.TableSizeListener;\r
+\r
+public class CompleteTableSmall extends CompleteTable {\r
+    public CompleteTableSmall(TableSizeListener sizeListener, int[] header, int headerBase) {\r
+        super(sizeListener, header, headerBase);\r
+    }\r
+    public CompleteTableSmall(TableSizeListener sizeListener, int[] header, int headerBase, int[] ints) {\r
+        super(sizeListener, header, headerBase, ints);\r
+    }\r
+\r
+    @Override\r
+    public <Context> boolean foreachPredicate(int setIndex,\r
+            ClusterI.PredicateProcedure<Context> procedure,\r
+            Context context, ClusterSupport support, Modifier modifier)\r
+    throws DatabaseException {\r
+        ForeachPredicate<Context> t = new ForeachPredicate<Context>(procedure, support, modifier);\r
+        return foreachComplete(setIndex, t, context, null, null);\r
+    }\r
+\r
+    @Override\r
+    public <Context> boolean foreachObject(int setIndex,\r
+            ClusterI.ObjectProcedure<Context> procedure,\r
+            Context context, ClusterSupport support, Modifier modifier,\r
+            ClusterI.CompleteTypeEnum completeType)\r
+    throws DatabaseException {\r
+        ForeachObject<Context> t = new ForeachObject<Context>\r
+        (procedure, support, modifier, completeType);\r
+        return foreachComplete(setIndex, t, context, null, null);\r
+    }\r
+    \r
+    private static final class ForeachPredicate<Context>\r
+    implements ClusterI.ObjectProcedure<Context> {\r
+        private TIntHashSet completeTypes = new TIntHashSet();\r
+        private ClusterI.PredicateProcedure<Context> procedure; \r
+        public ForeachPredicate(ClusterI.PredicateProcedure<Context>\r
+            procedure, ClusterSupport support, Modifier modifier) {\r
+            this.procedure = procedure;\r
+        }\r
+        @Override\r
+        public boolean execute(Context context, int completeRef) {\r
+               ClusterI.CompleteTypeEnum completeType = ClusterTraitsSmall.completeRefAndTypeGetType(completeRef);\r
+            if (!completeTypes.contains(completeType.getValue())) {\r
+                completeTypes.add(completeType.getValue());\r
+                try {\r
+                    int pKey = ClusterTraitsBase.getCompleteTypeResourceKeyFromEnum(completeType);\r
+                    if (procedure.execute(context, pKey, 0))\r
+                        return true; // loop broken by procedure\r
+                } catch (DatabaseException e) {\r
+                    e.printStackTrace();\r
+                    return false;\r
+                }\r
+            }\r
+            return false; // Continue looping.\r
+        }\r
+        \r
+    }\r
+    private static class ForeachObject<Context>\r
+    implements ClusterI.ObjectProcedure<Context> {\r
+        private ClusterI.ObjectProcedure<Context> procedure; \r
+        private Modifier modifier;\r
+        private ClusterI.CompleteTypeEnum completeType;\r
+        public ForeachObject(ClusterI.ObjectProcedure<Context>\r
+            procedure, ClusterSupport support, Modifier modifier, ClusterI.CompleteTypeEnum completeType) {\r
+            this.procedure = procedure;\r
+            this.modifier = modifier;\r
+            this.completeType = completeType;\r
+        }\r
+        @Override\r
+        public boolean execute(Context context, int completeRef) throws DatabaseException {\r
+               ClusterI.CompleteTypeEnum completeType2 = ClusterTraitsSmall.completeRefAndTypeGetType(completeRef);\r
+            if (completeType == completeType2) { // same predicate\r
+                int objectRef = ClusterTraitsSmall.completeRefAndTypeGetRef(completeRef);\r
+                int externalRef;\r
+                if (null == modifier)\r
+                    externalRef = objectRef;\r
+                else\r
+                    externalRef = modifier.execute(objectRef);\r
+                return procedure.execute(context, externalRef);\r
+            }\r
+            return false; // Continue looping.\r
+        }\r
+        \r
+    }\r
+}\r