Skip to content

Commit a3a0136

Browse files
committed
Improve Query/Scan inference. Fix lint errors
1 parent 3605655 commit a3a0136

File tree

5 files changed

+59
-22
lines changed

5 files changed

+59
-22
lines changed

gxdynamodb/src/main/java/com/genexus/db/dynamodb/DynamoDBErrors.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@
33
public class DynamoDBErrors
44
{
55
public static final String ValidationException = "ValidationException";
6-
public static CharSequence ValidationExceptionMessageKey = "The AttributeValue for a key attribute cannot contain an empty string value.";
6+
public static final CharSequence ValidationExceptionMessageKey = "The AttributeValue for a key attribute cannot contain an empty string value.";
77
}

gxdynamodb/src/main/java/com/genexus/db/dynamodb/DynamoDBPreparedStatement.java

Lines changed: 32 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,10 @@
1616
import java.sql.Connection;
1717
import java.sql.ResultSet;
1818
import 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.*;
2320
import java.util.regex.Matcher;
2421
import java.util.regex.Pattern;
22+
import java.util.stream.Collectors;
2523

2624
public 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
}

gxdynamodb/src/main/java/com/genexus/db/dynamodb/DynamoDBResultSet.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,12 @@
22

33
import com.genexus.CommonUtil;
44
import com.genexus.db.service.IOServiceContext;
5-
import com.genexus.db.service.ServiceError;
6-
import com.genexus.db.service.ServiceException;
75
import com.genexus.db.service.ServiceResultSet;
8-
import org.apache.commons.lang.time.DateUtils;
96
import software.amazon.awssdk.awscore.exception.AwsErrorDetails;
107
import software.amazon.awssdk.core.SdkBytes;
118
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
129
import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;
1310

14-
import java.io.ByteArrayInputStream;
1511
import java.io.InputStream;
1612
import java.math.BigDecimal;
1713
import java.sql.SQLException;
@@ -114,7 +110,7 @@ private double getDecimal(int columnIndex)
114110
.appendZoneRegionId()
115111
.appendLiteral(']').toFormatter();
116112

117-
private static DateTimeFormatter US_DATE_TIME_OR_DATE = DateTimeFormatter.ofPattern("M/d/yyyy[ HH:mm:ss]");
113+
private static final DateTimeFormatter US_DATE_TIME_OR_DATE = DateTimeFormatter.ofPattern("M/d/yyyy[ HH:mm:ss]");
118114

119115
private Instant getInstant(int columnIndex)
120116
{

gxdynamodb/src/main/java/com/genexus/db/dynamodb/DynamoQuery.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,23 @@
22

33
import com.genexus.db.service.Query;
44

5+
import java.util.Arrays;
6+
import java.util.stream.Stream;
7+
58
public class DynamoQuery extends Query{
69
private String index;
710

811
private boolean scanIndexForward = true;
912
private static final String RANGE_KEY_INDEX = "RangeKey";
1013
private String partitionKey;
14+
public String[] keyFilters = EMPTY_ARR_STRING;
15+
16+
@Override
17+
public DynamoQuery For(String tableName)
18+
{
19+
super.For(tableName);
20+
return this;
21+
}
1122

1223
@Override
1324
public DynamoQuery orderBy(String index)
@@ -29,6 +40,12 @@ public DynamoQuery setKey(String partitionKey)
2940
return this;
3041
}
3142

43+
public DynamoQuery keyFilter(String[] keyFilters)
44+
{
45+
this.keyFilters = keyFilters;
46+
return this;
47+
}
48+
3249
public String getPartitionKey(){ return partitionKey; }
3350

3451
public DynamoQuery(DataStoreHelperDynamoDB dataStoreHelper)
@@ -47,4 +64,9 @@ public void setIndex(String index) {
4764
public boolean isScanIndexForward() {
4865
return scanIndexForward;
4966
}
67+
68+
public Stream<String> getAllFilters()
69+
{
70+
return Stream.concat(Arrays.stream(keyFilters), Arrays.stream(filters));
71+
}
5072
}

java/src/main/java/com/genexus/db/service/Query.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@
33
import com.genexus.util.NameValuePair;
44

55
import java.util.ArrayList;
6+
import java.util.Arrays;
67
import java.util.HashMap;
78
import java.util.Iterator;
9+
import java.util.stream.Stream;
810

911
public class Query implements IQuery {
10-
private static final String [] EMPTY_ARR_STRING = new String [0];
12+
protected static final String [] EMPTY_ARR_STRING = new String [0];
1113
final ServiceDataStoreHelper dataStoreHelper;
1214
public Query(ServiceDataStoreHelper dataStoreHelper)
1315
{

0 commit comments

Comments
 (0)