package com.spotify.heroic.metric.datastax.schema;
import com.google.common.collect.ImmutableList;
import com.spotify.heroic.metric.BackendKey;
import com.spotify.heroic.metric.BackendKeyFilter;
import com.spotify.heroic.metric.datastax.MetricsRowKey;
import com.spotify.heroic.metric.datastax.TypeSerializer;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import java.io.IOException;
import java.nio.ByteBuffer;
import static org.junit.Assert.assertEquals;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.doReturn;
@RunWith(MockitoJUnitRunner.class)
public class BackendKeyUtilsTest {
@Mock
TypeSerializer<MetricsRowKey> serializer;
@Mock
BackendKey key;
@Mock
ByteBuffer serializedKey;
@Mock
SchemaInstance schema;
@Before
public void setup() throws IOException {
doReturn(serializedKey).when(serializer).serialize(any(MetricsRowKey.class));
doReturn(serializer).when(schema).rowKey();
}
@Test
public void testFloatToToken() {
assertEquals(Long.MAX_VALUE, BackendKeyUtils.percentageToToken(1.0f));
assertEquals(Long.MIN_VALUE, BackendKeyUtils.percentageToToken(0.0f));
assertEquals(0, BackendKeyUtils.percentageToToken(0.5f));
}
@Test
public void testClause() throws Exception {
final BackendKeyUtils utils = new BackendKeyUtils("key", "keyspace", "table", schema);
final String base = "SELECT DISTINCT key, token(key) FROM keyspace.table";
// basic, select everything
assertEquals(new SchemaBoundStatement(base, ImmutableList.of()),
utils.selectKeys(BackendKeyFilter.of()));
// one criteria
assertEquals(new SchemaBoundStatement(base + " WHERE token(key) >= token(?)",
ImmutableList.of(serializedKey)),
utils.selectKeys(BackendKeyFilter.of().withStart(BackendKeyFilter.gte(key))));
// more criteria
assertEquals(
new SchemaBoundStatement(base + " WHERE token(key) >= token(?) and token(key) < ?",
ImmutableList.of(serializedKey, 42L)), utils.selectKeys(BackendKeyFilter
.of()
.withStart(BackendKeyFilter.gte(key))
.withEnd(BackendKeyFilter.ltToken(42L))));
}
}