docs: @VisibleForTesting
    ByteMap<ByteMap<List<GetRequest>>> prepareRequests(final List<Long> base_time_list, List<ByteMap<byte[][]>> tags) {
     
      final ByteMap<ByteMap<List<GetRequest>>> tsuid_rows = new ByteMap<ByteMap<List<GetRequest>>>();
      // TSUID's don't have salts
      //    final byte[] tsuid = new byte[tsdb.metrics.width() 
      //                                  + (tags.size() * tsdb.tag_names.width())
      //                                  + tags.size() * tsdb.tag_values.width()];
      //    final byte[] row_key = new byte[row_size];
  
      
      // copy tagks and tagvs to the row key
      for (ByteMap<byte[][]> each_row_key : tags) {
        
        final int row_size = (Const.SALT_WIDTH() + tsdb.metrics.width() 
          + Const.TIMESTAMP_BYTES
          + (tsdb.tag_names.width() * each_row_key.size()) 
          + (tsdb.tag_values.width() * each_row_key.size()));
         byte[] tsuid = new byte[tsdb.metrics.width() 
                                      + (each_row_key.size() * tsdb.tag_names.width())
                                      + each_row_key.size() * tsdb.tag_values.width()];
         byte[] row_key = new byte[row_size];
         int row_key_copy_offset = Const.SALT_WIDTH() + tsdb.metrics.width() 
         + Const.TIMESTAMP_BYTES;
         int tsuid_copy_offset = tsdb.metrics.width();
  
         // metric
        System.arraycopy(metric, 0, row_key, Const.SALT_WIDTH(), tsdb.metrics.width());
        System.arraycopy(metric, 0, tsuid, 0, tsdb.metrics.width());
        
        final List<GetRequest> rows = 
            new ArrayList<GetRequest>(base_time_list.size());
        for (Map.Entry<byte[], byte[][]> tag_arr : each_row_key.entrySet()) {
          byte[] tagv = tag_arr.getValue()[0]; 
          // tagk
          byte[] tagk = tag_arr.getKey();
  
          System.arraycopy(tagk, 0, row_key, row_key_copy_offset, tsdb.tag_names.width());
          System.arraycopy(tagk, 0, tsuid, tsuid_copy_offset, tsdb.tag_names.width());
          row_key_copy_offset += tsdb.tag_names.width();
          tsuid_copy_offset += tsdb.tag_names.width();
  
          // tagv
          System.arraycopy(tagv, 0, row_key, row_key_copy_offset, 
              tsdb.tag_values.width());
          System.arraycopy(tagv, 0, tsuid, tsuid_copy_offset, 
              tsdb.tag_values.width());
          row_key_copy_offset += tsdb.tag_values.width();
          tsuid_copy_offset += tsdb.tag_values.width();
          
        } 
       
      // iterate for each timestamp, making a copy of the key and tweaking it's 
      // timestamp.
      for (final long row_base_time : base_time_list) {
        final byte[] key_copy = Arrays.copyOf(row_key, row_key.length);
  
        // base time
        Internal.setBaseTime(key_copy, (int) row_base_time);
  
        if (get_all_salts) {
          for (int i = 0; i < Const.SALT_BUCKETS(); i++) {
            byte[] salt = RowKey.getSaltBytes(i);
            final byte[] copy = Arrays.copyOf(key_copy, key_copy.length);
            System.arraycopy(salt, 0, copy, 0, Const.SALT_WIDTH());
            rows.add(new GetRequest(table_to_fetch, copy, TSDB.FAMILY));
          }
        } else {
          // salt
          RowKey.prefixKeyWithSalt(key_copy);
          rows.add(new GetRequest(table_to_fetch, key_copy, TSDB.FAMILY));
        }
      } // end for
      for (GetRequest request : rows) {
        byte[] salt = new byte[Const.SALT_WIDTH()];
        System.arraycopy(request.key(), 0, salt, 0, Const.SALT_WIDTH());
        if (tsuid_rows.containsKey(salt)) {
           ByteMap<List<GetRequest>> map = tsuid_rows.get(salt);
           if (map.containsKey(tsuid)) {
             List<GetRequest> list = map.get(tsuid);
             list.add(request);
           } else {
             List<GetRequest> list = new ArrayList<GetRequest>();
             list.add(request);
             map.put(tsuid, list);
           }
        } else {
          ByteMap<List<GetRequest>> map = new ByteMap<List<GetRequest>>();
          List<GetRequest> list = new ArrayList<GetRequest>();
          list.add(request);
          map.put(tsuid, list);
          tsuid_rows.put(salt, map);
        }
      }
      }
      
      return tsuid_rows;
    }