Repository: cassandra
Updated Branches:
  refs/heads/cassandra-3.11 7df942bc5 -> 6d0e95af7


http://git-wip-us.apache.org/repos/asf/cassandra/blob/88d2ac4f/test/unit/org/apache/cassandra/cql3/validation/operations/SelectLimitTest.java
----------------------------------------------------------------------
diff --cc 
test/unit/org/apache/cassandra/cql3/validation/operations/SelectLimitTest.java
index aeb3d56,0ffb799..7e90c0a
--- 
a/test/unit/org/apache/cassandra/cql3/validation/operations/SelectLimitTest.java
+++ 
b/test/unit/org/apache/cassandra/cql3/validation/operations/SelectLimitTest.java
@@@ -26,14 -26,14 +26,15 @@@ import org.junit.Test
  import org.apache.cassandra.config.DatabaseDescriptor;
  import org.apache.cassandra.cql3.CQLTester;
  import org.apache.cassandra.dht.ByteOrderedPartitioner;
--import org.apache.cassandra.exceptions.InvalidRequestException;
++import org.apache.cassandra.service.StorageService;
  
  public class SelectLimitTest extends CQLTester
  {
      @BeforeClass
      public static void setUp()
      {
 -        DatabaseDescriptor.setPartitioner(ByteOrderedPartitioner.instance);
++        
StorageService.instance.setPartitionerUnsafe(ByteOrderedPartitioner.instance);
 +        
DatabaseDescriptor.setPartitionerUnsafe(ByteOrderedPartitioner.instance);
      }
  
      /**
@@@ -125,43 -125,217 +126,296 @@@
                     row(1, 1),
                     row(1, 2),
                     row(1, 3));
 +        assertRows(execute("SELECT * FROM %s WHERE v > 1 AND v <= 3 LIMIT 6 
ALLOW FILTERING"),
 +                   row(0, 2),
 +                   row(0, 3),
 +                   row(1, 2),
 +                   row(1, 3),
 +                   row(2, 2),
 +                   row(2, 3));
 +    }
  
 -        // strict bound (v > 1) over a range of partitions is not supported 
for compact storage if limit is provided
 -        assertInvalidThrow(InvalidRequestException.class, "SELECT * FROM %s 
WHERE v > 1 AND v <= 3 LIMIT 6 ALLOW FILTERING");
 +    @Test
 +    public void testLimitWithDeletedRowsAndStaticColumns() throws Throwable
 +    {
 +        createTable("CREATE TABLE %s (pk int, c int, v int, s int static, 
PRIMARY KEY (pk, c))");
 +
 +        execute("INSERT INTO %s (pk, c, v, s) VALUES (1, -1, 1, 1)");
 +        execute("INSERT INTO %s (pk, c, v, s) VALUES (2, -1, 1, 1)");
 +        execute("INSERT INTO %s (pk, c, v, s) VALUES (3, -1, 1, 1)");
 +        execute("INSERT INTO %s (pk, c, v, s) VALUES (4, -1, 1, 1)");
 +        execute("INSERT INTO %s (pk, c, v, s) VALUES (5, -1, 1, 1)");
 +
 +        assertRows(execute("SELECT * FROM %s"),
 +                   row(1, -1, 1, 1),
 +                   row(2, -1, 1, 1),
 +                   row(3, -1, 1, 1),
 +                   row(4, -1, 1, 1),
 +                   row(5, -1, 1, 1));
 +
 +        execute("DELETE FROM %s WHERE pk = 2");
 +
 +        assertRows(execute("SELECT * FROM %s"),
 +                   row(1, -1, 1, 1),
 +                   row(3, -1, 1, 1),
 +                   row(4, -1, 1, 1),
 +                   row(5, -1, 1, 1));
 +
 +        assertRows(execute("SELECT * FROM %s LIMIT 2"),
 +                   row(1, -1, 1, 1),
 +                   row(3, -1, 1, 1));
      }
+ 
+     @Test
+     public void testFilteringOnClusteringColumnsWithLimitAndStaticColumns() 
throws Throwable
+     {
+         // With only one clustering column
+         createTable("CREATE TABLE %s (a int, b int, s int static, c int, 
primary key (a, b))"
+           + " WITH caching = {'keys': 'ALL', 'rows_per_partition' : 'ALL'}");
+ 
+         for (int i = 0; i < 4; i++)
+         {
+             execute("INSERT INTO %s (a, s) VALUES (?, ?)", i, i);
+                 for (int j = 0; j < 3; j++)
+                     if (!((i == 0 || i == 3) && j == 1))
+                         execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 
i, j, i + j);
+         }
+ 
 -        for (boolean forceFlush : new boolean[]{false, true})
++        beforeAndAfterFlush(() ->
+         {
 -            if (forceFlush)
 -                flush();
 -
+             assertRows(execute("SELECT * FROM %s"),
+                        row(0, 0, 0, 0),
+                        row(0, 2, 0, 2),
+                        row(1, 0, 1, 1),
+                        row(1, 1, 1, 2),
+                        row(1, 2, 1, 3),
+                        row(2, 0, 2, 2),
+                        row(2, 1, 2, 3),
+                        row(2, 2, 2, 4),
+                        row(3, 0, 3, 3),
+                        row(3, 2, 3, 5));
+ 
+             assertRows(execute("SELECT * FROM %s WHERE b = 1 ALLOW 
FILTERING"),
+                        row(1, 1, 1, 2),
+                        row(2, 1, 2, 3));
+ 
+             // The problem was that the static row of the partition 0 used to 
be only filtered in SelectStatement and was
+             // by consequence counted as a row. In which case the query was 
returning one row less.
+             assertRows(execute("SELECT * FROM %s WHERE b = 1 LIMIT 2 ALLOW 
FILTERING"),
+                        row(1, 1, 1, 2),
+                        row(2, 1, 2, 3));
+ 
+             assertRows(execute("SELECT * FROM %s WHERE b >= 1 AND b <= 1 
LIMIT 2 ALLOW FILTERING"),
+                        row(1, 1, 1, 2),
+                        row(2, 1, 2, 3));
+ 
+             // Test with paging
+             for (int pageSize = 1; pageSize < 4; pageSize++)
+             {
+                 assertRowsNet(executeNetWithPaging("SELECT * FROM %s WHERE b 
= 1 LIMIT 2 ALLOW FILTERING", pageSize),
+                               row(1, 1, 1, 2),
+                               row(2, 1, 2, 3));
+ 
+                 assertRowsNet(executeNetWithPaging("SELECT * FROM %s WHERE b 
>= 1 AND b <= 1 LIMIT 2 ALLOW FILTERING", pageSize),
+                               row(1, 1, 1, 2),
+                               row(2, 1, 2, 3));
+             }
 -        }
++        });
+ 
+         assertRows(execute("SELECT * FROM %s WHERE a IN (0, 1, 2, 3) AND b = 
1 LIMIT 2 ALLOW FILTERING"),
+                    row(1, 1, 1, 2),
+                    row(2, 1, 2, 3));
+ 
+         assertRows(execute("SELECT * FROM %s WHERE a IN (0, 1, 2, 3) AND b >= 
1 AND b <= 1 LIMIT 2 ALLOW FILTERING"),
+                    row(1, 1, 1, 2),
+                    row(2, 1, 2, 3));
+ 
+         assertRows(execute("SELECT * FROM %s WHERE a IN (0, 1, 2, 3) AND b = 
1 ORDER BY b DESC LIMIT 2 ALLOW FILTERING"),
 -                   row(2, 1, 2, 3),
 -                   row(1, 1, 1, 2));
++                   row(1, 1, 1, 2),
++                   row(2, 1, 2, 3));
+ 
+         assertRows(execute("SELECT * FROM %s WHERE a IN (0, 1, 2, 3) AND b >= 
1 AND b <= 1 ORDER BY b DESC LIMIT 2 ALLOW FILTERING"),
 -                   row(2, 1, 2, 3),
 -                   row(1, 1, 1, 2));
++                   row(1, 1, 1, 2),
++                   row(2, 1, 2, 3));
+ 
+         execute("SELECT * FROM %s WHERE a IN (0, 1, 2, 3)"); // Load all data 
in the row cache
+ 
++        // Partition range queries
+         assertRows(execute("SELECT * FROM %s WHERE b = 1 LIMIT 2 ALLOW 
FILTERING"),
+                    row(1, 1, 1, 2),
+                    row(2, 1, 2, 3));
+ 
+         assertRows(execute("SELECT * FROM %s WHERE b >= 1 AND b <= 1 LIMIT 2 
ALLOW FILTERING"),
+                    row(1, 1, 1, 2),
+                    row(2, 1, 2, 3));
+ 
++        // Multiple partitions queries
++        assertRows(execute("SELECT * FROM %s WHERE a IN (0, 1, 2) AND b = 1 
LIMIT 2 ALLOW FILTERING"),
++                   row(1, 1, 1, 2),
++                   row(2, 1, 2, 3));
++
++        assertRows(execute("SELECT * FROM %s WHERE a IN (0, 1, 2) AND b >= 1 
AND b <= 1 LIMIT 2 ALLOW FILTERING"),
++                   row(1, 1, 1, 2),
++                   row(2, 1, 2, 3));
++
+         // Test with paging
+         for (int pageSize = 1; pageSize < 4; pageSize++)
+         {
+             assertRowsNet(executeNetWithPaging("SELECT * FROM %s WHERE b = 1 
LIMIT 2 ALLOW FILTERING", pageSize),
+                           row(1, 1, 1, 2),
+                           row(2, 1, 2, 3));
+ 
+             assertRowsNet(executeNetWithPaging("SELECT * FROM %s WHERE b >= 1 
AND b <= 1 LIMIT 2 ALLOW FILTERING", pageSize),
+                           row(1, 1, 1, 2),
+                           row(2, 1, 2, 3));
+         }
+ 
+         // With multiple clustering columns
+         createTable("CREATE TABLE %s (a int, b int, c int, s int static, d 
int, primary key (a, b, c))"
 -                + " WITH caching = {'keys': 'ALL', 'rows_per_partition' : 
'ALL'}");
++           + " WITH caching = {'keys': 'ALL', 'rows_per_partition' : 'ALL'}");
+ 
+         for (int i = 0; i < 3; i++)
+         {
+             execute("INSERT INTO %s (a, s) VALUES (?, ?)", i, i);
 -            for (int j = 0; j < 3; j++)
 -                if (!(i == 0 && j == 1))
 -                    execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, 
?)", i, j, j, i + j);
++                for (int j = 0; j < 3; j++)
++                    if (!(i == 0 && j == 1))
++                        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, 
?)", i, j, j, i + j);
+         }
+ 
 -        for (boolean forceFlush : new boolean[]{false, true})
++        beforeAndAfterFlush(() ->
+         {
 -            if (forceFlush)
 -                flush();
 -
+             assertRows(execute("SELECT * FROM %s"),
+                        row(0, 0, 0, 0, 0),
+                        row(0, 2, 2, 0, 2),
+                        row(1, 0, 0, 1, 1),
+                        row(1, 1, 1, 1, 2),
+                        row(1, 2, 2, 1, 3),
+                        row(2, 0, 0, 2, 2),
+                        row(2, 1, 1, 2, 3),
+                        row(2, 2, 2, 2, 4));
+ 
+             assertRows(execute("SELECT * FROM %s WHERE b = 1 ALLOW 
FILTERING"),
+                        row(1, 1, 1, 1, 2),
+                        row(2, 1, 1, 2, 3));
+ 
+             assertRows(execute("SELECT * FROM %s WHERE b IN (1, 2, 3, 4) AND 
c >= 1 AND c <= 1 LIMIT 2 ALLOW FILTERING"),
+                        row(1, 1, 1, 1, 2),
+                        row(2, 1, 1, 2, 3));
+ 
+             // Test with paging
+             for (int pageSize = 1; pageSize < 4; pageSize++)
+             {
+                 assertRowsNet(executeNetWithPaging("SELECT * FROM %s WHERE b 
= 1 LIMIT 2 ALLOW FILTERING", pageSize),
+                               row(1, 1, 1, 1, 2),
+                               row(2, 1, 1, 2, 3));
+ 
+                 assertRowsNet(executeNetWithPaging("SELECT * FROM %s WHERE b 
IN (1, 2, 3, 4) AND c >= 1 AND c <= 1 LIMIT 2 ALLOW FILTERING", pageSize),
+                               row(1, 1, 1, 1, 2),
+                               row(2, 1, 1, 2, 3));
+             }
 -        }
++        });
+ 
+         execute("SELECT * FROM %s WHERE a IN (0, 1, 2)"); // Load data in the 
row cache
+ 
+         assertRows(execute("SELECT * FROM %s WHERE b = 1 ALLOW FILTERING"),
+                    row(1, 1, 1, 1, 2),
+                    row(2, 1, 1, 2, 3));
+ 
+         assertRows(execute("SELECT * FROM %s WHERE b IN (1, 2, 3, 4) AND c >= 
1 AND c <= 1 LIMIT 2 ALLOW FILTERING"),
+                    row(1, 1, 1, 1, 2),
+                    row(2, 1, 1, 2, 3));
+ 
++        assertRows(execute("SELECT * FROM %s WHERE a IN (1, 2, 3, 4) AND b = 
1 ALLOW FILTERING"),
++                   row(1, 1, 1, 1, 2),
++                   row(2, 1, 1, 2, 3));
++
++        assertRows(execute("SELECT * FROM %s WHERE a IN (1, 2, 3, 4) AND b IN 
(1, 2, 3, 4) AND c >= 1 AND c <= 1 LIMIT 2 ALLOW FILTERING"),
++                   row(1, 1, 1, 1, 2),
++                   row(2, 1, 1, 2, 3));
++
+         // Test with paging
+         for (int pageSize = 1; pageSize < 4; pageSize++)
+         {
+             assertRowsNet(executeNetWithPaging("SELECT * FROM %s WHERE b = 1 
LIMIT 2 ALLOW FILTERING", pageSize),
+                           row(1, 1, 1, 1, 2),
+                           row(2, 1, 1, 2, 3));
+ 
+             assertRowsNet(executeNetWithPaging("SELECT * FROM %s WHERE b IN 
(1, 2, 3, 4) AND c >= 1 AND c <= 1 LIMIT 2 ALLOW FILTERING", pageSize),
+                           row(1, 1, 1, 1, 2),
+                           row(2, 1, 1, 2, 3));
+         }
+     }
+ 
+     @Test
+     public void testIndexOnRegularColumnWithPartitionWithoutRows() throws 
Throwable
+     {
+         createTable("CREATE TABLE %s (pk int, c int, s int static, v int, 
PRIMARY KEY(pk, c))");
+         createIndex("CREATE INDEX ON %s (v)");
+ 
+         execute("INSERT INTO %s (pk, c, s, v) VALUES (?, ?, ?, ?)", 1, 1, 9, 
1);
+         execute("INSERT INTO %s (pk, c, s, v) VALUES (?, ?, ?, ?)", 1, 2, 9, 
2);
+         execute("INSERT INTO %s (pk, c, s, v) VALUES (?, ?, ?, ?)", 3, 1, 9, 
1);
+         execute("INSERT INTO %s (pk, c, s, v) VALUES (?, ?, ?, ?)", 4, 1, 9, 
1);
+         flush();
+ 
+         assertRows(execute("SELECT * FROM %s WHERE v = ?", 1),
+                    row(1, 1, 9, 1),
+                    row(3, 1, 9, 1),
+                    row(4, 1, 9, 1));
+ 
 -        execute("DELETE FROM %s WHERE pk = ? AND c = ?", 3, 1);
++        execute("DELETE FROM %s WHERE pk = ? and c = ?", 3, 1);
+ 
+         // Test without paging
 -        assertRows(execute("SELECT * FROM %s WHERE v = ?", 1),
++        assertRows(execute("SELECT * FROM %s WHERE v = ? LIMIT 2", 1),
+                    row(1, 1, 9, 1),
+                    row(4, 1, 9, 1));
+ 
 -        assertRows(execute("SELECT * FROM %s WHERE v = ? LIMIT 2", 1),
++        // Test with paging
++        for (int pageSize = 1; pageSize < 4; pageSize++)
++        {
++            assertRowsNet(executeNetWithPaging("SELECT * FROM %s WHERE v = 1 
LIMIT 2", pageSize),
++                          row(1, 1, 9, 1),
++                          row(4, 1, 9, 1));
++        }
++    }
++
++    @Test
++    public void testFilteringWithPartitionWithoutRows() throws Throwable
++    {
++        createTable("CREATE TABLE %s (pk int, c int, s int static, v int, 
PRIMARY KEY(pk, c))");
++
++        execute("INSERT INTO %s (pk, c, s, v) VALUES (?, ?, ?, ?)", 1, 1, 9, 
1);
++        execute("INSERT INTO %s (pk, c, s, v) VALUES (?, ?, ?, ?)", 1, 2, 9, 
2);
++        execute("INSERT INTO %s (pk, c, s, v) VALUES (?, ?, ?, ?)", 3, 1, 9, 
1);
++        execute("INSERT INTO %s (pk, c, s, v) VALUES (?, ?, ?, ?)", 4, 1, 9, 
1);
++        flush();
++
++        assertRows(execute("SELECT * FROM %s WHERE v = ? ALLOW FILTERING", 1),
++                   row(1, 1, 9, 1),
++                   row(3, 1, 9, 1),
++                   row(4, 1, 9, 1));
++
++        execute("DELETE FROM %s WHERE pk = ? and c = ?", 3, 1);
++
++        // Test without paging
++        assertRows(execute("SELECT * FROM %s WHERE v = ? LIMIT 2 ALLOW 
FILTERING", 1),
++                   row(1, 1, 9, 1),
++                   row(4, 1, 9, 1));
++
++        assertRows(execute("SELECT * FROM %s WHERE pk IN ? AND v = ? LIMIT 2 
ALLOW FILTERING", list(1, 3, 4), 1),
+                    row(1, 1, 9, 1),
+                    row(4, 1, 9, 1));
+ 
+         // Test with paging
+         for (int pageSize = 1; pageSize < 4; pageSize++)
+         {
 -            assertRowsNet(executeNetWithPaging("SELECT * FROM %s WHERE v = 
1", pageSize),
++            assertRowsNet(executeNetWithPaging("SELECT * FROM %s WHERE v = 1 
LIMIT 2 ALLOW FILTERING", pageSize),
+                           row(1, 1, 9, 1),
+                           row(4, 1, 9, 1));
+ 
 -            assertRowsNet(executeNetWithPaging("SELECT * FROM %s WHERE v = 1 
LIMIT 2", pageSize),
++            assertRowsNet(executeNetWithPaging("SELECT * FROM %s WHERE pk IN 
(1, 3, 4) AND v = 1 LIMIT 2 ALLOW FILTERING", pageSize),
+                           row(1, 1, 9, 1),
+                           row(4, 1, 9, 1));
+         }
+     }
  }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/88d2ac4f/test/unit/org/apache/cassandra/db/rows/UnfilteredRowIteratorsTest.java
----------------------------------------------------------------------
diff --cc test/unit/org/apache/cassandra/db/rows/UnfilteredRowIteratorsTest.java
index 43b9549,0000000..0387ba2
mode 100644,000000..100644
--- a/test/unit/org/apache/cassandra/db/rows/UnfilteredRowIteratorsTest.java
+++ b/test/unit/org/apache/cassandra/db/rows/UnfilteredRowIteratorsTest.java
@@@ -1,185 -1,0 +1,185 @@@
 +/*
 + * Licensed to the Apache Software Foundation (ASF) under one
 + * or more contributor license agreements.  See the NOTICE file
 + * distributed with this work for additional information
 + * regarding copyright ownership.  The ASF licenses this file
 + * to you under the Apache License, Version 2.0 (the
 + * "License"); you may not use this file except in compliance
 + * with the License.  You may obtain a copy of the License at
 + *
 + *     http://www.apache.org/licenses/LICENSE-2.0
 + *
 + * Unless required by applicable law or agreed to in writing, software
 + * distributed under the License is distributed on an "AS IS" BASIS,
 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 + * See the License for the specific language governing permissions and
 + * limitations under the License.
 + */
 +
 +package org.apache.cassandra.db.rows;
 +
 +import java.util.Arrays;
 +import java.util.Iterator;
 +
 +import org.junit.Test;
 +
 +import junit.framework.Assert;
 +import org.apache.cassandra.Util;
 +import org.apache.cassandra.config.CFMetaData;
 +import org.apache.cassandra.config.ColumnDefinition;
 +import org.apache.cassandra.db.BufferDecoratedKey;
 +import org.apache.cassandra.db.DecoratedKey;
 +import org.apache.cassandra.db.DeletionTime;
 +import org.apache.cassandra.db.EmptyIterators;
 +import org.apache.cassandra.db.PartitionColumns;
 +import org.apache.cassandra.db.filter.DataLimits;
 +import org.apache.cassandra.db.marshal.Int32Type;
 +import org.apache.cassandra.dht.Murmur3Partitioner;
 +import org.apache.cassandra.utils.ByteBufferUtil;
 +import org.apache.cassandra.utils.FBUtilities;
 +
 +public class UnfilteredRowIteratorsTest
 +{
 +    static final CFMetaData metadata;
 +    static final ColumnDefinition v1Metadata;
 +    static final ColumnDefinition v2Metadata;
 +
 +    static
 +    {
 +        metadata = CFMetaData.Builder.create("", "")
 +                             .addPartitionKey("pk", Int32Type.instance)
 +                                     .addClusteringColumn("ck", 
Int32Type.instance)
 +                             .addRegularColumn("v1", Int32Type.instance)
 +                             .addRegularColumn("v2", Int32Type.instance)
 +                             .build();
 +        v1Metadata = metadata.partitionColumns().columns(false).getSimple(0);
 +        v2Metadata = metadata.partitionColumns().columns(false).getSimple(1);
 +    }
 +
 +
 +    @Test
 +    public void concatTest()
 +    {
 +        UnfilteredRowIterator iter1, iter2, iter3, concat;
 +        // simple concatenation
 +        iter1 = rows(metadata.partitionColumns(), 1,
 +                     row(1, cell(v1Metadata, 1), cell(v2Metadata, 1)),
 +                     row(2, cell(v1Metadata, 2), cell(v2Metadata, 2)));
 +        iter2 = rows(metadata.partitionColumns(), 1,
 +                     row(3, cell(v1Metadata, 3), cell(v2Metadata, 3)),
 +                     row(4, cell(v1Metadata, 4), cell(v2Metadata, 4)));
 +        concat = UnfilteredRowIterators.concat(iter1, iter2);
 +        Assert.assertEquals(concat.columns(), metadata.partitionColumns());
 +        assertRows(concat,
 +                   row(1, cell(v1Metadata, 1), cell(v2Metadata, 1)),
 +                   row(2, cell(v1Metadata, 2), cell(v2Metadata, 2)),
 +                   row(3, cell(v1Metadata, 3), cell(v2Metadata, 3)),
 +                   row(4, cell(v1Metadata, 4), cell(v2Metadata, 4)));
 +
 +        // concat with RHS empty iterator
 +        iter1 = rows(metadata.partitionColumns(), 1,
 +                     row(1, cell(v1Metadata, 1), cell(v2Metadata, 1)),
 +                     row(2, cell(v1Metadata, 2), cell(v2Metadata, 2)));
 +        Assert.assertEquals(concat.columns(), metadata.partitionColumns());
 +        assertRows(UnfilteredRowIterators.concat(iter1, 
EmptyIterators.unfilteredRow(metadata, dk(1), false, Rows.EMPTY_STATIC_ROW, 
DeletionTime.LIVE)),
 +                   row(1, cell(v1Metadata, 1), cell(v2Metadata, 1)),
 +                   row(2, cell(v1Metadata, 2), cell(v2Metadata, 2)));
 +
 +        // concat with LHS empty iterator
 +        iter1 = rows(metadata.partitionColumns(), 1,
 +                     row(1, cell(v1Metadata, 1), cell(v2Metadata, 1)),
 +                     row(2, cell(v1Metadata, 2), cell(v2Metadata, 2)));
 +        Assert.assertEquals(concat.columns(), metadata.partitionColumns());
 +        
assertRows(UnfilteredRowIterators.concat(EmptyIterators.unfilteredRow(metadata, 
dk(1), false, Rows.EMPTY_STATIC_ROW, DeletionTime.LIVE), iter1),
 +                   row(1, cell(v1Metadata, 1), cell(v2Metadata, 1)),
 +                   row(2, cell(v1Metadata, 2), cell(v2Metadata, 2)));
 +
 +        // concat with different columns
 +        iter1 = rows(metadata.partitionColumns().without(v1Metadata), 1,
 +                     row(1, cell(v2Metadata, 1)), row(2, cell(v2Metadata, 
2)));
 +        iter2 = rows(metadata.partitionColumns().without(v2Metadata), 1,
 +                     row(3, cell(v1Metadata, 3)), row(4, cell(v1Metadata, 
4)));
 +        concat = UnfilteredRowIterators.concat(iter1, iter2);
 +        Assert.assertEquals(concat.columns(), 
PartitionColumns.of(v1Metadata).mergeTo(PartitionColumns.of(v2Metadata)));
 +        assertRows(concat,
 +                   row(1, cell(v2Metadata, 1)), row(2, cell(v2Metadata, 2)),
 +                   row(3, cell(v1Metadata, 3)), row(4, cell(v1Metadata, 4)));
 +
 +        // concat with CQL limits
 +        iter1 = rows(metadata.partitionColumns(), 1,
 +                     row(1, cell(v1Metadata, 1), cell(v2Metadata, 1)),
 +                     row(2, cell(v1Metadata, 2), cell(v2Metadata, 2)));
 +        iter2 = rows(metadata.partitionColumns(), 1,
 +                     row(3, cell(v1Metadata, 3), cell(v2Metadata, 3)),
 +                     row(4, cell(v1Metadata, 4), cell(v2Metadata, 4)));
-         concat = 
UnfilteredRowIterators.concat(DataLimits.cqlLimits(1).filter(iter1, 
FBUtilities.nowInSeconds()),
-                                                
DataLimits.cqlLimits(1).filter(iter2, FBUtilities.nowInSeconds()));
++        concat = 
UnfilteredRowIterators.concat(DataLimits.cqlLimits(1).filter(iter1, 
FBUtilities.nowInSeconds(), true),
++                                               
DataLimits.cqlLimits(1).filter(iter2, FBUtilities.nowInSeconds(), true));
 +        Assert.assertEquals(concat.columns(), metadata.partitionColumns());
 +        assertRows(concat,
 +                   row(1, cell(v1Metadata, 1), cell(v2Metadata, 1)),
 +                   row(3, cell(v1Metadata, 3), cell(v2Metadata, 3)));
 +
 +        // concat concatenated iterators
 +        iter1 = rows(metadata.partitionColumns(), 1,
 +                     row(1, cell(v1Metadata, 1), cell(v2Metadata, 1)),
 +                     row(2, cell(v1Metadata, 2), cell(v2Metadata, 2)));
 +        iter2 = rows(metadata.partitionColumns(), 1,
 +                     row(3, cell(v1Metadata, 3), cell(v2Metadata, 3)),
 +                     row(4, cell(v1Metadata, 4), cell(v2Metadata, 4)));
 +
-         concat = 
UnfilteredRowIterators.concat(DataLimits.cqlLimits(1).filter(iter1, 
FBUtilities.nowInSeconds()),
-                                                
DataLimits.cqlLimits(1).filter(iter2, FBUtilities.nowInSeconds()));
++        concat = 
UnfilteredRowIterators.concat(DataLimits.cqlLimits(1).filter(iter1, 
FBUtilities.nowInSeconds(), true),
++                                               
DataLimits.cqlLimits(1).filter(iter2, FBUtilities.nowInSeconds(), true));
 +
 +        iter3 = rows(metadata.partitionColumns(), 1,
 +                     row(4, cell(v1Metadata, 4), cell(v2Metadata, 4)),
 +                     row(5, cell(v1Metadata, 5), cell(v2Metadata, 5)));
-         concat = UnfilteredRowIterators.concat(concat, 
DataLimits.cqlLimits(1).filter(iter3, FBUtilities.nowInSeconds()));
++        concat = UnfilteredRowIterators.concat(concat, 
DataLimits.cqlLimits(1).filter(iter3, FBUtilities.nowInSeconds(), true));
 +
 +        Assert.assertEquals(concat.columns(), metadata.partitionColumns());
 +        assertRows(concat,
 +                   row(1, cell(v1Metadata, 1), cell(v2Metadata, 1)),
 +                   row(3, cell(v1Metadata, 3), cell(v2Metadata, 3)),
 +                   row(4, cell(v1Metadata, 4), cell(v2Metadata, 4)));
 +    }
 +
 +    public static void assertRows(UnfilteredRowIterator iterator, Row... rows)
 +    {
 +        Iterator<Row> rowsIterator = Arrays.asList(rows).iterator();
 +
 +        while (iterator.hasNext() && rowsIterator.hasNext())
 +            Assert.assertEquals(iterator.next(), rowsIterator.next());
 +
 +        Assert.assertTrue(iterator.hasNext() == rowsIterator.hasNext());
 +    }
 +
 +    public static DecoratedKey dk(int pk)
 +    {
 +        return new BufferDecoratedKey(new Murmur3Partitioner.LongToken(pk), 
ByteBufferUtil.bytes(pk));
 +    }
 +
 +    public static UnfilteredRowIterator rows(PartitionColumns columns, int 
pk, Row... rows)
 +    {
 +        Iterator<Row> rowsIterator = Arrays.asList(rows).iterator();
 +        return new AbstractUnfilteredRowIterator(metadata, dk(pk), 
DeletionTime.LIVE, columns, Rows.EMPTY_STATIC_ROW, false, 
EncodingStats.NO_STATS) {
 +            protected Unfiltered computeNext()
 +            {
 +                return rowsIterator.hasNext() ? rowsIterator.next() : 
endOfData();
 +            }
 +        };
 +    }
 +
 +    public Row row(int ck, Cell... columns)
 +    {
 +        BTreeRow.Builder builder = new BTreeRow.Builder(true);
 +        builder.newRow(Util.clustering(metadata.comparator, ck));
 +        for (Cell cell : columns)
 +            builder.addCell(cell);
 +        return builder.build();
 +    }
 +
 +    public Cell cell(ColumnDefinition metadata, int v)
 +    {
 +        return new BufferCell(metadata,
 +                              1L, BufferCell.NO_TTL, 
BufferCell.NO_DELETION_TIME, ByteBufferUtil.bytes(v), null);
 +    }
 +}


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org
For additional commands, e-mail: commits-h...@cassandra.apache.org

Reply via email to