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?
---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at [email protected] or file a JIRA ticket
with INFRA.
---