[Mulgara-svn] r247 - in branches/blank_nodes/src/jar: resolver/java/org/mulgara/resolver resolver-distributed/java/org/mulgara/resolver/distributed

pag at mulgara.org pag at mulgara.org
Fri Apr 20 21:17:42 UTC 2007


Author: pag
Date: 2007-04-20 16:17:42 -0500 (Fri, 20 Apr 2007)
New Revision: 247

Modified:
   branches/blank_nodes/src/jar/resolver-distributed/java/org/mulgara/resolver/distributed/AnswerResolution.java
   branches/blank_nodes/src/jar/resolver-distributed/java/org/mulgara/resolver/distributed/ForeignBlankNode.java
   branches/blank_nodes/src/jar/resolver/java/org/mulgara/resolver/StringPoolSession.java
Log:
Undebugged, first attempt at keeping track of blank nodes in a string pool session, and taking advantage of this with the distributed resolver

Modified: branches/blank_nodes/src/jar/resolver/java/org/mulgara/resolver/StringPoolSession.java
===================================================================
--- branches/blank_nodes/src/jar/resolver/java/org/mulgara/resolver/StringPoolSession.java	2007-04-20 21:16:19 UTC (rev 246)
+++ branches/blank_nodes/src/jar/resolver/java/org/mulgara/resolver/StringPoolSession.java	2007-04-20 21:17:42 UTC (rev 247)
@@ -129,6 +129,9 @@
 
   /** Where to store literals which won't outlive this session.  */
   private final StringPool temporaryStringPool;
+  
+  /** Maps blank nodes into remembered IDs. */
+  Map<BlankNode,Long> blankNodeCache = new HashMap<BlankNode,Long>();
 
   private int state;
 
@@ -226,6 +229,7 @@
     synchronized (this.globalLock) {
       this.persistentStringPool.refresh();
       this.persistentNodePool.refresh();
+      blankNodeCache.clear();
       // !!Review: Call rollback on temporary? NB. Can't rollback non XA-SP/NP.
       //this.temporaryStringPool.refresh();
       //this.temporaryNodePool.refresh();
@@ -274,6 +278,7 @@
     synchronized (globalLock) {
       persistentStringPool.commit();
       persistentNodePool.commit();
+      blankNodeCache.clear();
       for (int i = 0; i < resources.length; i++) {
         resources[i].commit();
       }
@@ -292,6 +297,7 @@
     state = ROLLBACK;
     persistentStringPool.rollback();
     persistentNodePool.rollback();
+    blankNodeCache.clear();
     for (int i = 0; i < resources.length; i++) {
       resources[i].rollback();
     }
@@ -313,6 +319,8 @@
 
     persistentStringPool.release();
     persistentNodePool.release();
+    blankNodeCache.clear();
+
     // TODO determine if release() should be called for the temp components.
     //temporaryStringPool.release();
     //temporaryNodePool.release();
@@ -470,8 +478,7 @@
           // persisting.
           if ((bi.getNodeId() < 0) && ((flags & STORE_MASK) == PERSIST)) {
             bi.setNodeId(persistentNodePool.newNode());
-          }
-          else if (bi.getNodeId() == 0) {
+          } else if (bi.getNodeId() == 0) {
             if ((flags & STORE_MASK) == TEMP) {
               bi.setNodeId(-temporaryNodePool.newNode());
             }
@@ -485,31 +492,42 @@
         // id is negative.
         throw new LocalizeException(node, "Attempt to persist a local blank " +
            "node in a read phase");
-      }
+      } else if ((flags & WRITE_MASK) == WRITE) {
       // Some other implementation of BlankNode, so we can't access internal
       // node ID and we can only create one - we must be in the WRITE phase.
-      else if ((flags & WRITE_MASK) == WRITE) {
-        long nodeId;
-        if ((flags & STORE_MASK) == TEMP) {
-          nodeId = -temporaryNodePool.newNode();
-        } else {
-          nodeId = persistentNodePool.newNode();
-        }
+        return getAllocatedNodeId(node, flags);
 
-        return nodeId;
-      }
-      // If it's a read phase and not the local BlankNode then throw an
-      // exception.
-      else {
+      } else {
+        // If it's a read phase and not the local BlankNode then throw an
+        // exception.
         throw new LocalizeException(node, "Attempt to read BlankNode from stringpool");
       }
-    }
-    catch (NodePoolException e) {
+    } catch (NodePoolException e) {
       throw new LocalizeException(node, "Couldn't create blank node", e);
     }
   }
 
