[
https://issues.apache.org/jira/browse/PHOENIX-1661?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14639906#comment-14639906
]
ASF GitHub Bot commented on PHOENIX-1661:
-----------------------------------------
Github user twdsilva commented on a diff in the pull request:
https://github.com/apache/phoenix/pull/93#discussion_r35394953
--- Diff:
phoenix-core/src/test/java/org/apache/phoenix/expression/function/JsonFunctionTest.java
---
@@ -0,0 +1,284 @@
+/*
+ * 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.phoenix.expression.function;
+
+import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
+import org.apache.hadoop.hbase.util.Bytes;
+import org.apache.phoenix.expression.Expression;
+import org.apache.phoenix.expression.LiteralExpression;
+import org.apache.phoenix.schema.json.PhoenixJson;
+import org.apache.phoenix.schema.types.*;
+import org.junit.Test;
+
+import java.sql.Time;
+import java.sql.Timestamp;
+import java.util.Date;
+import java.text.SimpleDateFormat;
+import java.util.Arrays;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+
+
+/**
+ * Unit tests for JSON build-in function.
+ * Testing function includes below:
+ * {@link ArrayToJsonFunction}
+ * {@link JsonArrayElementsFunction}
+ * {@link JsonPopulateRecordFunction}
+ * {@link JsonPopulateRecordSetFunction}
+ * {@link JsonArrayLengthFunction}
+ * {@link JsonObjectKeysFunction}
+ * {@link ToJsonFunction}
+ * {@link JsonEachFunction}
+ *
+ */
+public class JsonFunctionTest {
+ public static final String TEST_JSON_STR =
+
"{\"f2\":{\"f3\":\"value\"},\"f4\":{\"f5\":99,\"f6\":[1,true,\"foo\"]},\"f7\":true}";
+
+ private static PhoenixJson testArrayToJson (Object[] array,PDataType
datatype,PArrayDataType arraydatatype) throws Exception {
+ PhoenixArray pa = PArrayDataType.instantiatePhoenixArray(
datatype,array);
+ LiteralExpression arrayExpr =
LiteralExpression.newConstant(pa,arraydatatype );
+ List<Expression> children = Arrays.<Expression>asList(arrayExpr);
+ ArrayToJsonFunction e = new ArrayToJsonFunction(children);
+ ImmutableBytesWritable ptr = new ImmutableBytesWritable();
+ boolean evaluated = e.evaluate(null, ptr);
+ PhoenixJson result = (PhoenixJson)e.getDataType().toObject(ptr);
+ return result;
+ }
+
+ @Test
+ public void testNumberArrayToJson() throws Exception {
+ Object[] testarray = new Object[]{1,12,32,432};
+ PhoenixJson result = testArrayToJson(testarray, PInteger.INSTANCE,
PIntegerArray.INSTANCE);
+ String expected = "[1,12,32,432]";
+ assertEquals(result.serializeToString(), expected);
+ Object[] testarray2 = new Object[]{1.12,12.34,32.45,432.78};
+ PhoenixJson result2 = testArrayToJson(testarray2,
PDouble.INSTANCE, PDoubleArray.INSTANCE);
+ String expected2 = "[1.12,12.34,32.45,432.78]";
+ assertEquals(result2.serializeToString(), expected2);
+ }
+ @Test
+ public void testBooleanArrayToJson() throws Exception {
+ Object[] testarray = new Object[]{false,true};
+ PhoenixJson result = testArrayToJson(testarray, PBoolean.INSTANCE,
PBooleanArray.INSTANCE);
+ String expected = "[false,true]";
+ assertEquals(result.toString(), expected);
+ }
+
+ @Test
+ public void testStringArrayToJson() throws Exception {
+ Object[] testarray = new Object[]{"abc123","12.3","string","汉字"};
+ PhoenixJson result = testArrayToJson(testarray, PVarchar.INSTANCE,
PVarcharArray.INSTANCE);
+ String expected ="[\"abc123\",\"12.3\",\"string\",\"汉字\"]";
+ assertEquals(result.serializeToString(), expected);
+ }
+ @Test
+ public void testDateArrayToJson() throws Exception {
+ SimpleDateFormat myFormatter = new SimpleDateFormat("yyyy-MM-dd
kk:mm:ss.SSS");
+ Date date1= myFormatter.parse("1990-12-01 11:01:45.0");
+ Date date2 = myFormatter.parse("1989-03-12 13:01:45.0");
+ Date date3 = myFormatter.parse("1974-06-06 12:01:45.0");
+ Object[] testarray = new Object[]{date1,date2,date3};
+ PhoenixJson result = testArrayToJson(testarray,
PDate.INSTANCE,PDateArray.INSTANCE);
+ String expected ="[\"1990-12-01\",\"1989-03-12\",\"1974-06-06\"]";
+ assertEquals(result.serializeToString(), expected);
+
+ Timestamp ts1 = Timestamp.valueOf("1990-12-01 11:01:45.123");
+ Timestamp ts2 = Timestamp.valueOf("1989-03-12 01:01:01.0");
+ Timestamp ts3 = Timestamp.valueOf("1989-03-12 23:59:59.1");
+ testarray = new Object[]{ts1,ts2,ts3};
+ result = testArrayToJson(testarray,
PTimestamp.INSTANCE,PTimestampArray.INSTANCE);
+ expected ="[\"1990-12-01 11:01:45.123\",\"1989-03-12
01:01:01.0\",\"1989-03-12 23:59:59.1\"]";
+ assertEquals(result.serializeToString(), expected);
+
+ Time t1 = new Time(date1.getTime());
+ Time t2 = new Time(date2.getTime());
+ Time t3 = new Time(date3.getTime());
+ testarray = new Object[]{t1,t2,t3};
+ result = testArrayToJson(testarray,
PTime.INSTANCE,PTimeArray.INSTANCE);
+ expected ="[\"11:01:45\",\"13:01:45\",\"12:01:45\"]";
+ assertEquals(result.serializeToString(), expected);
+
+
+ }
+
+
+ private static String[] jsonArrayElements (String json) throws
Exception {
+ PhoenixJson phoenixJson = PhoenixJson.getInstance(json);
+ LiteralExpression JsonExpr =
LiteralExpression.newConstant(phoenixJson,PJson.INSTANCE );
+ List<Expression> children = Arrays.<Expression>asList(JsonExpr);
+ JsonArrayElementsFunction e = new
JsonArrayElementsFunction(children);
+ ImmutableBytesWritable ptr = new ImmutableBytesWritable();
+ boolean evaluated = e.evaluate(null, ptr);
+ PhoenixArray pa = (PhoenixArray)e.getDataType().toObject(ptr);
+ return (String[] )pa.getArray();
+ }
+
+ @Test
+ public void testJsonArrayElements() throws Exception {
+ String json = "[1,true,\"string\",[2,false]]";
+ Object[] expected = new
Object[]{"1","true","\"string\"","[2,false]"};
+ String[] result = jsonArrayElements(json);
+ assertEquals(result.length, expected.length);
+ for(int i = 0; i<result.length;i++){
+ assertEquals(result[i], expected[i]);
+ }
+ }
+ private static String jsonPopulateRecord (Object[] types,String json)
throws Exception {
+ PhoenixArray pa =PArrayDataType.instantiatePhoenixArray(
PVarchar.INSTANCE,types);
+ LiteralExpression typesExpr =
LiteralExpression.newConstant(pa,PVarcharArray.INSTANCE );
+ PhoenixJson phoenixJson = PhoenixJson.getInstance(json);
+ LiteralExpression JsonExpr=
LiteralExpression.newConstant(phoenixJson,PJson.INSTANCE );
+ List<Expression> children =
Arrays.<Expression>asList(typesExpr,JsonExpr);
+ JsonPopulateRecordFunction e = new
JsonPopulateRecordFunction(children);
+ ImmutableBytesWritable ptr = new ImmutableBytesWritable();
+ boolean evaluated = e.evaluate(null, ptr);
+ String record = (String)e.getDataType().toObject(ptr);
+ return record;
+ }
+
+ @Test
+ public void testJsonPopulateRecord() throws Exception {
--- End diff --
Add a test that executes this function as a query.
> Implement built-in functions for JSON
> -------------------------------------
>
> Key: PHOENIX-1661
> URL: https://issues.apache.org/jira/browse/PHOENIX-1661
> Project: Phoenix
> Issue Type: Bug
> Reporter: James Taylor
> Labels: JSON, Java, SQL, gsoc2015, mentor
> Attachments: PhoenixJSONSpecification-First-Draft.pdf
>
>
> Take a look at the JSON built-in functions that are implemented in Postgres
> (http://www.postgresql.org/docs/9.3/static/functions-json.html) and implement
> the same for Phoenix in Java following this guide:
> http://phoenix-hbase.blogspot.com/2013/04/how-to-add-your-own-built-in-function.html
> Examples of functions include ARRAY_TO_JSON, ROW_TO_JSON, TO_JSON, etc. The
> implementation of these built-in functions will be impacted by how JSON is
> stored in Phoenix. See PHOENIX-628. An initial implementation could work off
> of a simple text-based JSON representation and then when a native JSON type
> is implemented, they could be reworked to be more efficient.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)