/**
* 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.ql.udf;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.io.Text;
import org.junit.Assert;
import org.junit.Test;
public class TestUDFJson {
@Test
public void testJson() throws HiveException {
String book0 = "{\"author\":\"Nigel Rees\",\"title\":\"Sayings of the Century\""
+ ",\"category\":\"reference\",\"price\":8.95}";
String backet0 = "[1,2,{\"b\":\"y\",\"a\":\"x\"}]";
String backet = "[" + backet0 + ",[3,4],[5,6]]";
String backetFlat = backet0.substring(0, backet0.length() - 1) + ",3,4,5,6]";
String book = "[" + book0 + ",{\"author\":\"Herman Melville\",\"title\":\"Moby Dick\","
+ "\"category\":\"fiction\",\"price\":8.99"
+ ",\"isbn\":\"0-553-21311-3\"},{\"author\":\"J. R. R. Tolkien\""
+ ",\"title\":\"The Lord of the Rings\",\"category\":\"fiction\""
+ ",\"reader\":[{\"age\":25,\"name\":\"bob\"},{\"age\":26,\"name\":\"jack\"}]"
+ ",\"price\":22.99,\"isbn\":\"0-395-19395-8\"}]";
String json = "{\"store\":{\"fruit\":[{\"weight\":8,\"type\":\"apple\"},"
+ "{\"weight\":9,\"type\":\"pear\"}],\"basket\":" + backet + ",\"book\":" + book
+ ",\"bicycle\":{\"price\":19.95,\"color\":\"red\"}}"
+ ",\"email\":\"amy@only_for_json_udf_test.net\""
+ ",\"owner\":\"amy\",\"zip code\":\"94025\",\"fb:testid\":\"1234\"}";
UDFJson udf = new UDFJson();
runTest(json, "$.owner", "amy", udf);
runTest(json, "$.store.bicycle", "{\"price\":19.95,\"color\":\"red\"}", udf);
runTest(json, "$.store.book", book, udf);
runTest(json, "$.store.book[0]", book0, udf);
runTest(json, "$.store.book[*]", book, udf);
runTest(json, "$.store.book[0].category", "reference", udf);
runTest(json, "$.store.book[*].category", "[\"reference\",\"fiction\",\"fiction\"]", udf);
runTest(json, "$.store.book[*].reader[0].age", "25", udf);
runTest(json, "$.store.book[*].reader[*].age", "[25,26]", udf);
runTest(json, "$.store.basket[0][1]", "2", udf);
runTest(json, "$.store.basket[*]", backet, udf);
runTest(json, "$.store.basket[*][0]", "[1,3,5]", udf);
runTest(json, "$.store.basket[0][*]", backet0, udf);
runTest(json, "$.store.basket[*][*]", backetFlat, udf);
runTest(json, "$.store.basket[0][2].b", "y", udf);
runTest(json, "$.store.basket[0][*].b", "[\"y\"]", udf);
runTest(json, "$.non_exist_key", null, udf);
runTest(json, "$.store.book[10]", null, udf);
runTest(json, "$.store.book[0].non_exist_key", null, udf);
runTest(json, "$.store.basket[*].non_exist_key", null, udf);
runTest(json, "$.store.basket[0][*].non_exist_key", null, udf);
runTest(json, "$.store.basket[*][*].non_exist_key", null, udf);
runTest(json, "$.zip code", "94025", udf);
runTest(json, "$.fb:testid", "1234", udf);
runTest("{\"a\":\"b\nc\"}", "$.a", "b\nc", udf);
}
@Test
public void testRootArray() throws HiveException {
UDFJson udf = new UDFJson();
runTest("[1,2,3]", "$[0]", "1", udf);
runTest("[1,2,3]", "$.[0]", "1", udf);
runTest("[1,2,3]", "$.[1]", "2", udf);
runTest("[1,2,3]", "$[1]", "2", udf);
runTest("[1,2,3]", "$[3]", null, udf);
runTest("[1,2,3]", "$.[*]", "[1,2,3]", udf);
runTest("[1,2,3]", "$[*]", "[1,2,3]", udf);
runTest("[1,2,3]", "$", "[1,2,3]", udf);
runTest("[{\"k1\":\"v1\"},{\"k2\":\"v2\"},{\"k3\":\"v3\"}]", "$[2]", "{\"k3\":\"v3\"}", udf);
runTest("[{\"k1\":\"v1\"},{\"k2\":\"v2\"},{\"k3\":\"v3\"}]", "$[2].k3", "v3", udf);
runTest("[{\"k1\":[{\"k11\":[1,2,3]}]}]", "$[0].k1[0].k11[1]", "2", udf);
runTest("[{\"k1\":[{\"k11\":[1,2,3]}]}]", "$[0].k1[0].k11", "[1,2,3]", udf);
runTest("[{\"k1\":[{\"k11\":[1,2,3]}]}]", "$[0].k1[0]", "{\"k11\":[1,2,3]}", udf);
runTest("[{\"k1\":[{\"k11\":[1,2,3]}]}]", "$[0].k1", "[{\"k11\":[1,2,3]}]", udf);
runTest("[{\"k1\":[{\"k11\":[1,2,3]}]}]", "$[0]", "{\"k1\":[{\"k11\":[1,2,3]}]}", udf);
runTest("[[1,2,3],[4,5,6],[7,8,9]]", "$[1]", "[4,5,6]", udf);
runTest("[[1,2,3],[4,5,6],[7,8,9]]", "$[1][0]", "4", udf);
runTest("[\"a\",\"b\"]", "$[1]", "b", udf);
runTest("[[\"a\",\"b\"]]", "$[0][1]", "b", udf);
runTest("[1,2,3]", "[0]", null, udf);
runTest("[1,2,3]", "$0", null, udf);
runTest("[1,2,3]", "0", null, udf);
runTest("[1,2,3]", "$.", null, udf);
runTest("[1,2,3]", "$", "[1,2,3]", udf);
runTest("{\"a\":4}", "$", "{\"a\":4}", udf);
}
protected void runTest(String json, String path, String exp, UDFJson udf) {
Text res = udf.evaluate(json, path);
if (exp == null) {
Assert.assertNull(res);
} else {
Assert.assertNotNull(res);
Assert.assertEquals("get_json_object test", exp, res.toString());
}
}
}