]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.db.impl/src/org/simantics/db/impl/query/AssertedPredicates.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.db.impl / src / org / simantics / db / impl / query / AssertedPredicates.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 java.util.ArrayList;\r
15 import java.util.concurrent.Semaphore;\r
16 \r
17 import org.simantics.db.RelationInfo;\r
18 import org.simantics.db.impl.graph.ReadGraphImpl;\r
19 import org.simantics.db.impl.procedure.IntProcedureAdapter;import org.simantics.db.impl.procedure.InternalProcedure;\r
20 import org.simantics.db.procedure.ListenerBase;\r
21 \r
22 \r
23 final public class AssertedPredicates extends CollectionUnaryQuery<IntProcedure> {\r
24         \r
25 //      public ArrayList<IntProcedure> procs = null;\r
26         \r
27     public AssertedPredicates(final int r) {\r
28         super(r);\r
29     }\r
30 \r
31     public static AssertedPredicates newInstance(final int r) {\r
32         return new AssertedPredicates(r);\r
33     }\r
34     \r
35     final static void runner(ReadGraphImpl graph, final int r, final QueryProcessor provider, final CacheEntry parent, final ListenerBase listener, final IntProcedure procedure) {\r
36 \r
37         AssertedPredicates entry = (AssertedPredicates)provider.assertedPredicatesMap.get(r);\r
38         if(entry == null) {\r
39                 \r
40                 entry = new AssertedPredicates(r);\r
41                 entry.setPending();\r
42                 entry.clearResult(provider.querySupport);\r
43                 entry.putEntry(provider);\r
44                 \r
45             provider.performForEach(graph, entry, parent, listener, procedure);\r
46             \r
47         } else {\r
48                 \r
49             if(!entry.isReady()) {\r
50                 synchronized(entry) {\r
51                     if(!entry.isReady()) {\r
52                         throw new IllegalStateException();\r
53 //                      if(entry.procs == null) entry.procs = new ArrayList<IntProcedure>();\r
54 //                      entry.procs.add(procedure);\r
55 //                      return;\r
56                     }\r
57                 }\r
58             }\r
59             provider.performForEach(graph, entry, parent, listener, procedure);\r
60         }\r
61 \r
62     }\r
63     \r
64     final public static void queryEach(ReadGraphImpl graph, final int r, final QueryProcessor provider, final CacheEntry parent, final ListenerBase listener, final IntProcedure procedure) {\r
65         \r
66         if(parent == null && listener == null) {\r
67                 AssertedPredicates entry = (AssertedPredicates)provider.assertedPredicatesMap.get(r);\r
68                 if(entry != null && entry.isReady()) { \r
69                         entry.performFromCache(graph, provider, procedure);\r
70                         return;\r
71                 }\r
72         }\r
73         \r
74         runner(graph, r, provider, parent, listener, procedure);\r
75          \r
76     }\r
77 \r
78     @Override\r
79     public UnaryQuery<IntProcedure> getEntry(QueryProcessor provider) {\r
80         return provider.assertedPredicatesMap.get(id);\r
81     }\r
82         \r
83         @Override\r
84         public void putEntry(QueryProcessor provider) {\r
85         provider.assertedPredicatesMap.put(id, this);\r
86         }\r
87 \r
88         @Override\r
89         final public void removeEntry(QueryProcessor provider) {\r
90             provider.assertedPredicatesMap.remove(id);\r
91         }\r
92         \r
93         void computeInheritedAssertions(ReadGraphImpl graph, int type, final QueryProcessor queryProvider, final IntProcedure proc, final boolean store) {\r
94 \r
95             DirectObjects.queryEach(graph, type, queryProvider.getInherits(), queryProvider, this, null, new SyncIntProcedure() {\r
96 \r
97             @Override\r
98             public void run(ReadGraphImpl graph) {\r
99                 \r
100 //                finish(graph, queryProvider);\r
101 //                      proc.finished(graph);\r
102                 \r
103             }\r
104 \r
105             @Override\r
106             public void execute(ReadGraphImpl graph,int inh) {\r
107 \r
108                 inc();\r
109                 \r
110                 AssertedPredicates.queryEach(graph, inh, queryProvider, AssertedPredicates.this, null, new IntProcedure() {\r
111 \r
112                     @Override\r
113                     public void execute(ReadGraphImpl graph, int ass) {\r
114                             \r
115                         addOrSet(ass);\r
116 //                      proc.execute(graph, ass);\r
117                         \r
118                     }\r
119 \r
120                     @Override\r
121                     public void finished(ReadGraphImpl graph) {\r
122                         dec(graph);\r
123                     }\r
124                                 \r
125                                 @Override\r
126                                 public void exception(ReadGraphImpl graph, Throwable t) {\r
127 //                                      proc.exception(graph, t);\r
128                     }\r
129                     \r
130                 });\r
131                 \r
132             }\r
133 \r
134             @Override\r
135             public void finished(ReadGraphImpl graph) {\r
136                 \r
137                 dec(graph);\r
138                 \r
139             }\r
140             \r
141         });\r
142 \r
143         }\r
144 \r
145     @Override\r
146     public Object computeForEach(ReadGraphImpl graph, final QueryProcessor queryProvider, final IntProcedure proc, final boolean store) {\r
147 \r
148         computeInheritedAssertions(graph, id, queryProvider, proc, store);\r
149 \r
150         DirectObjects.queryEach(graph, id, queryProvider.getAsserts(), queryProvider, this, null, new IntProcedure() {\r
151 \r
152             @Override\r
153             public void execute(ReadGraphImpl graph, final int ass) {\r
154                 \r
155                 DirectObjects.queryEach(graph, ass, queryProvider.getHasPredicate(), queryProvider, AssertedPredicates.this, null, new IntProcedure() {\r
156 \r
157                     @Override\r
158                     public void execute(ReadGraphImpl graph, final int pred) {\r
159 \r
160                         addOrSetHiding(graph, pred, AssertedPredicates.this);\r
161 //                      proc.execute(graph, pred);\r
162                         return;\r
163                         \r
164                     }\r
165 \r
166                     @Override\r
167                     public void finished(ReadGraphImpl graph) {\r
168                     }\r
169                                 \r
170                                 @Override\r
171                                 public void exception(ReadGraphImpl graph, Throwable t) {\r
172 //                                      proc.exception(graph, t);\r
173                     }\r
174 \r
175                 });\r
176                 \r
177             }\r
178 \r
179             @Override\r
180             public void finished(ReadGraphImpl graph) {\r
181             }\r
182 \r
183                         @Override\r
184                         public void exception(ReadGraphImpl graph, Throwable t) {\r
185 //                              proc.exception(graph, t);\r
186                         }\r
187             \r
188         });\r
189         \r
190         finish(graph, queryProvider);\r
191 \r
192         performFromCache(graph, queryProvider, proc);\r
193         \r
194         return getResult();\r
195         \r
196     }\r
197     \r
198     @Override\r
199     public String toString() {\r
200         return "AssertedPredicates[" + id + "]";\r
201     }\r
202     \r
203     final public void finish(ReadGraphImpl graph, QueryProcessor provider) {\r
204         \r
205         assert(!isReady());\r
206 \r
207 //        ArrayList<IntProcedure> p = null;\r
208 \r
209         synchronized(this) {\r
210 \r
211                 setReady();\r
212 //            p = procs;\r
213 //            procs = null; \r
214         \r
215         }\r
216 \r
217 //        if(p != null) {\r
218 //              IntArray v = (IntArray)getResult();\r
219 //              if(v.data == null) {\r
220 //                  if(v.sizeOrData != IntArray.NO_DATA) {\r
221 //                      for(IntProcedure proc : p) proc.execute(graph, v.sizeOrData);\r
222 //                  }\r
223 //              } else {\r
224 //                  for(IntProcedure proc : p) {\r
225 //                      for(int i = 0;i < v.sizeOrData ; i++) proc.execute(graph, v.data[i]);\r
226 //                  }\r
227 //              }\r
228 //              \r
229 //              for(IntProcedure proc : p) proc.finished(graph);\r
230 //        }\r
231 \r
232     }\r
233 \r
234     synchronized private void addOrSet(int add) {\r
235 \r
236         assert(isPending());\r
237         \r
238         IntArray value = (IntArray)getResult(); \r
239         value.add(add);\r
240         \r
241     }\r
242 \r
243         final static InternalProcedure<RelationInfo> ip = new InternalProcedure<RelationInfo>() {\r
244 \r
245                 @Override\r
246                 public void execute(ReadGraphImpl graph, RelationInfo result) {\r
247                 }\r
248 \r
249                 @Override\r
250                 public void exception(ReadGraphImpl graph, Throwable throwable) {\r
251                 }\r
252 \r
253         };\r
254 \r
255         final static InternalProcedure<IntSet> ip2 = new InternalProcedure<IntSet>() {\r
256 \r
257                 @Override\r
258                 public void execute(ReadGraphImpl graph, IntSet result) {\r
259                 }\r
260 \r
261                 @Override\r
262                 public void exception(ReadGraphImpl graph, Throwable throwable) {\r
263                 }\r
264 \r
265         };\r
266 \r
267         synchronized private void addOrSetHiding(ReadGraphImpl graph, int add, CacheEntry parent) {\r
268 \r
269         assert(isPending());\r
270         \r
271         IntArray value = (IntArray)getResult(); \r
272                 RelationInfo ri = RelationInfoQuery.queryEach(graph, add, graph.processor, parent, null, ip);\r
273                 if(ri.isFunctional) {\r
274                         // Replace existing functional predicate if found\r
275                         try {\r
276                                 IntSet supers = SuperRelations.queryEach2(graph, add, graph.processor, parent, null, ip2);\r
277                         if(value.data == null) {\r
278                             if(value.sizeOrData != IntArray.NO_DATA) {\r
279                                 if(supers.contains(value.sizeOrData)) {\r
280                                         value.sizeOrData = add;\r
281                                         return;\r
282                                 }\r
283                             }\r
284                         } else {\r
285                             for(int i = 0;i < value.sizeOrData ; i++) {\r
286                                 if(supers.contains(value.data[i])) {\r
287                                         value.data[i] = add;\r
288                                         return;\r
289                                 }\r
290                             }\r
291                         }\r
292                         } catch (Throwable e) {\r
293                                 except(e);\r
294                                 return;\r
295                         }\r
296                 }\r
297                 \r
298             // No replacement - append\r
299         value.add(add);\r
300 \r
301     }\r
302     \r
303     @Override\r
304     public Object performFromCache(ReadGraphImpl graph, QueryProcessor provider, final IntProcedure procedure) {\r
305 \r
306         assert(isReady());\r
307         \r
308         if(handleException(graph, procedure)) return EXCEPTED;\r
309         \r
310         final IntArray value = (IntArray)getResult();\r
311         if(value.data == null) {\r
312             if(value.sizeOrData != IntArray.NO_DATA) procedure.execute(graph, value.sizeOrData);\r
313         } else {\r
314             for(int i = 0;i < value.sizeOrData ; i++) procedure.execute(graph, value.data[i]);\r
315         }\r
316 \r
317         procedure.finished(graph);\r
318         \r
319         return value;\r
320         \r
321     }\r
322     \r
323     @Override\r
324     public void recompute(ReadGraphImpl graph, QueryProcessor provider) {\r
325         \r
326         final Semaphore s = new Semaphore(0);\r
327 \r
328         computeForEach(graph, provider, new IntProcedureAdapter() {\r
329 \r
330             @Override\r
331             public void finished(ReadGraphImpl graph) {\r
332                 s.release();\r
333             }\r
334 \r
335             @Override\r
336             public void exception(ReadGraphImpl graph, Throwable t) {\r
337                 s.release();\r
338                 new Error("Error in recompute.", t).printStackTrace();\r
339             }\r
340 \r
341         }, true);\r
342 \r
343         while(!s.tryAcquire()) {\r
344                 provider.resume(graph);\r
345         }\r
346         \r
347     }\r
348     \r
349     \r
350 }\r