[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