[ 
https://issues.apache.org/jira/browse/PHOENIX-174?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14509376#comment-14509376
 ] 

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_r28982531
  
    --- 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();
    +   }
    +
    +   @Override
    +   public Integer getByteSize() {
    +           return null;
    +   }
    +
    +   @Override
    +   public int compareTo(Object lhs, Object rhs,
    +                   @SuppressWarnings("rawtypes") PDataType rhsType) {
    +           if (PJsonDataType.INSTANCE != rhsType) {
    +                   throwConstraintViolationException(rhsType, this);
    +           }
    +           PhoenixJson phoenixJsonLHS = (PhoenixJson) lhs;
    +           PhoenixJson phoenixJsonRHS = (PhoenixJson) rhs;
    +           return PVarchar.INSTANCE.compareTo(phoenixJsonLHS.toString(),
    +                           phoenixJsonRHS.toString(), rhsType);
    --- End diff --
    
    Doesn't Jackson provide a way of comparing two JSONs? Create a compareTo 
method on PhoenixJson.


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

Reply via email to