1 package org.simantics.db.procore.cluster;
3 import gnu.trove.set.hash.TIntHashSet;
5 import org.simantics.db.exception.DatabaseException;
6 import org.simantics.db.impl.ClusterI;
7 import org.simantics.db.impl.ClusterSupport;
8 import org.simantics.db.impl.ClusterTraitsBase;
9 import org.simantics.db.impl.Modifier;
10 import org.simantics.db.impl.TableSizeListener;
12 public class CompleteTableSmall extends CompleteTable {
13 public CompleteTableSmall(TableSizeListener sizeListener, int[] header, int headerBase) {
14 super(sizeListener, header, headerBase);
16 public CompleteTableSmall(TableSizeListener sizeListener, int[] header, int headerBase, int[] ints) {
17 super(sizeListener, header, headerBase, ints);
21 public <Context> boolean foreachPredicate(int setIndex,
22 ClusterI.PredicateProcedure<Context> procedure,
23 Context context, ClusterSupport support, Modifier modifier)
24 throws DatabaseException {
25 ForeachPredicate<Context> t = new ForeachPredicate<Context>(procedure, support, modifier);
26 return foreachComplete(setIndex, t, context, null, null);
30 public <Context> boolean foreachObject(int setIndex,
31 ClusterI.ObjectProcedure<Context> procedure,
32 Context context, ClusterSupport support, Modifier modifier,
33 ClusterI.CompleteTypeEnum completeType)
34 throws DatabaseException {
35 ForeachObject<Context> t = new ForeachObject<Context>
36 (procedure, support, modifier, completeType);
37 return foreachComplete(setIndex, t, context, null, null);
40 private static final class ForeachPredicate<Context>
41 implements ClusterI.ObjectProcedure<Context> {
42 private TIntHashSet completeTypes = new TIntHashSet();
43 private ClusterI.PredicateProcedure<Context> procedure;
44 public ForeachPredicate(ClusterI.PredicateProcedure<Context>
45 procedure, ClusterSupport support, Modifier modifier) {
46 this.procedure = procedure;
49 public boolean execute(Context context, int completeRef) {
50 ClusterI.CompleteTypeEnum completeType = ClusterTraitsSmall.completeRefAndTypeGetType(completeRef);
51 if (!completeTypes.contains(completeType.getValue())) {
52 completeTypes.add(completeType.getValue());
54 int pKey = ClusterTraitsBase.getCompleteTypeResourceKeyFromEnum(completeType);
55 if (procedure.execute(context, pKey, 0))
56 return true; // loop broken by procedure
57 } catch (DatabaseException e) {
62 return false; // Continue looping.
66 private static class ForeachObject<Context>
67 implements ClusterI.ObjectProcedure<Context> {
68 private ClusterI.ObjectProcedure<Context> procedure;
69 private Modifier modifier;
70 private ClusterI.CompleteTypeEnum completeType;
71 public ForeachObject(ClusterI.ObjectProcedure<Context>
72 procedure, ClusterSupport support, Modifier modifier, ClusterI.CompleteTypeEnum completeType) {
73 this.procedure = procedure;
74 this.modifier = modifier;
75 this.completeType = completeType;
78 public boolean execute(Context context, int completeRef) throws DatabaseException {
79 ClusterI.CompleteTypeEnum completeType2 = ClusterTraitsSmall.completeRefAndTypeGetType(completeRef);
80 if (completeType == completeType2) { // same predicate
81 int objectRef = ClusterTraitsSmall.completeRefAndTypeGetRef(completeRef);
84 externalRef = objectRef;
86 externalRef = modifier.execute(objectRef);
87 return procedure.execute(context, externalRef);
89 return false; // Continue looping.