44
55import java .sql .SQLDataException ;
66import java .sql .SQLException ;
7- import java .sql .SQLFeatureNotSupportedException ;
87import java .util .ArrayList ;
98import java .util .List ;
109import java .util .Map ;
1918 * @author Aleksandr Gorshenin
2019 */
2120public class YdbQuery {
22- private final ParsedQuery query ;
21+ private final String originSQL ;
22+ private final String preparedYQL ;
23+ private final List <QueryStatement > statements ;
24+
2325 private final QueryType type ;
2426 private final boolean isAutoDeclare ;
2527 private final List <String > paramNames = new ArrayList <>();
2628
27- YdbQuery (ParsedQuery query , QueryType type , boolean isAutoDeclare ) {
28- this .query = query ;
29+ YdbQuery (String originSQL , String preparedYQL , List <QueryStatement > stats , QueryType type , boolean isAutoDeclare ) {
30+ this .originSQL = originSQL ;
31+ this .preparedYQL = preparedYQL ;
32+ this .statements = stats ;
2933 this .type = type ;
3034 this .isAutoDeclare = isAutoDeclare ;
31- for (QueryExpression expression : query .getExpressions ()) {
35+
36+ for (QueryStatement expression : stats ) {
3237 paramNames .addAll (expression .getParamNames ());
3338 }
3439 }
@@ -38,11 +43,11 @@ public QueryType getType() {
3843 }
3944
4045 public String getOriginSQL () {
41- return query . getOriginSQL () ;
46+ return originSQL ;
4247 }
4348
44- public List <QueryExpression > getExpressions () {
45- return query . getExpressions () ;
49+ public List <QueryStatement > getStatements () {
50+ return statements ;
4651 }
4752
4853 public boolean hasFreeParams () {
@@ -55,15 +60,15 @@ public List<String> getFreeParams() {
5560
5661 public String withParams (Params params ) throws SQLException {
5762 if (paramNames .isEmpty ()) {
58- return query . getPreparedYQL () ;
63+ return preparedYQL ;
5964 }
6065
6166 if (params == null ) {
6267 if (!paramNames .isEmpty () && isAutoDeclare ) {
6368 // Comment in place where must be declare section
64- return "-- DECLARE " + paramNames .size () + " PARAMETERS\n " + query . getPreparedYQL () ;
69+ return "-- DECLARE " + paramNames .size () + " PARAMETERS\n " + preparedYQL ;
6570 }
66- return query . getPreparedYQL () ;
71+ return preparedYQL ;
6772 }
6873
6974 StringBuilder yql = new StringBuilder ();
@@ -84,30 +89,19 @@ public String withParams(Params params) throws SQLException {
8489 }
8590 }
8691
87- yql .append (query . getPreparedYQL () );
92+ yql .append (preparedYQL );
8893 return yql .toString ();
8994 }
9095
91- public static YdbQuery parseQuery (String queryText , YdbQueryProperties opts ) throws SQLException {
92- ParsedQuery query = ParsedQuery .parse (queryText , opts );
96+ public static YdbQuery parseQuery (String query , YdbQueryProperties opts ) throws SQLException {
97+ YdbQueryParser parser = new YdbQueryParser (opts .isDetectQueryType (), opts .isDetectJdbcParameters ());
98+ String preparedYQL = parser .parseSQL (query );
99+
93100 QueryType type = opts .getForcedQueryType ();
94- if (type != null ) {
95- return new YdbQuery (query , type , opts .isDeclareJdbcParameters ());
96- }
97- for (QueryExpression exp : query .getExpressions ()) {
98- if (type == null ) {
99- type = exp .getType ();
100- } else {
101- if (type != exp .getType ()) {
102- throw new SQLFeatureNotSupportedException (
103- YdbConst .MULTI_TYPES_IN_ONE_QUERY + type + ", " + exp .getType ()
104- );
105- }
106- }
107- }
108101 if (type == null ) {
109- type = QueryType . DATA_QUERY ;
102+ type = parser . detectQueryType () ;
110103 }
111- return new YdbQuery (query , type , opts .isDeclareJdbcParameters ());
104+
105+ return new YdbQuery (query , preparedYQL , parser .getStatements (), type , opts .isDeclareJdbcParameters ());
112106 }
113107}
0 commit comments