/**
* Copyright 2011-2014 Asakusa Framework Team.
*
* 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 com.asakusafw.directio.hive.serde;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.List;
import org.apache.hadoop.hive.common.type.HiveDecimal;
import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.StructField;
import org.junit.Test;
import com.asakusafw.directio.hive.serde.DataModelMapping.ExceptionHandlingStrategy;
import com.asakusafw.directio.hive.serde.DataModelMapping.FieldMappingStrategy;
import com.asakusafw.directio.hive.serde.mock.MockSimple;
import com.asakusafw.directio.hive.serde.mock.MockTypes;
import com.asakusafw.runtime.value.Date;
import com.asakusafw.runtime.value.DateTime;
import com.asakusafw.runtime.value.DateUtil;
import com.asakusafw.runtime.value.ValueOption;
/**
* Test for {@link DataModelDriver}.
*/
@SuppressWarnings("deprecation")
public class DataModelDriverTest {
/**
* Simple test case.
*/
@Test
public void simple() {
DataModelDescriptor descriptor = FieldPropertyDescriptor.extract(MockSimple.class);
MockSimple obj = (MockSimple) descriptor.createDataModelObject();
obj.number.modify(12345);
obj.string.modify("Hello, world!");
DataModelInspector inspector = new DataModelInspector(descriptor);
assertThat(inspector.getTypeName(), is(MockSimple.class.getName()));
assertThat(inspector.getAllStructFieldRefs(), hasSize(2));
assertThat(inspector.getStructFieldsDataAsList(obj), is(Arrays.asList(new Object[] {
obj.number,
obj.string,
})));
assertThat(getJavaField(inspector, obj, "number"), equalTo((Object) 12345));
assertThat(getJavaField(inspector, obj, "string"), equalTo((Object) "Hello, world!"));
DataModelDriver driver = new DataModelDriver(descriptor, inspector);
MockSimple copy = new MockSimple();
driver.set(copy, obj);
assertThat(copy.number, equalTo(obj.number));
assertThat(copy.string, equalTo(obj.string));
}
/**
* test case for column name mangled object.
*/
@Test
public void mangled() {
DataModelDescriptor descriptor = FieldPropertyDescriptor.extract(MockSimple.class);
MockSimple obj = (MockSimple) descriptor.createDataModelObject();
obj.number.modify(12345);
obj.string.modify("Hello, world!");
List<PropertyDescriptor> properties = new ArrayList<PropertyDescriptor>();
for (final PropertyDescriptor property : descriptor.getPropertyDescriptors()) {
properties.add(new PropertyDescriptor(String.format("_col%d", properties.size()), property) {
@Override
public ValueOption<?> extract(Object dataModel) {
return property.extract(dataModel);
}
});
}
DataModelDescriptor mangled = new DataModelDescriptor(descriptor.getDataModelClass(), properties);
DataModelMapping config = new DataModelMapping();
config.setFieldMappingStrategy(FieldMappingStrategy.NAME);
config.setOnMissingSource(ExceptionHandlingStrategy.FAIL);
config.setOnMissingTarget(ExceptionHandlingStrategy.IGNORE);
config.setOnIncompatibleType(ExceptionHandlingStrategy.IGNORE);
try {
DataModelDriver driver = new DataModelDriver(descriptor, new DataModelInspector(mangled), config);
MockSimple copy = new MockSimple();
driver.set(copy, obj);
throw new AssertionError();
} catch (IllegalArgumentException e) {
// ok.
}
config.setFieldMappingStrategy(FieldMappingStrategy.POSITION);
DataModelDriver driver = new DataModelDriver(descriptor, new DataModelInspector(mangled), config);
MockSimple copy = new MockSimple();
driver.set(copy, obj);
assertThat(copy.number, equalTo(obj.number));
assertThat(copy.string, equalTo(obj.string));
}
/**
* All property types.
*/
@Test
public void types() {
DataModelDescriptor descriptor = FieldPropertyDescriptor.extract(MockTypes.class);
MockTypes obj = (MockTypes) descriptor.createDataModelObject();
obj.booleanOption.modify(true);
obj.byteOption.modify((byte) 1);
obj.shortOption.modify((short) 2);
obj.intOption.modify(3);
obj.longOption.modify(4L);
obj.floatOption.modify(5f);
obj.doubleOption.modify(6d);
obj.dateOption.modify(new Date(2014, 6, 1));
obj.dateTimeOption.modify(new DateTime(2014, 6, 1, 2, 3, 4));
obj.stringOption.modify("Hello, world!");
obj.decimalOption.modify(new BigDecimal("7.8"));
DataModelInspector inspector = new DataModelInspector(descriptor);
assertThat(inspector.getTypeName(), is(MockTypes.class.getName()));
assertThat(inspector.getAllStructFieldRefs(), hasSize(11));
assertThat(inspector.getStructFieldsDataAsList(obj), is(Arrays.asList(new Object[] {
obj.booleanOption,
obj.byteOption,
obj.shortOption,
obj.intOption,
obj.longOption,
obj.floatOption,
obj.doubleOption,
obj.dateOption,
obj.dateTimeOption,
obj.stringOption,
obj.decimalOption,
})));
assertThat(getJavaField(inspector, obj, "booleanOption"), equalTo((Object) obj.booleanOption.get()));
assertThat(getJavaField(inspector, obj, "byteOption"), equalTo((Object) obj.byteOption.get()));
assertThat(getJavaField(inspector, obj, "shortOption"), equalTo((Object) obj.shortOption.get()));
assertThat(getJavaField(inspector, obj, "intOption"), equalTo((Object) obj.intOption.get()));
assertThat(getJavaField(inspector, obj, "longOption"), equalTo((Object) obj.longOption.get()));
assertThat(getJavaField(inspector, obj, "floatOption"), equalTo((Object) obj.floatOption.get()));
assertThat(getJavaField(inspector, obj, "doubleOption"), equalTo((Object) obj.doubleOption.get()));
Calendar calendar = Calendar.getInstance();
DateUtil.setDayToCalendar(obj.dateOption.get().getElapsedDays(), calendar);
assertThat(getJavaField(inspector, obj, "dateOption"),
equalTo((Object) new java.sql.Date(calendar.getTimeInMillis())));
DateUtil.setSecondToCalendar(obj.dateTimeOption.get().getElapsedSeconds(), calendar);
assertThat(getJavaField(inspector, obj, "dateTimeOption"),
equalTo((Object) new java.sql.Timestamp(calendar.getTimeInMillis())));
assertThat(getJavaField(inspector, obj, "stringOption"),
equalTo((Object) obj.stringOption.getAsString()));
assertThat(((HiveDecimal) getJavaField(inspector, obj, "decimalOption")),
equalTo(HiveDecimal.create(obj.decimalOption.get())));
DataModelDriver driver = new DataModelDriver(descriptor, inspector);
MockTypes copy = new MockTypes();
driver.set(copy, obj);
assertThat(copy.booleanOption, equalTo(obj.booleanOption));
assertThat(copy.byteOption, equalTo(obj.byteOption));
assertThat(copy.shortOption, equalTo(obj.shortOption));
assertThat(copy.intOption, equalTo(obj.intOption));
assertThat(copy.longOption, equalTo(obj.longOption));
assertThat(copy.floatOption, equalTo(obj.floatOption));
assertThat(copy.doubleOption, equalTo(obj.doubleOption));
assertThat(copy.dateOption, equalTo(obj.dateOption));
assertThat(copy.dateTimeOption, equalTo(obj.dateTimeOption));
assertThat(copy.stringOption, equalTo(obj.stringOption));
assertThat(copy.decimalOption, equalTo(obj.decimalOption));
}
/**
* All property types with null.
*/
@Test
public void nulls() {
DataModelDescriptor descriptor = FieldPropertyDescriptor.extract(MockTypes.class);
MockTypes obj = (MockTypes) descriptor.createDataModelObject();
DataModelInspector inspector = new DataModelInspector(descriptor);
assertThat(inspector.getTypeName(), is(MockTypes.class.getName()));
assertThat(inspector.getAllStructFieldRefs(), hasSize(11));
assertThat(inspector.getStructFieldsDataAsList(obj), is(Arrays.asList(new Object[11])));
assertThat(getJavaField(inspector, obj, "booleanOption"), is(nullValue()));
assertThat(getJavaField(inspector, obj, "byteOption"), is(nullValue()));
assertThat(getJavaField(inspector, obj, "shortOption"), is(nullValue()));
assertThat(getJavaField(inspector, obj, "intOption"), is(nullValue()));
assertThat(getJavaField(inspector, obj, "longOption"), is(nullValue()));
assertThat(getJavaField(inspector, obj, "floatOption"), is(nullValue()));
assertThat(getJavaField(inspector, obj, "doubleOption"), is(nullValue()));
assertThat(getJavaField(inspector, obj, "decimalOption"), is(nullValue()));
assertThat(getJavaField(inspector, obj, "stringOption"), is(nullValue()));
assertThat(getJavaField(inspector, obj, "dateOption"), is(nullValue()));
assertThat(getJavaField(inspector, obj, "dateTimeOption"), is(nullValue()));
DataModelDriver driver = new DataModelDriver(descriptor, inspector);
MockTypes copy = new MockTypes();
copy.booleanOption.modify(true);
copy.byteOption.modify((byte) 1);
copy.shortOption.modify((short) 2);
copy.intOption.modify(3);
copy.longOption.modify(4L);
copy.floatOption.modify(5f);
copy.doubleOption.modify(6d);
copy.dateOption.modify(new Date(2014, 6, 1));
copy.dateTimeOption.modify(new DateTime(2014, 6, 1, 2, 3, 4));
copy.stringOption.modify("Hello, world!");
copy.decimalOption.modify(new BigDecimal("7.8"));
driver.set(copy, obj);
assertThat(copy.booleanOption.isNull(), is(true));
assertThat(copy.byteOption.isNull(), is(true));
assertThat(copy.shortOption.isNull(), is(true));
assertThat(copy.intOption.isNull(), is(true));
assertThat(copy.longOption.isNull(), is(true));
assertThat(copy.floatOption.isNull(), is(true));
assertThat(copy.doubleOption.isNull(), is(true));
assertThat(copy.dateOption.isNull(), is(true));
assertThat(copy.dateTimeOption.isNull(), is(true));
assertThat(copy.stringOption.isNull(), is(true));
assertThat(copy.decimalOption.isNull(), is(true));
}
private Object getJavaField(DataModelInspector inspector, Object object, String name) {
StructField ref = inspector.getStructFieldRef(name);
Object field = inspector.getStructFieldData(object, ref);
PrimitiveObjectInspector primitive = (PrimitiveObjectInspector) ref.getFieldObjectInspector();
Object result = primitive.getPrimitiveJavaObject(field);
if (result == null) {
assertThat(primitive.getPrimitiveWritableObject(field), is(nullValue()));
} else {
assertThat(
primitive.getPrimitiveWritableObject(field),
instanceOf(primitive.getPrimitiveWritableClass()));
}
assertThat(primitive.copyObject(field), equalTo(field));
if (result != null) {
assertThat(primitive.copyObject(field), is(not(sameInstance(field))));
}
return result;
}
}