17
17
18
18
package io .shardingjdbc .core .routing .router ;
19
19
20
+ import com .google .common .base .Optional ;
21
+ import com .google .common .base .Preconditions ;
20
22
import io .shardingjdbc .core .constant .DatabaseType ;
21
23
import io .shardingjdbc .core .parsing .SQLParsingEngine ;
22
24
import io .shardingjdbc .core .parsing .parser .context .GeneratedKey ;
28
30
import io .shardingjdbc .core .parsing .parser .sql .ddl .DDLStatement ;
29
31
import io .shardingjdbc .core .parsing .parser .sql .dml .insert .InsertStatement ;
30
32
import io .shardingjdbc .core .parsing .parser .sql .dql .select .SelectStatement ;
33
+ import io .shardingjdbc .core .parsing .parser .token .GeneratedKeyToken ;
31
34
import io .shardingjdbc .core .rewrite .SQLBuilder ;
32
35
import io .shardingjdbc .core .rewrite .SQLRewriteEngine ;
33
36
import io .shardingjdbc .core .routing .SQLExecutionUnit ;
45
48
import io .shardingjdbc .core .routing .type .standard .StandardRoutingEngine ;
46
49
import io .shardingjdbc .core .routing .type .unicast .UnicastRoutingEngine ;
47
50
import io .shardingjdbc .core .rule .ShardingRule ;
51
+ import io .shardingjdbc .core .rule .TableRule ;
48
52
import io .shardingjdbc .core .util .SQLLogger ;
49
53
import lombok .RequiredArgsConstructor ;
50
54
@@ -70,22 +74,21 @@ public final class ParsingSQLRouter implements SQLRouter {
70
74
71
75
@ Override
72
76
public SQLStatement parse (final String logicSQL , final boolean useCache ) {
73
- SQLParsingEngine parsingEngine = new SQLParsingEngine (databaseType , logicSQL , shardingRule );
74
- SQLStatement result = parsingEngine .parse (useCache );
75
- if (result instanceof InsertStatement ) {
76
- ((InsertStatement ) result ).appendGenerateKeyToken (shardingRule );
77
- }
78
- return result ;
77
+ return new SQLParsingEngine (databaseType , logicSQL , shardingRule ).parse (useCache );
79
78
}
80
79
81
80
@ Override
82
81
public SQLRouteResult route (final String logicSQL , final List <Object > parameters , final SQLStatement sqlStatement ) {
83
- SQLRouteResult result = new SQLRouteResult ( sqlStatement ) ;
84
- if (sqlStatement instanceof InsertStatement && null != (( InsertStatement ) sqlStatement ). getGeneratedKey () ) {
85
- processGeneratedKey ( parameters , (InsertStatement ) sqlStatement , result );
82
+ GeneratedKey generatedKey = null ;
83
+ if (sqlStatement instanceof InsertStatement ) {
84
+ generatedKey = getGenerateKey ( shardingRule , (InsertStatement ) sqlStatement );
86
85
}
87
- RoutingResult routingResult = route (parameters , sqlStatement );
88
- SQLRewriteEngine rewriteEngine = new SQLRewriteEngine (shardingRule , logicSQL , databaseType , sqlStatement );
86
+ SQLRouteResult result = new SQLRouteResult (sqlStatement , generatedKey );
87
+ if (null != generatedKey ) {
88
+ processGeneratedKey (parameters , generatedKey , sqlStatement .getTables ().getSingleTableName (), result );
89
+ }
90
+ RoutingResult routingResult = route (parameters , sqlStatement , generatedKey );
91
+ SQLRewriteEngine rewriteEngine = new SQLRewriteEngine (shardingRule , logicSQL , databaseType , sqlStatement , generatedKey );
89
92
boolean isSingleRouting = routingResult .isSingleRouting ();
90
93
if (sqlStatement instanceof SelectStatement && null != ((SelectStatement ) sqlStatement ).getLimit ()) {
91
94
processLimit (parameters , (SelectStatement ) sqlStatement , isSingleRouting );
@@ -108,7 +111,7 @@ public SQLRouteResult route(final String logicSQL, final List<Object> parameters
108
111
return result ;
109
112
}
110
113
111
- private RoutingResult route (final List <Object > parameters , final SQLStatement sqlStatement ) {
114
+ private RoutingResult route (final List <Object > parameters , final SQLStatement sqlStatement , final GeneratedKey generatedKey ) {
112
115
Collection <String > tableNames = sqlStatement .getTables ().getTableNames ();
113
116
RoutingEngine routingEngine ;
114
117
if (sqlStatement instanceof UseStatement ) {
@@ -124,20 +127,38 @@ private RoutingResult route(final List<Object> parameters, final SQLStatement sq
124
127
} else if (tableNames .isEmpty ()) {
125
128
routingEngine = new DatabaseBroadcastRoutingEngine (shardingRule );
126
129
} else if (1 == tableNames .size () || shardingRule .isAllBindingTables (tableNames ) || shardingRule .isAllInDefaultDataSource (tableNames )) {
127
- routingEngine = new StandardRoutingEngine (shardingRule , parameters , tableNames .iterator ().next (), sqlStatement );
130
+ routingEngine = new StandardRoutingEngine (shardingRule , parameters , tableNames .iterator ().next (), sqlStatement , generatedKey );
128
131
} else {
129
132
// TODO config for cartesian set
130
133
routingEngine = new ComplexRoutingEngine (shardingRule , parameters , tableNames , sqlStatement );
131
134
}
132
135
return routingEngine .route ();
133
136
}
134
137
135
- private void processGeneratedKey (final List <Object > parameters , final InsertStatement insertStatement , final SQLRouteResult sqlRouteResult ) {
136
- GeneratedKey generatedKey = insertStatement .getGeneratedKey ();
138
+ private GeneratedKey getGenerateKey (final ShardingRule shardingRule , final InsertStatement insertStatement ) {
139
+ if (null != insertStatement .getGeneratedKey ()) {
140
+ return insertStatement .getGeneratedKey ();
141
+ }
142
+ Optional <TableRule > tableRule = shardingRule .tryFindTableRuleByLogicTable (insertStatement .getTables ().getSingleTableName ());
143
+ if (!tableRule .isPresent ()) {
144
+ return null ;
145
+ }
146
+ Optional <GeneratedKeyToken > generatedKeysToken = insertStatement .findGeneratedKeyToken ();
147
+ if (!generatedKeysToken .isPresent ()) {
148
+ return null ;
149
+ }
150
+ String logicTableName = insertStatement .getTables ().getSingleTableName ();
151
+ Optional <String > generateKeyColumn = shardingRule .getGenerateKeyColumn (logicTableName );
152
+ Preconditions .checkState (generateKeyColumn .isPresent ());
153
+ return 0 == insertStatement .getParametersIndex ()
154
+ ? new GeneratedKey (generateKeyColumn .get (), -1 , shardingRule .generateKey (logicTableName )) : new GeneratedKey (generateKeyColumn .get (), insertStatement .getParametersIndex (), null );
155
+ }
156
+
157
+ private void processGeneratedKey (final List <Object > parameters , final GeneratedKey generatedKey , final String logicTableName , final SQLRouteResult sqlRouteResult ) {
137
158
if (parameters .isEmpty ()) {
138
159
sqlRouteResult .getGeneratedKeys ().add (generatedKey .getValue ());
139
160
} else if (parameters .size () == generatedKey .getIndex ()) {
140
- Number key = shardingRule .generateKey (insertStatement . getTables (). getSingleTableName () );
161
+ Number key = shardingRule .generateKey (logicTableName );
141
162
parameters .add (key );
142
163
setGeneratedKeys (sqlRouteResult , key );
143
164
} else if (-1 != generatedKey .getIndex ()) {
0 commit comments