phoenix-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "ASF GitHub Bot (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (PHOENIX-514) Support functional indexes
Date Tue, 03 Feb 2015 00:45:35 GMT

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

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_r23973739
  
    --- Diff: phoenix-core/src/main/java/org/apache/phoenix/schema/MetaDataClient.java ---
    @@ -945,55 +963,79 @@ 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()));
    -                    }
    +                Set<ColumnName> indexedColumnNames = Sets.newHashSetWithExpectedSize(indexParseNodeAndSortOrderList.size());
    +                for (Pair<ParseNode, SortOrder> pair : indexParseNodeAndSortOrderList)
{
    +                	ParseNode parseNode = pair.getFirst();
    +            	    // compile the parseNode to get an expression
    +                    PhoenixStatement phoenixStatment = new PhoenixStatement(connection);
    +                    final StatementContext context = new StatementContext(phoenixStatment,
resolver);
    +                    // normalize the parse node
    +                    parseNode = StatementNormalizer.normalize(parseNode, resolver);
    +                    ExpressionCompiler expressionCompiler = new ExpressionCompiler(context);
    +                    Expression expression = parseNode.accept(expressionCompiler);   
    +                    if (expressionCompiler.isAggregate()) {
    +                        throw new SQLExceptionInfo.Builder(SQLExceptionCode.AGGREGATE_EXPRESSION_NOT_ALLOWED_IN_INDEX).build().buildException();
    +                    }
    +                    if (expression.getDeterminism() != Determinism.ALWAYS) {
    +                        throw new SQLExceptionInfo.Builder(SQLExceptionCode.NON_DETERMINISTIC_EXPRESSION_NOT_ALLOWED_IN_INDEX).build().buildException();
    +                    }
    +                    // true for any constant (including a view constant), as we don't
need these in the index
    +                    if (expression.isStateless()) {
    +                        continue;
    +                    }
    +                    unusedPkColumns.remove(expression);
    +                    
    +                    ColumnName colName = null;
    +					// if expression is KeyValueExpression set the column name correctly
    +					if (expression.getChildren().size() == 0) {
    +						colName = expression
    +								.accept(new StatelessTraverseAllExpressionVisitor<ColumnName>() {
    +									@Override
    +									public ColumnName visit(
    +											KeyValueColumnExpression node) {
    +										return ColumnName.caseSensitiveColumnName(Bytes.toString(IndexUtil
    +												.getIndexColumnName(node.getColumnFamily(), node.getColumnName())));
    +									}
    +								});
    +					}
    +					colName = colName!=null ? colName : ColumnName.caseSensitiveColumnName(IndexUtil.getIndexColumnName(null,
expression.toString().replaceAll("\"", "")));
    --- End diff --
    
    I don't get this still. Why do you have to remove all double quotes? That could be problematic,
for example if a string constant contains a double quote. 


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

Mime
View raw message