public static void addFacetingRequest(
      JsonBuilder.Object jsonQuery, FacetingRequest facetingRequest) {
    String fieldName = facetingRequest.getFieldName();
    if (facetingRequest instanceof DiscreteFacetRequest) {
      JsonObject termsJsonQuery =
          JsonBuilder.object()
              .add(
                  "terms",
                  JsonBuilder.object()
                      .addProperty("field", fieldName)
                      .addProperty(
                          "size",
                          facetingRequest.getMaxNumberOfFacets() == -1
                              ? 0
                              : facetingRequest.getMaxNumberOfFacets())
                      .add("order", fromFacetSortOrder(facetingRequest.getSort()))
                      .addProperty(
                          "min_doc_count", facetingRequest.hasZeroCountsIncluded() ? 0 : 1))
              .build();

      if (isNested(fieldName)) {
        JsonBuilder.Object facetJsonQuery = JsonBuilder.object();
        facetJsonQuery.add(
            "nested",
            JsonBuilder.object().addProperty("path", FieldHelper.getEmbeddedFieldPath(fieldName)));
        facetJsonQuery.add(
            "aggregations",
            JsonBuilder.object().add(facetingRequest.getFacetingName(), termsJsonQuery));
        jsonQuery.add(facetingRequest.getFacetingName(), facetJsonQuery);
      } else {
        jsonQuery.add(facetingRequest.getFacetingName(), termsJsonQuery);
      }
    } else if (facetingRequest instanceof RangeFacetRequest<?>) {
      RangeFacetRequest<?> rangeFacetingRequest = (RangeFacetRequest<?>) facetingRequest;
      for (FacetRange<?> facetRange : rangeFacetingRequest.getFacetRangeList()) {
        JsonBuilder.Object comparisonFragment = JsonBuilder.object();
        if (facetRange.getMin() != null) {
          comparisonFragment.addProperty(
              facetRange.isMinIncluded() ? "gte" : "gt", facetRange.getMin());
        }
        if (facetRange.getMax() != null) {
          comparisonFragment.addProperty(
              facetRange.isMaxIncluded() ? "lte" : "lt", facetRange.getMax());
        }

        JsonObject rangeQuery =
            wrapQueryForNestedIfRequired(
                fieldName,
                JsonBuilder.object()
                    .add("range", JsonBuilder.object().add(fieldName, comparisonFragment))
                    .build());

        jsonQuery.add(
            facetingRequest.getFacetingName() + "-" + facetRange.getIdentifier(),
            JsonBuilder.object().add("filter", rangeQuery));
      }
    } else {
      throw new IllegalArgumentException(
          "Faceting request of type " + facetingRequest.getClass().getName() + " not supported");
    }
  }