code: public AggregateResult aggregateQuery(String  tableName,
                                            String  metric,
                                            String  queryText,
                                            String  groupingFields,
                                            boolean bComposite) {
          Map<String, String> params = new HashMap<>();
          if (!Utils.isEmpty(metric)) {
              params.put("m", metric);
          }
          if (!Utils.isEmpty(queryText)) {
              params.put("q", queryText);
          }
          if (!Utils.isEmpty(groupingFields)) {
              // Apply URL encoding in case of Unicode characters.
              if (bComposite) {
                  params.put("cf", groupingFields);
              } else {
                  params.put("f", groupingFields);
              }
          }
          return aggregateQuery(tableName, params);
      }
docs: Perform an aggregate query with the given parameters. This is a convenience method
  that packages parameters into a Map<String,String> and calls
  {@link #aggregateQuery(String, Map)}. Optional parameters can be null or empty.
  
  @param tableName         Name of table to query. It must belong to this session's
  application.
  @param metric            Required metric expression (e.g., "COUNT(*)").
  @param queryText         Optional query expression.
  @param groupingFields    Optional list of grouping field expressions.
  @param bComposite        True if multi-level composite grouping is desired.
  @return                  Query result as an {@link AggregateResult}.