package com.klarna.hiverunner.data;
import static org.junit.Assert.assertEquals;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.hadoop.hive.serde2.typeinfo.PrimitiveTypeInfo;
import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory;
import org.apache.hive.hcatalog.api.HCatTable;
import org.apache.hive.hcatalog.common.HCatException;
import org.apache.hive.hcatalog.data.HCatRecord;
import org.apache.hive.hcatalog.data.schema.HCatFieldSchema;
import org.junit.Test;
import com.google.common.collect.Multimap;
public class TableDataBuilderTest {
private static final String DATABASE_NAME = "test_db";
private static final String TABLE_NAME = "test_table";
private static final String COLUMN_1 = "column_1";
private static final String PARTITION_COLUMN_1 = "partition_column_1";
private static final PrimitiveTypeInfo STRING = TypeInfoFactory.stringTypeInfo;
@Test(expected = IllegalArgumentException.class)
public void testUnknownColumnNameWithColumnMask() {
HCatTable table = table().cols(columns(COLUMN_1));
new TableDataBuilder(table).withColumns("unknown_column");
}
@Test(expected = IllegalArgumentException.class)
public void testUnknownColumnNameOnSet() {
HCatTable table = table().cols(columns(COLUMN_1));
new TableDataBuilder(table).set("unknown_column", "value");
}
@Test(expected = IllegalArgumentException.class)
public void testAddRowWithNoArguments() {
HCatTable table = table().cols(columns(COLUMN_1));
new TableDataBuilder(table).addRow();
}
@Test(expected = IllegalArgumentException.class)
public void testAddRowWithIncorrectNumberOfArguments() {
HCatTable table = table().cols(columns(COLUMN_1));
new TableDataBuilder(table).addRow("value1", "value2");
}
@Test(expected = IllegalStateException.class)
public void testCopyRowWhenNoRowToCopy() {
HCatTable table = table().cols(columns(COLUMN_1));
new TableDataBuilder(table).copyRow();
}
@Test
public void testCopyRow() {
HCatTable table = table().cols(columns(COLUMN_1));
Multimap<Map<String, String>, HCatRecord> data = new TableDataBuilder(table).addRow("value").copyRow().build();
assertEquals(2, data.size());
Iterator<HCatRecord> iterator = data.values().iterator();
HCatRecord row = iterator.next();
assertEquals(Arrays.asList((Object) "value"), row.getAll());
row = iterator.next();
assertEquals(Arrays.asList((Object) "value"), row.getAll());
}
@Test
public void testUnpartitionedEmptyRow() {
HCatTable table = table().cols(columns(COLUMN_1));
Multimap<Map<String, String>, HCatRecord> data = new TableDataBuilder(table).newRow().build();
assertEquals(1, data.size());
Iterator<HCatRecord> iterator = data.values().iterator();
HCatRecord row = iterator.next();
assertEquals(Arrays.asList((Object) null), row.getAll());
}
@Test
public void testUnpartitionedWithColumnMask() {
HCatTable table = table().cols(columns(COLUMN_1));
Multimap<Map<String, String>, HCatRecord> data = new TableDataBuilder(table)
.withColumns(COLUMN_1)
.addRow("value")
.build();
assertEquals(1, data.size());
Iterator<HCatRecord> iterator = data.values().iterator();
HCatRecord row = iterator.next();
assertEquals(Arrays.asList((Object) "value"), row.getAll());
}
@Test(expected = IllegalStateException.class)
public void testPartitionedNullPartitionColumnValue() {
HCatTable table = table().cols(columns(COLUMN_1)).partCols(columns(PARTITION_COLUMN_1));
new TableDataBuilder(table).newRow().build();
}
@Test
public void testPartitionedSimple() {
HCatTable table = table().cols(columns(COLUMN_1)).partCols(columns(PARTITION_COLUMN_1));
Multimap<Map<String, String>, HCatRecord> data = new TableDataBuilder(table)
.addRow("value", "partition_value")
.build();
assertEquals(1, data.size());
Map<String, String> partitionSpec = new HashMap<>();
partitionSpec.put(PARTITION_COLUMN_1, "partition_value");
Collection<HCatRecord> rows = data.get(partitionSpec);
assertEquals(1, rows.size());
HCatRecord row = rows.iterator().next();
assertEquals(Arrays.asList((Object) "value", "partition_value"), row.getAll());
}
@Test
public void testPartitionedMultiplePartitionsAndRows() {
HCatTable table = table().cols(columns(COLUMN_1)).partCols(columns(PARTITION_COLUMN_1));
Multimap<Map<String, String>, HCatRecord> data = new TableDataBuilder(table)
.addRow("value1", "partition_value1")
.addRow("value2", "partition_value1")
.addRow("value3", "partition_value2")
.addRow("value4", "partition_value2")
.build();
assertEquals(4, data.size());
Map<String, String> partitionSpec = new HashMap<>();
partitionSpec.put(PARTITION_COLUMN_1, "partition_value1");
Collection<HCatRecord> rows = data.get(partitionSpec);
assertEquals(2, rows.size());
Iterator<HCatRecord> iterator = rows.iterator();
HCatRecord row = iterator.next();
assertEquals(Arrays.asList((Object) "value1", "partition_value1"), row.getAll());
row = iterator.next();
assertEquals(Arrays.asList((Object) "value2", "partition_value1"), row.getAll());
partitionSpec = new HashMap<>();
partitionSpec.put(PARTITION_COLUMN_1, "partition_value2");
rows = data.get(partitionSpec);
assertEquals(2, rows.size());
iterator = rows.iterator();
row = iterator.next();
assertEquals(Arrays.asList((Object) "value3", "partition_value2"), row.getAll());
row = iterator.next();
assertEquals(Arrays.asList((Object) "value4", "partition_value2"), row.getAll());
}
private static HCatTable table() {
return new HCatTable(DATABASE_NAME, TABLE_NAME);
}
private static HCatFieldSchema column(String name) {
try {
return new HCatFieldSchema(name, STRING, null);
} catch (HCatException e) {
throw new RuntimeException(e);
}
}
private static List<HCatFieldSchema> columns(String... names) {
List<HCatFieldSchema> columns = new ArrayList<>();
for (String name : names) {
columns.add(column(name));
}
return columns;
}
}