[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