docs: public static Deferred<Map<String, String>> getTagsAsync(final TSDB tsdb, 
        final ByteMap<byte[]> tags) {
      if (tags == null || tags.isEmpty()) {
        return Deferred.fromResult(Collections.<String, String>emptyMap());
      }
      
      final ArrayList<Deferred<String>> deferreds = 
          new ArrayList<Deferred<String>>();
      
      for (final Map.Entry<byte[], byte[]> pair : tags) {
        deferreds.add(tsdb.tag_names.getNameAsync(pair.getKey()));
        deferreds.add(tsdb.tag_values.getNameAsync(pair.getValue()));
      }
      
      class NameCB implements Callback<Map<String, String>, ArrayList<String>> {
        public Map<String, String> call(final ArrayList<String> names) 
          throws Exception {
          final HashMap<String, String> result = new HashMap<String, String>();
          String tagk = "";
          for (String name : names) {
            if (tagk.isEmpty()) {
              tagk = name;
            } else {
              result.put(tagk, name);
              tagk = "";
            }
          }
          return result;
        }
      }
      
      return Deferred.groupInOrder(deferreds).addCallback(new NameCB());
    }