private ProjectedTableColumnResolver(PTable projectedTable, PhoenixConnection conn, Map<String, UDFParseNode> udfParseNodes) throws SQLException { super(conn, 0, udfParseNodes, null); Preconditions.checkArgument(projectedTable.getType() == PTableType.PROJECTED); this.isLocalIndex = projectedTable.getIndexType() == IndexType.LOCAL; this.columnRefMap = new HashMap<ColumnRef, Integer>(); long ts = Long.MAX_VALUE; for (int i = projectedTable.getBucketNum() == null ? 0 : 1; i < projectedTable.getColumns().size(); i++) { PColumn column = projectedTable.getColumns().get(i); ColumnRef colRef = ((ProjectedColumn) column).getSourceColumnRef(); TableRef tableRef = colRef.getTableRef(); if (!tables.contains(tableRef)) { String alias = tableRef.getTableAlias(); if (alias != null) { this.tableMap.put(alias, tableRef); } String name = tableRef.getTable().getName().getString(); if (alias == null || !alias.equals(name)) { tableMap.put(name, tableRef); } tables.add(tableRef); if (tableRef.getLowerBoundTimeStamp() < ts) { ts = tableRef.getLowerBoundTimeStamp(); } } this.columnRefMap.put(new ColumnRef(tableRef, colRef.getColumnPosition()), column.getPosition()); } this.theTableRefs = ImmutableList.of(new TableRef(ParseNodeFactory.createTempAlias(), projectedTable, ts, false)); }
public void projectColumns(Scan scan) { assert(!isSubselect()); if (isWildCardSelect()) { scan.getFamilyMap().clear(); return; } for (ColumnRef columnRef : columnRefs.keySet()) { if (columnRef.getTableRef().equals(tableRef) && !SchemaUtil.isPKColumn(columnRef.getColumn()) && !(columnRef instanceof LocalIndexColumnRef)) { EncodedColumnsUtil.setColumns(columnRef.getColumn(), tableRef.getTable(), scan); } } }
@Override public ColumnExpression newColumnExpression(boolean schemaNameCaseSensitive, boolean colNameCaseSensitive) { String displayName = this.getTableRef().getColumnDisplayName(this, schemaNameCaseSensitive, colNameCaseSensitive); return new ProjectedColumnExpression(this.getColumn(), columns, position, displayName); } }
public SingleTableColumnResolver(PhoenixConnection connection, TableRef tableRef) { super(connection, 0, null); alias = tableRef.getTableAlias(); tableRefs = ImmutableList.of(tableRef); schemas = ImmutableList.of(new PSchema(tableRef.getTable().getSchemaName().toString())); }
TableRef tableRef = filteredTableRefs.next(); if (tableRef.getTable().isTransactional()) { startTransaction(tableRef.getTable().getTransactionProvider()); strippedAliases.add(new TableRef(null, tableRef.getTable(), tableRef.getTimeStamp(), tableRef .getLowerBoundTimeStamp(), tableRef.hasDynamicCols()));
boolean isAsync = statement.isAsync(); String tenantId = connection.getTenantId() == null ? null : connection.getTenantId().getString(); PTable table = FromCompiler.getResolver(statement, connection).getTables().get(0).getTable(); String schemaName = statement.getTable().getName().getSchemaName(); String tableName = table.getTableName().getString(); Long timeStamp = indexRef.getTable().isTransactional() ? indexRef.getTimeStamp() : null; List<Mutation> tableMetadata = connection.getMutationState().toMutations(timeStamp).next().getSecond(); connection.rollback(); .setMessage(" currentState=" + indexRef.getTable().getIndexState() + ". requestedState=" + newIndexState ) .setSchemaName(schemaName).setTableName(indexName).build().buildException(); addTableToCache(result); indexRef.setTable(result.getTable()); if (newIndexState == PIndexState.BUILDING && isAsync) { try { PTable index = indexRef.getTable();
public static boolean isPkPositionChanging(TableRef tableRef, List<Expression> projectedExpressions) throws SQLException { for (int i = 0; i < tableRef.getTable().getPKColumns().size(); i++) { PColumn column = tableRef.getTable().getPKColumns().get(i); Expression source = projectedExpressions.get(i); if (source == null || !source .equals(new ColumnRef(tableRef, column.getPosition()).newColumnExpression())) { return true; } } return false; }
@Test public void testGetSplitsWithSkipScanFilter() throws Exception { byte[][] splits = new byte[][] {Ka1A, Ka1B, Ka1E, Ka1G, Ka1I, Ka2A}; createTestTable(getUrl(),DDL,splits, null); Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); Connection conn = DriverManager.getConnection(getUrl(), props); PhoenixConnection pconn = conn.unwrap(PhoenixConnection.class); PTable table = pconn.getTable(new PTableKey(pconn.getTenantId(), TABLE_NAME)); TableRef tableRef = new TableRef(table); List<HRegionLocation> regions = pconn.getQueryServices().getAllTableRegions(tableRef.getTable().getPhysicalName().getBytes()); List<KeyRange> ranges = getSplits(tableRef, scan, regions, scanRanges); assertEquals("Unexpected number of splits: " + ranges.size(), expectedSplits.size(), ranges.size()); for (int i=0; i<expectedSplits.size(); i++) { assertEquals(expectedSplits.get(i), ranges.get(i)); } }
table = tableRefToBe.getTable(); && tableRefToBe.equals(selectResolver.getTables().get(0)); long serverTime = selectResolver.getTables().get(0).getCurrentTime(); if (serverTime == QueryConstants.UNSET_TIMESTAMP) { if (queryPlanToBe.getTableRef().getTable().getType() == PTableType.PROJECTED || queryPlanToBe.getTableRef().getTable().getType() == PTableType.SUBQUERY) { parallelIteratorFactoryToBe = null; .isPkPositionChanging(new TableRef(table), projectedExpressions)) { runOnServer = false;
final ColumnResolver resolver = FromCompiler.getResolver(statement, connection); TableRef tableRef = resolver.getTables().get(0); PTable table = tableRef.getTable(); Long timeStamp = table.isTransactional() ? tableRef.getTimeStamp() : null; for (PTable index : table.getIndexes()) { IndexMaintainer indexMaintainer = index.getIndexMaintainer(table, connection); if (isColumnIndexed) { if (index.getViewIndexId() == null) { indexesToDrop.add(new TableRef(index)); indexColumnsToDrop.add(indexColumn); columnsToDrop.add(new ColumnRef(new TableRef(index), indexColumn.getPosition())); removedIndexTableOrColumn = true; .setColumns(columns) .build(); TableRef indexTableRef = new TableRef(viewIndexTable); PName indexTableTenantId = sharedTableState.getTenantId(); if (indexTableTenantId==null) { MutationPlan plan = compiler.compile( Collections.singletonList(droppedColumnTableRef), getNewEmptyColumnFamilyOrNull(droppedColumnTableRef.getTable(), droppedColumn), null, Collections.singletonList(droppedColumn),
private QueryPlan addPlan(PhoenixStatement statement, SelectStatement select, PTable index, List<? extends PDatum> targetColumns, ParallelIteratorFactory parallelIteratorFactory, QueryPlan dataPlan, boolean isHinted) throws SQLException { int nColumns = dataPlan.getProjector().getColumnCount(); String tableAlias = dataPlan.getTableRef().getTableAlias(); String alias = tableAlias==null ? null : '"' + tableAlias + '"'; // double quote in case it's case sensitive String schemaName = index.getParentSchemaName().getString(); ColumnResolver resolver = FromCompiler.getResolverForQuery(indexSelect, statement.getConnection()); boolean isProjected = dataPlan.getContext().getResolver().getTables().get(0).getTable().getType() == PTableType.PROJECTED; PTable indexTable = indexTableRef.getTable(); PIndexState indexState = indexTable.getIndexState(); if (indexState == PIndexState.ACTIVE || indexState == PIndexState.PENDING_ACTIVE || (indexState == PIndexState.PENDING_DISABLE && isUnderPendingDisableThreshold(indexTableRef.getCurrentTime(), indexTable.getIndexDisableTimestamp()))) { try { indexTable = indexTableRef.getTable(); indexState = indexTable.getIndexState(); || (indexState == PIndexState.PENDING_DISABLE && isUnderPendingDisableThreshold(indexTableRef.getCurrentTime(), indexTable.getIndexDisableTimestamp()))) { if (plan.getProjector().getColumnCount() == nColumns) { return plan; where = where.accept(whereRewriter); if (where != null) { PTable dataTable = dataPlan.getTableRef().getTable(); List<PColumn> pkColumns = dataTable.getPKColumns(); List<AliasedNode> aliasedNodes = Lists.<AliasedNode>newArrayListWithExpectedSize(pkColumns.size());
ColumnResolver resolver = context.getResolver(); TableRef tableRef = context.getCurrentTable(); PTable table = tableRef.getTable(); boolean resolveColumn = !tableRef.equals(resolver.getTables().get(0)); boolean isWildcard = false; Scan scan = context.getScan(); if (tableRef.getTable().getType() == PTableType.INDEX && ((WildcardParseNode)node).isRewrite()) { projectAllIndexColumns(context, tableRef, resolveColumn, projectedExpressions, projectedColumns, targetColumns); } else { TableName tName = ((TableWildcardParseNode) node).getTableName(); TableRef tRef = resolver.resolveTable(tName.getSchemaName(), tName.getTableName()); if (tRef.equals(tableRef)) { isWildcard = true; if (tRef.getTable().getType() == PTableType.INDEX && ((TableWildcardParseNode)node).isRewrite()) { projectAllIndexColumns(context, tRef, true, projectedExpressions, projectedColumns, targetColumns); } else { if (tableRef.getTable().getType() == PTableType.INDEX && ((FamilyWildcardParseNode)node).isRewrite()) { projectIndexColumnFamily(context, cfName, tableRef, resolveColumn, projectedExpressions, projectedColumns); } else { boolean isCaseSensitive = aliasedNode.getAlias() != null ? aliasedNode.isCaseSensitve() : (columnAlias != null ? SchemaUtil.isCaseSensitive(aliasedNode.getNode().getAlias()) : selectVisitor.isCaseSensitive); String name = columnAlias == null ? expression.toString() : columnAlias; projectedColumns.add(new ExpressionProjector(name, tableRef.getTableAlias() == null ? (table.getName() == null ? "" : table.getName().getString()) : tableRef.getTableAlias(), expression, isCaseSensitive)); for (int i = 0; i < projectedColumns.size(); i++) {
public long getCurrentTime() throws SQLException { long ts = this.getCurrentTable().getCurrentTime(); // if the table is transactional then it is only resolved once per query, so we can't use the table timestamp if (this.getCurrentTable().getTable().getType() != PTableType.PROJECTED && !this .getCurrentTable().getTable().isTransactional() && ts != QueryConstants .UNSET_TIMESTAMP) { return ts; } if (currentTime != QueryConstants.UNSET_TIMESTAMP) { return currentTime; } /* * For an UPSERT VALUES where autocommit off, we won't hit the server until the commit. * However, if the statement has a CURRENT_DATE() call as a value, we need to know the * current time at execution time. In that case, we'll call MetaDataClient.updateCache * purely to bind the current time based on the server time. */ PTable table = this.getCurrentTable().getTable(); PhoenixConnection connection = getConnection(); MetaDataClient client = new MetaDataClient(connection); currentTime = client.getCurrentTime(table.getSchemaName().getString(), table.getTableName().getString()); return currentTime; }
public Expression newColumnExpression(boolean schemaNameCaseSensitive, boolean colNameCaseSensitive) throws SQLException { PTable table = tableRef.getTable(); PColumn column = this.getColumn(); String displayName = tableRef.getColumnDisplayName(this, schemaNameCaseSensitive, colNameCaseSensitive); if (SchemaUtil.isPKColumn(column)) { return new RowKeyColumnExpression(
List<PTable>indexes = Lists.newArrayList(dataPlan.getTableRef().getTable().getIndexes()); if (indexes.isEmpty() || dataPlan.isDegenerate() || dataPlan.getTableRef().hasDynamicCols() || select.getHint().hasHint(Hint.NO_INDEX)) { return Collections.<QueryPlan> singletonList(dataPlan);
scn = mutationPlan.getContext().getCurrentTime(); scan.setTimeRange(dataTableRef.getLowerBoundTimeStamp(), scn); .getLong(QueryServices.INDEX_POPULATION_SLEEP_TIME, QueryServicesOptions.DEFAULT_INDEX_POPULATION_SLEEP_TIME); if (!dataTableRef.getTable().isTransactional() && sleepTime > 0) { long delta = sleepTime - firstUpsertSelectTime; if (delta > 0) { dataTableRef.getTable().getTableName().getString(), false, PIndexState.ACTIVE); alterIndex(indexStatement);
private QueryPlan addPlan(PhoenixStatement statement, SelectStatement select, PTable index, List<? extends PDatum> targetColumns, ParallelIteratorFactory parallelIteratorFactory, QueryPlan dataPlan, boolean isHinted) throws SQLException { int nColumns = dataPlan.getProjector().getColumnCount(); String tableAlias = dataPlan.getTableRef().getTableAlias(); String alias = tableAlias==null ? null : '"' + tableAlias + '"'; // double quote in case it's case sensitive String schemaName = index.getParentSchemaName().getString(); boolean isProjected = dataPlan.getContext().getResolver().getTables().get(0).getTable().getType() == PTableType.PROJECTED; PTable indexTable = indexTableRef.getTable(); PIndexState indexState = indexTable.getIndexState(); if (indexState == PIndexState.ACTIVE || indexState == PIndexState.PENDING_ACTIVE || (indexState == PIndexState.PENDING_DISABLE && isUnderPendingDisableThreshold(indexTableRef.getCurrentTime(), indexTable.getIndexDisableTimestamp()))) { try { indexTable = indexTableRef.getTable(); indexState = indexTable.getIndexState(); || (indexState == PIndexState.PENDING_DISABLE && isUnderPendingDisableThreshold(indexTableRef.getCurrentTime(), indexTable.getIndexDisableTimestamp()))) { if (plan.getProjector().getColumnCount() == nColumns) { return plan; PTable dataTable = dataPlan.getTableRef().getTable(); List<Pair<byte[], byte[]>> commonConditionColumns = dataPlan.getContext().getWhereConditionColumns(); IndexMaintainer maintainer = index.getIndexMaintainer(dataTable, statement.getConnection()); try { PColumn indexColumn = index.getColumnForColumnName(indexName); filterColumns.add(new ColumnRef(new TableRef(index), indexColumn.getPosition())); } catch (ColumnNotFoundException ce) {
Date asyncCreatedDate = null; if (statement.isAsync()) { asyncCreatedDate = new Date(tableRef.getTimeStamp()); PTable dataTable = tableRef.getTable(); boolean isTenantConnection = connection.getTenantId() != null; if (isTenantConnection) {
protected ColumnRef(ColumnRef columnRef, long timeStamp) { this.tableRef = new TableRef(columnRef.tableRef, timeStamp); this.columnPosition = columnRef.columnPosition; this.pkSlotPosition = columnRef.pkSlotPosition; }
@Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; ColumnRef other = (ColumnRef)obj; if (columnPosition != other.columnPosition) return false; if (!tableRef.equals(other.tableRef)) return false; return true; }