/*
* Licensed to CRATE Technology GmbH ("Crate") under one or more contributor
* license agreements. See the NOTICE file distributed with this work for
* additional information regarding copyright ownership. Crate 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.
*
* However, if you have executed another commercial license agreement
* with Crate these terms will supersede the license and you may use the
* software solely pursuant to the terms of the relevant commercial agreement.
*/
package io.crate;
import io.crate.test.integration.CrateUnitTest;
import io.crate.types.ArrayType;
import io.crate.types.DataType;
import io.crate.types.DataTypes;
import org.apache.lucene.util.BytesRef;
import org.elasticsearch.common.io.stream.BytesStreamOutput;
import org.elasticsearch.common.io.stream.StreamInput;
import org.junit.Test;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class DataTypeTest extends CrateUnitTest {
@Test
public void testStreaming() throws Exception {
BytesRef b1 = new BytesRef("hello");
BytesStreamOutput out = new BytesStreamOutput();
Streamer streamer = DataTypes.STRING.streamer();
streamer.writeValueTo(out, b1);
StreamInput in = out.bytes().streamInput();
BytesRef b2 = (BytesRef) streamer.readValueFrom(in);
assertEquals(b1, b2);
}
@Test
public void testStreamingNull() throws Exception {
BytesRef b1 = null;
BytesStreamOutput out = new BytesStreamOutput();
Streamer streamer = DataTypes.STRING.streamer();
streamer.writeValueTo(out, b1);
StreamInput in = out.bytes().streamInput();
BytesRef b2 = (BytesRef) streamer.readValueFrom(in);
assertNull(b2);
}
@Test
public void testForValueWithList() {
List<String> strings = Arrays.asList("foo", "bar");
DataType dataType = DataTypes.guessType(strings);
assertEquals(dataType, new ArrayType(DataTypes.STRING));
List<Integer> integers = Arrays.asList(1, 2, 3);
dataType = DataTypes.guessType(integers);
assertEquals(dataType, new ArrayType(DataTypes.INTEGER));
}
@Test
public void testForValueWithArray() {
Boolean[] booleans = new Boolean[]{true, false};
DataType dataType = DataTypes.guessType(booleans);
assertEquals(dataType, new ArrayType(DataTypes.BOOLEAN));
}
@Test
public void testForValueWithTimestampArrayAsString() {
String[] strings = {"2013-09-10T21:51:43", "2013-11-10T21:51:43"};
DataType dataType = DataTypes.guessType(strings);
assertEquals(dataType, new ArrayType(DataTypes.STRING));
}
@Test
public void testForValueWithObjectList() {
Map<String, Object> objA = new HashMap<>();
objA.put("a", 1);
Map<String, Object> objB = new HashMap<>();
Map<String, Object> objBNested = new HashMap<>();
objB.put("b", objBNested);
objBNested.put("bn1", 1);
objBNested.put("bn2", 2);
List<Object> objects = Arrays.<Object>asList(objA, objB);
DataType dataType = DataTypes.guessType(objects);
assertEquals(dataType, new ArrayType(DataTypes.OBJECT));
}
@Test
public void testForValueWithArrayWithNullValues() {
DataType dataType = DataTypes.guessType(new String[]{"foo", null, "bar"});
assertEquals(dataType, new ArrayType(DataTypes.STRING));
}
@Test
public void testForValueNestedList() {
List<List<String>> nestedStrings = Arrays.asList(
Arrays.asList("foo", "bar"),
Arrays.asList("f", "b"));
assertEquals(new ArrayType(new ArrayType(DataTypes.STRING)), DataTypes.guessType(nestedStrings));
}
@Test(expected = IllegalArgumentException.class)
public void testForValueMixedDataTypeInList() {
List<Object> objects = Arrays.<Object>asList("foo", 1);
DataTypes.guessType(objects);
}
@Test
public void testForValueWithEmptyList() {
List<Object> objects = Arrays.<Object>asList();
DataType type = DataTypes.guessType(objects);
assertEquals(type, new ArrayType(DataTypes.UNDEFINED));
}
}