Unfiltered.isEmpty conflicts with Row extends AbstractCollection.isEmpty patch by Benedict; reviewed by Blake Eggleston for CASSANDRA-14588
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/8404260f Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/8404260f Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/8404260f Branch: refs/heads/cassandra-3.11 Commit: 8404260f1640efd14613c4591e5e918786fcde10 Parents: 7bdea44 Author: Benedict Elliott Smith <bened...@apple.com> Authored: Fri Jul 27 16:04:13 2018 +0100 Committer: Benedict Elliott Smith <bened...@apache.org> Committed: Thu Nov 29 15:50:25 2018 +0000 ---------------------------------------------------------------------- CHANGES.txt | 1 + .../org/apache/cassandra/db/rows/AbstractRow.java | 8 +++++++- .../org/apache/cassandra/db/rows/BTreeRow.java | 16 +++++++++++++--- src/java/org/apache/cassandra/db/rows/Row.java | 17 ++++++++++++++++- .../cassandra/db/rows/UnfilteredSerializer.java | 8 ++++---- .../validation/entities/SecondaryIndexTest.java | 16 ++++++++-------- .../db/SinglePartitionSliceCommandTest.java | 2 +- 7 files changed, 50 insertions(+), 18 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/8404260f/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index 9ba36fa..40016a1 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 3.0.18 + * Unfiltered.isEmpty conflicts with Row extends AbstractCollection.isEmpty (CASSANDRA-14588) * RangeTombstoneList doesn't properly clean up mergeable or superseded rts in some cases (CASSANDRA-14894) * Fix handling of collection tombstones for dropped columns from legacy sstables (CASSANDRA-14912) * Throw exception if Columns serialized subset encode more columns than possible (CASSANDRA-14591) http://git-wip-us.apache.org/repos/asf/cassandra/blob/8404260f/src/java/org/apache/cassandra/db/rows/AbstractRow.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/db/rows/AbstractRow.java b/src/java/org/apache/cassandra/db/rows/AbstractRow.java index 67ed219..f91126b 100644 --- a/src/java/org/apache/cassandra/db/rows/AbstractRow.java +++ b/src/java/org/apache/cassandra/db/rows/AbstractRow.java @@ -19,6 +19,7 @@ package org.apache.cassandra.db.rows; import java.nio.ByteBuffer; import java.security.MessageDigest; import java.util.AbstractCollection; +import java.util.Collection; import java.util.Objects; import com.google.common.collect.Iterables; @@ -35,7 +36,7 @@ import org.apache.cassandra.utils.FBUtilities; * Unless you have a very good reason not to, every row implementation * should probably extend this class. */ -public abstract class AbstractRow extends AbstractCollection<ColumnData> implements Row +public abstract class AbstractRow implements Row { public Unfiltered.Kind kind() { @@ -87,6 +88,11 @@ public abstract class AbstractRow extends AbstractCollection<ColumnData> impleme cd.validate(); } + public String toString() + { + return columnData().toString(); + } + public String toString(CFMetaData metadata) { return toString(metadata, false); http://git-wip-us.apache.org/repos/asf/cassandra/blob/8404260f/src/java/org/apache/cassandra/db/rows/BTreeRow.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/db/rows/BTreeRow.java b/src/java/org/apache/cassandra/db/rows/BTreeRow.java index b07960c..e46d0cc 100644 --- a/src/java/org/apache/cassandra/db/rows/BTreeRow.java +++ b/src/java/org/apache/cassandra/db/rows/BTreeRow.java @@ -167,7 +167,12 @@ public class BTreeRow extends AbstractRow public Collection<ColumnDefinition> columns() { - return Collections2.transform(this, ColumnData::column); + return Collections2.transform(columnData(), ColumnData::column); + } + + public int columnCount() + { + return BTree.size(btree); } public LivenessInfo primaryKeyLivenessInfo() @@ -208,9 +213,14 @@ public class BTreeRow extends AbstractRow return (ComplexColumnData) BTree.<Object>find(btree, ColumnDefinition.asymmetricColumnDataComparator, c); } - public int size() + @Override + public Collection<ColumnData> columnData() { - return BTree.size(btree); + return new AbstractCollection<ColumnData>() + { + @Override public Iterator<ColumnData> iterator() { return BTreeRow.this.iterator(); } + @Override public int size() { return BTree.size(btree); } + }; } public Iterator<ColumnData> iterator() http://git-wip-us.apache.org/repos/asf/cassandra/blob/8404260f/src/java/org/apache/cassandra/db/rows/Row.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/db/rows/Row.java b/src/java/org/apache/cassandra/db/rows/Row.java index 3c97e09..dcb78f3 100644 --- a/src/java/org/apache/cassandra/db/rows/Row.java +++ b/src/java/org/apache/cassandra/db/rows/Row.java @@ -45,7 +45,7 @@ import org.apache.cassandra.utils.btree.UpdateFunction; * it's own data. For instance, a {@code Row} cannot contains a cell that is deleted by its own * row deletion. */ -public interface Row extends Unfiltered, Collection<ColumnData> +public interface Row extends Unfiltered, Iterable<ColumnData> { /** * The clustering values for this row. @@ -59,6 +59,12 @@ public interface Row extends Unfiltered, Collection<ColumnData> */ public Collection<ColumnDefinition> columns(); + + /** + * The number of columns for which data (incl. simple tombstones) is present in this row. + */ + public int columnCount(); + /** * The row deletion. * @@ -148,6 +154,15 @@ public interface Row extends Unfiltered, Collection<ColumnData> public Iterable<Cell> cells(); /** + * A collection of the ColumnData representation of this row, for columns with some data (possibly not live) present + * <p> + * The data is returned in column order. + * + * @return a Collection of the non-empty ColumnData for this row. + */ + public Collection<ColumnData> columnData(); + + /** * An iterable over the cells of this row that return cells in "legacy order". * <p> * In 3.0+, columns are sorted so that all simple columns are before all complex columns. Previously http://git-wip-us.apache.org/repos/asf/cassandra/blob/8404260f/src/java/org/apache/cassandra/db/rows/UnfilteredSerializer.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/db/rows/UnfilteredSerializer.java b/src/java/org/apache/cassandra/db/rows/UnfilteredSerializer.java index c4684e1..0342e39 100644 --- a/src/java/org/apache/cassandra/db/rows/UnfilteredSerializer.java +++ b/src/java/org/apache/cassandra/db/rows/UnfilteredSerializer.java @@ -133,7 +133,7 @@ public class UnfilteredSerializer LivenessInfo pkLiveness = row.primaryKeyLivenessInfo(); Row.Deletion deletion = row.deletion(); boolean hasComplexDeletion = row.hasComplexDeletion(); - boolean hasAllColumns = (row.size() == headerColumns.size()); + boolean hasAllColumns = (row.columnCount() == headerColumns.size()); boolean hasExtendedFlags = hasExtendedFlags(row); if (isStatic) @@ -181,7 +181,7 @@ public class UnfilteredSerializer header.writeDeletionTime(deletion.time(), out); if (!hasAllColumns) - Columns.serializer.serializeSubset(Collections2.transform(row, ColumnData::column), headerColumns, out); + Columns.serializer.serializeSubset(row.columns(), headerColumns, out); SearchIterator<ColumnDefinition, ColumnDefinition> si = headerColumns.iterator(); for (ColumnData data : row) @@ -274,7 +274,7 @@ public class UnfilteredSerializer LivenessInfo pkLiveness = row.primaryKeyLivenessInfo(); Row.Deletion deletion = row.deletion(); boolean hasComplexDeletion = row.hasComplexDeletion(); - boolean hasAllColumns = (row.size() == headerColumns.size()); + boolean hasAllColumns = (row.columnCount() == headerColumns.size()); if (!pkLiveness.isEmpty()) size += header.timestampSerializedSize(pkLiveness.timestamp()); @@ -287,7 +287,7 @@ public class UnfilteredSerializer size += header.deletionTimeSerializedSize(deletion.time()); if (!hasAllColumns) - size += Columns.serializer.serializedSubsetSize(Collections2.transform(row, ColumnData::column), header.columns(isStatic)); + size += Columns.serializer.serializedSubsetSize(row.columns(), header.columns(isStatic)); SearchIterator<ColumnDefinition, ColumnDefinition> si = headerColumns.iterator(); for (ColumnData data : row) http://git-wip-us.apache.org/repos/asf/cassandra/blob/8404260f/test/unit/org/apache/cassandra/cql3/validation/entities/SecondaryIndexTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/cql3/validation/entities/SecondaryIndexTest.java b/test/unit/org/apache/cassandra/cql3/validation/entities/SecondaryIndexTest.java index 0f6cba7..c2640a0 100644 --- a/test/unit/org/apache/cassandra/cql3/validation/entities/SecondaryIndexTest.java +++ b/test/unit/org/apache/cassandra/cql3/validation/entities/SecondaryIndexTest.java @@ -918,10 +918,10 @@ public class SecondaryIndexTest extends CQLTester execute("UPDATE %s USING TIMESTAMP 1 SET v1=1 WHERE k=0 AND c=0"); assertEquals(1, index.rowsUpdated.size()); Row oldRow = index.rowsUpdated.get(0).left; - assertEquals(1, oldRow.size()); + assertEquals(1, oldRow.columnCount()); validateCell(oldRow.getCell(v1), v1, ByteBufferUtil.bytes(0), 0); Row newRow = index.rowsUpdated.get(0).right; - assertEquals(1, newRow.size()); + assertEquals(1, newRow.columnCount()); validateCell(newRow.getCell(v1), v1, ByteBufferUtil.bytes(1), 1); index.reset(); @@ -929,11 +929,11 @@ public class SecondaryIndexTest extends CQLTester execute("UPDATE %s USING TIMESTAMP 2 SET v1=2, v2=2 WHERE k=0 AND c=0"); assertEquals(1, index.rowsUpdated.size()); oldRow = index.rowsUpdated.get(0).left; - assertEquals(2, oldRow.size()); + assertEquals(2, oldRow.columnCount()); validateCell(oldRow.getCell(v1), v1, ByteBufferUtil.bytes(1), 1); validateCell(oldRow.getCell(v2), v2, ByteBufferUtil.bytes(0), 0); newRow = index.rowsUpdated.get(0).right; - assertEquals(2, newRow.size()); + assertEquals(2, newRow.columnCount()); validateCell(newRow.getCell(v1), v1, ByteBufferUtil.bytes(2), 2); validateCell(newRow.getCell(v2), v2, ByteBufferUtil.bytes(2), 2); index.reset(); @@ -942,10 +942,10 @@ public class SecondaryIndexTest extends CQLTester execute("DELETE v1 FROM %s USING TIMESTAMP 3 WHERE k=0 AND c=0"); assertEquals(1, index.rowsUpdated.size()); oldRow = index.rowsUpdated.get(0).left; - assertEquals(1, oldRow.size()); + assertEquals(1, oldRow.columnCount()); validateCell(oldRow.getCell(v1), v1, ByteBufferUtil.bytes(2), 2); newRow = index.rowsUpdated.get(0).right; - assertEquals(1, newRow.size()); + assertEquals(1, newRow.columnCount()); Cell newCell = newRow.getCell(v1); assertTrue(newCell.isTombstone()); assertEquals(3, newCell.timestamp()); @@ -957,10 +957,10 @@ public class SecondaryIndexTest extends CQLTester execute("INSERT INTO %s(k, c) VALUES (0, 0) USING TIMESTAMP 4"); assertEquals(1, index.rowsUpdated.size()); oldRow = index.rowsUpdated.get(0).left; - assertEquals(0, oldRow.size()); + assertEquals(0, oldRow.columnCount()); assertEquals(0, oldRow.primaryKeyLivenessInfo().timestamp()); newRow = index.rowsUpdated.get(0).right; - assertEquals(0, newRow.size()); + assertEquals(0, newRow.columnCount()); assertEquals(4, newRow.primaryKeyLivenessInfo().timestamp()); } http://git-wip-us.apache.org/repos/asf/cassandra/blob/8404260f/test/unit/org/apache/cassandra/db/SinglePartitionSliceCommandTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/db/SinglePartitionSliceCommandTest.java b/test/unit/org/apache/cassandra/db/SinglePartitionSliceCommandTest.java index ca0dfa5..940b4f9 100644 --- a/test/unit/org/apache/cassandra/db/SinglePartitionSliceCommandTest.java +++ b/test/unit/org/apache/cassandra/db/SinglePartitionSliceCommandTest.java @@ -282,7 +282,7 @@ public class SinglePartitionSliceCommandTest assertTrue(unfiltered.isRow()); Row row = (Row) unfiltered; assertEquals(deletionTime, row.deletion().time().markedForDeleteAt()); - assertEquals(0, row.size()); // no btree + assertEquals(0, row.columnCount()); // no btree } count++; } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org For additional commands, e-mail: commits-h...@cassandra.apache.org