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.
Our robust, flexible Design System provides hundreds of pre-built components you can use to build the presentation layer of your dreams.

Asset types
Module types
Page types
Brightspot is packaged with content types that get you up and running in a matter of days, including assets, modules and landing pages.

Content types
Modules
Landing pages
Everything you need to know when creating, managing, and administering content within Brightspot CMS.

Dashboards
Publishing
Workflows
Admin configurations
A guide for installing, supporting, extending, modifying and administering code on the Brightspot platform.

Field types
Content modeling
Rich-text elements
Images
A guide to configuring Brightspot's library of integrations, including pre-built options and developer-configured extensions.

Google Analytics
Shopify
Apple News