77import java .util .HashMap ;
88import java .util .List ;
99import java .util .Map ;
10- import java .util .function .Function ;
11- import java .util .stream .Collectors ;
10+ import java .util .function .Supplier ;
1211
1312import tech .ydb .jdbc .YdbConst ;
1413import tech .ydb .jdbc .common .TypeDescription ;
15- import tech .ydb .jdbc .impl . YdbTypes ;
14+ import tech .ydb .jdbc .query . QueryStatement ;
1615import tech .ydb .jdbc .query .YdbPreparedQuery ;
1716import tech .ydb .jdbc .query .YdbQuery ;
1817import tech .ydb .table .query .Params ;
19- import tech .ydb .table .values .Type ;
20- import tech .ydb .table .values .Value ;
2118
2219
2320/**
2724public class InMemoryQuery implements YdbPreparedQuery {
2825 private final String yql ;
2926 private final boolean isAutoDeclare ;
30- private final JdbcParameter [] parameters ;
31- private final Map <String , JdbcParameter > parametersByName ;
32- private final Map <String , Value <?>> paramValues ;
27+ private final JdbcPrm [] parameters ;
28+ private final Map <String , JdbcPrm > parametersByName ;
3329 private final List <Params > batchList ;
3430
3531 public InMemoryQuery (YdbQuery query , boolean isAutoDeclare ) {
3632 this .yql = query .getPreparedYql ();
3733 this .isAutoDeclare = isAutoDeclare ;
38- this .parameters = query .getStatements ().stream ()
39- .flatMap (s -> s .getParams ().stream ())
40- .toArray (JdbcParameter []::new );
41- this .parametersByName = query .getStatements ().stream ()
42- .flatMap (s -> s .getParams ().stream ())
43- .collect (Collectors .toMap (JdbcParameter ::getName , Function .identity ()));
44-
45- this .paramValues = new HashMap <>();
34+
35+ int paramtersCount = 0 ;
36+ for (QueryStatement st : query .getStatements ()) {
37+ paramtersCount += st .getParams ().size ();
38+ }
39+ this .parameters = new JdbcPrm [paramtersCount ];
40+
41+ int idx = 0 ;
42+ for (QueryStatement st : query .getStatements ()) {
43+ for (Supplier <JdbcPrm > prm : st .getParams ()) {
44+ parameters [idx ++] = prm .get ();
45+ }
46+ }
47+
48+ this .parametersByName = new HashMap <>();
49+ for (JdbcPrm prm : this .parameters ) {
50+ parametersByName .put (prm .getName (), prm );
51+ }
52+
4653 this .batchList = new ArrayList <>();
4754 }
4855
@@ -53,18 +60,21 @@ public String getQueryText(Params prms) throws SQLException {
5360 }
5461
5562 StringBuilder query = new StringBuilder ();
56- Map <String , Value <?>> values = prms .values ();
57- for (JdbcParameter prm : parameters ) {
58- query .append (prm .getDeclare (values ));
59- }
63+ prms .values ().forEach ((name , value ) -> query
64+ .append ("DECLARE " )
65+ .append (name )
66+ .append (" AS " )
67+ .append (value .getType ().toString ())
68+ .append (";\n " )
69+ );
6070
6171 query .append (yql );
6272 return query .toString ();
6373 }
6474
6575 @ Override
6676 public int parametersCount () {
67- return paramValues . size () ;
77+ return parameters . length ;
6878 }
6979
7080 @ Override
@@ -73,9 +83,13 @@ public int batchSize() {
7383 }
7484
7585 @ Override
76- public void addBatch () {
77- batchList .add (Params .copyOf (paramValues ));
78- paramValues .clear ();
86+ public void addBatch () throws SQLException {
87+ Params batch = Params .create ();
88+ for (JdbcPrm prm : parameters ) {
89+ prm .copyToParams (batch );
90+ prm .reset ();
91+ }
92+ batchList .add (batch );
7993 }
8094
8195 @ Override
@@ -85,7 +99,9 @@ public void clearBatch() {
8599
86100 @ Override
87101 public void clearParameters () {
88- paramValues .clear ();
102+ for (JdbcPrm prm : parameters ) {
103+ prm .reset ();
104+ }
89105 }
90106
91107 @ Override
@@ -94,8 +110,12 @@ public List<Params> getBatchParams() {
94110 }
95111
96112 @ Override
97- public Params getCurrentParams () {
98- return Params .copyOf (paramValues );
113+ public Params getCurrentParams () throws SQLException {
114+ Params current = Params .create ();
115+ for (JdbcPrm prm : parameters ) {
116+ prm .copyToParams (current );
117+ }
118+ return current ;
99119 }
100120
101121 @ Override
@@ -111,17 +131,9 @@ public TypeDescription getDescription(int index) throws SQLException {
111131 if (index <= 0 || index > parameters .length ) {
112132 throw new SQLException (YdbConst .PARAMETER_NUMBER_NOT_FOUND + index );
113133 }
114- JdbcParameter p = parameters [index - 1 ];
115- if (p .getForcedType () != null ) {
116- return p .getForcedType ();
117- }
118-
119- Value <?> arg = paramValues .get (p .getName ());
120- if (arg != null ) {
121- return TypeDescription .of (arg .getType ());
122- }
123134
124- return null ;
135+ JdbcPrm p = parameters [index - 1 ];
136+ return p .getType ();
125137 }
126138
127139 @ Override
@@ -130,33 +142,15 @@ public void setParam(int index, Object obj, int sqlType) throws SQLException {
130142 throw new SQLException (YdbConst .PARAMETER_NUMBER_NOT_FOUND + index );
131143 }
132144
133- setParam ( parameters [index - 1 ], obj , sqlType );
145+ parameters [index - 1 ]. setValue ( obj , sqlType );
134146 }
135147
136148 @ Override
137149 public void setParam (String name , Object obj , int sqlType ) throws SQLException {
138- JdbcParameter param = parametersByName .get (name );
150+ JdbcPrm param = parametersByName .get (name );
139151 if (param == null ) {
140152 throw new SQLException (YdbConst .PARAMETER_NUMBER_NOT_FOUND + name );
141153 }
142- setParam (param , obj , sqlType );
143- }
144-
145- private void setParam (JdbcParameter param , Object obj , int sqlType ) throws SQLException {
146- if (obj instanceof Value <?>) {
147- paramValues .put (param .getName (), (Value <?>) obj );
148- return ;
149- }
150-
151- TypeDescription description = param .getForcedType ();
152- if (description == null ) {
153- Type type = YdbTypes .findType (obj , sqlType );
154- if (type == null ) {
155- throw new SQLException (String .format (YdbConst .PARAMETER_TYPE_UNKNOWN , sqlType , obj ));
156- }
157- description = TypeDescription .of (type );
158- }
159-
160- paramValues .put (param .getName (), ValueFactory .readValue (param .getName (), obj , description ));
154+ param .setValue (obj , sqlType );
161155 }
162156}
0 commit comments