| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You 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.apache.carbondata.hive; |
| |
| import java.util.Properties; |
| |
| import org.apache.hadoop.conf.Configuration; |
| import org.apache.hadoop.hive.common.type.HiveDecimal; |
| import org.apache.hadoop.hive.serde2.SerDeException; |
| import org.apache.hadoop.hive.serde2.SerDeUtils; |
| import org.apache.hadoop.hive.serde2.io.DoubleWritable; |
| import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable; |
| import org.apache.hadoop.hive.serde2.io.ShortWritable; |
| import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector; |
| import org.apache.hadoop.io.*; |
| |
| import org.apache.log4j.Logger; |
| |
| import org.junit.Assert; |
| import org.junit.Ignore; |
| import org.junit.Test; |
| |
| import org.apache.carbondata.common.logging.LogServiceFactory; |
| |
| //Ignoring because now the write logic has changed the serde and this test case is not valid anymore. |
| // serialize is returning Object[] instead of ArrayWritable and other test cases are already validating the same. |
| @Ignore |
| public class TestCarbonSerDe { |
| |
| private static final Logger LOGGER = |
| LogServiceFactory.getLogService(TestCarbonSerDe.class.getCanonicalName()); |
| |
| @Test |
| public void testCarbonHiveSerDe() throws Throwable { |
| // Create the SerDe |
| LOGGER.info("test: testCarbonHiveSerDe"); |
| |
| final CarbonHiveSerDe carbonHiveSerDe = new CarbonHiveSerDe(); |
| final Configuration configuration = new Configuration(); |
| final Properties tblProperties = createProperties(); |
| SerDeUtils.initializeSerDe(carbonHiveSerDe, configuration, tblProperties, null); |
| |
| // Data |
| final Writable[] arr = new Writable[7]; |
| |
| // Primitive types |
| arr[0] = new ShortWritable((short) 456); |
| arr[1] = new IntWritable(789); |
| arr[2] = new LongWritable(1000l); |
| arr[3] = new DoubleWritable(5.3); |
| arr[4] = new HiveDecimalWritable(HiveDecimal.create(1)); |
| arr[5] = new Text("CarbonSerDe Binary".getBytes("UTF-8")); |
| |
| final Writable[] arrayContainer = new Writable[1]; |
| final Writable[] array = new Writable[5]; |
| for (int i = 0; i < 5; ++i) { |
| array[i] = new IntWritable(i); |
| } |
| arrayContainer[0] = new ArrayWritable(Writable.class, array); |
| arr[6] = new ArrayWritable(Writable.class, arrayContainer); |
| |
| final ArrayWritable arrayWritable = new ArrayWritable(Writable.class, arr); |
| // Test |
| deserializeAndSerializeLazySimple(carbonHiveSerDe, arrayWritable); |
| |
| LOGGER.info("test: testCarbonHiveSerDe - OK"); |
| } |
| |
| private void deserializeAndSerializeLazySimple(final CarbonHiveSerDe serDe, |
| final ArrayWritable t) throws SerDeException { |
| |
| // Get the row structure |
| final StructObjectInspector oi = (StructObjectInspector) serDe.getObjectInspector(); |
| |
| // Deserialize |
| final Object row = serDe.deserialize(t); |
| Assert.assertEquals("deserialization gives the wrong object class", row.getClass(), |
| ArrayWritable.class); |
| Assert.assertEquals("size correct after deserialization", |
| serDe.getSerDeStats().getRawDataSize(), t.get().length); |
| Assert.assertEquals("deserialization gives the wrong object", t, row); |
| |
| // Serialize |
| final CarbonHiveRow serializedArr = (CarbonHiveRow) serDe.serialize(row, oi); |
| Assert.assertEquals("size correct after serialization", serDe.getSerDeStats().getRawDataSize(), |
| serializedArr.getData().length); |
| Assert.assertTrue("serialized object should be equal to starting object", |
| arrayWritableEquals((Object[]) t.toArray(), serializedArr.getData())); |
| } |
| |
| private Properties createProperties() { |
| final Properties tbl = new Properties(); |
| |
| // Set the configuration parameters |
| tbl.setProperty("columns", "aShort,aInt,aLong,aDouble,aDecimal,aString,aList"); |
| tbl.setProperty("columns.types", |
| "smallint:int:bigint:double:decimal:string:array<int>"); |
| tbl.setProperty(org.apache.hadoop.hive.serde.serdeConstants.SERIALIZATION_NULL_FORMAT, "NULL"); |
| return tbl; |
| } |
| |
| private static boolean arrayWritableEquals(final Object[] a1, final Object[] a2) { |
| if (a1.length != a2.length) { |
| return false; |
| } |
| |
| for (int i = 0; i < a1.length; ++i) { |
| if (a1[i] instanceof ArrayWritable) { |
| if (!(a2[i] instanceof ArrayWritable)) { |
| return false; |
| } |
| } else { |
| if (!a1[i].equals(a2[i])) { |
| return false; |
| } |
| } |
| |
| } |
| return true; |
| } |
| } |