[Mulgara-svn] r1770 - trunk/src/jar/tuples/java/org/mulgara/store/tuples
pag at mulgara.org
pag at mulgara.org
Wed Aug 12 18:54:17 UTC 2009
Author: pag
Date: 2009-08-12 11:54:16 -0700 (Wed, 12 Aug 2009)
New Revision: 1770
Modified:
trunk/src/jar/tuples/java/org/mulgara/store/tuples/UnorderedAppend.java
trunk/src/jar/tuples/java/org/mulgara/store/tuples/UnorderedAppendUnitTest.java
Log:
implemented getRowCardinality locally to be more efficient
Modified: trunk/src/jar/tuples/java/org/mulgara/store/tuples/UnorderedAppend.java
===================================================================
--- trunk/src/jar/tuples/java/org/mulgara/store/tuples/UnorderedAppend.java 2009-08-12 16:49:11 UTC (rev 1769)
+++ trunk/src/jar/tuples/java/org/mulgara/store/tuples/UnorderedAppend.java 2009-08-12 18:54:16 UTC (rev 1770)
@@ -34,6 +34,7 @@
import org.apache.log4j.Logger;
// Locally written packages
+import org.mulgara.query.Cursor;
import org.mulgara.query.TuplesException;
/**
@@ -191,6 +192,48 @@
return bound;
}
+ public int getRowCardinality() throws TuplesException {
+ if (rowCardinality != -1) return rowCardinality;
+
+ if (rowCount > 1) {
+ rowCardinality = Cursor.MANY;
+ } else {
+ switch ((int) rowCount) {
+ case 0:
+ rowCardinality = Cursor.ZERO;
+ break;
+ case 1:
+ rowCardinality = Cursor.ONE;
+ break;
+ case -1:
+ for (Tuples op: operands) {
+ Tuples temp = (Tuples)op.clone();
+ int tc = temp.getRowCardinality();
+ temp.close();
+ if (tc == Cursor.ZERO) {
+ if (rowCardinality == -1) rowCardinality = Cursor.ZERO;
+ } else if (tc == Cursor.ONE) {
+ if (rowCardinality == Cursor.ONE) {
+ rowCardinality = Cursor.MANY;
+ return rowCardinality;
+ }
+ assert rowCardinality != Cursor.MANY;
+ rowCardinality = Cursor.ONE;
+ } else {
+ assert tc == Cursor.MANY;
+ rowCardinality = tc;
+ return rowCardinality;
+ }
+ }
+ break;
+ default:
+ throw new TuplesException("Illegal rowCount " + rowCount);
+ }
+ }
+
+ return rowCardinality;
+ }
+
public boolean isColumnEverUnbound(int column) throws TuplesException {
assert(operand >= 0) || (operand < operands.length):"No column " +
column;
Modified: trunk/src/jar/tuples/java/org/mulgara/store/tuples/UnorderedAppendUnitTest.java
===================================================================
--- trunk/src/jar/tuples/java/org/mulgara/store/tuples/UnorderedAppendUnitTest.java 2009-08-12 16:49:11 UTC (rev 1769)
+++ trunk/src/jar/tuples/java/org/mulgara/store/tuples/UnorderedAppendUnitTest.java 2009-08-12 18:54:16 UTC (rev 1770)
@@ -34,6 +34,7 @@
import org.apache.log4j.Logger;
// locally written packages
+import org.mulgara.query.Cursor;
import org.mulgara.query.Variable;
/**
@@ -62,6 +63,7 @@
* Logger.
*
*/
+ @SuppressWarnings("unused")
private static final Logger logger = Logger.getLogger(UnorderedAppendUnitTest.class);
/**
@@ -130,7 +132,7 @@
/**
* Test {@link UnorderedAppend}. When passed two arguments with common
- * variables, the result should be correctly sorted.
+ * variables, the result should be sorted in insertion order.
*
* @throws Exception if query fails when it should have succeeded
*/
@@ -152,7 +154,7 @@
/**
* Test {@link UnorderedAppend} in the presence of unspecified column values.
* When passed two arguments with common variables, the result should be
- * correctly sorted.
+ * sorted in insertion order.
*
* @throws Exception if query fails when it should have succeeded
*/
@@ -170,4 +172,36 @@
new TestTuples(new UnorderedAppend(new Tuples[] {
lhs, rhs})));
}
+
+ /**
+ * Test {@link UnorderedAppend} cardinality. When passed two arguments with common
+ * variables, the result should be correctly sorted.
+ *
+ * @throws Exception if query fails when it should have succeeded
+ */
+ public void testCardinality() throws Exception {
+
+ Tuples appendedTuples = new UnorderedAppend(new Tuples[] {});
+ assertEquals(Cursor.ZERO, appendedTuples.getRowCardinality());
+
+ Variable x = new Variable("x");
+ Variable y = new Variable("y");
+
+ Tuples operand = new TestTuples(x, 1).and(y, 2);
+ appendedTuples = new UnorderedAppend(new Tuples[] { operand});
+ assertEquals(Cursor.ONE, appendedTuples.getRowCardinality());
+
+ operand = new TestTuples(x, 1).and(y, 2).or(x, 3).and(y, 4);;
+ appendedTuples = new UnorderedAppend(new Tuples[] { operand});
+ assertEquals(Cursor.MANY, appendedTuples.getRowCardinality());
+
+ Tuples lhs = new TestTuples(x, 1).and(y, 8).or(x, 3).and(y, 7);
+ Tuples rhs = new TestTuples(x, 2).and(y, 6).or(x, 4).and(y, 5);
+ assertEquals(Cursor.MANY, new UnorderedAppend(new Tuples[] { lhs, rhs}).getRowCardinality());
+
+ lhs = new TestTuples(x, 1).and(y, 8);
+ rhs = new TestTuples(x, 2).and(y, 6);
+ assertEquals(Cursor.MANY, new UnorderedAppend(new Tuples[] { lhs, rhs}).getRowCardinality());
+ }
+
}
More information about the Mulgara-svn
mailing list