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