Search code examples
javagoogle-analyticsgoogle-apigoogle-analytics-apigoogle-api-java-client

APIv4 Histogram - can't sort


I'm trying to fetch 5 days histogram from google analytics via APIv4, where each bucket is 1 day

This is the query that i'm trying to implement and it works fine when running via Query builder

{
  "reportRequests": [
    {
      "viewId": "810020000",
      "filtersExpression": "ga:pagePath=@mypage",
      "dateRanges": [
        {
          "startDate": "5daysAgo",
          "endDate": "today"
        }
      ],
      "metrics": [
        {
          "expression": "ga:entranceRate"
        }
      ],
      "dimensions": [
        {
          "name": "ga:nthDay",
          "histogramBuckets": [
            "0",
            "1",
            "2",
            "3",
            "4"
          ]
        }
      ],
      "orderBys": [
        {
          "fieldName": "ga:nthDay",
          "orderType": "HISTOGRAM_BUCKET",
          "sortOrder": "ASCENDING"
        }
      ]
    }
  ]
}

however when i try to run the same query through JAVA (APIv4) i only get a single result (if im not adding sortBy) and an error below if I add sort

{
  "code" : 400,
  "errors" : [ {
    "domain" : "global",
    "message" : "Sort key ga:nthDay is not a dimension or metric in this query.",
    "reason" : "badRequest"
  } ],
  "message" : "Sort key ga:nthDay is not a dimension or metric in this query.",
  "status" : "INVALID_ARGUMENT"
}

This is the java code

Integer uniquePageviews = analyticsApi.getUniquePageViewsHistogramDaily("5daysAgo", "today", "ga:uniquePageviews");

public Integer getUniquePageViewsHistogramDaily(String startDayPhrase, String endDayPhrase, String gaMetricsPhrase) throws IOException {
            DateRange dateRange = new DateRange();
            dateRange.setStartDate(startDayPhrase);
            dateRange.setEndDate(endDayPhrase);
            List<DateRange> dateRanges = new ArrayList<>();
            dateRanges.add(dateRange);

            Metric metric = new Metric();
            metric.setExpression(gaMetricsPhrase);
            List<Metric> metrics = new ArrayList<>();
            metrics.add(metric);

        //TODO caclulate dynamically
        List<Long> histogramBuckets = new ArrayList<>();
        histogramBuckets.add(0L);
        histogramBuckets.add(1L);
        histogramBuckets.add(2L);
        histogramBuckets.add(3L);
        histogramBuckets.add(4L);

        List<Dimension> dimensions = new ArrayList<>();
        Dimension histogram = new Dimension();
        histogram.setName("ga:nthDay");
        histogram.setHistogramBuckets(histogramBuckets);


        List<OrderBy> orderBys = new ArrayList<>();
        OrderBy orderByDay = new OrderBy();
        orderByDay.setFieldName("ga:nthDay");
        orderByDay.setOrderType("HISTOGRAM_BUCKET");
        orderByDay.setSortOrder("ASCENDING");

        orderBys.add(orderByDay);

        return getUniquePageViewsHistogramDaily(dateRanges, metrics, dimensions, "ga:pagePath=@myaccount",orderBys);
    }

    private Integer getUniquePageViewsHistogramDaily(List<DateRange> dateRangeList,
                                                     List<Metric> metrics,
                                                     List<Dimension> dimensions,
                                                     String filterExpression,
                                                     List<OrderBy> orderBys) throws IOException {

        ReportRequest request = new ReportRequest()
                .setViewId(getViewId())
                .setDateRanges(dateRangeList)
                .setDimensions(dimensions)
                .setMetrics(metrics)
                .setFiltersExpression(filterExpression)
                .setOrderBys(orderBys);

        ArrayList<ReportRequest> requests = new ArrayList<>();
        requests.add(request);

        // Create the GetReportsRequest object.
        GetReportsRequest getReport = new GetReportsRequest().setReportRequests(requests);
        // Call the batchGet method.
        GetReportsResponse response = analyticsBuilder.reports().batchGet(getReport).execute();


        return Integer.valueOf(response.getReports().get(0).getData().getTotals().get(0).getValues().get(0));
    }

How can i get a normal 5 days histogram via Java?


Solution

  • OK Thanks to Intellij I've found the issue Appears that ive forgot to add the histogram dimension to dimensions list

    dimensions.add(histogram);
    

    Now all is working as expected Thank you!