[ 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)