[
https://issues.apache.org/jira/browse/PHOENIX-1489?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14326941#comment-14326941
]
James Taylor commented on PHOENIX-1489:
---------------------------------------
Excellent, [~maryannxue]. I think this'll help the client-side memory footprint
and is a better abstraction too. Would you mind holding off on checking in
until 4.3 is out (hopefully in a couple of days)? Or check into master, but
hold off on 4.0 branch?
Here's some more detailed feedback/questions:
- I noticed a fair amount of serialization/deserialization changes (which is to
be expected). Will this be (or can it be made to be) b/w compatible for older
4.2/4.3 clients?
- In ProjectedTableColumnResolver when is the instanceof check needed?
{code}
+ private static class ProjectedTableColumnResolver extends
MultiTableColumnResolver {
+ private final boolean isLocalIndex;
+ private final List<TableRef> theTableRefs;
+ private final Map<ColumnRef, Integer> columnRefMap;
+
+ private ProjectedTableColumnResolver(PTable projectedTable) {
+ super(null, 0);
+ Preconditions.checkArgument(projectedTable.getType() ==
PTableType.PROJECTED);
+ this.isLocalIndex = projectedTable.getIndexType() ==
IndexType.LOCAL;
+ this.columnRefMap = new HashMap<ColumnRef, Integer>();
+ long ts = Long.MAX_VALUE;
+ for (PColumn column : projectedTable.getColumns()) {
+ if (!(column instanceof ProjectedColumn))
+ continue;
+ ColumnRef colRef = ((ProjectedColumn)
column).getSourceColumnRef();
+ TableRef tableRef = colRef.getTableRef();
{code}
- Similar question in JoinCompiler. Would it make sense to have a method on
ColumnRef to prevent the instanceof check here:
{code}
@@ -748,76 +739,27 @@ public class JoinCompiler {
if (e.getValue() != ColumnRefType.PREFILTER
&& columnRef.getTableRef().equals(tableRef)
&& (!retainPKColumns ||
!SchemaUtil.isPKColumn(columnRef.getColumn()))) {
- PColumn column = columnRef.getColumn();
- addProjectedColumn(projectedColumns,
sourceExpressions, columnNameMap,
- column,
PNameFactory.newName(TupleProjector.VALUE_COLUMN_FAMILY), hasSaltingColumn,
- columnRef instanceof LocalIndexColumnRef,
context);
+ if (columnRef instanceof LocalIndexColumnRef) {
+ sourceColumns.add(new
LocalIndexDataColumnRef(context,
IndexUtil.getIndexColumnName(columnRef.getColumn())));
+ } else {
+ sourceColumns.add(columnRef);
+ }
}
}
}
{code}
- Minor nit, but can you just start the iteration after the salt column instead
of comparing against SALT_COLUMN:
{code}
+ boolean hasSaltingColumn = table.getBucketNum() != null;
+ int position = hasSaltingColumn ? 1 : 0;
+ // Always project PK columns first in case there are some PK columns
added by alter table.
+ for (PColumn sourceColumn : table.getPKColumns()) {
+ if (sourceColumn == SALTING_COLUMN)
+ continue;
{code}
> Access column values positionally from client
> ---------------------------------------------
>
> Key: PHOENIX-1489
> URL: https://issues.apache.org/jira/browse/PHOENIX-1489
> Project: Phoenix
> Issue Type: Sub-task
> Reporter: James Taylor
> Assignee: Maryann Xue
> Attachments: 1489-2.patch, 1489-v1.patch
>
>
> Instead of passing back separate KeyValues for data returned from the server,
> we should access via position using our TupleProjector everywhere. This is
> already the case for joins and aggregate queries, but not for scan queries.
> We can modify ScanRegionObserver to use our KeyValueSchema to accomplish this.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)