+  /**
+   * Allocates new node IDs for unknown nodes.  Stores node IDs for later lookups.
+   * @param bn The blank node to get the ID for.
+   * @param flags Indicates the type of storage for the node ids.
+   * @return The node ID for this given blank node.
+   * @throws NodePoolException An error while allocating a new node.
+   */
+  protected long getAllocatedNodeId(BlankNode bn, int flags) throws NodePoolException {
+    assert !(bn instanceof BlankNodeImpl);
+    if (blankNodeCache.containsKey(bn)) return blankNodeCache.get(bn);
 
+    long nodeId;
+    if ((flags & STORE_MASK) == TEMP) {
+      nodeId = -temporaryNodePool.newNode();
+    } else {
+      nodeId = persistentNodePool.newNode();
+    }
+    blankNodeCache.put(bn, nodeId);
+    return nodeId;
+  }
+
   protected Node globalizeBlankNode(long localNode, SPObject spObject) throws
       GlobalizeException {
 

Modified: branches/blank_nodes/src/jar/resolver-distributed/java/org/mulgara/resolver/distributed/AnswerResolution.java
===================================================================
--- branches/blank_nodes/src/jar/resolver-distributed/java/org/mulgara/resolver/distributed/AnswerResolution.java	2007-04-20 21:16:19 UTC (rev 246)
+++ branches/blank_nodes/src/jar/resolver-distributed/java/org/mulgara/resolver/distributed/AnswerResolution.java	2007-04-20 21:17:42 UTC (rev 247)
@@ -18,19 +18,13 @@
 import org.mulgara.query.Answer;
 import org.mulgara.query.Constraint;
 import org.mulgara.query.TuplesException;
-import org.mulgara.query.rdf.URIReferenceImpl;
 import org.mulgara.query.rdf.BlankNodeImpl;
 
-import org.mulgara.resolver.spi.GlobalizeException;
 import org.mulgara.resolver.spi.LocalizeException;
 import org.mulgara.resolver.spi.LocalizedTuples;
 import org.mulgara.resolver.spi.ResolverSession;
 import org.mulgara.resolver.spi.Resolution;
 
-import org.mulgara.store.tuples.Annotation;
-import org.mulgara.store.tuples.RowComparator;
-import org.mulgara.store.tuples.Tuples;
-
 import java.net.URI;
 
 /**
@@ -67,6 +61,7 @@
     if (constraint == null) throw new IllegalArgumentException("Null constraint parameter");
     this.constraint = constraint;
     this.serverUri = serverUri;
+    logger.debug("Created resolution on server: " + serverUri + " for: " + constraint);
   }
 
 

Modified: branches/blank_nodes/src/jar/resolver-distributed/java/org/mulgara/resolver/distributed/ForeignBlankNode.java
===================================================================
--- branches/blank_nodes/src/jar/resolver-distributed/java/org/mulgara/resolver/distributed/ForeignBlankNode.java	2007-04-20 21:16:19 UTC (rev 246)
+++ branches/blank_nodes/src/jar/resolver-distributed/java/org/mulgara/resolver/distributed/ForeignBlankNode.java	2007-04-20 21:17:42 UTC (rev 247)
@@ -12,6 +12,7 @@
 package org.mulgara.resolver.distributed;
 
 import org.mulgara.query.rdf.BlankNodeImpl;
+import org.jrdf.graph.AbstractBlankNode;
 import java.net.URI;
 
 /**
@@ -25,15 +26,22 @@
  * @licence <a href="{@docRoot}/../../LICENCE.txt">Open Software License v3.0</a>
  */
 @SuppressWarnings("serial")
-public class ForeignBlankNode extends BlankNodeImpl {
+public class ForeignBlankNode extends AbstractBlankNode {
 
+  /** The internal ID for the node. */
+  long nodeId;
+  
   /** The URI of the foreign server. */
-  URI serverUri;
+  final URI serverUri;
   
-	public ForeignBlankNode(URI serverUri, BlankNodeImpl remoteNode) {
-		super(remoteNode.getNodeId());
+  /** The hashcode of the foreign server. */
+  final int serverHashCode;
+  
+  public ForeignBlankNode(URI serverUri, BlankNodeImpl remoteNode) {
+    this.nodeId = remoteNode.getNodeId();
     this.serverUri = serverUri;
-	}
+    this.serverHashCode = serverUri.hashCode();
+  }
 
 
   /**
@@ -41,7 +49,7 @@
    * @return A string containing all the unique features of the node.
    */
   public String toString() {
-    return serverUri.toString() + ":_" + getNodeId();
+    return serverUri.toString() + ":_" + nodeId;
   }
 
 
@@ -56,7 +64,7 @@
     if (obj == this) return true;
     if (obj instanceof ForeignBlankNode) {
       ForeignBlankNode fbn = (ForeignBlankNode)obj;
-      return (serverUri.equals(fbn.serverUri) && getNodeId() == fbn.getNodeId());
+      return (serverUri.equals(fbn.serverUri) && nodeId == fbn.nodeId);
     }
     return false;
   }
@@ -67,8 +75,7 @@
    * @return Hashcode of the nodeid.
    */
   public int hashCode() {
-    long nodeId = getNodeId();
-    return serverUri.hashCode() ^ (int)(nodeId ^ (nodeId >>>32));
+    return serverHashCode ^ (int)(nodeId ^ (nodeId >>>32));
   }
 
 }




More information about the Mulgara-svn mailing list