]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.db.impl/src/org/simantics/db/impl/query/DirectSuperRelations.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.db.impl / src / org / simantics / db / impl / query / DirectSuperRelations.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
3  * in Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.db.impl.query;\r
13 \r
14 import gnu.trove.procedure.TIntProcedure;\r
15 import gnu.trove.set.hash.TIntHashSet;\r
16 \r
17 import java.util.ArrayList;\r
18 \r
19 import org.simantics.db.impl.graph.ReadGraphImpl;\r
20 import org.simantics.db.impl.procedure.InternalProcedure;\r
21 import org.simantics.db.procedure.ListenerBase;\r
22 \r
23 final public class DirectSuperRelations extends UnaryQuery<IntProcedure> {\r
24 \r
25         public ArrayList<InternalProcedure<IntSet>> procs = null;\r
26 \r
27         private DirectSuperRelations(final int resource) {\r
28                 super(resource);\r
29         }\r
30 \r
31         final public static void queryEach(ReadGraphImpl graph, final int r, final QueryProcessor provider, final CacheEntry parent, final ListenerBase listener, final IntProcedure procedure) {\r
32 \r
33                 new DirectSuperRelations(r).computeForEach(graph, provider, procedure, false);\r
34 \r
35         }\r
36 \r
37         @Override\r
38         public UnaryQuery<IntProcedure> getEntry(QueryProcessor provider) {\r
39                 return null;\r
40         }\r
41 \r
42         @Override\r
43         public void putEntry(QueryProcessor provider) {\r
44         }\r
45 \r
46         @Override\r
47         final public void removeEntry(QueryProcessor provider) {\r
48         }\r
49 \r
50         class Koss {\r
51 \r
52                 private TIntHashSet set = null;\r
53                 public int single = 0;\r
54 \r
55                 public boolean add(int val) {\r
56                         if(single == val) return false;\r
57                         if(single == 0) {\r
58                                 single = val;\r
59                                 return true;\r
60                         }\r
61                         if(set == null) set = new TIntHashSet(4);\r
62                         return set.add(val);\r
63                 }\r
64 \r
65                 public int size() {\r
66 \r
67                         if(single == 0) return 0;\r
68                         if(set == null) return 1;\r
69                         return set.size() + 1;\r
70 \r
71                 }\r
72 \r
73                 //        public int[] toArray() {\r
74                         //            \r
75                         //            int[] result = Arrays.copyOf(set.toArray(), set.size() + 1);\r
76                         //            result[set.size()] = single;\r
77                         //            return result;\r
78                         //            \r
79                         //        }\r
80                 //        \r
81 \r
82                 public void forEach(TIntProcedure proc) {\r
83                         if(single > 0) proc.execute(single);\r
84                         if(set != null) set.forEach(proc);\r
85                 }\r
86 \r
87         }\r
88 \r
89         @Override\r
90         public Object computeForEach(final ReadGraphImpl graph, final QueryProcessor provider, final IntProcedure procedure, final boolean store) {\r
91 \r
92                 provider.querySupport.ensureLoaded(graph, id);\r
93                 \r
94                 int single = provider.querySupport.getSingleSuperrelation(id);\r
95                 if(single > 0) {\r
96                         procedure.execute(graph, single);\r
97                         procedure.finished(graph);\r
98                         return single;\r
99                 }\r
100 \r
101                 final int subrelationOf = provider.getSubrelationOf();\r
102 \r
103                 final IntSet result = new IntSet(provider.querySupport);\r
104 \r
105                 final class DirectProcedure extends Koss implements IntProcedure, TIntProcedure {\r
106                         @Override\r
107                         final public boolean execute(int r) {\r
108                                 result.add(r);\r
109                                 return true;\r
110                         }\r
111                         @Override\r
112                         final public void execute(ReadGraphImpl graph, int r) {\r
113                                 if(single == 0) {\r
114                                         single = r;\r
115                                         return;\r
116                                 }\r
117                                 add(r);\r
118                         }\r
119                         @Override\r
120                         public void finished(ReadGraphImpl graph) {\r
121                         }\r
122                         @Override\r
123                         public void exception(ReadGraphImpl graph, Throwable t) {\r
124                                 throw new Error("Errors are not supported.", t);\r
125                         }\r
126 \r
127                 }\r
128 \r
129                 final DirectProcedure directProc = new DirectProcedure();\r
130 \r
131                 provider.querySupport.getObjects(graph, id, subrelationOf, directProc);\r
132 \r
133                 int size = directProc.size();\r
134 \r
135                 if(size == 0) {\r
136 \r
137                         procedure.finished(graph);\r
138 \r
139                 } else if (size == 1) {\r
140 \r
141                         procedure.execute(graph, directProc.single);\r
142                         procedure.finished(graph);\r
143 \r
144                 } else {\r
145 \r
146                         directProc.forEach(new TIntProcedure() {\r
147 \r
148                                 @Override\r
149                                 public boolean execute(int arg0) {\r
150 \r
151                                         procedure.execute(graph, arg0);\r
152                                         return true;\r
153 \r
154                                 }\r
155 \r
156                         });\r
157 \r
158                         procedure.finished(graph);\r
159 \r
160                 }\r
161                 \r
162                 return getResult();\r
163 \r
164 \r
165         }\r
166 \r
167         @Override\r
168         public String toString() {\r
169                 return "SuperRelations2[" + id + "]";\r
170         }\r
171 \r
172         @Override\r
173         public Object performFromCache(ReadGraphImpl graph, QueryProcessor provider, IntProcedure procedure) {\r
174                 throw new UnsupportedOperationException();\r
175         }\r
176 \r
177         @Override\r
178         public void recompute(ReadGraphImpl graph, QueryProcessor provider) {\r
179 \r
180         }\r
181 \r
182 }\r