You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@manifoldcf.apache.org by kw...@apache.org on 2011/12/18 09:26:34 UTC
svn commit: r1220349 [6/6] - in
/incubator/lcf/branches/CONNECTORS-286/warthog-reimport: ./ lib/ src/
src/main/ src/main/java/ src/main/java/org/ src/main/java/org/apache/
src/main/java/org/apache/warthog/ src/main/java/org/apache/warthog/api/
src/main...
Added: incubator/lcf/branches/CONNECTORS-286/warthog-reimport/src/test/java/org/apache/warthog/tests/SanityTest.java
URL: http://svn.apache.org/viewvc/incubator/lcf/branches/CONNECTORS-286/warthog-reimport/src/test/java/org/apache/warthog/tests/SanityTest.java?rev=1220349&view=auto
==============================================================================
--- incubator/lcf/branches/CONNECTORS-286/warthog-reimport/src/test/java/org/apache/warthog/tests/SanityTest.java (added)
+++ incubator/lcf/branches/CONNECTORS-286/warthog-reimport/src/test/java/org/apache/warthog/tests/SanityTest.java Sun Dec 18 08:26:30 2011
@@ -0,0 +1,919 @@
+/* $Id: SanityTest.java 1212814 2011-12-10 15:26:17Z kwright $ */
+
+/**
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package org.apache.warthog.tests;
+
+import org.apache.warthog.api.*;
+import org.apache.warthog.transactionalkeyvaluestore.*;
+import org.apache.warthog.keyvaluetablestore.*;
+import org.apache.warthog.keyvalue.*;
+import org.apache.warthog.common.*;
+import org.junit.*;
+import static org.junit.Assert.*;
+import java.util.*;
+
+public class SanityTest
+{
+
+ @Test
+ public void basicTable()
+ throws Exception
+ {
+ WHTableStore ts = createInMemTableStore();
+
+ ts.beginTransaction();
+ ts.createTable("testtable",new String[]{"colA","colB","colC"});
+ ts.commitTransaction();
+
+ ts.beginTransaction();
+ WHTable table = ts.lookupTable("testtable");
+ table.insertRow(new String[]{"colA","colC"},new WHValue[]{new LongValue(123L),new StringValue("hello")});
+ ts.commitTransaction();
+
+ ts.beginTransaction();
+ table = ts.lookupTable("testtable");
+ table.insertRow(new String[]{"colA","colC","colB"},new WHValue[]{new LongValue(456L),new StringValue("goodbye"),new BooleanValue(true)});
+ ts.commitTransaction();
+
+ ts.beginTransaction();
+ table = ts.lookupTable("testtable");
+ WHAccessor accessor = table.buildAccessor();
+ boolean seen123 = false;
+ boolean seen456 = false;
+ while (true)
+ {
+ WHRowID rowID = accessor.getCurrentRowID();
+ if (rowID == null)
+ break;
+ WHValue value = accessor.getValue("colA");
+ assertNotNull(value);
+ assertEquals(value.getClass().getName(),"org.apache.warthog.common.LongValue");
+ LongValue lv = (LongValue)value;
+ if (lv.getValue() == 123L)
+ seen123 = true;
+ else if (lv.getValue() == 456L)
+ seen456 = true;
+ else
+ throw new Exception("Unexpected value: "+new Long(lv.getValue()).toString());
+ accessor.advance();
+ }
+ if (seen123 == false || seen456 == false)
+ throw new Exception("Missing rows");
+ ts.abandonTransaction();
+
+ ts.beginTransaction();
+ table = ts.lookupTable("testtable");
+ table.updateRows(new String[]{"colC"},new WHValue[]{new StringValue("abcdefg")},table.buildAccessor());
+ ts.commitTransaction();
+
+ ts.beginTransaction();
+ table = ts.lookupTable("testtable");
+ accessor = table.buildAccessor();
+ while (true)
+ {
+ WHRowID rowID = accessor.getCurrentRowID();
+ if (rowID == null)
+ break;
+ WHValue value = accessor.getValue("colC");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.StringValue",value.getClass().getName());
+ assertEquals("abcdefg",((StringValue)value).getValue());
+ accessor.advance();
+ }
+ ts.abandonTransaction();
+
+ ts.beginTransaction();
+ ts.dropTable("testtable");
+ ts.commitTransaction();
+ }
+
+ @Test
+ public void basicTableIndex()
+ throws Exception
+ {
+ WHTableStore ts = createInMemTableStore();
+
+ buildNonOverlappingTestTable(ts);
+
+ // Now build a one-column unique index on colA
+ ts.beginTransaction();
+ WHTable table = ts.lookupTable("testtable");
+ ts.createIndex("testindex",table,new String[]{"colA"},new String[]{"org.apache.warthog.common.LongComparatorAscending"},true);
+ ts.commitTransaction();
+
+ // Read in index order
+ ts.beginTransaction();
+ WHIndex index = ts.lookupIndex("testindex");
+ WHAccessor accessor = index.buildAccessor();
+ assertNotNull(accessor.getCurrentRowID());
+ WHValue value = accessor.getValue("colA");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(111L,((LongValue)value).getValue());
+ accessor.advance();
+ assertNotNull(accessor.getCurrentRowID());
+ value = accessor.getValue("colA");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(123L,((LongValue)value).getValue());
+ accessor.advance();
+ assertNotNull(accessor.getCurrentRowID());
+ value = accessor.getValue("colA");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(124L,((LongValue)value).getValue());
+ accessor.advance();
+ assertNotNull(accessor.getCurrentRowID());
+ value = accessor.getValue("colA");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(456L,((LongValue)value).getValue());
+ accessor.advance();
+ assertNull(accessor.getCurrentRowID());
+ ts.abandonTransaction();
+
+ // Now add a row while the index is set up to see if it appears
+ ts.beginTransaction();
+ table = ts.lookupTable("testtable");
+ table.insertRow(new String[]{"colA","colB"},new WHValue[]{new LongValue(333L),new StringValue("><")});
+ ts.commitTransaction();
+
+ // Read in index order
+ ts.beginTransaction();
+ index = ts.lookupIndex("testindex");
+ accessor = index.buildAccessor();
+ assertNotNull(accessor.getCurrentRowID());
+ value = accessor.getValue("colA");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(111L,((LongValue)value).getValue());
+ accessor.advance();
+ assertNotNull(accessor.getCurrentRowID());
+ value = accessor.getValue("colA");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(123L,((LongValue)value).getValue());
+ accessor.advance();
+ assertNotNull(accessor.getCurrentRowID());
+ value = accessor.getValue("colA");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(124L,((LongValue)value).getValue());
+ accessor.advance();
+ assertNotNull(accessor.getCurrentRowID());
+ value = accessor.getValue("colA");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(333L,((LongValue)value).getValue());
+ accessor.advance();
+ assertNotNull(accessor.getCurrentRowID());
+ value = accessor.getValue("colA");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(456L,((LongValue)value).getValue());
+ accessor.advance();
+ assertNull(accessor.getCurrentRowID());
+ ts.abandonTransaction();
+
+ // Build a bunch of accessors and see if they do what we expect
+ ts.beginTransaction();
+ index = ts.lookupIndex("testindex");
+ accessor = index.buildAccessor(new IndexCriteria[]{new IndexEquals(new LongValue(124L))},null);
+ assertNotNull(accessor.getCurrentRowID());
+ value = accessor.getValue("colA");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(124L,((LongValue)value).getValue());
+ accessor.advance();
+ assertNull(accessor.getCurrentRowID());
+ ts.abandonTransaction();
+
+ // Various index criteria
+ ts.beginTransaction();
+ index = ts.lookupIndex("testindex");
+ accessor = index.buildAccessor(new IndexCriteria[]{new IndexEqualsOrBefore(new LongValue(124L))},null);
+ assertNotNull(accessor.getCurrentRowID());
+ value = accessor.getValue("colA");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(111L,((LongValue)value).getValue());
+ accessor.advance();
+ assertNotNull(accessor.getCurrentRowID());
+ value = accessor.getValue("colA");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(123L,((LongValue)value).getValue());
+ accessor.advance();
+ assertNotNull(accessor.getCurrentRowID());
+ value = accessor.getValue("colA");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(124L,((LongValue)value).getValue());
+ accessor.advance();
+ assertNull(accessor.getCurrentRowID());
+ ts.abandonTransaction();
+
+ ts.beginTransaction();
+ index = ts.lookupIndex("testindex");
+ accessor = index.buildAccessor(new IndexCriteria[]{new IndexEqualsOrAfter(new LongValue(124L))},null);
+ assertNotNull(accessor.getCurrentRowID());
+ value = accessor.getValue("colA");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(124L,((LongValue)value).getValue());
+ accessor.advance();
+ assertNotNull(accessor.getCurrentRowID());
+ value = accessor.getValue("colA");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(333L,((LongValue)value).getValue());
+ accessor.advance();
+ assertNotNull(accessor.getCurrentRowID());
+ value = accessor.getValue("colA");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(456L,((LongValue)value).getValue());
+ accessor.advance();
+ assertNull(accessor.getCurrentRowID());
+ ts.abandonTransaction();
+
+ ts.beginTransaction();
+ index = ts.lookupIndex("testindex");
+ accessor = index.buildAccessor(new IndexCriteria[]{new IndexBefore(new LongValue(124L))},null);
+ assertNotNull(accessor.getCurrentRowID());
+ value = accessor.getValue("colA");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(111L,((LongValue)value).getValue());
+ accessor.advance();
+ assertNotNull(accessor.getCurrentRowID());
+ value = accessor.getValue("colA");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(123L,((LongValue)value).getValue());
+ accessor.advance();
+ assertNull(accessor.getCurrentRowID());
+ ts.abandonTransaction();
+
+ ts.beginTransaction();
+ index = ts.lookupIndex("testindex");
+ accessor = index.buildAccessor(new IndexCriteria[]{new IndexAfter(new LongValue(124L))},null);
+ assertNotNull(accessor.getCurrentRowID());
+ value = accessor.getValue("colA");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(333L,((LongValue)value).getValue());
+ accessor.advance();
+ assertNotNull(accessor.getCurrentRowID());
+ value = accessor.getValue("colA");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(456L,((LongValue)value).getValue());
+ accessor.advance();
+ assertNull(accessor.getCurrentRowID());
+ ts.abandonTransaction();
+
+ ts.beginTransaction();
+ index = ts.lookupIndex("testindex");
+ accessor = index.buildAccessor(new IndexCriteria[]{new IndexEqualsMultiple(new WHValue[]{new LongValue(123L),new LongValue(333L)})},null);
+ assertNotNull(accessor.getCurrentRowID());
+ value = accessor.getValue("colA");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(123L,((LongValue)value).getValue());
+ accessor.advance();
+ assertNotNull(accessor.getCurrentRowID());
+ value = accessor.getValue("colA");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(333L,((LongValue)value).getValue());
+ accessor.advance();
+ assertNull(accessor.getCurrentRowID());
+ ts.abandonTransaction();
+
+ ts.beginTransaction();
+ index = ts.lookupIndex("testindex");
+ accessor = index.buildAccessor(new IndexCriteria[]{new IndexBetween(new LongValue(123L),new LongValue(333L))},null);
+ assertNotNull(accessor.getCurrentRowID());
+ value = accessor.getValue("colA");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(124L,((LongValue)value).getValue());
+ accessor.advance();
+ assertNull(accessor.getCurrentRowID());
+ ts.abandonTransaction();
+
+ // Delete a table row and see if it goes away from the index
+ ts.beginTransaction();
+ table = ts.lookupTable("testtable");
+ index = ts.lookupIndex("testindex");
+ table.deleteRows(index.buildAccessor(new IndexCriteria[]{new IndexEquals(new LongValue(124L))},null));
+ ts.commitTransaction();
+
+ // Go through the iterator to see if it's gone
+ ts.beginTransaction();
+ index = ts.lookupIndex("testindex");
+ accessor = index.buildAccessor();
+ assertNotNull(accessor.getCurrentRowID());
+ value = accessor.getValue("colA");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(111L,((LongValue)value).getValue());
+ accessor.advance();
+ assertNotNull(accessor.getCurrentRowID());
+ value = accessor.getValue("colA");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(123L,((LongValue)value).getValue());
+ accessor.advance();
+ assertNotNull(accessor.getCurrentRowID());
+ value = accessor.getValue("colA");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(333L,((LongValue)value).getValue());
+ accessor.advance();
+ assertNotNull(accessor.getCurrentRowID());
+ value = accessor.getValue("colA");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(456L,((LongValue)value).getValue());
+ accessor.advance();
+ assertNull(accessor.getCurrentRowID());
+ ts.abandonTransaction();
+
+ ts.beginTransaction();
+ ts.dropIndex("testindex");
+ ts.commitTransaction();
+
+ }
+
+ @Test
+ public void twoColumnIndex()
+ throws Exception
+ {
+ WHTableStore ts = createInMemTableStore();
+
+ buildOverlappingTestTable(ts);
+
+ // Now build a two-column unique index on colA
+ ts.beginTransaction();
+ WHTable table = ts.lookupTable("testtable");
+ ts.createIndex("testindex",table,
+ new String[]{"colB","colA"},
+ new String[]{"org.apache.warthog.common.StringComparatorAscending",
+ "org.apache.warthog.common.LongComparatorAscending"},true);
+ ts.commitTransaction();
+
+ // Read in index order
+ ts.beginTransaction();
+ WHIndex index = ts.lookupIndex("testindex");
+ WHAccessor accessor = index.buildAccessor();
+ assertNotNull(accessor.getCurrentRowID());
+ WHValue value = accessor.getValue("colA");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(124L,((LongValue)value).getValue());
+ accessor.advance();
+ assertNotNull(accessor.getCurrentRowID());
+ value = accessor.getValue("colA");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(456L,((LongValue)value).getValue());
+ accessor.advance();
+ assertNotNull(accessor.getCurrentRowID());
+ value = accessor.getValue("colA");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(111L,((LongValue)value).getValue());
+ accessor.advance();
+ assertNotNull(accessor.getCurrentRowID());
+ value = accessor.getValue("colA");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(123L,((LongValue)value).getValue());
+ accessor.advance();
+ assertNull(accessor.getCurrentRowID());
+ ts.abandonTransaction();
+
+ ts.beginTransaction();
+ index = ts.lookupIndex("testindex");
+ accessor = index.buildAccessor(new IndexCriteria[]{
+ new IndexEquals(new StringValue("hello")),
+ new IndexBefore(new LongValue(123L))},null);
+ assertNotNull(accessor.getCurrentRowID());
+ value = accessor.getValue("colA");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(111L,((LongValue)value).getValue());
+ accessor.advance();
+ assertNull(accessor.getCurrentRowID());
+ ts.abandonTransaction();
+
+ ts.beginTransaction();
+ ts.dropIndex("testindex");
+ ts.commitTransaction();
+
+ }
+
+ @Test
+ public void aggregates()
+ throws Exception
+ {
+ WHTableStore ts = createInMemTableStore();
+
+ // Build a table with two columns, one of which can be summed, and the other of which has repeating values.
+ ts.beginTransaction();
+ ts.createTable("testtable",new String[]{"colA","colB"});
+ ts.commitTransaction();
+
+ ts.beginTransaction();
+ WHTable table = ts.lookupTable("testtable");
+ table.insertRow(new String[]{"colA","colB"},new WHValue[]{new LongValue(1L),new StringValue("hello")});
+ ts.commitTransaction();
+
+ ts.beginTransaction();
+ table = ts.lookupTable("testtable");
+ table.insertRow(new String[]{"colA","colB"},new WHValue[]{new LongValue(4L),new StringValue("goodbye")});
+ ts.commitTransaction();
+
+ ts.beginTransaction();
+ table = ts.lookupTable("testtable");
+ table.insertRow(new String[]{"colA","colB"},new WHValue[]{new LongValue(3L),new StringValue("hello")});
+ ts.commitTransaction();
+
+ ts.beginTransaction();
+ table = ts.lookupTable("testtable");
+ table.insertRow(new String[]{"colA","colB"},new WHValue[]{new LongValue(2L),new StringValue("goodbye")});
+ ts.commitTransaction();
+
+ // Build an index on this table to establish ordering on ColB
+ ts.beginTransaction();
+ table = ts.lookupTable("testtable");
+ ts.createIndex("testindex",table,
+ new String[]{"colB"},
+ new String[]{"org.apache.warthog.common.StringComparatorAscending"},false);
+ ts.commitTransaction();
+
+ // Now use the index as a relationship (to provide ordering), and build an aggregate relationship based on it
+ ts.beginTransaction();
+ WHIndex index = ts.lookupIndex("testindex");
+ WHRelationship aggregateRelationship = new AggregateRelationship(index,new WHColumnDescription[]{
+ new ColumnSumLong("colA","sumA"),
+ new ColumnBreakOnChange("colB","uniqueB")});
+ // Grab the accessor and verify it is correct
+ WHAccessor accessor = aggregateRelationship.buildAccessor();
+ assertNotNull(accessor.getCurrentRowID());
+ WHValue value = accessor.getValue("sumA");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(6L,((LongValue)value).getValue());
+ value = accessor.getValue("uniqueB");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.StringValue",value.getClass().getName());
+ assertEquals("goodbye",((StringValue)value).getValue());
+ accessor.advance();
+ assertNotNull(accessor.getCurrentRowID());
+ value = accessor.getValue("sumA");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(4L,((LongValue)value).getValue());
+ value = accessor.getValue("uniqueB");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.StringValue",value.getClass().getName());
+ assertEquals("hello",((StringValue)value).getValue());
+ accessor.advance();
+ assertNull(accessor.getCurrentRowID());
+ ts.commitTransaction();
+
+ // Again use the index and build a different aggregate relationship based on it
+ ts.beginTransaction();
+ index = ts.lookupIndex("testindex");
+ aggregateRelationship = new AggregateRelationship(index,new WHColumnDescription[]{
+ new ColumnCount("countA"),
+ new ColumnBreakOnChange("colB","uniqueB")});
+ // Grab the accessor and verify it is correct
+ accessor = aggregateRelationship.buildAccessor();
+ assertNotNull(accessor.getCurrentRowID());
+ value = accessor.getValue("countA");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(2L,((LongValue)value).getValue());
+ value = accessor.getValue("uniqueB");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.StringValue",value.getClass().getName());
+ assertEquals("goodbye",((StringValue)value).getValue());
+ accessor.advance();
+ assertNotNull(accessor.getCurrentRowID());
+ value = accessor.getValue("countA");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(2L,((LongValue)value).getValue());
+ value = accessor.getValue("uniqueB");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.StringValue",value.getClass().getName());
+ assertEquals("hello",((StringValue)value).getValue());
+ accessor.advance();
+ assertNull(accessor.getCurrentRowID());
+ ts.commitTransaction();
+
+ // Use the table and calculate a row count
+ ts.beginTransaction();
+ table = ts.lookupTable("testtable");
+ aggregateRelationship = new AggregateRelationship(table,new WHColumnDescription[]{
+ new ColumnCount("count")});
+ // Grab the accessor and verify it is correct
+ accessor = aggregateRelationship.buildAccessor();
+ assertNotNull(accessor.getCurrentRowID());
+ value = accessor.getValue("count");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(4L,((LongValue)value).getValue());
+ accessor.advance();
+ assertNull(accessor.getCurrentRowID());
+ ts.commitTransaction();
+
+ // Try out min and max
+ ts.beginTransaction();
+ table = ts.lookupTable("testtable");
+ aggregateRelationship = new AggregateRelationship(table,new WHColumnDescription[]{
+ new ColumnMin(new LongComparatorAscending(),"colA","minA"),
+ new ColumnMax(new LongComparatorAscending(),"colA","maxA")});
+ // Grab the accessor and verify it is correct
+ accessor = aggregateRelationship.buildAccessor();
+ assertNotNull(accessor.getCurrentRowID());
+ value = accessor.getValue("minA");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(1L,((LongValue)value).getValue());
+ value = accessor.getValue("maxA");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(4L,((LongValue)value).getValue());
+ accessor.advance();
+ assertNull(accessor.getCurrentRowID());
+ ts.commitTransaction();
+
+ }
+
+ @Test
+ public void filters()
+ throws Exception
+ {
+ WHTableStore ts = createInMemTableStore();
+
+ buildNonOverlappingTestTable(ts);
+
+ // Now build a one-column unique index on colA
+ ts.beginTransaction();
+ WHTable table = ts.lookupTable("testtable");
+ ts.createIndex("testindex",table,new String[]{"colA"},new String[]{"org.apache.warthog.common.LongComparatorAscending"},true);
+ ts.commitTransaction();
+
+ WHIndex index;
+ WHRelationship filterRelationship;
+ WHAccessor accessor;
+ WHValue value;
+
+ ts.beginTransaction();
+ index = ts.lookupIndex("testindex");
+ filterRelationship = new FilterRelationship(index,new FilterEqualsOrBefore("colA",new LongValue(124L),
+ new LongComparatorAscending()));
+ accessor = filterRelationship.buildAccessor();
+ assertNotNull(accessor.getCurrentRowID());
+ value = accessor.getValue("colA");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(111L,((LongValue)value).getValue());
+ accessor.advance();
+ assertNotNull(accessor.getCurrentRowID());
+ value = accessor.getValue("colA");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(123L,((LongValue)value).getValue());
+ accessor.advance();
+ assertNotNull(accessor.getCurrentRowID());
+ value = accessor.getValue("colA");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(124L,((LongValue)value).getValue());
+ accessor.advance();
+ assertNull(accessor.getCurrentRowID());
+ ts.abandonTransaction();
+
+ ts.beginTransaction();
+ index = ts.lookupIndex("testindex");
+ filterRelationship = new FilterRelationship(index,new FilterEqualsOrAfter("colA",new LongValue(124L),
+ new LongComparatorAscending()));
+ accessor = filterRelationship.buildAccessor();
+ assertNotNull(accessor.getCurrentRowID());
+ value = accessor.getValue("colA");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(124L,((LongValue)value).getValue());
+ accessor.advance();
+ assertNotNull(accessor.getCurrentRowID());
+ value = accessor.getValue("colA");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(456L,((LongValue)value).getValue());
+ accessor.advance();
+ assertNull(accessor.getCurrentRowID());
+ ts.abandonTransaction();
+
+ ts.beginTransaction();
+ index = ts.lookupIndex("testindex");
+ filterRelationship = new FilterRelationship(index,new FilterBefore("colA",new LongValue(124L),
+ new LongComparatorAscending()));
+ accessor = filterRelationship.buildAccessor();
+ assertNotNull(accessor.getCurrentRowID());
+ value = accessor.getValue("colA");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(111L,((LongValue)value).getValue());
+ accessor.advance();
+ assertNotNull(accessor.getCurrentRowID());
+ value = accessor.getValue("colA");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(123L,((LongValue)value).getValue());
+ accessor.advance();
+ assertNull(accessor.getCurrentRowID());
+ ts.abandonTransaction();
+
+ ts.beginTransaction();
+ index = ts.lookupIndex("testindex");
+ filterRelationship = new FilterRelationship(index,new FilterAfter("colA",new LongValue(124L),
+ new LongComparatorAscending()));
+ accessor = filterRelationship.buildAccessor();
+ value = accessor.getValue("colA");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(456L,((LongValue)value).getValue());
+ accessor.advance();
+ assertNull(accessor.getCurrentRowID());
+ ts.abandonTransaction();
+
+ ts.beginTransaction();
+ index = ts.lookupIndex("testindex");
+ filterRelationship = new FilterRelationship(index,new FilterEqualsMultiple("colA",new WHValue[]{new LongValue(123L),new LongValue(333L)},
+ new LongComparatorAscending()));
+ accessor = filterRelationship.buildAccessor();
+ assertNotNull(accessor.getCurrentRowID());
+ value = accessor.getValue("colA");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(123L,((LongValue)value).getValue());
+ accessor.advance();
+ assertNull(accessor.getCurrentRowID());
+ ts.abandonTransaction();
+
+ ts.beginTransaction();
+ index = ts.lookupIndex("testindex");
+ filterRelationship = new FilterRelationship(index,new FilterBetween("colA",new LongValue(123L),new LongValue(333L),
+ new LongComparatorAscending()));
+ accessor = filterRelationship.buildAccessor();
+ assertNotNull(accessor.getCurrentRowID());
+ value = accessor.getValue("colA");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(124L,((LongValue)value).getValue());
+ accessor.advance();
+ assertNull(accessor.getCurrentRowID());
+ ts.abandonTransaction();
+
+ }
+
+ @Test
+ public void joins()
+ throws Exception
+ {
+ // Build two tables. First one has a single column. Second one has two columns.
+ WHTableStore ts = createInMemTableStore();
+
+ ts.beginTransaction();
+ ts.createTable("testtable1",new String[]{"colC"});
+ ts.commitTransaction();
+
+ ts.beginTransaction();
+ WHTable table = ts.lookupTable("testtable1");
+ table.insertRow(new String[]{"colC"},new WHValue[]{new LongValue(123L)});
+ ts.commitTransaction();
+
+ ts.beginTransaction();
+ table = ts.lookupTable("testtable1");
+ table.insertRow(new String[]{"colC"},new WHValue[]{new LongValue(456L)});
+ ts.commitTransaction();
+
+ ts.beginTransaction();
+ table = ts.lookupTable("testtable1");
+ table.insertRow(new String[]{"colC"},new WHValue[]{new LongValue(124L)});
+ ts.commitTransaction();
+
+ ts.beginTransaction();
+ table = ts.lookupTable("testtable1");
+ table.insertRow(new String[]{"colC"},new WHValue[]{new LongValue(111L)});
+ ts.commitTransaction();
+
+ ts.beginTransaction();
+ ts.createTable("testtable2",new String[]{"colA","colB"});
+ ts.commitTransaction();
+
+ ts.beginTransaction();
+ table = ts.lookupTable("testtable2");
+ table.insertRow(new String[]{"colA","colB"},new WHValue[]{new LongValue(123L),new StringValue("hello")});
+ ts.commitTransaction();
+
+ ts.beginTransaction();
+ table = ts.lookupTable("testtable2");
+ table.insertRow(new String[]{"colA","colB"},new WHValue[]{new LongValue(123L),new StringValue("world")});
+ ts.commitTransaction();
+
+ ts.beginTransaction();
+ table = ts.lookupTable("testtable2");
+ table.insertRow(new String[]{"colA","colB"},new WHValue[]{new LongValue(456L),new StringValue("goodbye")});
+ ts.commitTransaction();
+
+ ts.beginTransaction();
+ table = ts.lookupTable("testtable2");
+ table.insertRow(new String[]{"colA","colB"},new WHValue[]{new LongValue(456L),new StringValue("world")});
+ ts.commitTransaction();
+
+ ts.beginTransaction();
+ table = ts.lookupTable("testtable2");
+ table.insertRow(new String[]{"colA","colB"},new WHValue[]{new LongValue(124L),new StringValue("...")});
+ ts.commitTransaction();
+
+ // Build indexes on both of these so we establish order for the test
+ ts.beginTransaction();
+ table = ts.lookupTable("testtable1");
+ ts.createIndex("testindex1",table,new String[]{"colC"},new String[]{"org.apache.warthog.common.LongComparatorAscending"},true);
+ ts.commitTransaction();
+
+ ts.beginTransaction();
+ table = ts.lookupTable("testtable2");
+ ts.createIndex("testindex2",table,new String[]{"colA","colB"},new String[]{"org.apache.warthog.common.LongComparatorAscending",
+ "org.apache.warthog.common.StringComparatorAscending"},false);
+ ts.commitTransaction();
+
+ // Now, build the join and iterate over it.
+ ts.beginTransaction();
+ WHIndex index2 = ts.lookupIndex("testindex2");
+ // Construct and index relationship builder linking the two
+ WHRelationshipBuilder indexRelationshipBuilder = new IndexRelationshipBuilder(index2,
+ new IndexCriteria[]{null,null},
+ new String[]{"colC",null},
+ new String[]{"org.apache.warthog.api.IndexEquals",null},
+ new boolean[]{false,false});
+ // Now construct the join
+ WHIndex index1 = ts.lookupIndex("testindex1");
+ WHRelationship joinRelationship = new JoinRelationship(index1,
+ new String[]{"colB"},
+ new String[]{"join-colB"},
+ indexRelationshipBuilder);
+
+ // Read from the relationship in order. Each row should have 2 columns: "colC" and "join-colB".
+ // The whole thing is ordered as follows: (1) by increasing "colC" value, (2) by increasing "join-colB" value.
+ WHAccessor accessor = joinRelationship.buildAccessor();
+ WHValue value;
+
+ assertNotNull(accessor.getCurrentRowID());
+ value = accessor.getValue("colC");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(123L,((LongValue)value).getValue());
+ value = accessor.getValue("join-colB");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.StringValue",value.getClass().getName());
+ assertEquals("hello",((StringValue)value).getValue());
+ accessor.advance();
+
+ assertNotNull(accessor.getCurrentRowID());
+ value = accessor.getValue("colC");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(123L,((LongValue)value).getValue());
+ value = accessor.getValue("join-colB");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.StringValue",value.getClass().getName());
+ assertEquals("world",((StringValue)value).getValue());
+ accessor.advance();
+
+ assertNotNull(accessor.getCurrentRowID());
+ value = accessor.getValue("colC");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(124L,((LongValue)value).getValue());
+ value = accessor.getValue("join-colB");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.StringValue",value.getClass().getName());
+ assertEquals("...",((StringValue)value).getValue());
+ accessor.advance();
+
+ assertNotNull(accessor.getCurrentRowID());
+ value = accessor.getValue("colC");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(456L,((LongValue)value).getValue());
+ value = accessor.getValue("join-colB");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.StringValue",value.getClass().getName());
+ assertEquals("goodbye",((StringValue)value).getValue());
+ accessor.advance();
+
+ assertNotNull(accessor.getCurrentRowID());
+ value = accessor.getValue("colC");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.LongValue",value.getClass().getName());
+ assertEquals(456L,((LongValue)value).getValue());
+ value = accessor.getValue("join-colB");
+ assertNotNull(value);
+ assertEquals("org.apache.warthog.common.StringValue",value.getClass().getName());
+ assertEquals("world",((StringValue)value).getValue());
+ accessor.advance();
+
+ assertNull(accessor.getCurrentRowID());
+
+ ts.abandonTransaction();
+ }
+
+ // Protected methods
+
+ protected WHTableStore createInMemTableStore()
+ throws WHException
+ {
+ return new TableStore(new InMemNativeTransactionalStoreImpl(new InMemAtomicNativeNonblockingKeyValueStore(32768)));
+ //return new TableStore(new InMemTransactionalStoreImpl(new InMemAtomicKeyValueStore(32768)));
+ }
+
+ protected void buildNonOverlappingTestTable(WHTableStore ts)
+ throws WHException
+ {
+ ts.beginTransaction();
+ ts.createTable("testtable",new String[]{"colA","colB"});
+ ts.commitTransaction();
+
+ ts.beginTransaction();
+ WHTable table = ts.lookupTable("testtable");
+ table.insertRow(new String[]{"colA","colB"},new WHValue[]{new LongValue(123L),new StringValue("hello")});
+ ts.commitTransaction();
+
+ ts.beginTransaction();
+ table = ts.lookupTable("testtable");
+ table.insertRow(new String[]{"colA","colB"},new WHValue[]{new LongValue(456L),new StringValue("goodbye")});
+ ts.commitTransaction();
+
+ ts.beginTransaction();
+ table = ts.lookupTable("testtable");
+ table.insertRow(new String[]{"colA","colB"},new WHValue[]{new LongValue(124L),new StringValue("...")});
+ ts.commitTransaction();
+
+ ts.beginTransaction();
+ table = ts.lookupTable("testtable");
+ table.insertRow(new String[]{"colA","colB"},new WHValue[]{new LongValue(111L),new StringValue("<>")});
+ ts.commitTransaction();
+ }
+
+ protected void buildOverlappingTestTable(WHTableStore ts)
+ throws WHException
+ {
+ ts.beginTransaction();
+ ts.createTable("testtable",new String[]{"colA","colB"});
+ ts.commitTransaction();
+
+ ts.beginTransaction();
+ WHTable table = ts.lookupTable("testtable");
+ table.insertRow(new String[]{"colA","colB"},new WHValue[]{new LongValue(123L),new StringValue("hello")});
+ ts.commitTransaction();
+
+ ts.beginTransaction();
+ table = ts.lookupTable("testtable");
+ table.insertRow(new String[]{"colA","colB"},new WHValue[]{new LongValue(456L),new StringValue("goodbye")});
+ ts.commitTransaction();
+
+ ts.beginTransaction();
+ table = ts.lookupTable("testtable");
+ table.insertRow(new String[]{"colA","colB"},new WHValue[]{new LongValue(124L),new StringValue("...")});
+ ts.commitTransaction();
+
+ ts.beginTransaction();
+ table = ts.lookupTable("testtable");
+ table.insertRow(new String[]{"colA","colB"},new WHValue[]{new LongValue(111L),new StringValue("hello")});
+ ts.commitTransaction();
+ }
+
+}
\ No newline at end of file
Added: incubator/lcf/branches/CONNECTORS-286/warthog-reimport/src/test/java/org/apache/warthog/tests/WrappedByteKey.java
URL: http://svn.apache.org/viewvc/incubator/lcf/branches/CONNECTORS-286/warthog-reimport/src/test/java/org/apache/warthog/tests/WrappedByteKey.java?rev=1220349&view=auto
==============================================================================
--- incubator/lcf/branches/CONNECTORS-286/warthog-reimport/src/test/java/org/apache/warthog/tests/WrappedByteKey.java (added)
+++ incubator/lcf/branches/CONNECTORS-286/warthog-reimport/src/test/java/org/apache/warthog/tests/WrappedByteKey.java Sun Dec 18 08:26:30 2011
@@ -0,0 +1,65 @@
+/* $Id: WrappedByteKey.java 1206939 2011-11-28 00:37:54Z kwright $ */
+
+/**
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+package org.apache.warthog.tests;
+
+import org.apache.warthog.api.*;
+import org.apache.warthog.bytekeyvalue.*;
+import org.apache.warthog.transactionalkeyvaluestore.*;
+
+public class WrappedByteKey
+{
+ protected byte[] key;
+
+ public WrappedByteKey(byte[] key)
+ {
+ this.key = key;
+ }
+
+ public int hashCode()
+ {
+ int rval = 0;
+ for (int i = 0 ; i < key.length ; i++)
+ {
+ int current = (int)key[i];
+ rval += (current << 5) ^ (current >> 3);
+ }
+ return rval;
+ }
+
+ public boolean equals(Object o)
+ {
+ if (!(o instanceof WrappedByteKey))
+ return false;
+ WrappedByteKey other = (WrappedByteKey)o;
+ if (key.length != other.key.length)
+ return false;
+ for (int i = 0 ; i < key.length ; i++)
+ {
+ if (key[i] != other.key[i])
+ return false;
+ }
+ return true;
+ }
+
+ public byte[] getKey()
+ {
+ return key;
+ }
+}
Added: incubator/lcf/branches/CONNECTORS-286/warthog-reimport/src/test/java/org/apache/warthog/tests/WrappedKey.java
URL: http://svn.apache.org/viewvc/incubator/lcf/branches/CONNECTORS-286/warthog-reimport/src/test/java/org/apache/warthog/tests/WrappedKey.java?rev=1220349&view=auto
==============================================================================
--- incubator/lcf/branches/CONNECTORS-286/warthog-reimport/src/test/java/org/apache/warthog/tests/WrappedKey.java (added)
+++ incubator/lcf/branches/CONNECTORS-286/warthog-reimport/src/test/java/org/apache/warthog/tests/WrappedKey.java Sun Dec 18 08:26:30 2011
@@ -0,0 +1,55 @@
+/* $Id: WrappedKey.java 1205831 2011-11-24 13:57:15Z kwright $ */
+
+/**
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+package org.apache.warthog.tests;
+
+import org.apache.warthog.api.*;
+import org.apache.warthog.keyvalue.*;
+import org.apache.warthog.transactionalkeyvaluestore.*;
+
+public class WrappedKey
+{
+ protected WHKey key;
+
+ public WrappedKey(WHKey key)
+ {
+ this.key = key;
+ }
+
+ public int hashCode()
+ {
+ long code = key.getHashCode();
+ return (int)code;
+ }
+
+ public boolean equals(Object o)
+ {
+ if (!(o instanceof WrappedKey))
+ return false;
+ WrappedKey other = (WrappedKey)o;
+ if (!key.getClass().equals(other.key.getClass()))
+ return false;
+ return key.isEquals(other.key);
+ }
+
+ public WHKey getKey()
+ {
+ return key;
+ }
+}