[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