1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.shardingsphere.sharding.rewrite.token.generator.impl;
19
20 import org.apache.shardingsphere.infra.annotation.HighFrequencyInvocation;
21 import org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
22 import org.apache.shardingsphere.infra.binder.context.statement.type.dml.SelectStatementContext;
23 import org.apache.shardingsphere.infra.rewrite.sql.token.common.generator.CollectionSQLTokenGenerator;
24 import org.apache.shardingsphere.infra.rewrite.sql.token.common.pojo.SQLToken;
25 import org.apache.shardingsphere.infra.rewrite.sql.token.common.pojo.generic.RemoveToken;
26 import org.apache.shardingsphere.sharding.rewrite.token.generator.IgnoreForSingleRoute;
27
28 import java.util.Collection;
29 import java.util.LinkedList;
30
31
32
33
34 @HighFrequencyInvocation
35 public final class ShardingRemoveTokenGenerator implements CollectionSQLTokenGenerator<SelectStatementContext>, IgnoreForSingleRoute {
36
37 @Override
38 public boolean isGenerateSQLToken(final SQLStatementContext sqlStatementContext) {
39 return isContainsAggregationDistinctProjection(sqlStatementContext);
40 }
41
42 private boolean isContainsAggregationDistinctProjection(final SQLStatementContext sqlStatementContext) {
43 return sqlStatementContext instanceof SelectStatementContext && !((SelectStatementContext) sqlStatementContext).getProjectionsContext().getAggregationDistinctProjections().isEmpty();
44 }
45
46 @Override
47 public Collection<SQLToken> generateSQLTokens(final SelectStatementContext sqlStatementContext) {
48 Collection<SQLToken> result = new LinkedList<>();
49 sqlStatementContext.getSqlStatement().getGroupBy().ifPresent(optional -> result.add(new RemoveToken(optional.getStartIndex(), optional.getStopIndex())));
50 return result;
51 }
52 }