/** * Judge is derived column or not. * * @param columnName column name to be judged * @return is derived column or not */ public static boolean isDerivedColumn(final String columnName) { for (DerivedColumn each : DerivedColumn.values()) { if (columnName.startsWith(each.pattern)) { return true; } } return false; } }
@Override public int getColumnCount() throws SQLException { int result = 0; for (int columnIndex = 1; columnIndex <= resultSetMetaData.getColumnCount(); columnIndex++) { if (!DerivedColumn.isDerivedColumn(resultSetMetaData.getColumnLabel(columnIndex))) { result++; } } return result; }
/** * Judge is derived alias or not. * * @param aliasName alias name to be judged * @return is derived alias or not */ public static boolean isDerivedAlias(final String aliasName) { for (DerivedAlias each : DerivedAlias.values()) { if (aliasName.startsWith(each.pattern)) { return true; } } return false; } }
private void appendDerivedOrderColumns(final ItemsToken itemsToken, final List<OrderItem> orderItems, final SelectStatement selectStatement) { int derivedColumnOffset = 0; for (OrderItem each : orderItems) { if (!containsItem(selectStatement, each)) { String alias = DerivedColumn.ORDER_BY_ALIAS.getDerivedColumnAlias(derivedColumnOffset++); each.setAlias(alias); itemsToken.getItems().add(each.getQualifiedName().get() + " AS " + alias + " "); } } }
private int setDistinctFunctionAlias(final SelectItemSegment selectItemSegment, final int offset) { if (selectItemSegment instanceof AggregationSelectItemSegment) { AggregationSelectItemSegment aggregationSelectItemSegment = (AggregationSelectItemSegment) selectItemSegment; Optional<String> alias = aggregationSelectItemSegment.getAlias(); if (aggregationSelectItemSegment instanceof AggregationDistinctSelectItemSegment && !alias.isPresent()) { ((AggregationSelectItemSegment) selectItemSegment).setAlias(DerivedAlias.AGGREGATION_DISTINCT_DERIVED.getDerivedAlias(offset)); return offset + 1; } } return offset; }
private void fillAggregationDistinctSelectItemSegment(final AggregationDistinctSelectItemSegment selectItemSegment, final SelectStatement selectStatement) { selectStatement.getItems().add( new AggregationDistinctSelectItem(selectItemSegment.getType(), selectItemSegment.getInnerExpression(), selectItemSegment.getAlias(), selectItemSegment.getDistinctExpression())); Optional<String> derivedAlias = Optional.absent(); if (DerivedAlias.isDerivedAlias(selectItemSegment.getAlias().get())) { derivedAlias = Optional.of(selectItemSegment.getAlias().get()); } selectStatement.getSQLTokens().add(new AggregationDistinctToken(selectItemSegment.getStartIndex(), selectItemSegment.getStopIndex(), selectItemSegment.getDistinctExpression(), derivedAlias)); }
private PostgreSQLQueryResponsePackets getQueryResponsePacketsWithoutDerivedColumns(final PostgreSQLQueryResponsePackets postgreSQLQueryResponsePackets) { int columnCount = 0; List<PostgreSQLColumnDescription> postgreSQLColumnDescriptions = new ArrayList<>(postgreSQLQueryResponsePackets.getColumnCount()); for (PostgreSQLColumnDescription each : postgreSQLQueryResponsePackets.getPostgreSQLRowDescriptionPacket().getPostgreSQLColumnDescriptions()) { if (!DerivedColumn.isDerivedColumn(each.getColumnName())) { postgreSQLColumnDescriptions.add(each); columnCount++; } } return new PostgreSQLQueryResponsePackets(new PostgreSQLRowDescriptionPacket(columnCount, postgreSQLColumnDescriptions)); }
private void appendDerivedOrderColumns(final ItemsToken itemsToken, final List<OrderItem> orderItems, final SelectStatement selectStatement, final ShardingTableMetaData shardingTableMetaData) { int derivedColumnOffset = 0; for (OrderItem each : orderItems) { if (!containsItem(selectStatement, each, shardingTableMetaData)) { String alias = DerivedColumn.ORDER_BY_ALIAS.getDerivedColumnAlias(derivedColumnOffset++); each.setAlias(alias); itemsToken.getItems().add(each.getQualifiedName().get() + " AS " + alias + " "); } } }
private SelectItem getAggregationDistinctSelectItem(final SelectStatement selectStatement, final AggregationType aggregationType, final int beginPosition, final int endPosition, final String innerExpression) { Optional<String> alias = aliasExpressionParser.parseSelectItemAlias().isPresent() ? aliasExpressionParser.parseSelectItemAlias() : Optional.of(DerivedAlias.AGGREGATION_DISTINCT_DERIVED.getDerivedAlias(selectStatement.getAggregationDistinctSelectItems().size())); AggregationDistinctSelectItem result = new AggregationDistinctSelectItem( aggregationType, innerExpression, alias, getDistinctColumnName(innerExpression)); selectStatement.getSQLTokens().add(new AggregationDistinctToken(beginPosition, endPosition - 1, result.getDistinctColumnName(), alias)); return result; }
private QueryResponsePackets getQueryResponsePacketsWithoutDerivedColumns(final QueryResponsePackets queryResponsePackets) { Collection<ColumnDefinition41Packet> columnDefinition41Packets = new ArrayList<>(queryResponsePackets.getColumnCount()); int columnCount = 0; for (ColumnDefinition41Packet each : queryResponsePackets.getColumnDefinition41Packets()) { if (!DerivedColumn.isDerivedColumn(each.getName())) { columnDefinition41Packets.add(each); columnCount++; } } FieldCountPacket fieldCountPacket = new FieldCountPacket(1, columnCount); return new QueryResponsePackets(fieldCountPacket, columnDefinition41Packets, new EofPacket(columnCount + 2)); }
private void appendDerivedGroupColumns(final ItemsToken itemsToken, final List<OrderItem> orderItems, final SelectStatement selectStatement, final ShardingTableMetaData shardingTableMetaData) { int derivedColumnOffset = 0; for (OrderItem each : orderItems) { if (!containsItem(selectStatement, each, shardingTableMetaData)) { String alias = DerivedColumn.GROUP_BY_ALIAS.getDerivedColumnAlias(derivedColumnOffset++); each.setAlias(alias); itemsToken.getItems().add(each.getQualifiedName().get() + " AS " + alias + " "); } } }
private void appendDerivedGroupColumns(final ItemsToken itemsToken, final List<OrderItem> orderItems, final SelectStatement selectStatement) { int derivedColumnOffset = 0; for (OrderItem each : orderItems) { if (!containsItem(selectStatement, each)) { String alias = DerivedColumn.GROUP_BY_ALIAS.getDerivedColumnAlias(derivedColumnOffset++); each.setAlias(alias); itemsToken.getItems().add(each.getQualifiedName().get() + " AS " + alias + " "); } } }
private void appendAvgDerivedColumns(final ItemsToken itemsToken, final SelectStatement selectStatement) { int derivedColumnOffset = 0; for (SelectItem each : selectStatement.getItems()) { if (!(each instanceof AggregationSelectItem) || AggregationType.AVG != ((AggregationSelectItem) each).getType()) { continue; } AggregationSelectItem avgItem = (AggregationSelectItem) each; String countAlias = DerivedColumn.AVG_COUNT_ALIAS.getDerivedColumnAlias(derivedColumnOffset); AggregationSelectItem countItem = new AggregationSelectItem(AggregationType.COUNT, avgItem.getInnerExpression(), Optional.of(countAlias)); String sumAlias = DerivedColumn.AVG_SUM_ALIAS.getDerivedColumnAlias(derivedColumnOffset); AggregationSelectItem sumItem = new AggregationSelectItem(AggregationType.SUM, avgItem.getInnerExpression(), Optional.of(sumAlias)); avgItem.getDerivedAggregationSelectItems().add(countItem); avgItem.getDerivedAggregationSelectItems().add(sumItem); // TODO replace avg to constant, avoid calculate useless avg itemsToken.getItems().add(countItem.getExpression() + " AS " + countAlias + " "); itemsToken.getItems().add(sumItem.getExpression() + " AS " + sumAlias + " "); derivedColumnOffset++; } }
private void appendAvgDerivedColumns(final ItemsToken itemsToken, final SelectStatement selectStatement) { int derivedColumnOffset = 0; for (SelectItem each : selectStatement.getItems()) { if (!isAverageSelectItem(each)) { continue; } AggregationSelectItem avgItem = (AggregationSelectItem) each; String countAlias = DerivedColumn.AVG_COUNT_ALIAS.getDerivedColumnAlias(derivedColumnOffset); AggregationSelectItem countItem = new AggregationSelectItem(AggregationType.COUNT, avgItem.getInnerExpression(), Optional.of(countAlias)); String sumAlias = DerivedColumn.AVG_SUM_ALIAS.getDerivedColumnAlias(derivedColumnOffset); AggregationSelectItem sumItem = new AggregationSelectItem(AggregationType.SUM, avgItem.getInnerExpression(), Optional.of(sumAlias)); avgItem.getDerivedAggregationSelectItems().add(countItem); avgItem.getDerivedAggregationSelectItems().add(sumItem); // TODO replace avg to constant, avoid calculate useless avg if (!(avgItem instanceof AggregationDistinctSelectItem)) { itemsToken.getItems().add(countItem.getExpression() + " AS " + countAlias + " "); itemsToken.getItems().add(sumItem.getExpression() + " AS " + sumAlias + " "); } derivedColumnOffset++; } }