You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by sl...@apache.org on 2012/05/15 09:08:56 UTC
[1/2] git commit: Don't return range ghosts in CQL3
Updated Branches:
refs/heads/cassandra-1.1 68bae3131 -> 0cee56b17
Don't return range ghosts in CQL3
patch by slebresne; reviewed by jbellis for CASSANDRA-3982
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/0cee56b1
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/0cee56b1
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/0cee56b1
Branch: refs/heads/cassandra-1.1
Commit: 0cee56b1720e1e1ee8e81a813d026c8b0e180070
Parents: 983ee11
Author: Sylvain Lebresne <sy...@datastax.com>
Authored: Tue May 15 09:07:56 2012 +0200
Committer: Sylvain Lebresne <sy...@datastax.com>
Committed: Tue May 15 09:07:56 2012 +0200
----------------------------------------------------------------------
CHANGES.txt | 3 +-
.../cassandra/cql3/statements/SelectStatement.java | 46 +++++++-------
2 files changed, 25 insertions(+), 24 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/0cee56b1/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index b37bd83..1a5a7b7 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -40,7 +40,8 @@
(CASSANDRA-4187)
* Fix exception during move when localhost is the only source (CASSANDRA-4200)
* (cql3) Allow paging through non-ordered partitioner results (CASSANDRA-3771)
- * (cql3) Fix drop index
+ * (cql3) Fix drop index (CASSANDRA-4192)
+ * (cql3) Don't return range ghosts anymore (CASSANDRA-3982)
Merged from 1.0:
* Fix super columns bug where cache is not updated (CASSANDRA-4190)
* fix maxTimestamp to include row tombstones (CASSANDRA-4116)
http://git-wip-us.apache.org/repos/asf/cassandra/blob/0cee56b1/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java b/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java
index 1878949..425cf17 100644
--- a/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java
@@ -467,18 +467,18 @@ public class SelectStatement implements CQLStatement
}
else
{
- // Adds all (requested) columns
- List<Pair<CFDefinition.Name, ColumnIdentifier>> selection = getExpandedSelection();
- List<ByteBuffer> columns = new ArrayList<ByteBuffer>(selection.size());
- Iterator<Pair<CFDefinition.Name, ColumnIdentifier>> iter = selection.iterator();
+ // Adds all columns (even if the user selected a few columns, we
+ // need to query all columns to know if the row exists or not).
+ // Note that when we allow IS NOT NULL in queries and if all
+ // selected name are request 'not null', we will allow to only
+ // query those.
+ List<ByteBuffer> columns = new ArrayList<ByteBuffer>(cfDef.columns.size());
+ Iterator<ColumnIdentifier> iter = cfDef.metadata.keySet().iterator();
while (iter.hasNext())
{
- CFDefinition.Name name = iter.next().left;
- // Skip everything that is not a 'metadata' column
- if (name.kind != CFDefinition.Name.Kind.COLUMN_METADATA)
- continue;
+ ColumnIdentifier name = iter.next();
ColumnNameBuilder b = iter.hasNext() ? builder.copy() : builder;
- ByteBuffer cname = b.add(name.name.key).build();
+ ByteBuffer cname = b.add(name.key).build();
columns.add(cname);
}
return columns;
@@ -626,14 +626,19 @@ public class SelectStatement implements CQLStatement
List<Pair<CFDefinition.Name, ColumnIdentifier>> selection = getExpandedSelection();
List<Column> thriftColumns = null;
+ // Add schema only once
+ for (Pair<CFDefinition.Name, ColumnIdentifier> p : selection)
+ addToSchema(schema, p);
+
for (org.apache.cassandra.db.Row row : rows)
{
+ // Not columns match the query, skip
+ if (row.cf == null)
+ continue;
+
if (cfDef.isCompact)
{
// One cqlRow per column
- if (row.cf == null)
- continue;
-
for (IColumn c : columnsInOrder(row.cf, variables))
{
if (c.isMarkedForDelete())
@@ -662,7 +667,6 @@ public class SelectStatement implements CQLStatement
CFDefinition.Name name = p.left;
ByteBuffer nameAsRequested = p.right.key;
- addToSchema(schema, p);
Column col = new Column(nameAsRequested);
switch (name.kind)
{
@@ -698,9 +702,6 @@ public class SelectStatement implements CQLStatement
else if (cfDef.isComposite)
{
// Sparse case: group column in cqlRow when composite prefix is equal
- if (row.cf == null)
- continue;
-
CompositeType composite = (CompositeType)cfDef.cfm.comparator;
int last = composite.types.size() - 1;
@@ -729,8 +730,12 @@ public class SelectStatement implements CQLStatement
}
else
{
+ if (row.cf.getLiveColumnCount() == 0)
+ continue;
+
// Static case: One cqlRow for all columns
thriftColumns = new ArrayList<Column>(selection.size());
+
// Respect selection order
for (Pair<CFDefinition.Name, ColumnIdentifier> p : selection)
{
@@ -739,15 +744,10 @@ public class SelectStatement implements CQLStatement
if (name.kind == CFDefinition.Name.Kind.KEY_ALIAS)
{
- addToSchema(schema, p);
thriftColumns.add(new Column(nameAsRequested).setValue(row.key.key).setTimestamp(-1L));
continue;
}
- if (row.cf == null)
- continue;
-
- addToSchema(schema, p);
IColumn c = row.cf.getColumn(name.name.key);
Column col = new Column(name.name.key);
if (c != null && !c.isMarkedForDelete())
@@ -799,7 +799,6 @@ public class SelectStatement implements CQLStatement
CFDefinition.Name name = p.left;
ByteBuffer nameAsRequested = p.right.key;
- addToSchema(schema, p);
Column col = new Column(nameAsRequested);
switch (name.kind)
{
@@ -815,7 +814,8 @@ public class SelectStatement implements CQLStatement
throw new AssertionError();
case COLUMN_METADATA:
IColumn c = columns.get(name.name.key);
- if (c != null && !c.isMarkedForDelete())
+ // We already have excluded deleted columns
+ if (c != null)
col.setValue(value(c)).setTimestamp(c.timestamp());
break;
}