--- /dev/null
+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