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