1616import java .sql .Connection ;
1717import java .sql .ResultSet ;
1818import java .sql .SQLException ;
19- import java .util .Arrays ;
20- import java .util .HashMap ;
21- import java .util .Iterator ;
22- import java .util .Map ;
19+ import java .util .*;
2320import java .util .regex .Matcher ;
2421import java .util .regex .Pattern ;
22+ import java .util .stream .Collectors ;
2523
2624public class DynamoDBPreparedStatement extends ServicePreparedStatement
2725{
@@ -50,6 +48,7 @@ public int executeUpdate() throws SQLException
5048 }
5149
5250 private static final Pattern FILTER_PATTERN = Pattern .compile ("\\ ((.*) = :(.*)\\ )" );
51+ private static final Pattern VAR_PATTERN = Pattern .compile (".*(:.*)\\ ).*" );
5352 private int _executeQuery (DynamoDBResultSet resultSet ) throws SQLException
5453 {
5554 query .initializeParms (parms );
@@ -59,9 +58,8 @@ private int _executeQuery(DynamoDBResultSet resultSet) throws SQLException
5958
6059 if (query .getQueryType () == QueryType .QUERY )
6160 {
62- for (Iterator < VarValue > it = query .getVars ().values (). iterator (); it . hasNext (); )
61+ for (VarValue var : query .getVars ().values ())
6362 {
64- VarValue var = it .next ();
6563 values .put (var .name , DynamoDBHelper .toAttributeValue (var ));
6664 }
6765 }
@@ -97,7 +95,7 @@ private int _executeQuery(DynamoDBResultSet resultSet) throws SQLException
9795
9896 if (query .getQueryType () != QueryType .QUERY )
9997 {
100- for (String keyFilter : query .filters )
98+ for (String keyFilter : query .getAllFilters (). collect ( Collectors . toList ()) )
10199 {
102100 Matcher match = FILTER_PATTERN .matcher (keyFilter );
103101 if (match .matches () && match .groupCount () > 1 )
@@ -115,17 +113,34 @@ private int _executeQuery(DynamoDBResultSet resultSet) throws SQLException
115113 {
116114 case QUERY :
117115 {
116+ boolean issueScan = query instanceof DynamoScan ;
117+ if (!issueScan )
118+ { // Check whether a query has to be demoted to scan due to empty parameters
119+ for (String keyFilter : query .keyFilters )
120+ {
121+ Matcher match = VAR_PATTERN .matcher (keyFilter );
122+ if (match .matches ())
123+ {
124+ String varName = match .group (1 );
125+ VarValue varValue = query .getParm (varName );
126+ if (varValue != null && varValue .value .toString ().isEmpty ())
127+ {
128+ issueScan = true ;
129+ break ;
130+ }
131+ }
132+ }
133+ }
134+
118135 Iterator <HashMap <String , Object >> iterator ;
119- if (query instanceof DynamoScan )
136+ if (issueScan )
120137 {
121138 ScanRequest .Builder builder = ScanRequest .builder ()
122139 .tableName (query .tableName )
123140 .projectionExpression (String .join ("," , query .projection ));
124- if (query .filters .length > 0 )
125- {
126- builder .filterExpression (String .join (" AND " , query .filters ))
127- .expressionAttributeValues (values );
128- }
141+ String filterString = query .getAllFilters ().collect (Collectors .joining (" AND " ));
142+ if (!filterString .isEmpty ())
143+ builder .filterExpression (filterString ).expressionAttributeValues (values );
129144 if (expressionAttributeNames != null )
130145 builder .expressionAttributeNames (expressionAttributeNames );
131146
@@ -139,11 +154,13 @@ private int _executeQuery(DynamoDBResultSet resultSet) throws SQLException
139154 {
140155 QueryRequest .Builder builder = QueryRequest .builder ()
141156 .tableName (query .tableName )
142- .keyConditionExpression (String .join (" AND " , query .filters ))
157+ .keyConditionExpression (String .join (" AND " , query .keyFilters ))
143158 .expressionAttributeValues (values )
144159 .projectionExpression (String .join (", " , query .projection ))
145160 .indexName (query .getIndex ())
146161 .scanIndexForward (query .isScanIndexForward ());
162+ if (query .filters .length > 0 )
163+ builder .filterExpression (String .join (" AND " , query .filters ));
147164 if (expressionAttributeNames != null )
148165 builder .expressionAttributeNames (expressionAttributeNames );
149166
@@ -236,7 +253,7 @@ DynamoDbClient getClient() throws SQLException
236253 }
237254
238255 @ Override
239- public void setBinaryStream (int parameterIndex , InputStream x , int length ) throws SQLException
256+ public void setBinaryStream (int parameterIndex , InputStream x , int length )
240257 {
241258 parms [parameterIndex -1 ] = SdkBytes .fromInputStream (x );
242259 }
0 commit comments