Skip to content

Commit 20c9a88

Browse files
committed
In clause via params functional and tested.
1 parent f0d3e64 commit 20c9a88

File tree

4 files changed

+67
-11
lines changed

4 files changed

+67
-11
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
group 'com.softwareverde'
2-
version '3.0.1'
2+
version '3.1.0'
33

44
apply plugin: 'java'
55
apply plugin: 'java-library'

src/main/java/com/softwareverde/database/query/Query.java

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,21 +15,49 @@
1515

1616
public class Query {
1717
public static final TypedParameter NULL = TypedParameter.NULL;
18+
public static final String NULL_STRING = "NULL";
1819

19-
protected static String buildInClause(final Integer parameterCount) {
20+
protected static StringBuilder buildParenthesisList(final Integer parameterCount) {
2021
final StringBuilder stringBuilder = new StringBuilder();
21-
stringBuilder.append("IN (");
2222

2323
if (parameterCount > 0) {
24+
stringBuilder.append("(");
2425
String separator = "";
2526
for (int i = 0; i < parameterCount; ++i) {
2627
stringBuilder.append(separator);
2728
stringBuilder.append("?");
29+
separator = ",";
30+
}
31+
stringBuilder.append(")");
32+
}
33+
else {
34+
stringBuilder.append(NULL_STRING);
35+
}
36+
37+
return stringBuilder;
38+
}
39+
40+
protected static String buildInClause(final List<InClauseParameter> inClauseParameters) {
41+
final StringBuilder stringBuilder = new StringBuilder();
42+
stringBuilder.append("IN (");
43+
44+
if (inClauseParameters.getCount() > 0) {
45+
String separator = "";
46+
for (final InClauseParameter inClauseParameter : inClauseParameters) {
47+
stringBuilder.append(separator);
48+
if (inClauseParameter.getType() == InClauseParameter.Type.TUPLE) {
49+
final Integer parameterCount = inClauseParameter.getParameterCount();
50+
stringBuilder.append(Query.buildParenthesisList(parameterCount));
51+
}
52+
else {
53+
stringBuilder.append("?");
54+
}
55+
2856
separator = ", ";
2957
}
3058
}
3159
else {
32-
stringBuilder.append("NULL");
60+
stringBuilder.append(NULL_STRING);
3361
}
3462

3563
stringBuilder.append(")");
@@ -214,8 +242,8 @@ public String getQueryString() {
214242
break;
215243
}
216244

217-
final List<?> inClauseValues = _inClauseParameters.get(matchCount);
218-
final String inClause = Query.buildInClause(inClauseValues.getCount());
245+
final List<InClauseParameter> inClauseValues = _inClauseParameters.get(matchCount);
246+
final String inClause = Query.buildInClause(inClauseValues);
219247
matcher.appendReplacement(stringBuffer, inClause);
220248
matchCount += 1;
221249
}

src/main/java/com/softwareverde/database/util/DatabaseUtil.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,8 @@ protected DatabaseUtil() { }
5656
// return _createInClause(list, keyMap);
5757
// }
5858

59-
public static <T, V> List<V> sortMappedRows(final java.util.List<Row> rows, final List<T> rowOrder, final Map<T, V> keyMap) {
60-
final Integer itemCount = rows.size();
61-
if (! Util.areEqual(itemCount, rowOrder.getSize())) { return null; }
62-
63-
final ImmutableListBuilder<V> lockingScriptsBuilder = new ImmutableListBuilder<V>(itemCount);
59+
public static <T, V> List<V> sortMappedRows(final List<T> rowOrder, final Map<T, V> keyMap) {
60+
final ImmutableListBuilder<V> lockingScriptsBuilder = new ImmutableListBuilder<V>();
6461
for (final T key : rowOrder) {
6562
final V value = keyMap.get(key);
6663
lockingScriptsBuilder.add(value);

src/test/java/com/softwareverde/database/QueryTests.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package com.softwareverde.database;
22

3+
import com.softwareverde.constable.list.mutable.MutableList;
34
import com.softwareverde.database.query.Query;
45
import com.softwareverde.database.query.ValueExtractor;
6+
import com.softwareverde.database.query.parameter.InClauseParameter;
57
import com.softwareverde.database.query.parameter.ParameterType;
68
import com.softwareverde.database.query.parameter.TypedParameter;
9+
import com.softwareverde.util.Tuple;
710
import org.junit.Assert;
811
import org.junit.Test;
912

@@ -140,4 +143,32 @@ public void should_create_query_with_multiple_in_clauses() {
140143
Assert.assertEquals("2", parameters.get(6).value);
141144
Assert.assertEquals("3", parameters.get(7).value);
142145
}
146+
147+
@Test
148+
public void should_create_query_of_multiple_tuple_pairs() {
149+
// Setup
150+
final Query query = new Query("SELECT id FROM table WHERE (value0, value1) IN (?)");
151+
152+
final ValueExtractor<Tuple<String, String>> stringTupleExtractor = new ValueExtractor<Tuple<String, String>>() {
153+
@Override
154+
public InClauseParameter extractValues(final Tuple<String, String> tuple) {
155+
final TypedParameter typedParameter0 = new TypedParameter(tuple.first);
156+
final TypedParameter typedParameter1 = new TypedParameter(tuple.second);
157+
return new InClauseParameter(typedParameter0, typedParameter1);
158+
}
159+
};
160+
161+
final MutableList<Tuple<String, String>> values = new MutableList<Tuple<String, String>>();
162+
for (int i = 0; i < 3; ++i) {
163+
values.add(new Tuple<String, String>("Value0-" + i, "Value1-" + i));
164+
}
165+
166+
// Action
167+
query.setInClauseParameters(values, stringTupleExtractor);
168+
169+
final String queryString = query.getQueryString();
170+
171+
// Assert
172+
Assert.assertEquals("SELECT id FROM table WHERE (value0, value1) IN ((?,?), (?,?), (?,?))", queryString);
173+
}
143174
}

0 commit comments

Comments
 (0)