@java.lang.Override
  public boolean equals(final java.lang.Object obj) {
    if (obj == this) {
      return true;
    }
    if (!(obj instanceof com.google.cloud.vision.v1p4beta1.Product)) {
      return super.equals(obj);
    }
    com.google.cloud.vision.v1p4beta1.Product other =
        (com.google.cloud.vision.v1p4beta1.Product) obj;

    if (!getName().equals(other.getName())) return false;
    if (!getDisplayName().equals(other.getDisplayName())) return false;
    if (!getDescription().equals(other.getDescription())) return false;
    if (!getProductCategory().equals(other.getProductCategory())) return false;
    if (!getProductLabelsList().equals(other.getProductLabelsList())) return false;
    if (!getUnknownFields().equals(other.getUnknownFields())) return false;
    return true;
  }
<pre>
Key-value pairs that can be attached to a product. At query time,
constraints can be specified based on the product_labels.

Note that integer values can be provided as strings, e.g. "1199". Only
strings with integer values can match a range-based restriction which is
to be supported soon.

Multiple values can be assigned to the same key. One product may have up to
500 product_labels.

Notice that the total number of distinct product_labels over all products
in one ProductSet cannot exceed 1M, otherwise the product search pipeline
will refuse to work for that ProductSet.
</pre>

<code>repeated .google.cloud.vision.v1p4beta1.Product.KeyValue product_labels = 5;</code>
java-vision/proto-google-cloud-vision-v1p4beta1/src/main/java/com/google/cloud/vision/v1p4beta1/Product.java