/* * 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.aggregation; import java.nio.ByteBuffer; import org.junit.BeforeClass; import org.junit.Test; import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.db.Clustering; import org.apache.cassandra.db.ClusteringComparator; import org.apache.cassandra.db.DecoratedKey; import org.apache.cassandra.db.marshal.AbstractType; import org.apache.cassandra.db.marshal.Int32Type; import org.apache.cassandra.db.marshal.ReversedType; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; public class GroupMakerTest { @BeforeClass public static void setupDD() { DatabaseDescriptor.daemonInitialization(); } @Test public void testIsNewGroupWithClusteringColumns() { ClusteringComparator comparator = newComparator(false, false, false); GroupMaker groupMaker = GroupMaker.newInstance(comparator, 2); assertTrue(groupMaker.isNewGroup(partitionKey(1), clustering(1, 1, 1))); assertFalse(groupMaker.isNewGroup(partitionKey(1), clustering(1, 1, 2))); assertFalse(groupMaker.isNewGroup(partitionKey(1), clustering(1, 1, 3))); assertTrue(groupMaker.isNewGroup(partitionKey(1), clustering(1, 2, 1))); assertTrue(groupMaker.isNewGroup(partitionKey(1), clustering(1, 3, 1))); assertFalse(groupMaker.isNewGroup(partitionKey(1), clustering(1, 3, 2))); assertTrue(groupMaker.isNewGroup(partitionKey(1), clustering(2, 1, 1))); assertFalse(groupMaker.isNewGroup(partitionKey(1), clustering(2, 1, 2))); assertTrue(groupMaker.isNewGroup(partitionKey(2), clustering(2, 2, 1))); } @Test public void testIsNewGroupWithOneClusteringColumnsPrefix() { ClusteringComparator comparator = newComparator(false, false, false); GroupMaker groupMaker = GroupMaker.newInstance(comparator, 1); assertTrue(groupMaker.isNewGroup(partitionKey(1), clustering(1, 1, 1))); assertFalse(groupMaker.isNewGroup(partitionKey(1), clustering(1, 1, 2))); assertFalse(groupMaker.isNewGroup(partitionKey(1), clustering(1, 1, 3))); assertFalse(groupMaker.isNewGroup(partitionKey(1), clustering(1, 2, 1))); assertFalse(groupMaker.isNewGroup(partitionKey(1), clustering(1, 3, 1))); assertFalse(groupMaker.isNewGroup(partitionKey(1), clustering(1, 3, 2))); assertTrue(groupMaker.isNewGroup(partitionKey(1), clustering(2, 1, 1))); assertFalse(groupMaker.isNewGroup(partitionKey(1), clustering(2, 1, 2))); assertTrue(groupMaker.isNewGroup(partitionKey(2), clustering(2, 2, 1))); } @Test public void testIsNewGroupWithReversedClusteringColumns() { ClusteringComparator comparator = newComparator(true, true, true); GroupMaker groupMaker = GroupMaker.newInstance(comparator, 2); assertTrue(groupMaker.isNewGroup(partitionKey(1), clustering(1, 3, 2))); assertFalse(groupMaker.isNewGroup(partitionKey(1), clustering(1, 3, 1))); assertTrue(groupMaker.isNewGroup(partitionKey(1), clustering(1, 2, 1))); assertTrue(groupMaker.isNewGroup(partitionKey(1), clustering(1, 1, 3))); assertFalse(groupMaker.isNewGroup(partitionKey(1), clustering(1, 1, 2))); assertFalse(groupMaker.isNewGroup(partitionKey(1), clustering(1, 1, 1))); assertTrue(groupMaker.isNewGroup(partitionKey(1), clustering(2, 1, 2))); assertFalse(groupMaker.isNewGroup(partitionKey(1), clustering(2, 1, 1))); assertTrue(groupMaker.isNewGroup(partitionKey(2), clustering(2, 2, 1))); } @Test public void testIsNewGroupWithOneReversedClusteringColumns() { ClusteringComparator comparator = newComparator(true, false, false); GroupMaker groupMaker = GroupMaker.newInstance(comparator, 2); assertTrue(groupMaker.isNewGroup(partitionKey(1), clustering(1, 3, 1))); assertFalse(groupMaker.isNewGroup(partitionKey(1), clustering(1, 3, 2))); assertTrue(groupMaker.isNewGroup(partitionKey(1), clustering(1, 2, 1))); assertTrue(groupMaker.isNewGroup(partitionKey(1), clustering(1, 1, 1))); assertFalse(groupMaker.isNewGroup(partitionKey(1), clustering(1, 1, 2))); assertFalse(groupMaker.isNewGroup(partitionKey(1), clustering(1, 1, 3))); assertTrue(groupMaker.isNewGroup(partitionKey(1), clustering(2, 1, 1))); assertFalse(groupMaker.isNewGroup(partitionKey(1), clustering(2, 1, 2))); assertTrue(groupMaker.isNewGroup(partitionKey(2), clustering(2, 2, 1))); } @Test public void testIsNewGroupWithStaticClusteringColumns() { ClusteringComparator comparator = newComparator(false, false, false); GroupMaker groupMaker = GroupMaker.newInstance(comparator, 2); assertTrue(groupMaker.isNewGroup(partitionKey(1), clustering(1, 1, 1))); assertFalse(groupMaker.isNewGroup(partitionKey(1), clustering(1, 1, 2))); assertTrue(groupMaker.isNewGroup(partitionKey(2), Clustering.STATIC_CLUSTERING)); assertTrue(groupMaker.isNewGroup(partitionKey(3), Clustering.STATIC_CLUSTERING)); assertTrue(groupMaker.isNewGroup(partitionKey(4), clustering(1, 1, 2))); } @Test public void testIsNewGroupWithOnlyPartitionKeyComponents() { ClusteringComparator comparator = newComparator(false, false, false); GroupMaker goupMaker = GroupMaker.newInstance(comparator, 2); assertTrue(goupMaker.isNewGroup(partitionKey(1, 1), clustering(1, 1, 1))); assertFalse(goupMaker.isNewGroup(partitionKey(1, 1), clustering(1, 1, 2))); assertTrue(goupMaker.isNewGroup(partitionKey(1, 2), clustering(1, 1, 2))); assertTrue(goupMaker.isNewGroup(partitionKey(1, 2), clustering(2, 2, 2))); assertTrue(goupMaker.isNewGroup(partitionKey(2, 2), clustering(1, 1, 2))); } private static DecoratedKey partitionKey(int... components) { ByteBuffer buffer = ByteBuffer.allocate(components.length * 4); for (int component : components) { buffer.putInt(component); } buffer.flip(); return DatabaseDescriptor.getPartitioner().decorateKey(buffer); } private static Clustering clustering(int... components) { return Clustering.make(toByteBufferArray(components)); } private static ByteBuffer[] toByteBufferArray(int[] values) { ByteBuffer[] buffers = new ByteBuffer[values.length]; for (int i = 0; i < values.length; i++) { buffers[i] = Int32Type.instance.decompose(values[i]); } return buffers; } private static ClusteringComparator newComparator(boolean... reversed) { AbstractType<?>[] types = new AbstractType<?>[reversed.length]; for (int i = 0, m = reversed.length; i < m; i++) types[i] = reversed[i] ? ReversedType.getInstance(Int32Type.instance) : Int32Type.instance; return new ClusteringComparator(types); } }