private static void splitVectorAcrossWorkers(BloomFilterMergeWorker[] workers, byte[] bytes,
        int start, int length) {
      if (bytes == null || length == 0) {
        return;
      }
      /*
       * This will split a byte[] across workers as below:
       * let's say there are 10 workers for 7813 bytes, in this case
       * length: 7813, elementPerBatch: 781
       * bytes assigned to workers: inclusive lower bound, exclusive upper bound
       * 1. worker: 5 -> 786
       * 2. worker: 786 -> 1567
       * 3. worker: 1567 -> 2348
       * 4. worker: 2348 -> 3129
       * 5. worker: 3129 -> 3910
       * 6. worker: 3910 -> 4691
       * 7. worker: 4691 -> 5472
       * 8. worker: 5472 -> 6253
       * 9. worker: 6253 -> 7034
       * 10. worker: 7034 -> 7813 (last element per batch is: 779)
       *
       * This way, a particular worker will be given with the same part
       * of all bloom filters along with the shared base bloom filter,
       * so the bitwise OR function will not be a subject of threading/sync issues.
       */
      int elementPerBatch =
          (int) Math.ceil((double) (length - START_OF_SERIALIZED_LONGS) / workers.length);

      for (int w = 0; w < workers.length; w++) {
        int modifiedStart = START_OF_SERIALIZED_LONGS + w * elementPerBatch;
        int modifiedLength = (w == workers.length - 1)
          ? length - (START_OF_SERIALIZED_LONGS + w * elementPerBatch) : elementPerBatch;

        ElementWrapper wrapper =
            new ElementWrapper(bytes, start, length, modifiedStart, modifiedLength);
        workers[w].add(wrapper);
      }
    }
class for storing the current aggregate value.
ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/aggregates/VectorUDAFBloomFilterMerge.java