Skip to content
This repository was archived by the owner on Oct 20, 2022. It is now read-only.

Commit 2370947

Browse files
1 parent 5fd2133 commit 2370947

File tree

2 files changed

+43
-3
lines changed

2 files changed

+43
-3
lines changed

src/main/java/com/google/visualization/datasource/util/SqlDataSourceHelper.java

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,12 @@
3434
import com.google.visualization.datasource.query.AggregationColumn;
3535
import com.google.visualization.datasource.query.AggregationType;
3636
import com.google.visualization.datasource.query.ColumnColumnFilter;
37+
import com.google.visualization.datasource.query.ColumnIsNullFilter;
3738
import com.google.visualization.datasource.query.ColumnSort;
3839
import com.google.visualization.datasource.query.ColumnValueFilter;
3940
import com.google.visualization.datasource.query.ComparisonFilter;
4041
import com.google.visualization.datasource.query.CompoundFilter;
42+
import com.google.visualization.datasource.query.NegationFilter;
4143
import com.google.visualization.datasource.query.Query;
4244
import com.google.visualization.datasource.query.QueryFilter;
4345
import com.google.visualization.datasource.query.QueryGroup;
@@ -284,11 +286,18 @@ static void appendWhereClause(Query query, StrBuilder queryStringBuilder) {
284286
private static StrBuilder buildWhereClauseRecursively(QueryFilter queryFilter) {
285287
StrBuilder whereClause = new StrBuilder();
286288

287-
// Base case of the recursion: the filter is a comparison filter.
288-
if (queryFilter instanceof ComparisonFilter) {
289+
// Base case of the recursion: the filter is not a compound filter.
290+
if (queryFilter instanceof ColumnIsNullFilter) {
291+
buildWhereClauseForIsNullFilter(whereClause, queryFilter);
292+
} else if (queryFilter instanceof ComparisonFilter) {
289293
buildWhereCluaseForComparisonFilter(whereClause, queryFilter);
294+
} else if (queryFilter instanceof NegationFilter) {
295+
whereClause.append("(NOT ");
296+
whereClause.append(buildWhereClauseRecursively(
297+
((NegationFilter) queryFilter).getSubFilter()));
298+
whereClause.append(")");
290299
} else {
291-
// The Recursion step: queryFilter is a CompoundFilter.
300+
// queryFilter is a CompoundFilter.
292301
CompoundFilter compoundFilter = (CompoundFilter) queryFilter;
293302

294303
int numberOfSubFilters = compoundFilter.getSubFilters().size();
@@ -315,6 +324,19 @@ private static StrBuilder buildWhereClauseRecursively(QueryFilter queryFilter) {
315324
return whereClause;
316325
}
317326

327+
/**
328+
* Builds a WHERE clause for is-null filter.
329+
*
330+
* @param whereClause A string builder representing the WHERE clause of the SQL query.
331+
* @param queryFilter The query filter.
332+
*/
333+
private static void buildWhereClauseForIsNullFilter(StrBuilder whereClause,
334+
QueryFilter queryFilter) {
335+
ColumnIsNullFilter filter = (ColumnIsNullFilter) queryFilter;
336+
337+
whereClause.append("(").append(filter.getColumn().getId()).append(" IS NULL)");
338+
}
339+
318340
/**
319341
* Builds the WHERE clause for comparison filter. This is the base case of
320342
* the recursive building of the WHERE clause of the sql query.

src/test/java/com/google/visualization/datasource/util/SqlDataSourceHelperTest.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,11 @@
2929
import com.google.visualization.datasource.query.AggregationColumn;
3030
import com.google.visualization.datasource.query.AggregationType;
3131
import com.google.visualization.datasource.query.ColumnColumnFilter;
32+
import com.google.visualization.datasource.query.ColumnIsNullFilter;
3233
import com.google.visualization.datasource.query.ColumnValueFilter;
3334
import com.google.visualization.datasource.query.ComparisonFilter;
3435
import com.google.visualization.datasource.query.CompoundFilter;
36+
import com.google.visualization.datasource.query.NegationFilter;
3537
import com.google.visualization.datasource.query.Query;
3638
import com.google.visualization.datasource.query.QueryFilter;
3739
import com.google.visualization.datasource.query.QueryGroup;
@@ -208,6 +210,22 @@ public void testBuildWhereClause() {
208210
SqlDataSourceHelper.appendWhereClause(query, queryStringBuilder);
209211
assertEquals(queryStringBuilder.toString(), "WHERE ((ID=Salary)) ",
210212
queryStringBuilder.toString());
213+
214+
// Check "is null".
215+
ColumnIsNullFilter isNullFilter = new ColumnIsNullFilter(new SimpleColumn("ID"));
216+
query.setFilter(isNullFilter);
217+
queryStringBuilder = new StrBuilder();
218+
SqlDataSourceHelper.appendWhereClause(query, queryStringBuilder);
219+
assertEquals("WHERE (ID IS NULL) ", queryStringBuilder.toString());
220+
221+
// Check negation.
222+
NegationFilter negationFilter =
223+
new NegationFilter(new ColumnColumnFilter(new SimpleColumn("ID"),
224+
new SimpleColumn("Salary"), ComparisonFilter.Operator.EQ));
225+
query.setFilter(negationFilter);
226+
queryStringBuilder = new StrBuilder();
227+
SqlDataSourceHelper.appendWhereClause(query, queryStringBuilder);
228+
assertEquals("WHERE (NOT (ID=Salary)) ", queryStringBuilder.toString());
211229
}
212230

213231
/**

0 commit comments

Comments
 (0)