[ 
https://issues.apache.org/jira/browse/PHOENIX-1661?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14639900#comment-14639900
 ] 

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_r35394793
  
    --- Diff: 
phoenix-core/src/main/java/org/apache/phoenix/schema/json/PhoenixJson.java ---
    @@ -231,4 +236,197 @@ private PhoenixJson getPhoenixJsonInternal(String[] 
paths) {
             }
             return new PhoenixJson(node, node.toString());
         }
    +
    +    /**
    +     * If the current {@link PhoenixJson} is a JsonArray,then it returns 
the length of the JsonArray.
    +     * <p>For example:[1,2,3] ,it will return 3
    +     * <p>Its required for json_array_length().
    +     * @throws SQLException
    +     */
    +    public int getJsonArrayLength() throws SQLException {
    +       if(this.rootNode.isArray()){
    +           return this.rootNode.size();
    +       }else{
    +           throw new SQLException("The JsonNode should be an Array");
    +       }
    +    }
    +
    +    /**
    +     * If the current {@link PhoenixJson} is a JsonArray,then it returns 
the set of array elements.
    +     * <p>For example:[1,false,[2,"string"]]
    +     * it will return (new Object[]{"1","false","[2,\"string\"]"})
    +     * <p>Its required for json_array_elements().
    +     * @return {@link String []} as the set of JSON elements
    +     * @throws SQLException
    +     */
    +    public Object[] getJsonArrayElements() throws SQLException {
    +        if(this.rootNode.isArray()) {
    +            List<String> elementlist = new ArrayList();
    +            Iterator<JsonNode> elements = this.rootNode.getElements();
    +            while (elements.hasNext()) {
    +                JsonNode e = elements.next();
    +                elementlist.add(e.toString());
    +            }
    +            return elementlist.toArray();
    +        }else{
    +            throw new SQLException("The JsonNode should be an Array");
    +        }
    +    }
    +    /**
    +     * It returns the set of JSON keys for the current {@link 
PhoenixJson}.Only the outermost keys will be generated
    +     * <p>For example:{"f1":"abc","f2":{"f3":"a", "f4":"b"}}
    +     * it will return (new Object[]{"f1","f2"})
    +     * <p>Its required for json_object_keys().
    +     * @return {@link String []} as the set of JSON keys
    +     */
    +    public Object[] getJsonObjectKeys() {
    +        List<String> elementlist = new ArrayList();
    +        Iterator<String> fieldnames = this.rootNode.getFieldNames();
    +        while(fieldnames.hasNext()){
    +            elementlist.add(fieldnames.next());
    +        }
    +        return elementlist.toArray();
    +    }
    +
    +    /**
    +     * It returns the SET of JSON key/value pairs for the current {@link 
PhoenixJson}.Only the outermost key/value will be generated
    +     * Probably it seems we should use a special SET class which can hold 
different types of elements.
    +     * but we use the {@link 
org.apache.phoenix.schema.types.PVarcharArray} as an alternative of SET TYPE
    +     * when implementing the build-in function ,so we use {@link String} 
directly to store the pair
    +     * and in this case we use "," to separate key and value
    +     * <p>For example:{"f1":"abc","f2":"edf"}
    +     * it will return (new Object[]{"f1,abc","f2,edf"})
    +     *
    +     * <p>Its required for json_each().
    +     * @return {@link String []} as the SET of JSON key/value pairs
    +     */
    +    public Object[] getJsonFields() {
    +        List<String> elementlist = new ArrayList();
    +        Iterator<Map.Entry<String, JsonNode>> fields = 
this.rootNode.getFields();
    +        while(fields.hasNext()){
    +            Map.Entry<String, JsonNode> entry = fields.next();
    +            StringBuilder fieldBuilder = new StringBuilder();
    +            fieldBuilder.append(entry.getKey());
    +            fieldBuilder.append(",");
    +            fieldBuilder.append(entry.getValue().toString());
    +            elementlist.add(fieldBuilder.toString());
    +        }
    +        return elementlist.toArray();
    +    }
    +    /**
    +     * Expands the object in current {@link PhoenixJson} to a record whose 
columns match the record type defined by base.
    +     * Conversion will be best effort; columns in base with no 
corresponding key will be left null.
    +     * If a column is specified more than once, the last value is used.
    +     * Also use "," to separate each columns
    +     * <p>For example:types :{"a","b"} json: {"a":"1","b":"2"}
    +     * it will return new String("1,2")
    +     *
    +     * <p>Its required for json_populate_record().
    +     * @param types {@link String} the record type
    +     * @return {@link String} as the result record
    +     */
    +    public String jsonPopulateRecord(String [] types) {
    --- End diff --
    
    Maybe add a helper function that can be used by both jsonPopulateRecord and 
jsonPopulateRecordSet?


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

Reply via email to