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

James Taylor commented on PHOENIX-3295:
---------------------------------------

Thanks for the explanation. Let change ByteBuffer to ImmutableBytesPtr then. I 
don't think we need the empty key value column in the array itself, since every 
row will have the single key value. Seems to me it'd be simpler to just use 
QueryConstants.EMPTY_COLUMN_BYTES as the column qualifier of the single key 
value. Since our encoding scheme is only for new tables, we should have a 
variant of QueryConstants.EMPTY_COLUMN_BYTES which is only a single character 
too. I'd have to look closer at how the getKeyValueExpression is used while 
adding parent indexes to child views. Not sure, but I we may be able to tweak 
the IndexExpressionParseNodeRewriter so that we don't need that call any longer.

> Remove ReplaceArrayColumnWithKeyValueColumnExpressionVisitor 
> -------------------------------------------------------------
>
>                 Key: PHOENIX-3295
>                 URL: https://issues.apache.org/jira/browse/PHOENIX-3295
>             Project: Phoenix
>          Issue Type: Improvement
>            Reporter: Thomas D'Silva
>            Assignee: Thomas D'Silva
>         Attachments: PHOENIX-3295-v2.patch, PHOENIX-3295.patch
>
>
> ReplaceArrayColumnWithKeyValueColumnExpressionVisitor is only used in one 
> place in IndexUtil.generateIndexData because we use a ValueGetter to get the 
> value of the data table column using the original data table column 
> reference. This is also why ArrayColumnExpression needs to keep track of the 
> original key value column expression. 
> If we don't replace the array column expression with the original column 
> expression when it looks up the column by the qualifier it won't find it. 
> {code}
> ValueGetter valueGetter = new ValueGetter() {
>                       
>                       @Override
>                         public byte[] getRowKey() {
>                               return dataMutation.getRow();
>                       }
>         
>                         @Override
>                         public ImmutableBytesWritable 
> getLatestValue(ColumnReference ref) {
>                             // Always return null for our empty key value, as 
> this will cause the index
>                             // maintainer to always treat this Put as a new 
> row.
>                             if (isEmptyKeyValue(table, ref)) {
>                                 return null;
>                             }
>                             byte[] family = ref.getFamily();
>                             byte[] qualifier = ref.getQualifier();
>                             RowMutationState rowMutationState = 
> valuesMap.get(ptr);
>                             PColumn column = null;
>                             try {
>                                 column = 
> table.getColumnFamily(family).getPColumnForColumnQualifier(qualifier);
>                             } catch (ColumnNotFoundException e) {
>                             } catch (ColumnFamilyNotFoundException e) {
>                             }
>                             if (rowMutationState!=null && column!=null) {
>                                 byte[] value = 
> rowMutationState.getColumnValues().get(column);
>                                 ImmutableBytesPtr ptr = new 
> ImmutableBytesPtr();
>                                 ptr.set(value==null ? 
> ByteUtil.EMPTY_BYTE_ARRAY : value);
>                                 
> SchemaUtil.padData(table.getName().getString(), column, ptr);
>                                 return ptr;
>                             }
>                             return null;
>                         }
>                         
>                     };
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to