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