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

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_r22993543
  
    --- Diff: 
phoenix-core/src/main/java/org/apache/phoenix/schema/MetaDataClient.java ---
    @@ -953,20 +973,39 @@ public MutationState createIndex(CreateIndexStatement 
statement, byte[][] splits
                         PDataType dataType = 
MetaDataUtil.getViewIndexIdDataType();
                         ColumnName colName = 
ColumnName.caseSensitiveColumnName(MetaDataUtil.getViewIndexIdColumnName());
                         allPkColumns.add(new Pair<ColumnName, 
SortOrder>(colName, SortOrder.getDefault()));
    -                    columnDefs.add(FACTORY.columnDef(colName, 
dataType.getSqlTypeName(), false, null, null, false, SortOrder.getDefault()));
    +                    columnDefs.add(FACTORY.columnDef(colName, 
dataType.getSqlTypeName(), false, null, null, false, SortOrder.getDefault(), 
null));
                     }
                     // First columns are the indexed ones
    -                for (Pair<ColumnName, SortOrder> pair : indexedPkColumns) {
    -                    ColumnName colName = pair.getFirst();
    -                    PColumn col = resolver.resolveColumn(null, 
colName.getFamilyName(), colName.getColumnName()).getColumn();
    -                    unusedPkColumns.remove(col);
    -                    // Ignore view constants for updatable views as we 
don't need these in the index
    -                    if (col.getViewConstant() == null) {
    -                        PDataType dataType = 
IndexUtil.getIndexColumnDataType(col);
    -                        colName = 
ColumnName.caseSensitiveColumnName(IndexUtil.getIndexColumnName(col));
    -                        allPkColumns.add(new Pair<ColumnName, 
SortOrder>(colName, pair.getSecond()));
    -                        columnDefs.add(FACTORY.columnDef(colName, 
dataType.getSqlTypeName(), col.isNullable(), col.getMaxLength(), 
col.getScale(), false, SortOrder.getDefault()));
    -                    }
    +                for (Pair<ParseNode, SortOrder> pair : 
indexParseNodeAndSortOrderList) {
    +                   ParseNode parseNode = pair.getFirst();
    +                   ColumnName colName = null;
    +                   Integer maxLength = null;
    +                   Integer scale = null;
    +                   // if it is a column 
    +                   if (parseNode instanceof ColumnParseNode) {
    +                           ColumnParseNode colParseNode = 
(ColumnParseNode)parseNode;
    +                       PColumn col = resolver.resolveColumn(null, 
colParseNode.getTableName(), colParseNode.getName()).getColumn();
    +                       unusedPkColumns.remove(col);
    +                       // Ignore view constants for updatable views as we 
don't need these in the index
    +                       if (col.getViewConstant() != null) 
    +                           continue;
    +                       colName = 
ColumnName.caseSensitiveColumnName(IndexUtil.getIndexColumnName(col));
    +                       maxLength = col.getMaxLength();
    +                       scale = col.getScale();
    +                   }
    +                   // compile the parseNode to get an expression
    +                           PhoenixStatement phoenixStatment = new 
PhoenixStatement(connection);
    +                                   final StatementContext context = new 
StatementContext(phoenixStatment, resolver);
    +                           ExpressionCompiler expressionCompiler = new 
ExpressionCompiler(context);
    +                           Expression expression = 
parseNode.accept(expressionCompiler);   
    +                   
    +                   PDataType dataType = 
IndexUtil.getIndexColumnDataType(expression.isNullable(), 
expression.getDataType());
    +                   // use the expression's hashCode as the column name for 
uniqueness
    +                   colName = colName != null ? colName : 
    +                           
ColumnName.caseSensitiveColumnName(IndexUtil.getIndexColumnName(null, 
String.valueOf(expression.hashCode())));
    +                    allPkColumns.add(new Pair<ColumnName, 
SortOrder>(colName, pair.getSecond()));
    +                    // TODO set the max length and scale correctly
    --- End diff --
    
    Use expression.getMaxLength() and expression.getScale() instead.


> 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