[Mulgara-svn] r238 - in branches/nuc-disj: data src/jar/resolver/java/org/mulgara/resolver src/jar/tuples/java/org/mulgara/store/tuples

andrae at mulgara.org andrae at mulgara.org
Thu Apr 19 03:08:30 UTC 2007


Author: andrae
Date: 2007-04-18 22:08:29 -0500 (Wed, 18 Apr 2007)
New Revision: 238

Added:
   branches/nuc-disj/data/prefix-unbound.rdf
Modified:
   branches/nuc-disj/src/jar/resolver/java/org/mulgara/resolver/AdvDatabaseSessionUnitTest.java
   branches/nuc-disj/src/jar/tuples/java/org/mulgara/store/tuples/UnboundJoin.java
Log:
Just committing this so it is in.  This resolves the symptoms of http://mulgara.org/jira/browse/MGR-34.  

I am pretty certain this is incorrect - I've been playing around with it and
can't quite pin it down - but my gut tells me this will lead to invalid
prefixing in some cases.



Added: branches/nuc-disj/data/prefix-unbound.rdf
===================================================================
--- branches/nuc-disj/data/prefix-unbound.rdf	2007-04-18 05:29:19 UTC (rev 237)
+++ branches/nuc-disj/data/prefix-unbound.rdf	2007-04-19 03:08:29 UTC (rev 238)
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+         xmlns:testdb="test:">
+
+<rdf:Description rdf:about = "test:s01" >
+  <testdb:p01 rdf:resource="test:o01"/>
+  <testdb:p02 rdf:resource="test:o02"/>
+  <testdb:p03 rdf:resource="test:o03"/>
+</rdf:Description>
+<rdf:Description rdf:about = "test:s02" >
+  <testdb:p01 rdf:resource="test:o01"/>
+  <testdb:p02 rdf:resource="test:o04"/>
+  <testdb:p03 rdf:resource="test:o03"/>
+</rdf:Description>
+
+</rdf:RDF>

Modified: branches/nuc-disj/src/jar/resolver/java/org/mulgara/resolver/AdvDatabaseSessionUnitTest.java
===================================================================
--- branches/nuc-disj/src/jar/resolver/java/org/mulgara/resolver/AdvDatabaseSessionUnitTest.java	2007-04-18 05:29:19 UTC (rev 237)
+++ branches/nuc-disj/src/jar/resolver/java/org/mulgara/resolver/AdvDatabaseSessionUnitTest.java	2007-04-19 03:08:29 UTC (rev 238)
@@ -79,6 +79,7 @@
   private static final URI model2URI;
   private static final URI model3URI;
   private static final URI model4URI;
+  private static final URI model5URI;
 
   static {
     try {
@@ -88,6 +89,7 @@
       model2URI      = new URI("local:database#model2");
       model3URI      = new URI("local:database#model3");
       model4URI      = new URI("local:database#model4");
+      model5URI      = new URI("local:database#model5");
     } catch (URISyntaxException e) {
       throw new Error("Bad hardcoded URI", e);
     }
@@ -114,6 +116,7 @@
     suite.addTest(new AdvDatabaseSessionUnitTest("testExplicitRollbackIsolationQuery"));
     suite.addTest(new AdvDatabaseSessionUnitTest("testExplicitCommitIsolationQuery"));
     suite.addTest(new AdvDatabaseSessionUnitTest("testImplicitCommitQuery"));
+    suite.addTest(new AdvDatabaseSessionUnitTest("testPrefixingWithUnbound"));
     suite.addTest(new AdvDatabaseSessionUnitTest("testDatabaseDelete"));
 
     return suite;
@@ -1105,7 +1108,7 @@
           assertFalse(answer.next());
           answer.close();
 
-          session1.removeModel(model3URI);
+          session1.removeModel(model4URI);
         } finally {
           session2.close();
         }
@@ -1118,6 +1121,87 @@
   }
 
 
