public Builder mergeFrom(
          com.google.cloud.visionai.v1.FacetProperty.CustomRangeBucketSpec other) {
        if (other
            == com.google.cloud.visionai.v1.FacetProperty.CustomRangeBucketSpec
                .getDefaultInstance()) return this;
        if (endpointsBuilder_ == null) {
          if (!other.endpoints_.isEmpty()) {
            if (endpoints_.isEmpty()) {
              endpoints_ = other.endpoints_;
              bitField0_ = (bitField0_ & ~0x00000001);
            } else {
              ensureEndpointsIsMutable();
              endpoints_.addAll(other.endpoints_);
            }
            onChanged();
          }
        } else {
          if (!other.endpoints_.isEmpty()) {
            if (endpointsBuilder_.isEmpty()) {
              endpointsBuilder_.dispose();
              endpointsBuilder_ = null;
              endpoints_ = other.endpoints_;
              bitField0_ = (bitField0_ & ~0x00000001);
              endpointsBuilder_ =
                  com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders
                      ? getEndpointsFieldBuilder()
                      : null;
            } else {
              endpointsBuilder_.addAllMessages(other.endpoints_);
            }
          }
        }
        this.mergeUnknownFields(other.getUnknownFields());
        onChanged();
        return this;
      }
<pre>
If bucket type is CUSTOM_RANGE, specify how values are bucketized. Use
integer bucket value as an example, when the endpoints are 0, 10, 100, and
1000, we will generate the following facets:
[-inf, 0), [0, 10), [10, 100), [100, 1000), [1000, inf).
Notably:
- endpoints must be listed in ascending order. Otherwise, the SearchConfig
  API will reject the facet config.
- &lt; 1 endpoints is an invalid spec.
</pre>

Protobuf type {@code google.cloud.visionai.v1.FacetProperty.CustomRangeBucketSpec}
java-visionai/proto-google-cloud-visionai-v1/src/main/java/com/google/cloud/visionai/v1/FacetProperty.java