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