1 |
// (c) Tuomas J. Lukka |
// (c) Tuomas J. Lukka |
2 |
|
|
3 |
package org.fenfire.swamp.impl; |
package org.fenfire.swamp.impl; |
4 |
|
import org.fenfire.Obs; |
5 |
import org.fenfire.swamp.*; |
import org.fenfire.swamp.*; |
6 |
|
|
7 |
import java.util.HashMap; |
import java.util.HashMap; |
13 |
* Relatively inefficient but a basic implementation |
* Relatively inefficient but a basic implementation |
14 |
* that can be used as a reference. |
* that can be used as a reference. |
15 |
*/ |
*/ |
16 |
public class HashGraph implements Graph { |
public class HashGraph extends StdObservableGraph { |
17 |
|
|
18 |
/** Map: key = subject, value = (Map: key=predicate, value = |
/** Map: key = subject, value = (Map: key=predicate, value = |
19 |
* (Set: r/l)). |
* (Set: r/l)). |
20 |
*/ |
*/ |
21 |
private HashMap spo = new HashMap(); |
private HashMap spo = new HashMap(); |
22 |
|
|
23 |
|
|
24 |
private HashSet emptySet = new HashSet(); |
private HashSet emptySet = new HashSet(); |
25 |
|
|
26 |
|
private StdObserver observer = new StdObserver(); |
27 |
|
|
28 |
private HashSet get_HHS(boolean create, HashMap m, |
private HashSet get_HHS(boolean create, HashMap m, |
29 |
Object o1, Object o2) { |
Object o1, Object o2) { |
30 |
HashMap m2 = (HashMap)m.get(o1); |
HashMap m2 = (HashMap)m.get(o1); |
48 |
return s; |
return s; |
49 |
} |
} |
50 |
|
|
51 |
public Object find1_11X(Object subject, Object predicate) { |
public Object find1_11X(Object subject, Object predicate, Obs obs) { |
52 |
|
observer.addObs(subject, predicate, observer.WILDCARD, obs); |
53 |
HashSet s = get_HHS(false, spo, subject, predicate); |
HashSet s = get_HHS(false, spo, subject, predicate); |
54 |
if(s == null) return null; |
if(s == null) return null; |
55 |
int size = s.size(); |
int size = s.size(); |
58 |
// urgh... |
// urgh... |
59 |
return s.iterator().next(); |
return s.iterator().next(); |
60 |
} |
} |
61 |
public Iterator findN_11X_Iter(Object subject, Object predicate) { |
|
62 |
|
|
63 |
|
public Iterator findN_11X_Iter(Object subject, Object predicate, Obs obs) { |
64 |
|
observer.addObs(subject, predicate, observer.WILDCARD, obs); |
65 |
HashSet s = get_HHS(false, spo, subject, predicate); |
HashSet s = get_HHS(false, spo, subject, predicate); |
66 |
if(s == null) |
if(s == null) |
67 |
return emptySet.iterator(); |
return emptySet.iterator(); |
69 |
return s.iterator(); |
return s.iterator(); |
70 |
} |
} |
71 |
|
|
72 |
|
|
73 |
|
|
74 |
|
// -------------------------------- |
75 |
|
// Methods which modify the structure by calling the single-triple |
76 |
|
// methods below. |
77 |
|
// |
78 |
|
|
79 |
|
|
80 |
public void set1_11X(Object subject, Object predicate, Object object) { |
public void set1_11X(Object subject, Object predicate, Object object) { |
81 |
rm_11X(subject, predicate); |
rm_11X(subject, predicate); |
82 |
|
|
91 |
rm_111(subject, predicate, i.next()); |
rm_111(subject, predicate, i.next()); |
92 |
} |
} |
93 |
|
|
94 |
|
|
95 |
|
// -------------------------------- |
96 |
|
// Methods which actually modify the structure |
97 |
|
// |
98 |
|
|
99 |
public void rm_111(Object subject, Object predicate, Object object) { |
public void rm_111(Object subject, Object predicate, Object object) { |
100 |
HashSet s = get_HHS(false, spo, subject, predicate); |
HashSet s = get_HHS(false, spo, subject, predicate); |
101 |
if(s == null) return; |
if(s == null) return; |
102 |
s.remove(object); |
s.remove(object); |
103 |
|
observer.triggerObs(subject, predicate, object); |
104 |
} |
} |
105 |
|
|
106 |
public void add(Object subject, Object predicate, Object object) { |
public void add(Object subject, Object predicate, Object object) { |
107 |
get_HHS(true, spo, subject, predicate).add(object); |
get_HHS(true, spo, subject, predicate).add(object); |
108 |
|
observer.triggerObs(subject, predicate, object); |
109 |
} |
} |
110 |
|
|
111 |
} |
} |