You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by be...@apache.org on 2018/11/29 16:00:53 UTC

[2/6] cassandra git commit: Unfiltered.isEmpty conflicts with Row extends AbstractCollection.isEmpty

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 <be...@apple.com>
Authored: Fri Jul 27 16:04:13 2018 +0100
Committer: Benedict Elliott Smith <be...@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-unsubscribe@cassandra.apache.org
For additional commands, e-mail: commits-help@cassandra.apache.org