17 |
graph = [] |
graph = [] |
18 |
|
|
19 |
for pattern in ( |
for pattern in ( |
20 |
"111", |
"111", # Only these three removes at first... |
21 |
"11A", "1A1", "A11", |
"11A", |
22 |
"1AA", "A1A", "AA1"): |
"1AA", |
23 |
|
): |
24 |
graph.append({ |
graph.append({ |
25 |
"Type": "rm", |
"Type": "rm", |
26 |
"Pattern": pattern}) |
"Pattern": pattern}) |
136 |
public interface Graph extends ConstGraph { |
public interface Graph extends ConstGraph { |
137 |
Graph getObservedGraph(org.fenfire.Obs o); |
Graph getObservedGraph(org.fenfire.Obs o); |
138 |
void close(); |
void close(); |
139 |
|
void set1_11X(Object subject, Object predicate, Object object); |
140 |
|
|
141 |
%(nonobs_modprotos)s |
%(nonobs_modprotos)s |
142 |
|
|
204 |
this.graph = graph; |
this.graph = graph; |
205 |
this.obs = obs; |
this.obs = obs; |
206 |
} |
} |
207 |
|
void set1_11X(Object subject, Object predicate, Object object) { |
208 |
|
graph.set1_11X(subject, predicate, object); |
209 |
|
} |
210 |
|
|
211 |
%(graph_callother)s |
%(graph_callother)s |
212 |
} |
} |
230 |
|
|
231 |
def makeFind(g): |
def makeFind(g): |
232 |
code = "" |
code = "" |
233 |
|
code += proto(g, 1) + "{\n"; |
234 |
|
def ow(i, wild): |
235 |
|
if g["Pattern"][i] == "1": return "e"+str(i) |
236 |
|
else: return wild |
237 |
|
|
238 |
|
code += "if(obs != null) observer.addObs(%s, %s, %s, obs);\n" % tuple( |
239 |
|
[ow(i, "observer.WILDCARD") for i in range(0,3)]) |
240 |
|
|
241 |
|
notUniqueParams = ",".join([ow(i, "null") for i in range(0,3)]) |
242 |
|
|
243 |
|
indsNeeded = [i for i in range(0,3) if g["Pattern"][i] == "1"] |
244 |
|
indNext = [i for i in range(0,3) if g["Pattern"][i] == "X"][0] |
245 |
|
|
246 |
|
print g, indsNeeded, indNext |
247 |
|
|
248 |
|
success = None |
249 |
|
|
250 |
|
# Select the index to use |
251 |
|
for i in range(0,len(hashIndices)): |
252 |
|
if len(indsNeeded): |
253 |
|
firstinds = hashIndices[i][0:len(indsNeeded)] |
254 |
|
if not min([el in firstinds for el in indsNeeded]) : |
255 |
|
print "Can't be ", hashNames[i], indsNeeded, firstinds |
256 |
|
continue |
257 |
|
if hashIndices[i][len(indsNeeded)] != indNext: |
258 |
|
print "Can't be (because of next set) ",hashNames[i], hashIndices[i], indNext |
259 |
|
continue |
260 |
|
|
261 |
|
print "Is: ",hashNames[i] |
262 |
|
success = i |
263 |
|
break |
264 |
|
|
265 |
|
assert success != None |
266 |
|
ind = i |
267 |
|
|
268 |
|
curHash = hashNames[ind] |
269 |
|
for i in range(0,3): |
270 |
|
elem = hashIndices[ind][i] |
271 |
|
newHash = "hash"+str(i+1) |
272 |
|
p = g["Pattern"][elem] |
273 |
|
if p == "1": |
274 |
|
if i == 1: |
275 |
|
htype = "HashSet" |
276 |
|
else: |
277 |
|
htype = "HashMap" |
278 |
|
code += """ |
279 |
|
%(htype)s %(newHash)s = (%(htype)s) %(curHash)s.get(e%(elem)s); |
280 |
|
if(%(newHash)s == null) RETURN_NONE |
281 |
|
""" % locals() |
282 |
|
curHash = newHash |
283 |
|
elif p == "X": |
284 |
|
if i < 2: |
285 |
|
code += """ |
286 |
|
HashSet resSet = %(curHash)s.keySet(); |
287 |
|
""" % locals() |
288 |
|
else: |
289 |
|
code += """ |
290 |
|
HashSet resSet = %(curHash)s; |
291 |
|
""" % locals() |
292 |
|
break |
293 |
|
elif p == "A": |
294 |
|
assert 1 == 0 |
295 |
|
|
296 |
|
if g["NVal"] == "N": |
297 |
|
code += "return resSet.iterator();\n" |
298 |
|
code = code.replace("RETURN_NONE", "return emptySet.iterator(); ") |
299 |
|
else: |
300 |
|
code += """ |
301 |
|
if(resSet.size() == 0) return null; |
302 |
|
if(resSet.size() == 1) return resSet().iterator().next(); |
303 |
|
throw new NotUniqueError(%(notUniqueParams)s); |
304 |
|
""" % locals() |
305 |
|
code = code.replace("RETURN_NONE", "return null; ") |
306 |
|
|
307 |
|
|
308 |
|
|
309 |
|
code += "}\n\n" |
310 |
return code |
return code |
311 |
|
|
312 |
finds = "".join([makeFind(g) for g in constgraph]) |
finds = "".join([makeFind(g) for g in constgraph]) |
313 |
|
|
314 |
|
rm_triple = "" |
315 |
|
add_triple = "" |
316 |
|
for ind in range(0, len(hashIndices)): |
317 |
|
name = hashNames[ind] |
318 |
|
s0 = hashIndices[ind][0] |
319 |
|
s1 = hashIndices[ind][1] |
320 |
|
s2 = hashIndices[ind][2] |
321 |
|
rm_triple += """ |
322 |
|
rm_ind(%(name)s, e%(s0)s, e%(s1)s, e%(s2)s); |
323 |
|
""" % locals() |
324 |
|
add_triple += """ |
325 |
|
add_ind(%(name)s, e%(s0)s, e%(s1)s, e%(s2)s); |
326 |
|
""" % locals() |
327 |
|
|
328 |
mkFile("org/fenfire/swamp/impl/HashGraph.nava", """ |
mkFile("org/fenfire/swamp/impl/HashGraph.nava", """ |
329 |
package org.fenfire.swamp.impl; |
package org.fenfire.swamp.impl; |
330 |
import org.fenfire.Obs; |
import org.fenfire.Obs; |
346 |
private HashSet emptySet = new HashSet(); |
private HashSet emptySet = new HashSet(); |
347 |
private StdObserver observer = new StdObserver(); |
private StdObserver observer = new StdObserver(); |
348 |
|
|
349 |
private HashSet get_HHS(boolean create, HashMap m, |
private final void rm_ind(HashMap ind, Object o1, Object o2, Object o3) { |
350 |
Object o1, Object o2) { |
HashMap m2 = (HashMap)ind.get(o1); |
351 |
HashMap m2 = (HashMap)m.get(o1); |
if(m2 == null) return; |
352 |
|
HashSet m3 = (HashMap)m2.get(o2); |
353 |
|
if(m3 == null) return; |
354 |
|
m3.remove(o3); |
355 |
|
} |
356 |
|
|
357 |
|
private final void add_ind(HashMap ind, Object o1, Object o2, Object o3) { |
358 |
|
HashMap m2 = (HashMap)ind.get(o1); |
359 |
if(m2 == null) { |
if(m2 == null) { |
360 |
if(create) { |
if(create) { |
361 |
m2 = new HashMap(); |
m2 = new HashMap(); |
373 |
return null; |
return null; |
374 |
} |
} |
375 |
} |
} |
376 |
return s; |
s.add(o3); |
377 |
} |
} |
378 |
|
|
379 |
////////////////// |
public void set1_11X(Object subject, Object predicate, Object object) { |
380 |
// Finds |
rm_11X(subject, predicate); |
|
|
|
|
%(finds)s |
|
381 |
|
|
382 |
public Object find1_11X(Object subject, Object predicate, Obs obs) { |
add(subject, predicate, object); |
|
observer.addObs(subject, predicate, observer.WILDCARD, obs); |
|
|
HashSet s = get_HHS(false, spo, subject, predicate); |
|
|
if(s == null) return null; |
|
|
int size = s.size(); |
|
|
if(size == 0) return null; |
|
|
if(size != 1) throw new NotUniqueError(subject, predicate, null); |
|
|
// urgh... |
|
|
return s.iterator().next(); |
|
383 |
} |
} |
384 |
|
|
385 |
|
|
386 |
public Iterator findN_11X_Iter(Object subject, Object predicate, Obs obs) { |
////////////////// |
387 |
observer.addObs(subject, predicate, observer.WILDCARD, obs); |
// Finds |
|
HashSet s = get_HHS(false, spo, subject, predicate); |
|
|
if(s == null) |
|
|
return emptySet.iterator(); |
|
|
int size = s.size(); |
|
|
return s.iterator(); |
|
|
} |
|
388 |
|
|
389 |
|
%(finds)s |
390 |
|
|
391 |
|
|
392 |
// -------------------------------- |
// -------------------------------- |
395 |
// |
// |
396 |
|
|
397 |
|
|
|
public void set1_11X(Object subject, Object predicate, Object object) { |
|
|
rm_11X(subject, predicate); |
|
|
|
|
|
add(subject, predicate, object); |
|
|
} |
|
|
|
|
398 |
public void rm_11X(Object subject, Object predicate) { |
public void rm_11X(Object subject, Object predicate) { |
399 |
HashSet s = get_HHS(false, spo, subject, predicate); |
HashSet s = get_HHS(false, spo, subject, predicate); |
400 |
if(s == null) return; |
if(s == null) return; |
408 |
// Methods which actually modify the structure |
// Methods which actually modify the structure |
409 |
// |
// |
410 |
|
|
411 |
public void rm_111(Object subject, Object predicate, Object object) { |
public void rm_111(Object e0, Object e1, Object e2) { |
412 |
HashSet s = get_HHS(false, spo, subject, predicate); |
%(rm_triple)s |
413 |
if(s == null) return; |
|
414 |
s.remove(object); |
observer.triggerObs(e0, e1, e2); |
|
observer.triggerObs(subject, predicate, object); |
|
415 |
} |
} |
416 |
|
|
417 |
public void add(Object subject, Object predicate, Object object) { |
public void add(Object e0, Object e1, Object e2) { |
418 |
get_HHS(true, spo, subject, predicate).add(object); |
%(add_triple)s |
419 |
observer.triggerObs(subject, predicate, object); |
|
420 |
|
observer.triggerObs(e0, e1, e2); |
421 |
} |
} |
422 |
|
|
423 |
} |
} |
425 |
|
|
426 |
|
|
427 |
|
|
428 |
""") |
""" % locals()) |
429 |
|
|
430 |
makeHashGraph() |
makeHashGraph() |