Modified: cassandra/trunk/src/java/org/apache/cassandra/db/TreeMapBackedSortedColumns.java URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/TreeMapBackedSortedColumns.java?rev=1225001&r1=1225000&r2=1225001&view=diff ============================================================================== --- cassandra/trunk/src/java/org/apache/cassandra/db/TreeMapBackedSortedColumns.java (original) +++ cassandra/trunk/src/java/org/apache/cassandra/db/TreeMapBackedSortedColumns.java Tue Dec 27 20:17:17 2011 @@ -24,11 +24,15 @@ import java.util.SortedMap; import java.util.SortedSet; import java.util.TreeMap; +import com.google.common.base.Function; + import org.apache.cassandra.db.marshal.AbstractType; import org.apache.cassandra.utils.Allocator; -public class TreeMapBackedSortedColumns extends TreeMap<ByteBuffer, IColumn> implements ISortedColumns +public class TreeMapBackedSortedColumns extends AbstractThreadUnsafeSortedColumns implements ISortedColumns { + private final TreeMap<ByteBuffer, IColumn> map; + public static final ISortedColumns.Factory factory = new Factory() { public ISortedColumns create(AbstractType<?> comparator, boolean insertReversed) @@ -49,17 +53,17 @@ public class TreeMapBackedSortedColumns public AbstractType<?> getComparator() { - return (AbstractType)comparator(); + return (AbstractType)map.comparator(); } private TreeMapBackedSortedColumns(AbstractType<?> comparator) { - super(comparator); + this.map = new TreeMap<ByteBuffer, IColumn>(comparator); } private TreeMapBackedSortedColumns(SortedMap<ByteBuffer, IColumn> columns) { - super(columns); + this.map = new TreeMap<ByteBuffer, IColumn>(columns); } public ISortedColumns.Factory getFactory() @@ -69,7 +73,7 @@ public class TreeMapBackedSortedColumns public ISortedColumns cloneMe() { - return new TreeMapBackedSortedColumns(this); + return new TreeMapBackedSortedColumns(map); } public boolean isInsertReversed() @@ -88,7 +92,7 @@ public class TreeMapBackedSortedColumns // but TreeMap lacks putAbsent. Rather than split it into a "get, then put" check, we do it as follows, // which saves the extra "get" in the no-conflict case [for both normal and super columns], // in exchange for a re-put in the SuperColumn case. - IColumn oldColumn = put(name, column); + IColumn oldColumn = map.put(name, column); if (oldColumn != null) { if (oldColumn instanceof SuperColumn) @@ -98,13 +102,13 @@ public class TreeMapBackedSortedColumns // add the new one to the old, then place old back in the Map, rather than copy the old contents // into the new Map entry. ((SuperColumn) oldColumn).putColumn((SuperColumn)column, allocator); - put(name, oldColumn); + map.put(name, oldColumn); } else { // calculate reconciled col from old (existing) col and new col IColumn reconciledColumn = column.reconcile(oldColumn, allocator); - put(name, reconciledColumn); + map.put(name, reconciledColumn); } } } @@ -112,10 +116,10 @@ public class TreeMapBackedSortedColumns /** * We need to go through each column in the column container and resolve it before adding */ - public void addAll(ISortedColumns cm, Allocator allocator) + protected void addAllColumns(ISortedColumns cm, Allocator allocator, Function<IColumn, IColumn> transformation) { for (IColumn column : cm.getSortedColumns()) - addColumn(column, allocator); + addColumn(transformation.apply(column), allocator); } public boolean replace(IColumn oldColumn, IColumn newColumn) @@ -127,15 +131,15 @@ public class TreeMapBackedSortedColumns // column or the column was not equal to oldColumn (to be coherent // with other implementation). We optimize for the common case where // oldColumn do is present though. - IColumn previous = put(oldColumn.name(), newColumn); + IColumn previous = map.put(oldColumn.name(), newColumn); if (previous == null) { - remove(oldColumn.name()); + map.remove(oldColumn.name()); return false; } if (!previous.equals(oldColumn)) { - put(oldColumn.name(), previous); + map.put(oldColumn.name(), previous); return false; } return true; @@ -143,37 +147,42 @@ public class TreeMapBackedSortedColumns public IColumn getColumn(ByteBuffer name) { - return get(name); + return map.get(name); } public void removeColumn(ByteBuffer name) { - remove(name); + map.remove(name); } - public Collection<IColumn> getSortedColumns() + public void clear() { - return values(); + map.clear(); } - public Collection<IColumn> getReverseSortedColumns() + public int size() { - return descendingMap().values(); + return map.size(); } - public SortedSet<ByteBuffer> getColumnNames() + public Collection<IColumn> getSortedColumns() { - return navigableKeySet(); + return map.values(); } - public int getEstimatedColumnCount() + public Collection<IColumn> getReverseSortedColumns() + { + return map.descendingMap().values(); + } + + public SortedSet<ByteBuffer> getColumnNames() { - return size(); + return map.navigableKeySet(); } public Iterator<IColumn> iterator() { - return values().iterator(); + return map.values().iterator(); } public Iterator<IColumn> reverseIterator() @@ -183,11 +192,11 @@ public class TreeMapBackedSortedColumns public Iterator<IColumn> iterator(ByteBuffer start) { - return tailMap(start).values().iterator(); + return map.tailMap(start).values().iterator(); } public Iterator<IColumn> reverseIterator(ByteBuffer start) { - return descendingMap().tailMap(start).values().iterator(); + return map.descendingMap().tailMap(start).values().iterator(); } }
Modified: cassandra/trunk/test/unit/org/apache/cassandra/db/ArrayBackedSortedColumnsTest.java URL: http://svn.apache.org/viewvc/cassandra/trunk/test/unit/org/apache/cassandra/db/ArrayBackedSortedColumnsTest.java?rev=1225001&r1=1225000&r2=1225001&view=diff ============================================================================== --- cassandra/trunk/test/unit/org/apache/cassandra/db/ArrayBackedSortedColumnsTest.java (original) +++ cassandra/trunk/test/unit/org/apache/cassandra/db/ArrayBackedSortedColumnsTest.java Tue Dec 27 20:17:17 2011 @@ -28,6 +28,8 @@ import org.junit.Test; import static org.junit.Assert.*; +import com.google.common.base.Function; + import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.db.marshal.BytesType; import org.apache.cassandra.utils.HeapAllocator; @@ -76,7 +78,7 @@ public class ArrayBackedSortedColumnsTes for (int i = 0; i < values2.length; ++i) map2.addColumn(new Column(ByteBufferUtil.bytes(values2[reversed ? values2.length - 1 - i : i])), HeapAllocator.instance); - map2.addAll(map, HeapAllocator.instance); + map2.addAll(map, HeapAllocator.instance, new Function<IColumn, IColumn>(){ public IColumn apply(IColumn c) { return c; }; }); Iterator<IColumn> iter = map2.iterator(); assertEquals("1st column", 1, iter.next().name().getInt(0)); Modified: cassandra/trunk/test/unit/org/apache/cassandra/db/ColumnFamilyTest.java URL: http://svn.apache.org/viewvc/cassandra/trunk/test/unit/org/apache/cassandra/db/ColumnFamilyTest.java?rev=1225001&r1=1225000&r2=1225001&view=diff ============================================================================== --- cassandra/trunk/test/unit/org/apache/cassandra/db/ColumnFamilyTest.java (original) +++ cassandra/trunk/test/unit/org/apache/cassandra/db/ColumnFamilyTest.java Tue Dec 27 20:17:17 2011 @@ -174,7 +174,7 @@ public class ColumnFamilyTest extends Sc public void testSuperColumnResolution() { testSuperColumnResolution(TreeMapBackedSortedColumns.factory()); - testSuperColumnResolution(ThreadSafeSortedColumns.factory()); + testSuperColumnResolution(AtomicSortedColumns.factory()); // array-sorted does allow conflict resolution IF it is the last column. Bit of an edge case. testSuperColumnResolution(ArrayBackedSortedColumns.factory()); }