http://git-wip-us.apache.org/repos/asf/hive/blob/e0484b78/druid-handler/src/test/org/apache/hadoop/hive/druid/TestDruidSerDe.java
----------------------------------------------------------------------
diff --git
a/druid-handler/src/test/org/apache/hadoop/hive/druid/TestDruidSerDe.java
b/druid-handler/src/test/org/apache/hadoop/hive/druid/TestDruidSerDe.java
deleted file mode 100644
index 137309c..0000000
--- a/druid-handler/src/test/org/apache/hadoop/hive/druid/TestDruidSerDe.java
+++ /dev/null
@@ -1,918 +0,0 @@
-/**
- * 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.druid;
-
-import static org.junit.Assert.assertEquals;
-
-import java.io.IOException;
-import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.sql.Timestamp;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map.Entry;
-import java.util.Properties;
-
-import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hive.common.type.HiveChar;
-import org.apache.hadoop.hive.common.type.HiveDecimal;
-import org.apache.hadoop.hive.common.type.HiveVarchar;
-import org.apache.hadoop.hive.conf.Constants;
-import org.apache.hadoop.hive.druid.serde.DruidGroupByQueryRecordReader;
-import org.apache.hadoop.hive.druid.serde.DruidQueryRecordReader;
-import org.apache.hadoop.hive.druid.serde.DruidSelectQueryRecordReader;
-import org.apache.hadoop.hive.druid.serde.DruidSerDe;
-import org.apache.hadoop.hive.druid.serde.DruidTimeseriesQueryRecordReader;
-import org.apache.hadoop.hive.druid.serde.DruidTopNQueryRecordReader;
-import org.apache.hadoop.hive.druid.serde.DruidWritable;
-import org.apache.hadoop.hive.ql.exec.Utilities;
-import org.apache.hadoop.hive.serde.serdeConstants;
-import org.apache.hadoop.hive.serde2.SerDeException;
-import org.apache.hadoop.hive.serde2.SerDeUtils;
-import org.apache.hadoop.hive.serde2.io.ByteWritable;
-import org.apache.hadoop.hive.serde2.io.DoubleWritable;
-import org.apache.hadoop.hive.serde2.io.HiveCharWritable;
-import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable;
-import org.apache.hadoop.hive.serde2.io.HiveVarcharWritable;
-import org.apache.hadoop.hive.serde2.io.ShortWritable;
-import org.apache.hadoop.hive.serde2.io.TimestampWritable;
-import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
-import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
-import org.apache.hadoop.hive.serde2.objectinspector.StructField;
-import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector;
-import
org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
-import org.apache.hadoop.hive.serde2.typeinfo.PrimitiveTypeInfo;
-import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory;
-import org.apache.hadoop.io.FloatWritable;
-import org.apache.hadoop.io.IntWritable;
-import org.apache.hadoop.io.LongWritable;
-import org.apache.hadoop.io.NullWritable;
-import org.apache.hadoop.io.Text;
-import org.junit.Test;
-
-import com.fasterxml.jackson.core.JsonParseException;
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.JsonMappingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.google.common.base.Function;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Lists;
-
-import io.druid.data.input.Row;
-import io.druid.query.Query;
-import io.druid.query.Result;
-import io.druid.query.groupby.GroupByQuery;
-import io.druid.query.select.SelectQuery;
-import io.druid.query.select.SelectResultValue;
-import io.druid.query.timeseries.TimeseriesQuery;
-import io.druid.query.timeseries.TimeseriesResultValue;
-import io.druid.query.topn.TopNQuery;
-import io.druid.query.topn.TopNResultValue;
-
-/**
- * Basic tests for Druid SerDe. The examples are taken from Druid 0.9.1.1
- * documentation.
- */
-public class TestDruidSerDe {
-
- // Timeseries query
- private static final String TIMESERIES_QUERY =
- "{ \"queryType\": \"timeseries\", "
- + " \"dataSource\": \"sample_datasource\", "
- + " \"granularity\": \"day\", "
- + " \"descending\": \"true\", "
- + " \"filter\": { "
- + " \"type\": \"and\", "
- + " \"fields\": [ "
- + " { \"type\": \"selector\", \"dimension\":
\"sample_dimension1\", \"value\": \"sample_value1\" }, "
- + " { \"type\": \"or\", "
- + " \"fields\": [ "
- + " { \"type\": \"selector\", \"dimension\":
\"sample_dimension2\", \"value\": \"sample_value2\" }, "
- + " { \"type\": \"selector\", \"dimension\":
\"sample_dimension3\", \"value\": \"sample_value3\" } "
- + " ] "
- + " } "
- + " ] "
- + " }, "
- + " \"aggregations\": [ "
- + " { \"type\": \"longSum\", \"name\": \"sample_name1\",
\"fieldName\": \"sample_fieldName1\" }, "
- + " { \"type\": \"doubleSum\", \"name\": \"sample_name2\",
\"fieldName\": \"sample_fieldName2\" } "
- + " ], "
- + " \"postAggregations\": [ "
- + " { \"type\": \"arithmetic\", "
- + " \"name\": \"sample_divide\", "
- + " \"fn\": \"/\", "
- + " \"fields\": [ "
- + " { \"type\": \"fieldAccess\", \"name\":
\"postAgg__sample_name1\", \"fieldName\": \"sample_name1\" }, "
- + " { \"type\": \"fieldAccess\", \"name\":
\"postAgg__sample_name2\", \"fieldName\": \"sample_name2\" } "
- + " ] "
- + " } "
- + " ], "
- + " \"intervals\": [
\"2012-01-01T00:00:00.000/2012-01-03T00:00:00.000\" ]}";
-
- // Timeseries query results
- private static final String TIMESERIES_QUERY_RESULTS =
- "[ "
- + "{ "
- + " \"timestamp\": \"2012-01-01T00:00:00.000Z\", "
- + " \"result\": { \"sample_name1\": 0, \"sample_name2\":
1.0, \"sample_divide\": 2.2222 } "
- + "}, "
- + "{ "
- + " \"timestamp\": \"2012-01-02T00:00:00.000Z\", "
- + " \"result\": { \"sample_name1\": 2, \"sample_name2\":
3.32, \"sample_divide\": 4 } "
- + "}]";
-
- // Timeseries query results as records
- private static final Object[][] TIMESERIES_QUERY_RESULTS_RECORDS = new
Object[][] {
- new Object[] { new TimestampWritable(new Timestamp(1325376000000L)),
new LongWritable(0),
- new FloatWritable(1.0F), new FloatWritable(2.2222F) },
- new Object[] { new TimestampWritable(new Timestamp(1325462400000L)),
new LongWritable(2),
- new FloatWritable(3.32F), new FloatWritable(4F) }
- };
-
- // Timeseries query results as records (types defined by metastore)
- private static final String TIMESERIES_COLUMN_NAMES =
"__time,sample_name1,sample_name2,sample_divide";
- private static final String TIMESERIES_COLUMN_TYPES =
"timestamp,smallint,double,float";
- private static final Object[][] TIMESERIES_QUERY_RESULTS_RECORDS_2 = new
Object[][] {
- new Object[] { new TimestampWritable(new Timestamp(1325376000000L)), new
ShortWritable((short) 0),
- new DoubleWritable(1.0d), new FloatWritable(2.2222F) },
- new Object[] { new TimestampWritable(new Timestamp(1325462400000L)), new
ShortWritable((short) 2),
- new DoubleWritable(3.32d), new FloatWritable(4F) }
- };
-
- // TopN query
- private static final String TOPN_QUERY =
- "{ \"queryType\": \"topN\", "
- + " \"dataSource\": \"sample_data\", "
- + " \"dimension\": \"sample_dim\", "
- + " \"threshold\": 5, "
- + " \"metric\": \"count\", "
- + " \"granularity\": \"all\", "
- + " \"filter\": { "
- + " \"type\": \"and\", "
- + " \"fields\": [ "
- + " { "
- + " \"type\": \"selector\", "
- + " \"dimension\": \"dim1\", "
- + " \"value\": \"some_value\" "
- + " }, "
- + " { "
- + " \"type\": \"selector\", "
- + " \"dimension\": \"dim2\", "
- + " \"value\": \"some_other_val\" "
- + " } "
- + " ] "
- + " }, "
- + " \"aggregations\": [ "
- + " { "
- + " \"type\": \"longSum\", "
- + " \"name\": \"count\", "
- + " \"fieldName\": \"count\" "
- + " }, "
- + " { "
- + " \"type\": \"doubleSum\", "
- + " \"name\": \"some_metric\", "
- + " \"fieldName\": \"some_metric\" "
- + " } "
- + " ], "
- + " \"postAggregations\": [ "
- + " { "
- + " \"type\": \"arithmetic\", "
- + " \"name\": \"sample_divide\", "
- + " \"fn\": \"/\", "
- + " \"fields\": [ "
- + " { "
- + " \"type\": \"fieldAccess\", "
- + " \"name\": \"some_metric\", "
- + " \"fieldName\": \"some_metric\" "
- + " }, "
- + " { "
- + " \"type\": \"fieldAccess\", "
- + " \"name\": \"count\", "
- + " \"fieldName\": \"count\" "
- + " } "
- + " ] "
- + " } "
- + " ], "
- + " \"intervals\": [ "
- + " \"2013-08-31T00:00:00.000/2013-09-03T00:00:00.000\" "
- + " ]}";
-
- // TopN query results
- private static final String TOPN_QUERY_RESULTS =
- "[ "
- + " { "
- + " \"timestamp\": \"2013-08-31T00:00:00.000Z\", "
- + " \"result\": [ "
- + " { "
- + " \"sample_dim\": \"dim1_val\", "
- + " \"count\": 111, "
- + " \"some_metric\": 10669, "
- + " \"sample_divide\": 96.11711711711712 "
- + " }, "
- + " { "
- + " \"sample_dim\": \"another_dim1_val\", "
- + " \"count\": 88, "
- + " \"some_metric\": 28344, "
- + " \"sample_divide\": 322.09090909090907 "
- + " }, "
- + " { "
- + " \"sample_dim\": \"dim1_val3\", "
- + " \"count\": 70, "
- + " \"some_metric\": 871, "
- + " \"sample_divide\": 12.442857142857143 "
- + " }, "
- + " { "
- + " \"sample_dim\": \"dim1_val4\", "
- + " \"count\": 62, "
- + " \"some_metric\": 815, "
- + " \"sample_divide\": 13.14516129032258 "
- + " }, "
- + " { "
- + " \"sample_dim\": \"dim1_val5\", "
- + " \"count\": 60, "
- + " \"some_metric\": 2787, "
- + " \"sample_divide\": 46.45 "
- + " } "
- + " ] "
- + " }]";
-
- // TopN query results as records
- private static final Object[][] TOPN_QUERY_RESULTS_RECORDS = new Object[][] {
- new Object[] { new TimestampWritable(new Timestamp(1377907200000L)),
new Text("dim1_val"),
- new LongWritable(111), new FloatWritable(10669F),
- new FloatWritable(96.11711711711712F) },
- new Object[] { new TimestampWritable(new Timestamp(1377907200000L)),
- new Text("another_dim1_val"), new LongWritable(88), new
FloatWritable(28344F),
- new FloatWritable(322.09090909090907F) },
- new Object[] { new TimestampWritable(new Timestamp(1377907200000L)),
- new Text("dim1_val3"), new LongWritable(70), new
FloatWritable(871F),
- new FloatWritable(12.442857142857143F) },
- new Object[] { new TimestampWritable(new Timestamp(1377907200000L)),
- new Text("dim1_val4"), new LongWritable(62), new
FloatWritable(815F),
- new FloatWritable(13.14516129032258F) },
- new Object[] { new TimestampWritable(new Timestamp(1377907200000L)),
- new Text("dim1_val5"), new LongWritable(60), new
FloatWritable(2787F),
- new FloatWritable(46.45F) }
- };
-
- // TopN query results as records (types defined by metastore)
- private static final String TOPN_COLUMN_NAMES =
"__time,sample_dim,count,some_metric,sample_divide";
- private static final String TOPN_COLUMN_TYPES =
"timestamp,string,bigint,double,float";
- private static final Object[][] TOPN_QUERY_RESULTS_RECORDS_2 = new
Object[][] {
- new Object[] { new TimestampWritable(new Timestamp(1377907200000L)),
- new Text("dim1_val"), new LongWritable(111), new
DoubleWritable(10669d),
- new FloatWritable(96.11711711711712F) },
- new Object[] { new TimestampWritable(new Timestamp(1377907200000L)),
- new Text("another_dim1_val"), new LongWritable(88), new
DoubleWritable(28344d),
- new FloatWritable(322.09090909090907F) },
- new Object[] { new TimestampWritable(new Timestamp(1377907200000L)),
- new Text("dim1_val3"), new LongWritable(70), new
DoubleWritable(871d),
- new FloatWritable(12.442857142857143F) },
- new Object[] { new TimestampWritable(new Timestamp(1377907200000L)),
- new Text("dim1_val4"), new LongWritable(62), new
DoubleWritable(815d),
- new FloatWritable(13.14516129032258F) },
- new Object[] { new TimestampWritable(new Timestamp(1377907200000L)),
- new Text("dim1_val5"), new LongWritable(60), new
DoubleWritable(2787d),
- new FloatWritable(46.45F) }
- };
-
- // GroupBy query
- private static final String GROUP_BY_QUERY =
- "{ "
- + " \"queryType\": \"groupBy\", "
- + " \"dataSource\": \"sample_datasource\", "
- + " \"granularity\": \"day\", "
- + " \"dimensions\": [\"country\", \"device\"], "
- + " \"limitSpec\": {"
- + " \"type\": \"default\","
- + " \"limit\": 5000,"
- + " \"columns\": [\"country\", \"data_transfer\"] }, "
- + " \"filter\": { "
- + " \"type\": \"and\", "
- + " \"fields\": [ "
- + " { \"type\": \"selector\", \"dimension\": \"carrier\",
\"value\": \"AT&T\" }, "
- + " { \"type\": \"or\", "
- + " \"fields\": [ "
- + " { \"type\": \"selector\", \"dimension\": \"make\",
\"value\": \"Apple\" }, "
- + " { \"type\": \"selector\", \"dimension\": \"make\",
\"value\": \"Samsung\" } "
- + " ] "
- + " } "
- + " ] "
- + " }, "
- + " \"aggregations\": [ "
- + " { \"type\": \"longSum\", \"name\": \"total_usage\",
\"fieldName\": \"user_count\" }, "
- + " { \"type\": \"doubleSum\", \"name\": \"data_transfer\",
\"fieldName\": \"data_transfer\" } "
- + " ], "
- + " \"postAggregations\": [ "
- + " { \"type\": \"arithmetic\", "
- + " \"name\": \"avg_usage\", "
- + " \"fn\": \"/\", "
- + " \"fields\": [ "
- + " { \"type\": \"fieldAccess\", \"fieldName\":
\"data_transfer\" }, "
- + " { \"type\": \"fieldAccess\", \"fieldName\":
\"total_usage\" } "
- + " ] "
- + " } "
- + " ], "
- + " \"intervals\": [
\"2012-01-01T00:00:00.000/2012-01-03T00:00:00.000\" ], "
- + " \"having\": { "
- + " \"type\": \"greaterThan\", "
- + " \"aggregation\": \"total_usage\", "
- + " \"value\": 100 "
- + " }}";
-
- // GroupBy query results
- private static final String GROUP_BY_QUERY_RESULTS =
- "[ "
- + " { "
- + " \"version\" : \"v1\", "
- + " \"timestamp\" : \"2012-01-01T00:00:00.000Z\", "
- + " \"event\" : { "
- + " \"country\" : \"India\", "
- + " \"device\" : \"phone\", "
- + " \"total_usage\" : 88, "
- + " \"data_transfer\" : 29.91233453, "
- + " \"avg_usage\" : 60.32 "
- + " } "
- + " }, "
- + " { "
- + " \"version\" : \"v1\", "
- + " \"timestamp\" : \"2012-01-01T00:00:12.000Z\", "
- + " \"event\" : { "
- + " \"country\" : \"Spain\", "
- + " \"device\" : \"pc\", "
- + " \"total_usage\" : 16, "
- + " \"data_transfer\" : 172.93494959, "
- + " \"avg_usage\" : 6.333333 "
- + " } "
- + " }]";
-
- // GroupBy query results as records
- private static final Object[][] GROUP_BY_QUERY_RESULTS_RECORDS = new
Object[][] {
- new Object[] { new TimestampWritable(new Timestamp(1325376000000L)),
new Text("India"),
- new Text("phone"), new LongWritable(88), new
FloatWritable(29.91233453F),
- new FloatWritable(60.32F) },
- new Object[] { new TimestampWritable(new Timestamp(1325376012000L)),
new Text("Spain"),
- new Text("pc"), new LongWritable(16), new
FloatWritable(172.93494959F),
- new FloatWritable(6.333333F) }
- };
-
- // GroupBy query results as records (types defined by metastore)
- private static final String GROUP_BY_COLUMN_NAMES =
"__time,country,device,total_usage,data_transfer,avg_usage";
- private static final String GROUP_BY_COLUMN_TYPES =
"timestamp,string,string,int,double,float";
- private static final Object[][] GROUP_BY_QUERY_RESULTS_RECORDS_2 = new
Object[][] {
- new Object[] { new TimestampWritable(new Timestamp(1325376000000L)), new
Text("India"),
- new Text("phone"), new IntWritable(88), new
DoubleWritable(29.91233453F),
- new FloatWritable(60.32F) },
- new Object[] { new TimestampWritable(new Timestamp(1325376012000L)), new
Text("Spain"),
- new Text("pc"), new IntWritable(16), new
DoubleWritable(172.93494959F),
- new FloatWritable(6.333333F) }
- };
-
- // Select query
- private static final String SELECT_QUERY =
- "{ \"queryType\": \"select\", "
- + " \"dataSource\": \"wikipedia\", \"descending\":
\"false\", "
- + "
\"dimensions\":[\"robot\",\"namespace\",\"anonymous\",\"unpatrolled\",\"page\",\"language\",\"newpage\",\"user\"],
"
- + "
\"metrics\":[\"count\",\"added\",\"delta\",\"variation\",\"deleted\"], "
- + " \"granularity\": \"all\", "
- + " \"intervals\": [ \"2013-01-01/2013-01-02\" ], "
- + " \"pagingSpec\":{\"pagingIdentifiers\": {},
\"threshold\":5} }";
-
- // Select query results
- private static final String SELECT_QUERY_RESULTS =
- "[{ "
- + " \"timestamp\" : \"2013-01-01T00:00:00.000Z\", "
- + " \"result\" : { "
- + " \"pagingIdentifiers\" : { "
- + "
\"wikipedia_2012-12-29T00:00:00.000Z_2013-01-10T08:00:00.000Z_2013-01-10T08:13:47.830Z_v9\"
: 4 }, "
- + " \"events\" : [ { "
- + " \"segmentId\" :
\"wikipedia_editstream_2012-12-29T00:00:00.000Z_2013-01-10T08:00:00.000Z_2013-01-10T08:13:47.830Z_v9\",
"
- + " \"offset\" : 0, "
- + " \"event\" : { "
- + " \"timestamp\" : \"2013-01-01T00:00:00.000Z\", "
- + " \"robot\" : \"1\", "
- + " \"namespace\" : \"article\", "
- + " \"anonymous\" : \"0\", "
- + " \"unpatrolled\" : \"0\", "
- + " \"page\" : \"11._korpus_(NOVJ)\", "
- + " \"language\" : \"sl\", "
- + " \"newpage\" : \"0\", "
- + " \"user\" : \"EmausBot\", "
- + " \"count\" : 1.0, "
- + " \"added\" : 39.0, "
- + " \"delta\" : 39.0, "
- + " \"variation\" : 39.0, "
- + " \"deleted\" : 0.0 "
- + " } "
- + " }, { "
- + " \"segmentId\" :
\"wikipedia_2012-12-29T00:00:00.000Z_2013-01-10T08:00:00.000Z_2013-01-10T08:13:47.830Z_v9\",
"
- + " \"offset\" : 1, "
- + " \"event\" : { "
- + " \"timestamp\" : \"2013-01-01T00:00:00.000Z\", "
- + " \"robot\" : \"0\", "
- + " \"namespace\" : \"article\", "
- + " \"anonymous\" : \"0\", "
- + " \"unpatrolled\" : \"0\", "
- + " \"page\" : \"112_U.S._580\", "
- + " \"language\" : \"en\", "
- + " \"newpage\" : \"1\", "
- + " \"user\" : \"MZMcBride\", "
- + " \"count\" : 1.0, "
- + " \"added\" : 70.0, "
- + " \"delta\" : 70.0, "
- + " \"variation\" : 70.0, "
- + " \"deleted\" : 0.0 "
- + " } "
- + " }, { "
- + " \"segmentId\" :
\"wikipedia_2012-12-29T00:00:00.000Z_2013-01-10T08:00:00.000Z_2013-01-10T08:13:47.830Z_v9\",
"
- + " \"offset\" : 2, "
- + " \"event\" : { "
- + " \"timestamp\" : \"2013-01-01T00:00:12.000Z\", "
- + " \"robot\" : \"0\", "
- + " \"namespace\" : \"article\", "
- + " \"anonymous\" : \"0\", "
- + " \"unpatrolled\" : \"0\", "
- + " \"page\" : \"113_U.S._243\", "
- + " \"language\" : \"en\", "
- + " \"newpage\" : \"1\", "
- + " \"user\" : \"MZMcBride\", "
- + " \"count\" : 1.0, "
- + " \"added\" : 77.0, "
- + " \"delta\" : 77.0, "
- + " \"variation\" : 77.0, "
- + " \"deleted\" : 0.0 "
- + " } "
- + " }, { "
- + " \"segmentId\" :
\"wikipedia_2012-12-29T00:00:00.000Z_2013-01-10T08:00:00.000Z_2013-01-10T08:13:47.830Z_v9\",
"
- + " \"offset\" : 3, "
- + " \"event\" : { "
- + " \"timestamp\" : \"2013-01-01T00:00:12.000Z\", "
- + " \"robot\" : \"0\", "
- + " \"namespace\" : \"article\", "
- + " \"anonymous\" : \"0\", "
- + " \"unpatrolled\" : \"0\", "
- + " \"page\" : \"113_U.S._73\", "
- + " \"language\" : \"en\", "
- + " \"newpage\" : \"1\", "
- + " \"user\" : \"MZMcBride\", "
- + " \"count\" : 1.0, "
- + " \"added\" : 70.0, "
- + " \"delta\" : 70.0, "
- + " \"variation\" : 70.0, "
- + " \"deleted\" : 0.0 "
- + " } "
- + " }, { "
- + " \"segmentId\" :
\"wikipedia_2012-12-29T00:00:00.000Z_2013-01-10T08:00:00.000Z_2013-01-10T08:13:47.830Z_v9\",
"
- + " \"offset\" : 4, "
- + " \"event\" : { "
- + " \"timestamp\" : \"2013-01-01T00:00:12.000Z\", "
- + " \"robot\" : \"0\", "
- + " \"namespace\" : \"article\", "
- + " \"anonymous\" : \"0\", "
- + " \"unpatrolled\" : \"0\", "
- + " \"page\" : \"113_U.S._756\", "
- + " \"language\" : \"en\", "
- + " \"newpage\" : \"1\", "
- + " \"user\" : \"MZMcBride\", "
- + " \"count\" : 1.0, "
- + " \"added\" : 68.0, "
- + " \"delta\" : 68.0, "
- + " \"variation\" : 68.0, "
- + " \"deleted\" : 0.0 "
- + " } "
- + " } ] }} ]";
-
- // Select query results as records
- private static final Object[][] SELECT_QUERY_RESULTS_RECORDS = new
Object[][] {
- new Object[] { new TimestampWritable(new Timestamp(1356998400000L)),
new Text("1"),
- new Text("article"), new Text("0"), new Text("0"),
- new Text("11._korpus_(NOVJ)"), new Text("sl"), new Text("0"),
- new Text("EmausBot"),
- new FloatWritable(1.0F), new FloatWritable(39.0F), new
FloatWritable(39.0F),
- new FloatWritable(39.0F), new FloatWritable(0.0F) },
- new Object[] { new TimestampWritable(new Timestamp(1356998400000L)),
new Text("0"),
- new Text("article"), new Text("0"), new Text("0"),
- new Text("112_U.S._580"), new Text("en"), new Text("1"), new
Text("MZMcBride"),
- new FloatWritable(1.0F), new FloatWritable(70.0F), new
FloatWritable(70.0F),
- new FloatWritable(70.0F), new FloatWritable(0.0F) },
- new Object[] { new TimestampWritable(new Timestamp(1356998412000L)),
new Text("0"),
- new Text("article"), new Text("0"), new Text("0"),
- new Text("113_U.S._243"), new Text("en"), new Text("1"), new
Text("MZMcBride"),
- new FloatWritable(1.0F), new FloatWritable(77.0F), new
FloatWritable(77.0F),
- new FloatWritable(77.0F), new FloatWritable(0.0F) },
- new Object[] { new TimestampWritable(new Timestamp(1356998412000L)),
new Text("0"),
- new Text("article"), new Text("0"), new Text("0"),
- new Text("113_U.S._73"), new Text("en"), new Text("1"), new
Text("MZMcBride"),
- new FloatWritable(1.0F), new FloatWritable(70.0F), new
FloatWritable(70.0F),
- new FloatWritable(70.0F), new FloatWritable(0.0F) },
- new Object[] { new TimestampWritable(new Timestamp(1356998412000L)),
new Text("0"),
- new Text("article"), new Text("0"), new Text("0"),
- new Text("113_U.S._756"), new Text("en"), new Text("1"), new
Text("MZMcBride"),
- new FloatWritable(1.0F), new FloatWritable(68.0F), new
FloatWritable(68.0F),
- new FloatWritable(68.0F), new FloatWritable(0.0F) }
- };
-
- // Select query results as records (types defined by metastore)
- private static final String SELECT_COLUMN_NAMES =
"__time,robot,namespace,anonymous,unpatrolled,page,language,newpage,user,count,added,delta,variation,deleted";
- private static final String SELECT_COLUMN_TYPES =
"timestamp,string,string,string,string,string,string,string,string,double,double,float,float,float";
- private static final Object[][] SELECT_QUERY_RESULTS_RECORDS_2 = new
Object[][] {
- new Object[] { new TimestampWritable(new Timestamp(1356998400000L)),
new Text("1"),
- new Text("article"), new Text("0"), new Text("0"),
- new Text("11._korpus_(NOVJ)"), new Text("sl"), new Text("0"),
- new Text("EmausBot"),
- new DoubleWritable(1.0d), new DoubleWritable(39.0d), new
FloatWritable(39.0F),
- new FloatWritable(39.0F), new FloatWritable(0.0F) },
- new Object[] { new TimestampWritable(new Timestamp(1356998400000L)),
new Text("0"),
- new Text("article"), new Text("0"), new Text("0"),
- new Text("112_U.S._580"), new Text("en"), new Text("1"), new
Text("MZMcBride"),
- new DoubleWritable(1.0d), new DoubleWritable(70.0d), new
FloatWritable(70.0F),
- new FloatWritable(70.0F), new FloatWritable(0.0F) },
- new Object[] { new TimestampWritable(new Timestamp(1356998412000L)),
new Text("0"),
- new Text("article"), new Text("0"), new Text("0"),
- new Text("113_U.S._243"), new Text("en"), new Text("1"), new
Text("MZMcBride"),
- new DoubleWritable(1.0d), new DoubleWritable(77.0d), new
FloatWritable(77.0F),
- new FloatWritable(77.0F), new FloatWritable(0.0F) },
- new Object[] { new TimestampWritable(new Timestamp(1356998412000L)),
new Text("0"),
- new Text("article"), new Text("0"), new Text("0"),
- new Text("113_U.S._73"), new Text("en"), new Text("1"), new
Text("MZMcBride"),
- new DoubleWritable(1.0d), new DoubleWritable(70.0d), new
FloatWritable(70.0F),
- new FloatWritable(70.0F), new FloatWritable(0.0F) },
- new Object[] { new TimestampWritable(new Timestamp(1356998412000L)),
new Text("0"),
- new Text("article"), new Text("0"), new Text("0"),
- new Text("113_U.S._756"), new Text("en"), new Text("1"), new
Text("MZMcBride"),
- new DoubleWritable(1.0d), new DoubleWritable(68.0d), new
FloatWritable(68.0F),
- new FloatWritable(68.0F), new FloatWritable(0.0F) }
- };
-
- /**
- * Test the default behavior of the objects and object inspectors.
- * @throws IOException
- * @throws IllegalAccessException
- * @throws IllegalArgumentException
- * @throws SecurityException
- * @throws NoSuchFieldException
- * @throws JsonMappingException
- * @throws JsonParseException
- * @throws InvocationTargetException
- * @throws NoSuchMethodException
- */
- @Test
- public void testDruidDeserializer()
- throws SerDeException, JsonParseException, JsonMappingException,
- NoSuchFieldException, SecurityException, IllegalArgumentException,
- IllegalAccessException, IOException, InterruptedException,
- NoSuchMethodException, InvocationTargetException {
- // Create, initialize, and test the SerDe
- QTestDruidSerDe serDe = new QTestDruidSerDe();
- Configuration conf = new Configuration();
- Properties tbl;
- // Timeseries query
- tbl = createPropertiesQuery("sample_datasource", Query.TIMESERIES,
TIMESERIES_QUERY);
- SerDeUtils.initializeSerDe(serDe, conf, tbl, null);
- deserializeQueryResults(serDe, Query.TIMESERIES, TIMESERIES_QUERY,
- TIMESERIES_QUERY_RESULTS, TIMESERIES_QUERY_RESULTS_RECORDS
- );
- // Timeseries query (simulating column types from metastore)
- tbl.setProperty(serdeConstants.LIST_COLUMNS, TIMESERIES_COLUMN_NAMES);
- tbl.setProperty(serdeConstants.LIST_COLUMN_TYPES, TIMESERIES_COLUMN_TYPES);
- SerDeUtils.initializeSerDe(serDe, conf, tbl, null);
- deserializeQueryResults(serDe, Query.TIMESERIES, TIMESERIES_QUERY,
- TIMESERIES_QUERY_RESULTS, TIMESERIES_QUERY_RESULTS_RECORDS_2
- );
- // TopN query
- tbl = createPropertiesQuery("sample_data", Query.TOPN, TOPN_QUERY);
- SerDeUtils.initializeSerDe(serDe, conf, tbl, null);
- deserializeQueryResults(serDe, Query.TOPN, TOPN_QUERY,
- TOPN_QUERY_RESULTS, TOPN_QUERY_RESULTS_RECORDS
- );
- // TopN query (simulating column types from metastore)
- tbl.setProperty(serdeConstants.LIST_COLUMNS, TOPN_COLUMN_NAMES);
- tbl.setProperty(serdeConstants.LIST_COLUMN_TYPES, TOPN_COLUMN_TYPES);
- SerDeUtils.initializeSerDe(serDe, conf, tbl, null);
- deserializeQueryResults(serDe, Query.TOPN, TOPN_QUERY,
- TOPN_QUERY_RESULTS, TOPN_QUERY_RESULTS_RECORDS_2
- );
- // GroupBy query
- tbl = createPropertiesQuery("sample_datasource", Query.GROUP_BY,
GROUP_BY_QUERY);
- SerDeUtils.initializeSerDe(serDe, conf, tbl, null);
- deserializeQueryResults(serDe, Query.GROUP_BY, GROUP_BY_QUERY,
- GROUP_BY_QUERY_RESULTS, GROUP_BY_QUERY_RESULTS_RECORDS
- );
- // GroupBy query (simulating column types from metastore)
- tbl.setProperty(serdeConstants.LIST_COLUMNS, GROUP_BY_COLUMN_NAMES);
- tbl.setProperty(serdeConstants.LIST_COLUMN_TYPES, GROUP_BY_COLUMN_TYPES);
- SerDeUtils.initializeSerDe(serDe, conf, tbl, null);
- deserializeQueryResults(serDe, Query.GROUP_BY, GROUP_BY_QUERY,
- GROUP_BY_QUERY_RESULTS, GROUP_BY_QUERY_RESULTS_RECORDS_2
- );
- // Select query
- tbl = createPropertiesQuery("wikipedia", Query.SELECT, SELECT_QUERY);
- SerDeUtils.initializeSerDe(serDe, conf, tbl, null);
- deserializeQueryResults(serDe, Query.SELECT, SELECT_QUERY,
- SELECT_QUERY_RESULTS, SELECT_QUERY_RESULTS_RECORDS
- );
- // Select query (simulating column types from metastore)
- tbl.setProperty(serdeConstants.LIST_COLUMNS, SELECT_COLUMN_NAMES);
- tbl.setProperty(serdeConstants.LIST_COLUMN_TYPES, SELECT_COLUMN_TYPES);
- SerDeUtils.initializeSerDe(serDe, conf, tbl, null);
- deserializeQueryResults(serDe, Query.SELECT, SELECT_QUERY,
- SELECT_QUERY_RESULTS, SELECT_QUERY_RESULTS_RECORDS_2
- );
- }
-
- private static Properties createPropertiesQuery(String dataSource, String
queryType,
- String jsonQuery
- ) {
- Properties tbl = new Properties();
-
- // Set the configuration parameters
- tbl.setProperty(Constants.DRUID_DATA_SOURCE, dataSource);
- tbl.setProperty(Constants.DRUID_QUERY_JSON, jsonQuery);
- tbl.setProperty(Constants.DRUID_QUERY_TYPE, queryType);
- return tbl;
- }
-
- @SuppressWarnings("unchecked")
- private static void deserializeQueryResults(DruidSerDe serDe, String
queryType, String jsonQuery,
- String resultString, Object[][] records
- ) throws SerDeException, JsonParseException,
- JsonMappingException, IOException, NoSuchFieldException,
SecurityException,
- IllegalArgumentException, IllegalAccessException,
InterruptedException,
- NoSuchMethodException, InvocationTargetException {
-
- // Initialize
- Query<?> query = null;
- DruidQueryRecordReader<?, ?> reader = null;
- List<?> resultsList = null;
- ObjectMapper mapper = DruidStorageHandlerUtils.JSON_MAPPER;
- switch (queryType) {
- case Query.TIMESERIES:
- query = mapper.readValue(jsonQuery, TimeseriesQuery.class);
- reader = new DruidTimeseriesQueryRecordReader();
- resultsList = mapper.readValue(resultString,
- new TypeReference<List<Result<TimeseriesResultValue>>>() {
- }
- );
- break;
- case Query.TOPN:
- query = mapper.readValue(jsonQuery, TopNQuery.class);
- reader = new DruidTopNQueryRecordReader();
- resultsList = mapper.readValue(resultString,
- new TypeReference<List<Result<TopNResultValue>>>() {
- }
- );
- break;
- case Query.GROUP_BY:
- query = mapper.readValue(jsonQuery, GroupByQuery.class);
- reader = new DruidGroupByQueryRecordReader();
- resultsList = mapper.readValue(resultString,
- new TypeReference<List<Row>>() {
- }
- );
- break;
- case Query.SELECT:
- query = mapper.readValue(jsonQuery, SelectQuery.class);
- reader = new DruidSelectQueryRecordReader();
- resultsList = mapper.readValue(resultString,
- new TypeReference<List<Result<SelectResultValue>>>() {
- }
- );
- break;
- }
-
- // Set query and fields access
- Field field1 = DruidQueryRecordReader.class.getDeclaredField("query");
- field1.setAccessible(true);
- field1.set(reader, query);
- if (reader instanceof DruidGroupByQueryRecordReader) {
- Method method1 =
DruidGroupByQueryRecordReader.class.getDeclaredMethod("initDimensionTypes");
- method1.setAccessible(true);
- method1.invoke(reader);
- Method method2 =
DruidGroupByQueryRecordReader.class.getDeclaredMethod("initExtractors");
- method2.setAccessible(true);
- method2.invoke(reader);
- }
- Field field2 = DruidQueryRecordReader.class.getDeclaredField("results");
- field2.setAccessible(true);
-
- // Get the row structure
- StructObjectInspector oi = (StructObjectInspector)
serDe.getObjectInspector();
- List<? extends StructField> fieldRefs = oi.getAllStructFieldRefs();
-
- // Check mapred
- Iterator<?> results = resultsList.iterator();
- field2.set(reader, results);
- DruidWritable writable = new DruidWritable();
- int pos = 0;
- while (reader.next(NullWritable.get(), writable)) {
- List<Object> row = (List<Object>) serDe.deserialize(writable);
- Object[] expectedFieldsData = records[pos];
- assertEquals(expectedFieldsData.length, fieldRefs.size());
- for (int i = 0; i < fieldRefs.size(); i++) {
- assertEquals("Field " + i + " type", expectedFieldsData[i].getClass(),
row.get(i).getClass());
- Object fieldData = oi.getStructFieldData(row, fieldRefs.get(i));
- assertEquals("Field " + i, expectedFieldsData[i], fieldData);
- }
- pos++;
- }
- assertEquals(pos, records.length);
-
- // Check mapreduce
- results = resultsList.iterator();
- field2.set(reader, results);
- pos = 0;
- while (reader.nextKeyValue()) {
- List<Object> row = (List<Object>)
serDe.deserialize(reader.getCurrentValue());
- Object[] expectedFieldsData = records[pos];
- assertEquals(expectedFieldsData.length, fieldRefs.size());
- for (int i = 0; i < fieldRefs.size(); i++) {
- assertEquals("Field " + i + " type", expectedFieldsData[i].getClass(),
row.get(i).getClass());
- Object fieldData = oi.getStructFieldData(row, fieldRefs.get(i));
- assertEquals("Field " + i, expectedFieldsData[i], fieldData);
- }
- pos++;
- }
- assertEquals(pos, records.length);
- }
-
-
- private static final String COLUMN_NAMES =
"__time,c0,c1,c2,c3,c4,c5,c6,c7,c8,c9";
- private static final String COLUMN_TYPES =
"timestamp,string,char(6),varchar(8),double,float,decimal(38,18),bigint,int,smallint,tinyint";
- private static final Object[] ROW_OBJECT = new Object[] {
- new TimestampWritable(new Timestamp(1377907200000L)),
- new Text("dim1_val"),
- new HiveCharWritable(new HiveChar("dim2_v", 6)),
- new HiveVarcharWritable(new HiveVarchar("dim3_val", 8)),
- new DoubleWritable(10669.3D),
- new FloatWritable(10669.45F),
- new HiveDecimalWritable(HiveDecimal.create(1064.34D)),
- new LongWritable(1113939),
- new IntWritable(1112123),
- new ShortWritable((short) 12),
- new ByteWritable((byte) 0),
- new TimestampWritable(new Timestamp(1377907200000L)) // granularity
- };
- private static final DruidWritable DRUID_WRITABLE = new DruidWritable(
- ImmutableMap.<String, Object>builder()
- .put("__time", 1377907200000L)
- .put("c0", "dim1_val")
- .put("c1", "dim2_v")
- .put("c2", "dim3_val")
- .put("c3", 10669.3D)
- .put("c4", 10669.45F)
- .put("c5", 1064.34D)
- .put("c6", 1113939L)
- .put("c7", 1112123)
- .put("c8", (short) 12)
- .put("c9", (byte) 0)
- .put("__time_granularity", 1377907200000L)
- .build());
-
- /**
- * Test the default behavior of the objects and object inspectors.
- * @throws IOException
- * @throws IllegalAccessException
- * @throws IllegalArgumentException
- * @throws SecurityException
- * @throws NoSuchFieldException
- * @throws JsonMappingException
- * @throws JsonParseException
- * @throws InvocationTargetException
- * @throws NoSuchMethodException
- */
- @Test
- public void testDruidObjectSerializer()
- throws SerDeException, JsonParseException, JsonMappingException,
- NoSuchFieldException, SecurityException, IllegalArgumentException,
- IllegalAccessException, IOException, InterruptedException,
- NoSuchMethodException, InvocationTargetException {
- // Create, initialize, and test the SerDe
- DruidSerDe serDe = new DruidSerDe();
- Configuration conf = new Configuration();
- Properties tbl;
- // Mixed source (all types)
- tbl = createPropertiesSource(COLUMN_NAMES, COLUMN_TYPES);
- SerDeUtils.initializeSerDe(serDe, conf, tbl, null);
- serializeObject(tbl, serDe, ROW_OBJECT, DRUID_WRITABLE);
- }
-
- private static Properties createPropertiesSource(String columnNames, String
columnTypes) {
- Properties tbl = new Properties();
-
- // Set the configuration parameters
- tbl.setProperty(serdeConstants.LIST_COLUMNS, columnNames);
- tbl.setProperty(serdeConstants.LIST_COLUMN_TYPES, columnTypes);
- return tbl;
- }
-
- private static void serializeObject(Properties properties, DruidSerDe serDe,
- Object[] rowObject, DruidWritable druidWritable) throws SerDeException {
- // Build OI with timestamp granularity column
- final List<String> columnNames = new ArrayList<>();
- final List<PrimitiveTypeInfo> columnTypes = new ArrayList<>();
- List<ObjectInspector> inspectors = new ArrayList<>();
- columnNames.addAll(Utilities.getColumnNames(properties));
- columnNames.add(Constants.DRUID_TIMESTAMP_GRANULARITY_COL_NAME);
- columnTypes.addAll(Lists.transform(Utilities.getColumnTypes(properties),
- new Function<String, PrimitiveTypeInfo>() {
- @Override
- public PrimitiveTypeInfo apply(String type) {
- return TypeInfoFactory.getPrimitiveTypeInfo(type);
- }
- }
- ));
- columnTypes.add(TypeInfoFactory.getPrimitiveTypeInfo("timestamp"));
- inspectors.addAll(Lists.transform(columnTypes,
- new Function<PrimitiveTypeInfo, ObjectInspector>() {
- @Override
- public ObjectInspector apply(PrimitiveTypeInfo type) {
- return PrimitiveObjectInspectorFactory
- .getPrimitiveWritableObjectInspector(type);
- }
- }
- ));
- ObjectInspector inspector = ObjectInspectorFactory
- .getStandardStructObjectInspector(columnNames, inspectors);
- // Serialize
- DruidWritable writable = (DruidWritable) serDe.serialize(rowObject,
inspector);
- // Check result
- assertEquals(druidWritable.getValue().size(), writable.getValue().size());
- for (Entry<String, Object> e: druidWritable.getValue().entrySet()) {
- assertEquals(e.getValue(), writable.getValue().get(e.getKey()));
- }
- }
-
- private static final Object[] ROW_OBJECT_2 = new Object[] {
- new TimestampWritable(new Timestamp(1377907200000L)),
- new Text("dim1_val"),
- new HiveCharWritable(new HiveChar("dim2_v", 6)),
- new HiveVarcharWritable(new HiveVarchar("dim3_val", 8)),
- new DoubleWritable(10669.3D),
- new FloatWritable(10669.45F),
- new HiveDecimalWritable(HiveDecimal.create(1064.34D)),
- new LongWritable(1113939),
- new IntWritable(1112123),
- new ShortWritable((short) 12),
- new ByteWritable((byte) 0)
- };
- private static final DruidWritable DRUID_WRITABLE_2 = new DruidWritable(
- ImmutableMap.<String, Object>builder()
- .put("__time", 1377907200000L)
- .put("c0", "dim1_val")
- .put("c1", "dim2_v")
- .put("c2", "dim3_val")
- .put("c3", 10669.3D)
- .put("c4", 10669.45F)
- .put("c5", 1064.34D)
- .put("c6", 1113939L)
- .put("c7", 1112123)
- .put("c8", (short) 12)
- .put("c9", (byte) 0)
- .build());
-
- @Test
- public void testDruidObjectDeserializer()
- throws SerDeException, JsonParseException, JsonMappingException,
- NoSuchFieldException, SecurityException, IllegalArgumentException,
- IllegalAccessException, IOException, InterruptedException,
- NoSuchMethodException, InvocationTargetException {
- // Create, initialize, and test the SerDe
- DruidSerDe serDe = new DruidSerDe();
- Configuration conf = new Configuration();
- Properties tbl;
- // Mixed source (all types)
- tbl = createPropertiesSource(COLUMN_NAMES, COLUMN_TYPES);
- SerDeUtils.initializeSerDe(serDe, conf, tbl, null);
- deserializeObject(tbl, serDe, ROW_OBJECT_2, DRUID_WRITABLE_2);
- }
-
- @SuppressWarnings("unchecked")
- private static void deserializeObject(Properties properties, DruidSerDe
serDe,
- Object[] rowObject, DruidWritable druidWritable) throws SerDeException {
- // Deserialize
- List<Object> object = (List<Object>) serDe.deserialize(druidWritable);
- // Check result
- assertEquals(rowObject.length, object.size());
- for (int i = 0; i < rowObject.length; i++) {
- assertEquals(rowObject[i].getClass(), object.get(i).getClass());
- assertEquals(rowObject[i], object.get(i));
- }
- }
-}