[ https://issues.apache.org/jira/browse/PHOENIX-628?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17810491#comment-17810491 ]
ASF GitHub Bot commented on PHOENIX-628: ---------------------------------------- kadirozde commented on code in PR #1780: URL: https://github.com/apache/phoenix/pull/1780#discussion_r1465208297 ########## phoenix-core-client/src/main/java/org/apache/phoenix/util/json/BsonJsonProvider.java: ########## @@ -0,0 +1,250 @@ +/* + * 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.util.json; + +import com.jayway.jsonpath.InvalidJsonException; +import com.jayway.jsonpath.spi.json.AbstractJsonProvider; +import org.bson.BsonArray; +import org.bson.BsonBinary; +import org.bson.BsonBoolean; +import org.bson.BsonDocument; +import org.bson.BsonDouble; +import org.bson.BsonInt32; +import org.bson.BsonInt64; +import org.bson.BsonObjectId; +import org.bson.BsonString; +import org.bson.BsonType; +import org.bson.BsonValue; +import org.bson.Document; +import org.bson.json.JsonReader; +import org.bson.types.ObjectId; + +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +public class BsonJsonProvider extends AbstractJsonProvider { + + @Override + public Object parse(final String json) throws InvalidJsonException { + JsonReader jsonReader = new JsonReader(json); + BsonType bsonType = jsonReader.readBsonType(); + switch (bsonType) { + case ARRAY: + return BsonArray.parse(json); + case DOCUMENT: + return BsonDocument.parse(json); + case STRING: + return new BsonString(jsonReader.readString()); + case INT32: + return new BsonInt32(jsonReader.readInt32()); + default: + throw new InvalidJsonException(String.format("Unsupported bson type %s", bsonType)); + } + } + + @Override + public Object parse(InputStream jsonStream, String charset) throws InvalidJsonException { + return null; + } + + @Override + public String toJson(Object obj) { + return null; + } + + @Override + public Object createArray() { + return new BsonArray(); + } + + @Override + public boolean isArray(final Object obj) { + + return (obj instanceof BsonArray || obj instanceof List); + } + + @Override + public Object getArrayIndex(final Object obj, final int idx) { + + return toBsonArray(obj).get(idx); + } + + @Override + public void setArrayIndex(final Object array, final int index, final Object newValue) { + if (!isArray(array)) { + throw new UnsupportedOperationException(); + } else { + BsonArray arr = toBsonArray(array); + if (index == arr.size()) { + arr.add(toBsonValue(newValue)); + } else { + arr.set(index, toBsonValue(newValue)); + } + } + } + + @Override + public Object createMap() { + return new BsonDocument(); + } + + @Override + public boolean isMap(final Object obj) { + return (obj instanceof BsonDocument); + } + + @Override + public Object getMapValue(final Object obj, final String key) { + BsonDocument bsonDocument = toBsonDocument(obj); + Object o = bsonDocument.get(key); + if (!bsonDocument.containsKey(key)) { + return UNDEFINED; + } else { + return unwrap(o); + } + } + + @Override + public Iterable<?> toIterable(final Object obj) { + BsonArray arr = toBsonArray(obj); + List<Object> values = new ArrayList<Object>(arr.size()); + for (Object o : arr) { + values.add(toJavaType(toBsonValue(o))); + } + return values; + } + + @Override + public void setProperty(final Object obj, final Object key, final Object value) { + if (isMap(obj)) { + toBsonDocument(obj).put(key.toString(), toBsonValue(value)); + } else { + BsonArray array = toBsonArray(obj); + int index; + if (key != null) { + index = key instanceof Integer ? (Integer) key : Integer.parseInt(key.toString()); + } else { + index = array.size(); + } + + if (index == array.size()) { + array.add(toBsonValue(value)); + } else { + array.set(index, toBsonValue(value)); + } + } + } + + private static BsonArray toBsonArray(final Object o) { + return (BsonArray) o; + } + + private static BsonDocument toBsonDocument(final Object o) { + return (BsonDocument) o; + } + + /** + * https://github.com/spring-projects/spring-data-mongodb/blob/main/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/BsonUtils.java#L66 Review Comment: Please check the link and if it is correct then add some brief note for the link. > Support native JSON data type > ----------------------------- > > Key: PHOENIX-628 > URL: https://issues.apache.org/jira/browse/PHOENIX-628 > Project: Phoenix > Issue Type: Task > Affects Versions: 5.1.4 > Reporter: James R. Taylor > Assignee: Ranganath Govardhanagiri > Labels: JSON, Java, SQL > Fix For: 4.4.1, 5.2.0 > > Attachments: JSON Support for Phoenix.docx, Screen Shot 2022-02-02 at > 12.23.24 PM.png, image-2023-12-07-11-26-56-198.png > > > MongoDB and Postgres do some interesting things with JSON. We should look at > adding similar support. For a detailed description, see JSONB support in > Postgres: > [http://www.craigkerstiens.com/2014/03/24/Postgres-9.4-Looking-up] > [http://www.depesz.com/2014/03/25/waiting-for-9-4-introduce-jsonb-a-structured-format-for-storing-json/] > [http://michael.otacoo.com/postgresql-2/manipulating-jsonb-data-with-key-unique/] -- This message was sent by Atlassian Jira (v8.20.10#820010)