Brightspot CMS Developer Guide

Grouping


The Query API includes the groupBy method that groups retrieved objects by field, with objects with the same field value placed into the same group. A group is represented by a Grouping object, and the groupBy method returns a list of Grouping objects. (There’s also the groupByPartial method that specifies a limit on the number of Grouping objects returned.)

The following snippets use the Activity class to demonstrate the groupBy method.

public class Activity extends Record {
    @Indexed private Date activityDate;
    @Indexed private User activityUser;
    @Indexed private String groupLead;

     /* Getters and setters */
 }

The following query returns all Activity instances and groups them by their activityDate values. That is, all instances with the same activityDate value are grouped together.

Iterating the list of Grouping objects, the code calls methods on each object. The getKeys method returns the value of the field specified in the Query.groupBy method, in this case activityDate. The getCount method returns the number of Activity objects in the group.

List<Grouping<Activity>> groupings = Query.from(com.psddev.dari.test.Activity.class)
                                          .groupBy("activityDate");
/* Iterate groups */
for (Grouping grouping : groupings) {
    Date date = (Date) grouping.getKeys().get(0);
    System.out.println("Date: " + date.toString());
    long count = grouping.getCount();
    System.out.println("Count: " + count + "\n");
}

You can sort the list of Grouping objects that are returned.

List<Grouping<Activity>> groupings = Query.from(com.psddev.dari.test.Activity.class)
                                           .sortDescending("activityDate")
                                           .groupBy("activityDate");

The Grouping class also includes the createItemsQuery() method. This method returns a Query object that retrieves all of the objects in a group. In the following snippet, createItemsQuery() returns all of the Activity objects in the group that’s currently being iterated.

List<Grouping<Activity>> groupings = Query.from(com.psddev.dari.test.Activity.class).
                                            groupBy("activityDate");
/* Iterate groups */
for (Grouping grouping : groupings) {
    Date date = (Date) grouping.getKeys().get(0);
    System.out.println("Date: " + date.toString());
    long count = grouping.getCount();
    System.out.println("Count: " + count);

    List<Activity> activities = grouping.createItemsQuery().selectAll();
    /* Iterate activities in each group */
    for (Activity activity : activities) {
        System.out.println("Date: " + activity.getActivityDate().toString());
        System.out.println("User: " + activity.getUser().getUserName());
    }
}

You can group objects by more than one field. The following snippet returns all Activity instances and groups them by the activityDate field and the activityUser field.

List<Grouping<com.psddev.dari.test.Activity>> groupings = 
    Query.from(com.psddev.dari.test.Activity.class)
         .sortAscending("activityDate")
         .groupBy("activityDate", "activityUser");

for (Grouping grouping : groupings) {
    Date date = (Date) grouping.getKeys().get(0);
    System.out.println("Date: " + date.toString());
    System.out.println ("User: " + ((User) grouping.getKeys().get(1)).getUserName());
}

Previous Topic
Sorting
Next Topic
Advanced Querying
Was this topic helpful?
Thanks for your feedback.
The elements that get you up and running in a matter of days, from pre-built content types, to modules, to landing pages.

Content types
Modules
Landing pages
Everything you need to manage and administer content within Brightspot CMS, including plug-and-play integrations.

Dashboards
Publishing
Workflows
Admin configurations
A guide for installing, supporting and administering code on the Brightspot platform, including integrations requiring developer support to use.

Field types
Content modeling
Rich-text elements
Images