code: public static Criteria compose(final Criteria... criteria) {
          Preconditions.checkArgument(criteria.length > 0, "At least a criteria must be supplied");
          if (criteria.length == 1) {
              return criteria[0];
          } else {
              return new Compose(criteria);
          }
      }
docs: Creates a {@code Criteria} object that composes the {@code Criteria} objects specified in a
  <i>composed</i> merge criteria. Given a property whose old and new values have to be
  merged, the created composed criteria will scan through the supplied list of
  {@code Criteria} using the first matching one. As a consequence, the created criteria will
  support all the properties that are supported by at least one of the composed
  {@code Criteria}; if one of them supports all the properties, then the composed criteria
  will also support all the properties.
  
  @param criteria
  the {@code Criteria} objects to compose
  @return the created {@code Criteria} object