/*
* 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.hadoop.hive.accumulo.serde;
import java.util.List;
import java.util.Properties;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hive.accumulo.columns.ColumnEncoding;
import org.apache.hadoop.hive.accumulo.columns.ColumnMapper;
import org.apache.hadoop.hive.serde.serdeConstants;
import org.apache.hadoop.hive.serde2.SerDeException;
import org.apache.hadoop.hive.serde2.lazy.LazyObjectBase;
import org.apache.hadoop.hive.serde2.lazy.LazySerDeParameters;
import org.apache.hadoop.hive.serde2.lazy.LazyString;
import org.apache.hadoop.hive.serde2.lazy.objectinspector.LazyMapObjectInspector;
import org.apache.hadoop.hive.serde2.lazy.objectinspector.LazySimpleStructObjectInspector;
import org.apache.hadoop.hive.serde2.lazy.objectinspector.primitive.LazyIntObjectInspector;
import org.apache.hadoop.hive.serde2.lazy.objectinspector.primitive.LazyPrimitiveObjectInspectorFactory;
import org.apache.hadoop.hive.serde2.lazy.objectinspector.primitive.LazyStringObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.typeinfo.TypeInfo;
import org.junit.Assert;
import org.junit.Test;
/**
*
*/
public class TestDefaultAccumuloRowIdFactory {
@Test
public void testCorrectPrimitiveInspectors() throws SerDeException {
AccumuloSerDe accumuloSerDe = new AccumuloSerDe();
Properties properties = new Properties();
Configuration conf = new Configuration();
properties.setProperty(AccumuloSerDeParameters.COLUMN_MAPPINGS, ":rowID,cf:cq");
properties.setProperty(serdeConstants.LIST_COLUMNS, "row,col");
properties.setProperty(serdeConstants.LIST_COLUMN_TYPES,
"string,int");
accumuloSerDe.initialize(conf, properties);
AccumuloRowIdFactory factory = accumuloSerDe.getParams().getRowIdFactory();
List<TypeInfo> columnTypes = accumuloSerDe.getParams().getHiveColumnTypes();
ColumnMapper mapper = accumuloSerDe.getParams().getColumnMapper();
LazySerDeParameters serDeParams = accumuloSerDe.getParams().getSerDeParameters();
List<ObjectInspector> OIs = accumuloSerDe.getColumnObjectInspectors(columnTypes, serDeParams, mapper.getColumnMappings(), factory);
Assert.assertEquals(2, OIs.size());
Assert.assertEquals(LazyStringObjectInspector.class, OIs.get(0).getClass());
Assert.assertEquals(LazyIntObjectInspector.class, OIs.get(1).getClass());
}
@Test
public void testCorrectComplexInspectors() throws SerDeException {
AccumuloSerDe accumuloSerDe = new AccumuloSerDe();
Properties properties = new Properties();
Configuration conf = new Configuration();
properties.setProperty(AccumuloSerDeParameters.COLUMN_MAPPINGS, ":rowID,cf:cq");
properties.setProperty(serdeConstants.LIST_COLUMNS, "row,col");
properties.setProperty(serdeConstants.LIST_COLUMN_TYPES,
"struct<col1:int,col2:int>,map<string,string>");
accumuloSerDe.initialize(conf, properties);
AccumuloRowIdFactory factory = accumuloSerDe.getParams().getRowIdFactory();
List<TypeInfo> columnTypes = accumuloSerDe.getParams().getHiveColumnTypes();
ColumnMapper mapper = accumuloSerDe.getParams().getColumnMapper();
LazySerDeParameters serDeParams = accumuloSerDe.getParams().getSerDeParameters();
List<ObjectInspector> OIs = accumuloSerDe.getColumnObjectInspectors(columnTypes, serDeParams, mapper.getColumnMappings(), factory);
// Expect the correct OIs
Assert.assertEquals(2, OIs.size());
Assert.assertEquals(LazySimpleStructObjectInspector.class, OIs.get(0).getClass());
Assert.assertEquals(LazyMapObjectInspector.class, OIs.get(1).getClass());
LazySimpleStructObjectInspector structOI = (LazySimpleStructObjectInspector) OIs.get(0);
Assert.assertEquals(2, (int) structOI.getSeparator());
LazyMapObjectInspector mapOI = (LazyMapObjectInspector) OIs.get(1);
Assert.assertEquals(2, (int) mapOI.getItemSeparator());
Assert.assertEquals(3, (int) mapOI.getKeyValueSeparator());
}
@Test
public void testBinaryStringRowId() throws SerDeException {
AccumuloSerDe accumuloSerDe = new AccumuloSerDe();
Properties properties = new Properties();
Configuration conf = new Configuration();
properties.setProperty(AccumuloSerDeParameters.COLUMN_MAPPINGS, ":rowID,cf:cq");
properties.setProperty(serdeConstants.LIST_COLUMNS, "row,col");
properties.setProperty(serdeConstants.LIST_COLUMN_TYPES,
"string,string");
properties.setProperty(AccumuloSerDeParameters.DEFAULT_STORAGE_TYPE, ColumnEncoding.BINARY.getName());
accumuloSerDe.initialize(conf, properties);
DefaultAccumuloRowIdFactory rowIdFactory = new DefaultAccumuloRowIdFactory();
rowIdFactory.init(accumuloSerDe.getParams(), properties);
LazyStringObjectInspector oi = LazyPrimitiveObjectInspectorFactory.getLazyStringObjectInspector(false, (byte) '\\');
LazyObjectBase lazyObj = rowIdFactory.createRowId(oi);
Assert.assertNotNull(lazyObj);
Assert.assertTrue(LazyString.class.isAssignableFrom(lazyObj.getClass()));
}
}