/**
* 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;
import org.apache.accumulo.core.client.lexicoder.BigIntegerLexicoder;
import org.apache.accumulo.core.client.lexicoder.DoubleLexicoder;
import org.apache.accumulo.core.client.lexicoder.IntegerLexicoder;
import org.apache.accumulo.core.client.lexicoder.LongLexicoder;
import org.apache.hadoop.hive.serde.serdeConstants;
import org.junit.Assert;
import org.junit.Test;
import java.math.BigInteger;
import java.nio.ByteBuffer;
import static java.nio.charset.StandardCharsets.UTF_8;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
/**
*
*/
public class TestAccumuloIndexLexicoder {
@Test
public void testBooleanString() {
byte[] value = Boolean.TRUE.toString().getBytes(UTF_8);
assertArrayEquals(AccumuloIndexLexicoder.encodeValue(value, serdeConstants.BOOLEAN_TYPE_NAME,
true), value);
}
@Test
public void testBooleanBinary() {
byte[] value = new byte[] { 1 };
assertArrayEquals(AccumuloIndexLexicoder.encodeValue(value, serdeConstants.BOOLEAN_TYPE_NAME,
false), Boolean.TRUE.toString().getBytes(UTF_8));
}
@Test
public void testIntString() {
byte[] value = "10".getBytes(UTF_8);
byte[] encoded = new IntegerLexicoder().encode(10);
byte[] lex = AccumuloIndexLexicoder.encodeValue(value, serdeConstants.INT_TYPE_NAME, true);
assertArrayEquals(lex, encoded);
lex = AccumuloIndexLexicoder.encodeValue(value, serdeConstants.SMALLINT_TYPE_NAME, true);
assertArrayEquals(lex, encoded);
lex = AccumuloIndexLexicoder.encodeValue(value, serdeConstants.TINYINT_TYPE_NAME, true);
assertArrayEquals(lex, encoded);
}
@Test
public void testIntBinary() {
byte[] value = ByteBuffer.allocate(4).putInt(10).array();
byte[] encoded = new IntegerLexicoder().encode(10);
byte[] lex = AccumuloIndexLexicoder.encodeValue(value, serdeConstants.INT_TYPE_NAME, false);
assertArrayEquals(lex, encoded);
value = ByteBuffer.allocate(2).putShort((short) 10).array();
lex = AccumuloIndexLexicoder.encodeValue(value, serdeConstants.SMALLINT_TYPE_NAME, false);
assertArrayEquals(lex, encoded);
value = ByteBuffer.allocate(1).put((byte)10).array();
lex = AccumuloIndexLexicoder.encodeValue(value, serdeConstants.TINYINT_TYPE_NAME, false);
assertArrayEquals(lex, encoded);
}
@Test
public void testFloatBinary() {
byte[] value = ByteBuffer.allocate(4).putFloat(10.55f).array();
byte[] encoded = new DoubleLexicoder().encode((double)10.55f);
String val = new String(encoded);
byte[] lex = AccumuloIndexLexicoder.encodeValue(value, serdeConstants.FLOAT_TYPE_NAME, false);
assertArrayEquals(lex, encoded);
value = ByteBuffer.allocate(8).putDouble(10.55).array();
encoded = new DoubleLexicoder().encode(10.55);
lex = AccumuloIndexLexicoder.encodeValue(value, serdeConstants.DOUBLE_TYPE_NAME, false);
assertArrayEquals(lex, encoded);
}
@Test
public void testFloatString() {
byte[] value = "10.55".getBytes(UTF_8);
byte[] encoded = new DoubleLexicoder().encode(10.55);
byte[] lex = AccumuloIndexLexicoder.encodeValue(value, serdeConstants.FLOAT_TYPE_NAME, true);
assertArrayEquals(lex, encoded);
lex = AccumuloIndexLexicoder.encodeValue(value, serdeConstants.DOUBLE_TYPE_NAME, true);
assertArrayEquals(lex, encoded);
}
@Test
public void testBigIntBinary() {
byte[] value = new String("1232322323").getBytes(UTF_8);
byte[] encoded = new BigIntegerLexicoder().encode(new BigInteger("1232322323", 10));
byte[] lex = AccumuloIndexLexicoder.encodeValue(value, serdeConstants.BIGINT_TYPE_NAME, true);
assertArrayEquals(lex, encoded);
value = new BigInteger( "1232322323", 10 ).toByteArray();
encoded = new BigIntegerLexicoder().encode(new BigInteger("1232322323", 10 ));
lex = AccumuloIndexLexicoder.encodeValue(value, serdeConstants.BIGINT_TYPE_NAME, false);
assertArrayEquals(lex, encoded);
}
@Test
public void testDecimalString() {
String strVal = "12323232233434";
byte[] value = strVal.getBytes(UTF_8);
byte[] encoded = strVal.getBytes(UTF_8);
byte[] lex = AccumuloIndexLexicoder.encodeValue(value, serdeConstants.DECIMAL_TYPE_NAME, true);
assertArrayEquals(lex, encoded);
lex = AccumuloIndexLexicoder.encodeValue(value, "DECIMAL (10,3)", true);
assertArrayEquals(lex, encoded);
}
@Test
public void testDecimalBinary() {
byte[] value = new BigInteger("12323232233434", 10).toString().getBytes(UTF_8);
byte[] encoded = new String(value).getBytes(UTF_8);
byte[] lex = AccumuloIndexLexicoder.encodeValue(value, serdeConstants.DECIMAL_TYPE_NAME, false);
assertArrayEquals(lex, encoded);
}
@Test
public void testDateString() {
String date = "2016-02-22";
byte[] value = date.getBytes(UTF_8);
assertArrayEquals(AccumuloIndexLexicoder.encodeValue(value, serdeConstants.DATE_TYPE_NAME,
true), value);
}
@Test
public void testDateTimeString() {
String timestamp = "2016-02-22 12:12:06.000000005";
byte[] value = timestamp.getBytes(UTF_8);
assertArrayEquals(AccumuloIndexLexicoder.encodeValue(value, serdeConstants.TIMESTAMP_TYPE_NAME,
true), value);
}
@Test
public void testString() {
String strVal = "The quick brown fox";
byte[] value = strVal.getBytes(UTF_8);
assertArrayEquals(AccumuloIndexLexicoder.encodeValue(value, serdeConstants.STRING_TYPE_NAME,
true), value);
assertArrayEquals(AccumuloIndexLexicoder.encodeValue(value, "varChar(20)",
true), value);
assertArrayEquals(AccumuloIndexLexicoder.encodeValue(value, "CHAR (20)",
true), value);
}
}