blob: 9313c3a82434c51c7325c21355bc5281705619f7 [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.db.filter;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.concurrent.atomic.AtomicBoolean;
import org.junit.Assert;
import org.junit.Test;
import org.apache.cassandra.SchemaLoader;
import org.apache.cassandra.config.CFMetaData;
import org.apache.cassandra.config.ColumnDefinition;
import org.apache.cassandra.cql3.ColumnIdentifier;
import org.apache.cassandra.cql3.Operator;
import org.apache.cassandra.db.Clustering;
import org.apache.cassandra.db.DecoratedKey;
import org.apache.cassandra.db.DeletionTime;
import org.apache.cassandra.db.LivenessInfo;
import org.apache.cassandra.db.PartitionColumns;
import org.apache.cassandra.db.marshal.Int32Type;
import org.apache.cassandra.db.partitions.SingletonUnfilteredPartitionIterator;
import org.apache.cassandra.db.partitions.UnfilteredPartitionIterator;
import org.apache.cassandra.db.rows.BTreeRow;
import org.apache.cassandra.db.rows.BufferCell;
import org.apache.cassandra.db.rows.Cell;
import org.apache.cassandra.db.rows.EncodingStats;
import org.apache.cassandra.db.rows.Row;
import org.apache.cassandra.db.rows.Rows;
import org.apache.cassandra.db.rows.Unfiltered;
import org.apache.cassandra.db.rows.UnfilteredRowIterator;
import org.apache.cassandra.utils.btree.BTree;
public class RowFilterTest
{
@Test
public void testCQLFilterClose()
{
// CASSANDRA-15126
SchemaLoader.prepareServer();
CFMetaData metadata = CFMetaData.Builder.create("testks", "testcf")
.addPartitionKey("pk", Int32Type.instance)
.addStaticColumn("s", Int32Type.instance)
.addRegularColumn("r", Int32Type.instance)
.build();
ColumnDefinition s = metadata.getColumnDefinition(new ColumnIdentifier("s", true));
ColumnDefinition r = metadata.getColumnDefinition(new ColumnIdentifier("r", true));
ByteBuffer one = Int32Type.instance.decompose(1);
RowFilter filter = RowFilter.NONE.withNewExpressions(new ArrayList<>());
filter.add(s, Operator.NEQ, one);
AtomicBoolean closed = new AtomicBoolean();
UnfilteredPartitionIterator iter = filter.filter(new SingletonUnfilteredPartitionIterator(new UnfilteredRowIterator()
{
public DeletionTime partitionLevelDeletion() { return null; }
public EncodingStats stats() { return null; }
public CFMetaData metadata() { return metadata; }
public boolean isReverseOrder() { return false; }
public PartitionColumns columns() { return null; }
public DecoratedKey partitionKey() { return null; }
public boolean hasNext() { return false; }
public Unfiltered next() { return null; }
public Row staticRow()
{
return BTreeRow.create(Clustering.STATIC_CLUSTERING,
LivenessInfo.EMPTY,
Row.Deletion.LIVE,
BTree.singleton(new BufferCell(s, 1, Cell.NO_TTL, Cell.NO_DELETION_TIME, one, null)));
}
public void close()
{
closed.set(true);
}
}, false), 1);
Assert.assertFalse(iter.hasNext());
Assert.assertTrue(closed.get());
filter = RowFilter.NONE.withNewExpressions(new ArrayList<>());
filter.add(r, Operator.NEQ, one);
closed.set(false);
iter = filter.filter(new SingletonUnfilteredPartitionIterator(new UnfilteredRowIterator()
{
boolean hasNext = true;
public DeletionTime partitionLevelDeletion() { return null; }
public EncodingStats stats() { return null; }
public CFMetaData metadata() { return metadata; }
public boolean isReverseOrder() { return false; }
public PartitionColumns columns() { return null; }
public DecoratedKey partitionKey() { return null; }
public Row staticRow() { return Rows.EMPTY_STATIC_ROW; }
public boolean hasNext()
{
boolean r = hasNext;
hasNext = false;
return r;
}
public Unfiltered next()
{
return BTreeRow.create(Clustering.EMPTY,
LivenessInfo.EMPTY,
Row.Deletion.LIVE,
BTree.singleton(new BufferCell(r, 1, Cell.NO_TTL, Cell.NO_DELETION_TIME, one, null)));
}
public void close()
{
closed.set(true);
}
}, false), 1);
Assert.assertFalse(iter.hasNext());
Assert.assertTrue(closed.get());
}
}