/**
* Copyright 2013 Cloudera Inc.
*
* Licensed 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.kitesdk.data.hbase.avro;
import org.kitesdk.data.DatasetException;
import org.kitesdk.data.spi.PartitionKey;
import org.kitesdk.data.hbase.avro.entities.CompositeRecord;
import org.kitesdk.data.hbase.avro.entities.SubRecord1;
import org.kitesdk.data.hbase.avro.entities.SubRecord2;
import org.kitesdk.data.hbase.impl.Dao;
import org.kitesdk.data.hbase.testing.HBaseTestUtils;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import org.apache.avro.specific.SpecificRecord;
import org.apache.hadoop.hbase.client.HTablePool;
import org.apache.hadoop.hbase.util.Bytes;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
public class CompositeDaoTest {
private static final String subRecord1String;
private static final String subRecord2String;
private static final String tableName = "test_table";
private HTablePool tablePool;
static {
try {
subRecord1String = AvroUtils.inputStreamToString(AvroDaoTest.class
.getResourceAsStream("/SubRecord1.avsc"));
subRecord2String = AvroUtils.inputStreamToString(AvroDaoTest.class
.getResourceAsStream("/SubRecord2.avsc"));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@BeforeClass
public static void beforeClass() throws Exception {
HBaseTestUtils.getMiniCluster();
byte[] tableNameBytes = Bytes.toBytes(tableName);
byte[][] cfNames = { Bytes.toBytes("meta"), Bytes.toBytes("conflict"),
Bytes.toBytes("_s") };
HBaseTestUtils.util.createTable(tableNameBytes, cfNames);
}
@AfterClass
public static void afterClass() throws Exception {
HBaseTestUtils.util.deleteTable(Bytes.toBytes(tableName));
}
@Before
public void beforeTest() throws Exception {
tablePool = new HTablePool(HBaseTestUtils.getConf(), 10);
}
@After
public void afterTest() throws Exception {
tablePool.close();
}
@Test
public void testSpecific() throws Exception {
// Construct Dao
Dao<CompositeRecord> dao = SpecificAvroDao.buildCompositeDao(tablePool,
tableName, Arrays.asList(subRecord1String, subRecord2String),
CompositeRecord.class);
// Construct records
SubRecord1 subRecord1 = SubRecord1.newBuilder().setKeyPart1("1")
.setKeyPart2("1").setField1("field1_1").setField2("field1_2").build();
SubRecord2 subRecord2 = SubRecord2.newBuilder().setKeyPart1("1")
.setKeyPart2("1").setField1("field2_1").setField2("field2_2").build();
CompositeRecord compositeRecord = CompositeRecord.newBuilder()
.setSubRecord1(subRecord1).setSubRecord2(subRecord2).build();
// Test put and get
dao.put(compositeRecord);
PartitionKey key = new PartitionKey("1", "1");
CompositeRecord returnedCompositeRecord = dao.get(key);
assertEquals("field1_1", returnedCompositeRecord.getSubRecord1()
.getField1());
assertEquals("field1_2", returnedCompositeRecord.getSubRecord1()
.getField2());
assertEquals("field2_1", returnedCompositeRecord.getSubRecord2()
.getField1());
assertEquals("field2_2", returnedCompositeRecord.getSubRecord2()
.getField2());
// Test OCC
assertFalse(dao.put(compositeRecord));
assertTrue(dao.put(returnedCompositeRecord));
// Test null field
subRecord1 = SubRecord1.newBuilder().setKeyPart1("1").setKeyPart2("2")
.setField1("field1_1").setField2("field1_2").build();
compositeRecord = CompositeRecord.newBuilder().setSubRecord1(subRecord1)
.build();
dao.put(compositeRecord);
key = new PartitionKey("1", "2");
compositeRecord = dao.get(key);
assertEquals(null, compositeRecord.getSubRecord2());
}
@Test
public void testSpecificMap() throws Exception {
// Construct Dao
Dao<Map<String, SpecificRecord>> dao = SpecificAvroDao.buildCompositeDao(
tablePool, tableName,
Arrays.asList(subRecord1String, subRecord2String));
// Construct records and keys
SubRecord1 subRecord1 = SubRecord1.newBuilder().setKeyPart1("1").setKeyPart2("1").setField1("field1_1")
.setField2("field1_2").build();
SubRecord2 subRecord2 = SubRecord2.newBuilder().setKeyPart1("1").setKeyPart2("1").setField1("field2_1")
.setField2("field2_2").build();
Map<String, SpecificRecord> compositeRecord = new HashMap<String, SpecificRecord>();
compositeRecord.put("SubRecord1", subRecord1);
compositeRecord.put("SubRecord2", subRecord2);
// Test put and get
dao.put(compositeRecord);
PartitionKey key = new PartitionKey("1", "1");
Map<String, SpecificRecord> returnedCompositeRecord = dao.get(key);
assertEquals("field1_1", ((SubRecord1) returnedCompositeRecord.get("SubRecord1"))
.getField1());
assertEquals("field1_2", ((SubRecord1) returnedCompositeRecord.get("SubRecord1"))
.getField2());
assertEquals("field2_1", ((SubRecord2) returnedCompositeRecord.get("SubRecord2"))
.getField1());
assertEquals("field2_2", ((SubRecord2) returnedCompositeRecord.get("SubRecord2"))
.getField2());
// Test OCC
assertFalse(dao.put(compositeRecord));
assertTrue(dao.put(returnedCompositeRecord));
// Test null field
compositeRecord = new HashMap<String, SpecificRecord>();
subRecord1 = SubRecord1.newBuilder().setKeyPart1("1").setKeyPart2("2")
.setField1("field1_1").setField2("field1_2").build();
compositeRecord.put("SubRecord1", subRecord1);
dao.put(compositeRecord);
key = new PartitionKey("1", "2");
compositeRecord = dao.get(key);
assertEquals(null, compositeRecord.get("SubRecord2"));
}
@Test(expected = DatasetException.class)
public void testIncompatibleKeys() throws Exception {
// Construct Dao
Dao<Map<String, SpecificRecord>> dao = SpecificAvroDao.buildCompositeDao(
tablePool, tableName,
Arrays.asList(subRecord1String, subRecord2String));
// Construct records and keys
SubRecord1 subRecord1 = SubRecord1.newBuilder().setKeyPart1("1").setKeyPart2("1").setField1("field1_1")
.setField2("field1_2").build();
SubRecord2 subRecord2 = SubRecord2.newBuilder().setKeyPart1("1").setKeyPart2("unmatched").setField1("field2_1")
.setField2("field2_2").build();
Map<String, SpecificRecord> compositeRecord = new HashMap<String, SpecificRecord>();
compositeRecord.put("SubRecord1", subRecord1);
compositeRecord.put("SubRecord2", subRecord2);
// Test put and get
dao.put(compositeRecord);
}
}