use of io.shardingjdbc.core.parsing.parser.token.SQLToken in project sharding-jdbc by shardingjdbc.
the class SQLRewriteEngine method rewrite.
/**
* rewrite SQL.
*
* @param isRewriteLimit is rewrite limit
* @return SQL builder
*/
public SQLBuilder rewrite(final boolean isRewriteLimit) {
SQLBuilder result = new SQLBuilder();
if (sqlTokens.isEmpty()) {
result.appendLiterals(originalSQL);
return result;
}
int count = 0;
sortByBeginPosition();
for (SQLToken each : sqlTokens) {
if (0 == count) {
result.appendLiterals(originalSQL.substring(0, each.getBeginPosition()));
}
if (each instanceof TableToken) {
appendTablePlaceholder(result, (TableToken) each, count, sqlTokens);
} else if (each instanceof SchemaToken) {
appendSchemaPlaceholder(result, (SchemaToken) each, count, sqlTokens);
} else if (each instanceof IndexToken) {
appendIndexPlaceholder(result, (IndexToken) each, count, sqlTokens);
} else if (each instanceof ItemsToken) {
appendItemsToken(result, (ItemsToken) each, count, sqlTokens);
} else if (each instanceof RowCountToken) {
appendLimitRowCount(result, (RowCountToken) each, count, sqlTokens, isRewriteLimit);
} else if (each instanceof OffsetToken) {
appendLimitOffsetToken(result, (OffsetToken) each, count, sqlTokens, isRewriteLimit);
} else if (each instanceof OrderByToken) {
appendOrderByToken(result, count, sqlTokens);
}
count++;
}
return result;
}
use of io.shardingjdbc.core.parsing.parser.token.SQLToken in project sharding-jdbc by shardingjdbc.
the class SelectStatement method processLimitForSubQuery.
private SelectStatement processLimitForSubQuery() {
SelectStatement result = this;
List<SQLToken> limitSQLTokens = getLimitTokens(result);
Limit limit = result.getLimit();
while (result.containsSubQuery()) {
result = result.subQueryStatement;
limitSQLTokens.addAll(getLimitTokens(result));
if (null == result.getLimit()) {
continue;
}
if (null == limit) {
limit = result.getLimit();
}
if (null != result.getLimit().getRowCount()) {
limit.setRowCount(result.getLimit().getRowCount());
}
if (null != result.getLimit().getOffset()) {
limit.setOffset(result.getLimit().getOffset());
}
}
resetLimitTokens(result, limitSQLTokens);
result.setLimit(limit);
return result;
}
use of io.shardingjdbc.core.parsing.parser.token.SQLToken in project sharding-jdbc by shardingjdbc.
the class SelectStatement method resetLimitTokens.
private void resetLimitTokens(final SelectStatement selectStatement, final List<SQLToken> limitSQLTokens) {
int count = 0;
List<Integer> toBeRemovedIndexes = new LinkedList<>();
for (SQLToken each : selectStatement.getSqlTokens()) {
if (each instanceof RowCountToken || each instanceof OffsetToken) {
toBeRemovedIndexes.add(count);
}
count++;
}
for (int each : toBeRemovedIndexes) {
selectStatement.getSqlTokens().remove(each);
}
selectStatement.getSqlTokens().addAll(limitSQLTokens);
}
Aggregations