//(c): Benja Fallenstein and Matti J. Katila package org.fenfire.index.impl; import org.fenfire.*; import org.fenfire.vocab.*; import org.fenfire.util.*; import org.fenfire.index.*; import org.nongnu.alph.*; import com.hp.hpl.mesa.rdf.jena.model.*; import java.util.*; /** An index of xanadu links stored in a space. */ public class SpaceXuIndexer implements XuIndexer { public static final String rcsid = "$Id: SpaceXuIndexer.java,v 1.1 2003/03/26 23:48:14 mudyc Exp $"; public static final boolean dbg = true; protected static void p(String s) { if(dbg) pa(s); } protected static void pa(String s) { System.out.println(s); } protected Space space; protected VStreamNodeTexter texter; protected MyIndex forwardIndex = new MyIndex(1), backwardIndex = new MyIndex(2); protected Map linksByNode = new HashMap(), nodesByLink = new HashMap(); public SpaceXuIndexer(Space space) { this.space = space; this.texter = (VStreamNodeTexter)space.getNodeTexter(); } protected class MyIndex implements Index { /** Return only links corresponding to nth cells on * d.xu-link (count starts with 0) */ int n; public MyIndex(int n) { this.n = n; } public Collection getMatches(Object o) { Collection res = new ArrayList(); Collection all = IndexManager.getEnfiladeOverlap(space).getMatches(o); /* for(Iterator i=all.iterator(); i.hasNext();) { Cell c = (Cell)i.next(); if(c.s(link, -n) != null && c.s(link, -n-1) == null) { res.add(getLinkForNode(c.h(link))); } } */ for(Iterator i=all.iterator(); i.hasNext(); ) { RDFNode n = (RDFNode)i.next(); // XXX ???? } return res; } } public Index getForwardIndex() { return forwardIndex; } public Index getBackwardIndex() { return backwardIndex; } protected Object getLinkForNode(RDFNode node) { Object res = linksByNode.get(node); if (res == null) { if(ShortRDF.isNodeType(space.getModel(), node, ALPH.xuType)) { RDFNode from = ShortRDF.getRes(space.getModel(), node, ALPH.xuLinkFrom); RDFNode to = ShortRDF.getRes(space.getModel(), node, ALPH.xuLinkTo); res = new XuLink(texter.getEnfilade(from, null), texter.getEnfilade(to, null)); linksByNode.put(node, res); nodesByLink.put(res, node); } else { return null; } } return res; } /** ,--ALPH:xuLinkFrom -> from * ALPH.xuType <--RDF:type --- id--< * '--ALPH:xuLinkTo-> to */ public void add(XuLink l) { Model mod = space.getModel(); RDFNode id = ShortRDF.newNode(mod, ALPH.xuType); RDFNode from = ShortRDF.newNode(mod, id, ALPH.xuLinkFrom); RDFNode to = ShortRDF.newNode(mod, id, ALPH.xuLinkTo); texter.setEnfilade(from, l.from); texter.setEnfilade(to, l.to); linksByNode.put(id, l); nodesByLink.put(l, id); } public void remove(XuLink l) { /* Cell c = (Cell)nodesByLink.get(l); if(c != null) { c.s(link, 2).delete(); c.s(link, 1).delete(); c.delete(); nodesByLink.remove(l); linksByNode.remove(c); } */ // XXX pa("Not implemented!!!!"); } }