Search code examples
google-analytics-apigoogle-analytics-4google-analytics-data-api

How to filter by dimension using Google Analytics Data API (GA4) Java client library?


I am trying to call Google Analytics Data API (GA4) using the Java client library and applying a dimension filter. This is the call which is working if I don't use the setDimensionFilter call:

RunReportRequest request =
    RunReportRequest.newBuilder()
        .setProperty(propertyId)
        .addDimensions(com.google.analytics.data.v1beta.Dimension.newBuilder().setName("pageLocation"))
        .addMetrics(com.google.analytics.data.v1beta.Metric.newBuilder().setName("screenPageViews"))
        .addMetrics(com.google.analytics.data.v1beta.Metric.newBuilder().setName("activeUsers"))
//        .setDimensionFilter(FilterExpression.newBuilder().setFilter(Filter.newBuilder().setStringFilter(
//             Filter.StringFilter.newBuilder()
//               .setMatchType(Filter.StringFilter.MatchType.FULL_REGEXP)
//               .setField(Descriptors.FieldDescriptor, "pageLocation")
//               .setValue("MY_REGEXP")
//               .build())))
        .addDateRanges(com.google.analytics.data.v1beta.DateRange.newBuilder()
        .setStartDate(startDate.toStringYYYYMMDDWithDashes())
        .setEndDate(endDate.toStringYYYYMMDDWithDashes()))
        .setKeepEmptyRows(true)
        .build();

I don't know how to use setDimensionFilter. If the usage which is commented in the previous code is correct, then the only thing missing is the call to setField. I don't know how to generate the Descriptors.FieldDescriptor instance (or even its meaning).

I have reviewed the client library javadoc, and also the code samples (which are really simple and unfortunately do not show any usage of setDimensionFilter).


Solution

  • The Descriptors.FieldDescriptor isn't part of the GA4 Data API and is an internal functionality of the protobuf framework

    If you are trying to call this filter on a field with the name 'pageLocation' instead of using setField, I think you can do something like this

    RunReportRequest request =
        RunReportRequest.newBuilder()
            .setProperty("properties/" + propertyId)
            .addDimensions(com.google.analytics.data.v1beta.Dimension.newBuilder().setName("pageLocation"))
            .addMetrics(com.google.analytics.data.v1beta.Metric.newBuilder().setName("screenPageViews"))
            .addMetrics(com.google.analytics.data.v1beta.Metric.newBuilder().setName("activeUsers"))
            .setDimensionFilter(FilterExpression.newBuilder()
                .setFilter(Filter.newBuilder()
                    .setFieldName("pageLocation")
                    .setStringFilter(Filter.StringFilter.newBuilder()
                        .setMatchType(Filter.StringFilter.MatchType.FULL_REGEXP)
                        .setValue("MY_REGEXP"))))
            .addDateRanges(com.google.analytics.data.v1beta.DateRange.newBuilder()
                .setStartDate("2020-03-31")
                .setEndDate("2021-03-31"))
            .build();
    

    Also, if you want an additional example of how to use setDimensionFilter, here is another code example that might help

    RunReportRequest request =
              RunReportRequest.newBuilder()
                  .setProperty("properties/" + propertyId)
                  .addDimensions(Dimension.newBuilder().setName("city"))
                  .addMetrics(Metric.newBuilder().setName("activeUsers"))
                  .addDateRanges(DateRange.newBuilder().setStartDate("2020-03-31").setEndDate("today"))
                  .setDimensionFilter(FilterExpression.newBuilder()
                      .setAndGroup(FilterExpressionList.newBuilder()
                          .addExpressions(FilterExpression.newBuilder()
                              .setFilter(Filter.newBuilder()
                                  .setFieldName("platform")
                                  .setStringFilter(Filter.StringFilter.newBuilder()
                                      .setMatchType(Filter.StringFilter.MatchType.EXACT)
                                      .setValue("Android"))))
                          .addExpressions(FilterExpression.newBuilder()
                              .setFilter(Filter.newBuilder()
                                  .setFieldName("eventName")
                                  .setStringFilter(Filter.StringFilter.newBuilder()
                                      .setMatchType(Filter.StringFilter.MatchType.EXACT)
                                      .setValue("in_app_purchase"))))))
                  .setMetricFilter(FilterExpression.newBuilder()
                      .setFilter(Filter.newBuilder()
                          .setFieldName("sessions")
                          .setNumericFilter(Filter.NumericFilter.newBuilder()
                              .setOperation(Filter.NumericFilter.Operation.GREATER_THAN)
                              .setValue(NumericValue.newBuilder()
                                  .setInt64Value(1000)))))
                  .build();