+  public void testPrefixingWithUnbound() throws URISyntaxException
+  {
+    logger.warn("testPrefixingWithUnbound");
+    URI fileURI  = new File("data/prefix-unbound.rdf").toURI();
+
+    try {
+      Session session = database.newSession();
+      try {
+        session.createModel(model5URI, null);
+        session.setModel(model5URI, new ModelResource(fileURI));
+
+        Variable varA   = new Variable("a");
+        Variable varB   = new Variable("b");
+        Variable varT = new Variable("t");
+
+        List selectList = new ArrayList(2);
+        selectList.add(varA);
+        selectList.add(varT);
+
+        // Check data loaded
+        Answer answer = session.query(new Query(
+          selectList,                                       // SELECT
+          new ModelResource(model5URI),                      // FROM
+          new ConstraintConjunction(Arrays.asList(
+              new ConstraintExpression[] {
+                  new ConstraintImpl(varB,
+                      new URIReferenceImpl(new URI("test:p01")),
+                      new URIReferenceImpl(new URI("test:o01"))),
+                  new ConstraintImpl(varB,
+                      new URIReferenceImpl(new URI("test:p02")),
+                      varA),
+                  new ConstraintDisjunction(
+                      new ConstraintConjunction(
+                          new ConstraintImpl(varB,
+                              new URIReferenceImpl(new URI("test:p03")),
+                              new URIReferenceImpl(new URI("test:o03"))),
+                          new ConstraintIs(varT,
+                              new URIReferenceImpl(new URI("result:0")))),
+                      new ConstraintIs(varT,
+                              new URIReferenceImpl(new URI("result:1")))),
+              })),                                          // WHERE
+          null,                                             // HAVING
+          Arrays.asList(new Order[] {                       // ORDER BY
+            new Order(varA, true),
+            new Order(varT, true),
+          }),
+          null,                                             // LIMIT
+          0,                                                // OFFSET
+          new UnconstrainedAnswer()                         // GIVEN
+        ));
+
+        String[][] results = {
+          { "test:o02", "result:0" },
+          { "test:o02", "result:1" },
+          { "test:o04", "result:0" },
+          { "test:o04", "result:1" },
+        };
+        answer.beforeFirst();
+        String s = "comparing results:\n" + answer.getVariables();
+        while (answer.next()) {
+          s += "\n[";
+          for (int i = 0; i < answer.getNumberOfVariables(); i++) {
+            s += " " + answer.getObject(i);
+          }
+          s += " ]";
+        }
+        logger.warn(s);
+
+        compareResults(results, answer);
+        answer.close();
+
+        session.removeModel(model5URI);
+      } finally {
+        session.close();
+      }
+    } catch (Exception e) {
+      fail(e);
+    }
+  }
+
+
   public void testDatabaseDelete() {
     database.delete();
     database = null;
@@ -1128,17 +1212,22 @@
   //
 
   private void compareResults(String[][] expected, Answer answer) throws Exception {
-    answer.beforeFirst();
-    for (int i = 0; i < expected.length; i++) {
-      assertTrue("Answer short at row " + i, answer.next());
-      assertEquals(expected[i].length, answer.getNumberOfVariables());
-      for (int j = 0; j < expected[i].length; j++) {
-        URIReferenceImpl uri = new URIReferenceImpl(
-            new URI(expected[i][j]));
-        assertEquals(uri, answer.getObject(j));
+    try {
+      answer.beforeFirst();
+      for (int i = 0; i < expected.length; i++) {
+        assertTrue("Answer short at row " + i, answer.next());
+        assertEquals(expected[i].length, answer.getNumberOfVariables());
+        for (int j = 0; j < expected[i].length; j++) {
+          URIReferenceImpl uri = new URIReferenceImpl(new URI(expected[i][j]));
+          assertEquals(uri, answer.getObject(j));
+        }
       }
+      assertFalse(answer.next());
+    } catch (Exception e) {
+      logger.error("Failed test - " + answer);
+      answer.close();
+      throw e;
     }
-    assertFalse(answer.next());
   }
 
   private void compareResults(Answer answer1, Answer answer2) throws Exception {

Modified: branches/nuc-disj/src/jar/tuples/java/org/mulgara/store/tuples/UnboundJoin.java
===================================================================
--- branches/nuc-disj/src/jar/tuples/java/org/mulgara/store/tuples/UnboundJoin.java	2007-04-18 05:29:19 UTC (rev 237)
+++ branches/nuc-disj/src/jar/tuples/java/org/mulgara/store/tuples/UnboundJoin.java	2007-04-19 03:08:29 UTC (rev 238)
@@ -139,7 +139,7 @@
   /**
    * Do any of the operands with variables matching this output variable contain UNBOUND?
    */
-  protected boolean[] columnOperandEverUnbound;
+  protected boolean[][] columnOperandEverUnbound;
 
   /**
    * Flag indicating that the cursor is before the first row.
@@ -258,17 +258,17 @@
 
     // Determine which columns are ever unbound
     columnEverUnbound = new boolean[variableList.size()];
-    columnOperandEverUnbound = new boolean[variableList.size()];
+    columnOperandEverUnbound = new boolean[operands.length][variableList.size()];
     Arrays.fill(columnEverUnbound, true);
-    Arrays.fill(columnOperandEverUnbound, false);
 
     for (int i = 0; i < operands.length; i++) {
+        Arrays.fill(columnOperandEverUnbound[i], false);
         Variable[] variables = operands[i].getVariables();
         for (int j = 0; j < variables.length; j++) {
             if (!operands[i].isColumnEverUnbound(j)) {
                 columnEverUnbound[getColumnIndex(variables[j])] = false;
             } else {
-                columnOperandEverUnbound[getColumnIndex(variables[j])] = true;
+                columnOperandEverUnbound[i][getColumnIndex(variables[j])] = true;
             }
         }
     }
@@ -500,7 +500,7 @@
     int prefixLength = 0;
     while ((prefixLength < operandBinding[i].length) &&
         (operandBinding[i][prefixLength] != Tuples.UNBOUND) &&
-        (columnOperandEverUnbound[operandOutputMap[i][prefixLength]] == false)) {
+        (columnOperandEverUnbound[i][operandOutputMap[i][prefixLength]] == false)) {
       prefixLength++;
     }
 




More information about the Mulgara-svn mailing list