[Mulgara-svn] r285 - in trunk/src/jar: resolver/java/org/mulgara/resolver resolver-distributed/java/org/mulgara/resolver/distributed resolver-spi/java/org/mulgara/resolver/spi
pag at mulgara.org
pag at mulgara.org
Thu Jun 21 20:53:02 UTC 2007
Author: pag
Date: 2007-06-21 15:53:02 -0500 (Thu, 21 Jun 2007)
New Revision: 285
Modified:
trunk/src/jar/resolver-distributed/java/org/mulgara/resolver/distributed/AnswerResolution.java
trunk/src/jar/resolver-distributed/java/org/mulgara/resolver/distributed/NetworkDelegator.java
trunk/src/jar/resolver-spi/java/org/mulgara/resolver/spi/LocalizedTuples.java
trunk/src/jar/resolver/java/org/mulgara/resolver/LocalQuery.java
Log:
Added file-backed mappings for blank nodes for consistent and correct insertions. This can clean to IOExceptions that get wrapped in a more local exception type and need propagating
Modified: trunk/src/jar/resolver/java/org/mulgara/resolver/LocalQuery.java
===================================================================
--- trunk/src/jar/resolver/java/org/mulgara/resolver/LocalQuery.java 2007-06-21 20:51:16 UTC (rev 284)
+++ trunk/src/jar/resolver/java/org/mulgara/resolver/LocalQuery.java 2007-06-21 20:53:02 UTC (rev 285)
@@ -115,7 +115,7 @@
* @throws LocalizeException if the <var>query</var> can't be localized
*/
LocalQuery(Query query, ResolverSession resolverSession, DatabaseOperationContext context)
- throws LocalizeException
+ throws LocalizeException, TuplesException
{
if (logger.isDebugEnabled()) {
logger.debug("Constructing local query for " + query);
Modified: trunk/src/jar/resolver-distributed/java/org/mulgara/resolver/distributed/AnswerResolution.java
===================================================================
--- trunk/src/jar/resolver-distributed/java/org/mulgara/resolver/distributed/AnswerResolution.java 2007-06-21 20:51:16 UTC (rev 284)
+++ trunk/src/jar/resolver-distributed/java/org/mulgara/resolver/distributed/AnswerResolution.java 2007-06-21 20:53:02 UTC (rev 285)
@@ -54,7 +54,7 @@
* @param constraint the constraint.
* @throws IllegalArgumentException if <var>constraint<var> is <code>null</code>
*/
- AnswerResolution(URI serverUri, ResolverSession session, Answer answer, Constraint constraint) {
+ AnswerResolution(URI serverUri, ResolverSession session, Answer answer, Constraint constraint) throws TuplesException {
super(session, answer);
logger.debug("Constructed AnswerResolution for distributed resolver");
if (constraint == null) throw new IllegalArgumentException("Null constraint parameter");
Modified: trunk/src/jar/resolver-distributed/java/org/mulgara/resolver/distributed/NetworkDelegator.java
===================================================================
--- trunk/src/jar/resolver-distributed/java/org/mulgara/resolver/distributed/NetworkDelegator.java 2007-06-21 20:51:16 UTC (rev 284)
+++ trunk/src/jar/resolver-distributed/java/org/mulgara/resolver/distributed/NetworkDelegator.java 2007-06-21 20:53:02 UTC (rev 285)
@@ -96,7 +96,11 @@
logger.debug("Querying for: " + localConstraint + " in model: " + modelRef + " on server: " + serverUri);
Answer ans = getServerSession(serverUri).query(globalizedQuery(localConstraint, modelRef));
- return new AnswerResolution(serverUri, session, ans, localConstraint);
+ try {
+ return new AnswerResolution(serverUri, session, ans, localConstraint);
+ } catch (TuplesException te) {
+ throw new ResolverException("Localization failed", te);
+ }
}
Modified: trunk/src/jar/resolver-spi/java/org/mulgara/resolver/spi/LocalizedTuples.java
===================================================================
--- trunk/src/jar/resolver-spi/java/org/mulgara/resolver/spi/LocalizedTuples.java 2007-06-21 20:51:16 UTC (rev 284)
+++ trunk/src/jar/resolver-spi/java/org/mulgara/resolver/spi/LocalizedTuples.java 2007-06-21 20:53:02 UTC (rev 285)
@@ -27,16 +27,23 @@
package org.mulgara.resolver.spi;
+import java.io.IOException;
import java.util.*;
// Third party packages
import org.apache.log4j.*;
+import org.jrdf.graph.BlankNode;
import org.jrdf.graph.Node;
// Locally written packages
import org.mulgara.query.Answer;
import org.mulgara.query.TuplesException;
+import org.mulgara.query.rdf.BlankNodeImpl;
+import org.mulgara.store.nodepool.NodePoolException;
import org.mulgara.store.tuples.AbstractTuples;
+import org.mulgara.util.IntFile;
+import org.mulgara.util.StringToLongMap;
+import org.mulgara.util.TempDir;
/**
* Wrapper around a globally valid {@link Answer} instance, converting into
@@ -76,6 +83,13 @@
*/
protected Answer answer;
+ /** Mapping between parsed blank node IDs and local node numbers. */
+ private IntFile blankNodeIdMap;
+
+
+ /** Mapping between blank node rdf:nodeIDs and local node numbers. */
+ private StringToLongMap blankNodeNameMap;
+
/**
* Does the localization need to be done in the persistent store.
*/
@@ -88,7 +102,7 @@
* @throws IllegalArgumentException if <var>globalAnswer</var> is
* <code>null</code>
*/
- public LocalizedTuples(ResolverSession session, Answer globalAnswer, boolean persist)
+ public LocalizedTuples(ResolverSession session, Answer globalAnswer, boolean persist) throws TuplesException
{
if (session == null) {
throw new IllegalArgumentException("Null \"session\" parameter");
@@ -100,11 +114,18 @@
this.session = session;
answer = (Answer) globalAnswer.clone();
setVariables(answer.getVariables());
+
+ try {
+ blankNodeIdMap = IntFile.open(TempDir.createTempFile("localIdMap", null), true);
+ blankNodeNameMap = new StringToLongMap();
+ } catch (IOException ioe) {
+ throw new TuplesException("Unable to localize tuples", ioe);
+ }
this.persist = persist;
}
- public LocalizedTuples(ResolverSession session, Answer globalAnswer)
+ public LocalizedTuples(ResolverSession session, Answer globalAnswer) throws TuplesException
{
this(session, globalAnswer, false);
}
@@ -136,6 +157,12 @@
public void close() throws TuplesException {
answer.close();
+ blankNodeNameMap.delete();
+ try {
+ blankNodeIdMap.delete();
+ } catch (IOException ioe) {
+ throw new TuplesException("Unable to manage temporary files", ioe);
+ }
}
@@ -143,15 +170,21 @@
try {
Object node = answer.getObject(column);
assert node instanceof Node;
+ if (node instanceof BlankNode) return localizeBlankNode((BlankNode)node);
return persist
? session.localizePersistent((Node)node)
: session.localize((Node)node);
- } catch (LocalizeException e) {
+ } catch (NodePoolException e) {
+ throw new TuplesException("Couldn't create new node to localize column " + column, e);
+ } catch (Exception e) {
throw new TuplesException("Couldn't localize column " + column, e);
}
}
+ private long newBlankNode() throws NodePoolException, LocalizeException {
+ return persist ? session.newBlankNode() : session.localize(new BlankNodeImpl());
+ }
public long getRowCount() throws TuplesException {
return answer.getRowCount();
@@ -189,4 +222,37 @@
public boolean next() throws TuplesException {
return answer.next();
}
+
+
+ /**
+ * Converts a blank node into a local gNode ID.
+ * @param node The blank node to localize.
+ * @return A gNode ID that is unique and reproducable for the blank node.
+ * @throws NodePoolException There was an error allocating a new gNode ID.
+ * @throws LocalizeException There was an error recalling an earlier conversion, or mixed local and remote nodes.
+ * @throws IOException There was an error communicating with files used for recalling conversions.
+ */
+ private long localizeBlankNode(BlankNode node) throws NodePoolException, LocalizeException, IOException {
+ long nodeId;
+ if (node instanceof BlankNodeImpl) {
+ nodeId = ((BlankNodeImpl)node).getNodeId();
+ if (nodeId < 0) {
+ long foreignId = -nodeId;
+ nodeId = blankNodeIdMap.getLong(foreignId);
+ if (nodeId == 0) {
+ nodeId = newBlankNode();
+ blankNodeIdMap.putLong(foreignId, nodeId);
+ }
+ }
+ } else {
+ String foreignIdStr = node.toString();
+ nodeId = blankNodeNameMap.get(foreignIdStr);
+ if (nodeId == 0) {
+ nodeId = newBlankNode();
+ blankNodeNameMap.put(foreignIdStr, nodeId);
+ }
+ }
+ return nodeId;
+ }
+
}
More information about the Mulgara-svn
mailing list