[ https://issues.apache.org/jira/browse/PHOENIX-174?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14509374#comment-14509374 ]
ASF GitHub Bot commented on PHOENIX-174: ---------------------------------------- Github user JamesRTaylor commented on a diff in the pull request: https://github.com/apache/phoenix/pull/75#discussion_r28982446 --- Diff: phoenix-core/src/main/java/org/apache/phoenix/schema/types/PJsonDataType.java --- @@ -0,0 +1,258 @@ +package org.apache.phoenix.schema.types; + +import java.io.IOException; +import java.sql.Types; +import java.text.Format; + +import org.apache.hadoop.hbase.io.ImmutableBytesWritable; +import org.apache.hadoop.hbase.util.Bytes; +import org.apache.phoenix.exception.SQLExceptionCode; +import org.apache.phoenix.exception.SQLExceptionInfo; +import org.apache.phoenix.schema.IllegalDataException; +import org.apache.phoenix.schema.SortOrder; +import org.apache.phoenix.schema.json.PhoenixJson; +import org.apache.phoenix.util.ByteUtil; +import org.apache.phoenix.util.StringUtil; +import org.codehaus.jackson.JsonParseException; + +import com.google.common.base.Preconditions; + +/** + * <p> + * A Phoenix data type to represent JSON. The json data type stores an exact + * copy of the input text, which processing functions must reparse on each + * execution. Because the json type stores an exact copy of the input text, it + * will preserve semantically-insignificant white space between tokens, as well + * as the order of keys within JSON objects. Also, if a JSON object within the + * value contains the same key more than once, all the key/value pairs are kept. + * It stores the data as string in single column of HBase and it has same data + * size limit as Phoenix's Varchar. + * <p> + * JSON data types are for storing JSON (JavaScript Object Notation) data, as + * specified in RFC 7159. Such data can also be stored as text, but the JSON + * data types have the advantage of enforcing that each stored value is valid + * according to the JSON rules. + */ +public class PJsonDataType extends PDataType<String> { + + public static final PJsonDataType INSTANCE = new PJsonDataType(); + + PJsonDataType() { + super("JSON", Types.OTHER, PhoenixJson.class, null, 48); + } + + @Override + public int toBytes(Object object, byte[] bytes, int offset) { + + if (object == null) { + return 0; + } + byte[] b = toBytes(object); + System.arraycopy(b, 0, bytes, offset, b.length); + return b.length; + + } + + @Override + public byte[] toBytes(Object object) { + if (object == null) { + return ByteUtil.EMPTY_BYTE_ARRAY; + } + PhoenixJson phoenixJson = (PhoenixJson) object; + return PVarchar.INSTANCE.toBytes(phoenixJson.toString()); + } + + @Override + public Object toObject(byte[] bytes, int offset, int length, + @SuppressWarnings("rawtypes") PDataType actualType, + SortOrder sortOrder, Integer maxLength, Integer scale) { + + if (!actualType.isCoercibleTo(this)) { + throwConstraintViolationException(actualType, this); + } + if (length == 0) { + return null; + } + return getPhoenixJson(bytes, offset, length); + + } + + @Override + public Object toObject(Object object, + @SuppressWarnings("rawtypes") PDataType actualType) { + if (object == null) { + return null; + } + if (equalsAny(actualType, PJsonDataType.INSTANCE)) { + return object; + } + if (equalsAny(actualType, PVarchar.INSTANCE)) { + return getJsonFromVarchar(object, actualType); + } + return throwConstraintViolationException(actualType, this); + } + + @Override + public boolean isCoercibleTo( + @SuppressWarnings("rawtypes") PDataType targetType) { + return equalsAny(targetType, this, PVarchar.INSTANCE); + + } + + @Override + public boolean isCoercibleTo( + @SuppressWarnings("rawtypes") PDataType targetType, Object value) { + return isCoercibleTo(targetType); + } + + @Override + public boolean isSizeCompatible(ImmutableBytesWritable ptr, Object value, + @SuppressWarnings("rawtypes") PDataType srcType, Integer maxLength, + Integer scale, Integer desiredMaxLength, Integer desiredScale) { + if (ptr.getLength() != 0 && maxLength != null + && desiredMaxLength != null) { + return maxLength <= desiredMaxLength; + } + return true; + } + + @Override + public boolean isFixedWidth() { + return false; + } + + @Override + public int estimateByteSize(Object o) { + PhoenixJson phoenixJson = (PhoenixJson) o; + return phoenixJson.toString().length(); --- End diff -- Add a estimateByteSize() on PhoenixJson as you don't want to have to string-ify the JSON just to get an estimate of the size. > Zookeeper parameter in Phoenix JDBC URL should be optional as it can be > specified in hbase-site.xml > --------------------------------------------------------------------------------------------------- > > Key: PHOENIX-174 > URL: https://issues.apache.org/jira/browse/PHOENIX-174 > Project: Phoenix > Issue Type: Task > Affects Versions: 1.1 > Reporter: mujtaba > Labels: enhancement > > Currently, value from HBase zookeeper/port specified in Phoenix JDBC URL > overrides the value specified in hbase-site.xml. Override is fine, but it > should use value specified in hbase-site.xml if no value is specified in > phoenix JDBC URL i.e. to make this parameter optional. -- This message was sent by Atlassian JIRA (v6.3.4#6332)