]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.db.impl/src/org/simantics/db/impl/query/DirectPredicates.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.db.impl / src / org / simantics / db / impl / query / DirectPredicates.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.concurrent.Semaphore;\r
15 \r
16 import org.simantics.db.common.exception.DebugException;\r
17 import org.simantics.db.impl.graph.ReadGraphImpl;\r
18 import org.simantics.db.impl.procedure.IntProcedureAdapter;\r
19 import org.simantics.db.procedure.ListenerBase;\r
20 \r
21 final public class DirectPredicates extends CollectionUnaryQuery<IntProcedure> {\r
22 \r
23         private DirectPredicates(final int resource) {\r
24                 super(resource);\r
25         }\r
26 \r
27         final static DirectPredicates entry(final QueryProcessor provider, final int r) {\r
28 \r
29                 return (DirectPredicates)provider.directPredicatesMap.get(r);\r
30 \r
31         }\r
32 \r
33         final static void runner(ReadGraphImpl graph, final int r, final QueryProcessor provider, final CacheEntry parent, final ListenerBase listener, final IntProcedure procedure) {\r
34 \r
35                 DirectPredicates entry = (DirectPredicates)provider.directPredicatesMap.get(r);\r
36                 if(entry == null) {\r
37 \r
38                         entry = new DirectPredicates(r);\r
39                 entry.setPending();\r
40                 entry.clearResult(provider.querySupport);\r
41                 entry.putEntry(provider);\r
42                         \r
43                         provider.performForEach(graph, entry, parent, listener, procedure);\r
44                         \r
45                 } else {\r
46                         \r
47                         if(!entry.isReady()) {\r
48                                 synchronized(entry) {\r
49                                         if(!entry.isReady()) {\r
50                                                 provider.registerDependencies(graph, entry, parent, listener, procedure, false);\r
51                                                 entry.computeForEach(graph, provider, procedure, true);\r
52                                                 return;\r
53                                         }\r
54                                 }\r
55                         }\r
56                         \r
57                         provider.performForEach(graph, entry, parent, listener, procedure);\r
58                         \r
59                 }\r
60 \r
61         }\r
62 \r
63         final public static void queryEach(ReadGraphImpl graph, final int r, final QueryProcessor provider, final CacheEntry parent, final ListenerBase listener, final IntProcedure procedure) {\r
64 \r
65                 if(parent == null && listener == null) {\r
66                         DirectPredicates entry = (DirectPredicates)provider.directPredicatesMap.get(r);\r
67                         if(entry != null && entry.isReady()) { \r
68                                 entry.performFromCache(graph, provider, procedure);\r
69                                 return;\r
70                         } else {\r
71                             computeForEach(graph, r, null, procedure, false);\r
72                             return;\r
73                         }\r
74                 }\r
75 \r
76                 runner(graph, r, provider, parent, listener, procedure);\r
77 \r
78         }\r
79 \r
80         \r
81         @Override\r
82         public void clearResult(QuerySupport support) {\r
83                 // The cached result is never used\r
84                 setResult(INVALID_RESULT);\r
85         }\r
86         \r
87         @Override\r
88         public UnaryQuery<IntProcedure> getEntry(QueryProcessor provider) {\r
89                 return provider.directPredicatesMap.get(id);\r
90         }\r
91 \r
92         @Override\r
93         public void putEntry(QueryProcessor provider) {\r
94                 provider.directPredicatesMap.put(id, this);\r
95         }\r
96 \r
97         @Override\r
98         final public void removeEntry(QueryProcessor provider) {\r
99                 provider.directPredicatesMap.remove(id);\r
100         }\r
101 \r
102         @Override\r
103         public Object computeForEach(ReadGraphImpl graph, QueryProcessor provider, IntProcedure procedure, boolean store) {\r
104             return computeForEach(graph, id, this, procedure, store);\r
105         }\r
106         \r
107         public static Object computeForEach(ReadGraphImpl graph, int id, final DirectPredicates entry, final IntProcedure procedure, final boolean store) {\r
108 \r
109                 graph.processor.querySupport.ensureLoaded(graph, id);\r
110                 \r
111                 final IntArray list = new IntArray();\r
112 \r
113                 graph.processor.querySupport.getPredicates(graph, id, new IntProcedure() {\r
114 \r
115                         @Override\r
116                         public void execute(ReadGraphImpl graph, int i) {\r
117                                 list.add(i);\r
118                         }\r
119 \r
120                         @Override\r
121                         public void finished(ReadGraphImpl graph) {\r
122                         }\r
123 \r
124                         @Override\r
125                         public void exception(ReadGraphImpl graph, Throwable t) {\r
126                                 if(DebugException.DEBUG) new DebugException(t).printStackTrace();\r
127                         }\r
128 \r
129                 });\r
130 \r
131                 if(entry != null)\r
132                     entry.finish(graph, graph.processor);\r
133 \r
134                 if(list.data == null) {\r
135                         if(list.sizeOrData != IntArray.NO_DATA) procedure.execute(graph, list.sizeOrData);\r
136                 } else {\r
137                         for(int i = 0;i < list.sizeOrData ; i++) procedure.execute(graph, list.data[i]);\r
138                 }\r
139 \r
140                 procedure.finished(graph);\r
141                 \r
142                 return list;\r
143 \r
144         }\r
145 \r
146         @Override\r
147         public String toString() {\r
148                 return "DirectPredicates[" + id + "]";\r
149         }\r
150 \r
151         @Override\r
152         public void setReady() {\r
153                 statusOrException = READY;\r
154         }\r
155         \r
156         final private void finish(ReadGraphImpl graph, QueryProcessor provider) {\r
157 \r
158                 setReady();\r
159 \r
160         }\r
161 \r
162         @Override\r
163         public Object performFromCache(ReadGraphImpl graph, QueryProcessor provider, IntProcedure procedure) {\r
164 \r
165                 assert(isReady());\r
166 \r
167                 return computeForEach(graph, provider, procedure, false);\r
168 \r
169         }\r
170 \r
171         @Override\r
172         public void recompute(ReadGraphImpl graph, QueryProcessor provider) {\r
173 \r
174                 final Semaphore s = new Semaphore(0);\r
175 \r
176                 computeForEach(graph, provider, new IntProcedureAdapter() {\r
177 \r
178                         @Override\r
179                         public void finished(ReadGraphImpl graph) {\r
180                                 s.release();\r
181                         }\r
182 \r
183                         @Override\r
184                         public void exception(ReadGraphImpl graph, Throwable t) {\r
185                                 s.release();\r
186                                 new Error("Error in recompute.", t).printStackTrace();\r
187                         }\r
188 \r
189                 }, true);\r
190 \r
191         while(!s.tryAcquire()) {\r
192                 provider.resume(graph);\r
193         }\r
194 \r
195         }\r
196 \r
197 \r
198     @Override\r
199     boolean isImmutable(ReadGraphImpl graph) {\r
200         return graph.processor.isImmutable(id);\r
201     }\r
202 \r
203 }\r