3434import com .google .visualization .datasource .query .AggregationColumn ;
3535import com .google .visualization .datasource .query .AggregationType ;
3636import com .google .visualization .datasource .query .ColumnColumnFilter ;
37+ import com .google .visualization .datasource .query .ColumnIsNullFilter ;
3738import com .google .visualization .datasource .query .ColumnSort ;
3839import com .google .visualization .datasource .query .ColumnValueFilter ;
3940import com .google .visualization .datasource .query .ComparisonFilter ;
4041import com .google .visualization .datasource .query .CompoundFilter ;
42+ import com .google .visualization .datasource .query .NegationFilter ;
4143import com .google .visualization .datasource .query .Query ;
4244import com .google .visualization .datasource .query .QueryFilter ;
4345import 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.
0 commit comments