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

ASF GitHub Bot commented on PHOENIX-514:
----------------------------------------

Github user JamesRTaylor commented on a diff in the pull request:

    https://github.com/apache/phoenix/pull/34#discussion_r22993159
  
    --- Diff: 
phoenix-core/src/main/java/org/apache/phoenix/index/IndexMaintainer.java ---
    @@ -326,6 +322,48 @@ private IndexMaintainer(PTable dataTable, PTable 
index) {
             // TODO: check whether index is immutable or not. Currently it's 
always false so checking
             // data table is with immutable rows or not.
             this.immutableRows = dataTable.isImmutableRows();
    +        int indexColByteSize = 0;
    +        for (int i = indexPosOffset; i < index.getPKColumns().size(); i++) 
{
    +            PColumn indexColumn = index.getPKColumns().get(i);
    +            int indexPos = i - indexPosOffset;
    +            Expression expression = null;
    +            try {
    +                ParseNode parseNode  = 
SQLParser.parseCondition(indexColumn.getExpressionStr());
    +                ColumnResolver resolver = FromCompiler.getResolver(new 
TableRef(dataTable));
    +                StatementContext context = new StatementContext(new 
PhoenixStatement(null), resolver);
    +                expression = parseNode.accept(new 
ExpressionCompiler(context));
    +            } catch (SQLException e) {
    +                throw new RuntimeException(e); // Impossible
    +            }
    +            if ( 
ColumnExpression.class.isAssignableFrom(expression.getClass()) ) {
    +                   // get the column of the data table that corresponds to 
this index column
    +               PColumn column = IndexUtil.getDataColumn(dataTable, 
indexColumn.getName().getString());
    +               boolean isPKColumn = SchemaUtil.isPKColumn(column);
    +               if (isPKColumn) {
    +                   int dataPkPos = 
dataTable.getPKColumns().indexOf(column) - (dataTable.getBucketNum() == null ? 
0 : 1) - (this.isMultiTenant ? 1 : 0);
    +                   this.rowKeyMetaData.setIndexPkPosition(dataPkPos, 
indexPos);
    +               } else {
    +                   indexColByteSize += column.getDataType().isFixedWidth() 
? SchemaUtil.getFixedByteSize(column) : 
ValueSchema.ESTIMATED_VARIABLE_LENGTH_SIZE;
    +                   this.indexedExpressions.add(expression);
    +               }
    +               if (indexColumn.getSortOrder() == SortOrder.DESC) {
    +                   
this.rowKeyMetaData.getDescIndexColumnBitSet().set(indexPos);
    +               }
    +            }
    +            else {
    +                   indexColByteSize += 
expression.getDataType().isFixedWidth() ? 
SchemaUtil.getFixedByteSize(expression) : 
ValueSchema.ESTIMATED_VARIABLE_LENGTH_SIZE;
    --- End diff --
    
    Yes, this looks right.


> Support functional indexes
> --------------------------
>
>                 Key: PHOENIX-514
>                 URL: https://issues.apache.org/jira/browse/PHOENIX-514
>             Project: Phoenix
>          Issue Type: Task
>            Reporter: James Taylor
>            Assignee: Thomas D'Silva
>              Labels: enhancement
>
> Instead of only defining the set of columns from the data table that make up 
> an index, you should be able to use expressions.  For example:
>       CREATE INDEX upper_last_name_idx ON person (UPPER(last_name))
> Then in queries that use UPPER(last_name), we can replace them with column 
> references to the index table.



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

Reply via email to