// (c) Tuomas J. Lukka package org.fenfire.swamp.impl; import org.fenfire.swamp.*; import java.util.HashMap; import java.util.HashSet; import java.util.ArrayList; import java.util.Iterator; /** A Graph implemented by HashMaps. * Relatively inefficient but a basic implementation * that can be used as a reference. */ public class HashGraph implements Graph { /** Map: key = subject, value = (Map: key=predicate, value = * (Set: r/l)). */ private HashMap spo; private HashSet emptySet = new HashSet(); private HashSet get_HHS(boolean create, HashMap m, Object o1, Object o2) { HashMap m2 = (HashMap)m.get(o1); if(m2 == null) { if(create) { m2 = new HashMap(); m.put(o1, m2); } else { return null; } } HashSet s = (HashSet)m2.get(o2); if(s == null) { if(create) { s = new HashSet(); m2.put(o2, s); } else { return null; } } return s; } public Object find1_11X(Object subject, Object predicate) { 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(); } public Iterator findN_11X_Iter(Object subject, Object predicate) { HashSet s = get_HHS(false, spo, subject, predicate); if(s == null) return emptySet.iterator(); int size = s.size(); return s.iterator(); } public void set1_11X(Object subject, Object predicate, Object object) { rm_11X(subject, predicate); get_HHS(true, spo, subject, predicate).add(object); } public void rm_11X(Object subject, Object predicate) { HashSet s = get_HHS(false, spo, subject, predicate); if(s == null) return; ArrayList l = new ArrayList(s); for(Iterator i = l.iterator(); i.hasNext(); ) rm_111(subject, predicate, i.next()); } public void rm_111(Object subject, Object predicate, Object object) { HashSet s = get_HHS(false, spo, subject, predicate); if(s == null) return; s.remove(object); } }