blob: 00718b4ce43f6c707b1f7eb43edcc868bd73b4b3 [file] [log] [blame]
/*
* 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.service.pager;
import java.nio.ByteBuffer;
import java.util.*;
import org.junit.Test;
import static org.junit.Assert.*;
import org.apache.cassandra.Util;
import org.apache.cassandra.config.*;
import org.apache.cassandra.db.*;
import org.apache.cassandra.db.composites.CellNames;
import org.apache.cassandra.db.filter.ColumnCounter;
import org.apache.cassandra.db.marshal.Int32Type;
import org.apache.cassandra.utils.ByteBufferUtil;
public class AbstractQueryPagerTest
{
@Test
public void discardFirstTest()
{
TestPager pager = new TestPager();
List<Row> rows = Arrays.asList(createRow("r1", 1),
createRow("r2", 3),
createRow("r3", 2));
assertEquals(3, rows.size());
assertRow(rows.get(0), "r1", 0);
assertRow(rows.get(1), "r2", 0, 1, 2);
assertRow(rows.get(2), "r3", 0, 1);
rows = pager.discardFirst(rows, 1);
assertEquals(2, rows.size());
assertRow(rows.get(0), "r2", 0, 1, 2);
assertRow(rows.get(1), "r3", 0, 1);
rows = pager.discardFirst(rows, 1);
assertEquals(2, rows.size());
assertRow(rows.get(0), "r2", 1, 2);
assertRow(rows.get(1), "r3", 0, 1);
rows = pager.discardFirst(rows, 3);
assertEquals(1, rows.size());
assertRow(rows.get(0), "r3", 1);
rows = pager.discardFirst(rows, 1);
assertTrue(rows.isEmpty());
}
@Test
public void discardLastTest()
{
TestPager pager = new TestPager();
List<Row> rows = Arrays.asList(createRow("r1", 2),
createRow("r2", 3),
createRow("r3", 1));
assertEquals(3, rows.size());
assertRow(rows.get(0), "r1", 0, 1);
assertRow(rows.get(1), "r2", 0, 1, 2);
assertRow(rows.get(2), "r3", 0);
rows = pager.discardLast(rows, 1);
assertEquals(2, rows.size());
assertRow(rows.get(0), "r1", 0, 1);
assertRow(rows.get(1), "r2", 0, 1, 2);
rows = pager.discardLast(rows, 1);
assertEquals(2, rows.size());
assertRow(rows.get(0), "r1", 0, 1);
assertRow(rows.get(1), "r2", 0, 1);
rows = pager.discardLast(rows, 3);
assertEquals(1, rows.size());
assertRow(rows.get(0), "r1", 0);
rows = pager.discardLast(rows, 1);
assertTrue(rows.isEmpty());
}
private void assertRow(Row row, String name, int... values)
{
assertEquals(row.key.getKey(), ByteBufferUtil.bytes(name));
assertEquals(values.length, row.cf.getColumnCount());
int i = 0;
for (Cell c : row.cf)
assertEquals(values[i++], i(c.name().toByteBuffer()));
}
private Row createRow(String name, int nbCol)
{
return new Row(Util.dk(name), createCF(nbCol));
}
private ColumnFamily createCF(int nbCol)
{
ColumnFamily cf = ArrayBackedSortedColumns.factory.create(createMetadata());
for (int i = 0; i < nbCol; i++)
cf.addColumn(CellNames.simpleDense(bb(i)), bb(i), 0);
return cf;
}
private static CFMetaData createMetadata()
{
CFMetaData cfm = new CFMetaData("ks", "cf", ColumnFamilyType.Standard, CellNames.fromAbstractType(Int32Type.instance, false));
cfm.rebuild();
return cfm;
}
private static ByteBuffer bb(int i)
{
return ByteBufferUtil.bytes(i);
}
private static int i(ByteBuffer bb)
{
return ByteBufferUtil.toInt(bb);
}
private static class TestPager extends AbstractQueryPager
{
public TestPager()
{
// We use this to test more thorougly DiscardFirst and DiscardLast (more generic pager behavior is tested in
// QueryPagerTest). The only thing those method use is the result of the columnCounter() method. So to keep
// it simple, we fake all actual parameters in the ctor below but just override the columnCounter() method.
super(null, 0, false, createMetadata(), null, 0);
}
@Override
public ColumnCounter columnCounter()
{
return new ColumnCounter(0);
}
public PagingState state()
{
return null;
}
protected List<Row> queryNextPage(int pageSize, ConsistencyLevel consistency, boolean localQuery)
{
return null;
}
protected boolean containsPreviousLast(Row first)
{
return false;
}
protected boolean recordLast(Row last)
{
return false;
}
protected boolean isReversed()
{
return false;
}
}
}