[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