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