package com.netflix.astyanax.cql.test.utils; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Random; import java.util.Set; import java.util.UUID; import junit.framework.Assert; import org.joda.time.DateTime; import com.netflix.astyanax.MutationBatch; import com.netflix.astyanax.cql.test.KeyspaceTests; import com.netflix.astyanax.model.Column; import com.netflix.astyanax.model.ColumnFamily; import com.netflix.astyanax.model.ColumnList; import com.netflix.astyanax.serializers.BytesArraySerializer; import com.netflix.astyanax.serializers.StringSerializer; public class ReadTests extends KeyspaceTests { public static DateTime OriginalDate = new DateTime().withMillisOfSecond(0).withSecondOfMinute(0).withMinuteOfHour(0).withHourOfDay(0); public static byte[] TestBytes = new String("TestBytes").getBytes(); public static UUID TestUUID = UUID.fromString("edeb3d70-15ce-11e3-8ffd-0800200c9a66"); //public static int RowCount = 1; public static String[] columnNamesArr = {"firstname", "lastname", "address","age","ageShort", "ageLong","percentile", "married","single", "birthdate", "bytes", "uuid", "empty"}; public static List<String> columnNames = new ArrayList<String>(Arrays.asList(columnNamesArr)); public static ColumnFamily<String, String> CF_USER_INFO = ColumnFamily.newColumnFamily( "UserInfo", // Column Family Name StringSerializer.get(), // Key Serializer StringSerializer.get()); // Column Serializer public static void initReadTests() throws Exception { initContext(); Collections.sort(columnNames); } public void testAllColumnsForRow(ColumnList<String> resultColumns, int i) throws Exception { Date date = OriginalDate.plusMinutes(i).toDate(); testColumnValue(resultColumns, "firstname", columnNames, "john_" + i); testColumnValue(resultColumns, "lastname", columnNames, "smith_" + i); testColumnValue(resultColumns, "address", columnNames, "john smith address " + i); testColumnValue(resultColumns, "age", columnNames, 30 + i); testColumnValue(resultColumns, "ageShort", columnNames, new Integer(30+i).shortValue()); testColumnValue(resultColumns, "ageLong", columnNames, new Integer(30+i).longValue()); testColumnValue(resultColumns, "percentile", columnNames, 30.1); testColumnValue(resultColumns, "married", columnNames, true); testColumnValue(resultColumns, "single", columnNames, false); testColumnValue(resultColumns, "birthdate", columnNames, date); testColumnValue(resultColumns, "bytes", columnNames, TestBytes); testColumnValue(resultColumns, "uuid", columnNames, TestUUID); testColumnValue(resultColumns, "empty", columnNames, null); /** TEST THE ITERATOR INTERFACE */ Iterator<Column<String>> iter = resultColumns.iterator(); while (iter.hasNext()) { Column<String> col = iter.next(); Assert.assertNotNull(col.getName()); } } private <T> void testColumnValue(ColumnList<String> result, String columnName, List<String> columnNames, T expectedValue) { // by column name Column<String> column = result.getColumnByName(columnName); Assert.assertEquals(columnName, column.getName()); testColumnValue(column, expectedValue); // // by column index // int index = columnNames.indexOf(columnName); // column = result.getColumnByIndex(index); // testColumnValue(column, expectedValue); } private <T> void testColumnValue(Column<String> column, T value) { // Check the column name // check if value exists if (value != null) { Assert.assertTrue(column.hasValue()); if (value instanceof String) { Assert.assertEquals(value, column.getStringValue()); } else if (value instanceof Integer) { Assert.assertEquals(value, column.getIntegerValue()); } else if (value instanceof Short) { Assert.assertEquals(value, column.getShortValue()); } else if (value instanceof Long) { Assert.assertEquals(value, column.getLongValue()); } else if (value instanceof Double) { Assert.assertEquals(value, column.getDoubleValue()); } else if (value instanceof Boolean) { Assert.assertEquals(value, column.getBooleanValue()); } else if (value instanceof Date) { Assert.assertEquals(value, column.getDateValue()); } else if (value instanceof byte[]) { ByteBuffer bbuf = column.getByteBufferValue(); String result = new String(BytesArraySerializer.get().fromByteBuffer(bbuf)); Assert.assertEquals(new String((byte[])value), result); } else if (value instanceof UUID) { Assert.assertEquals(value, column.getUUIDValue()); } else { Assert.fail("Value not recognized for column: " + column.getName()); } } else { // check that value does not exist Assert.assertFalse(column.hasValue()); } } public void populateRows(int numRows) throws Exception { MutationBatch mb = keyspace.prepareMutationBatch(); for (int i=0; i<numRows; i++) { Date date = OriginalDate.plusMinutes(i).toDate(); mb.withRow(CF_USER_INFO, "acct_" + i) .putColumn("firstname", "john_" + i, null) .putColumn("lastname", "smith_" + i, null) .putColumn("address", "john smith address " + i, null) .putColumn("age", 30+i, null) .putColumn("ageShort", new Integer(30+i).shortValue(), null) .putColumn("ageLong", new Integer(30+i).longValue(), null) .putColumn("percentile", 30.1) .putColumn("married", true) .putColumn("single", false) .putColumn("birthdate", date) .putColumn("bytes", TestBytes) .putColumn("uuid", TestUUID) .putEmptyColumn("empty"); mb.execute(); mb.discardMutations(); } } public void deleteRows(int numRows) throws Exception { MutationBatch mb = keyspace.prepareMutationBatch(); for (int i=0; i<numRows; i++) { mb.withRow(CF_USER_INFO, "acct_" + i).delete(); mb.execute(); mb.discardMutations(); } } public Collection<String> getRandomColumns(int numColumns) { Random random = new Random(); Set<String> hashSet = new HashSet<String>(); while(hashSet.size() < numColumns) { int pick = random.nextInt(26); char ch = (char) ('a' + pick); hashSet.add(String.valueOf(ch)); } return hashSet; } }