docs: NamedList<Object> getNamedList(boolean showDebugInfo) throws IOException {
      if (dataCollector.getCollectorType()
          .equals(DataCollector.COLLECTOR_TYPE_LIST)) {
        SimpleOrderedMap<Object> mtasResponseList = new SimpleOrderedMap<>();
        // functions
        Map<String, SimpleOrderedMap<Object>> functionList = new HashMap<>();
        if (functionData != null && functionData.containsKey(dataCollector)) {
          HashMap<String, MtasSolrMtasResult> functionDataItem = functionData
              .get(dataCollector);
          for (Entry<String, MtasSolrMtasResult> entry : functionDataItem
              .entrySet()) {
            MtasSolrMtasResult functionResult = entry.getValue();
            if (functionResult.dataCollector.getCollectorType()
                .equals(DataCollector.COLLECTOR_TYPE_LIST)) {
              NamedList<Object> functionNamedList = functionResult
                  .getNamedList(showDebugInfo);
              for (int i = 0; i < functionNamedList.size(); i++) {
                if (functionList.containsKey(functionNamedList.getName(i))) {
                  SimpleOrderedMap<Object> tmpMap = functionList
                      .get(functionNamedList.getName(i));
                  tmpMap.add(entry.getKey(), functionNamedList.getVal(i));
                } else {
                  SimpleOrderedMap<Object> tmpMap = new SimpleOrderedMap<>();
                  tmpMap.add(entry.getKey(), functionNamedList.getVal(i));
                  functionList.put(functionNamedList.getName(i), tmpMap);
                }
              }
            } else {
              throw new IOException("unexpected function collectorType "
                  + functionResult.dataCollector.getCollectorType());
            }
          }
        }
        // main result
        Map<String, ?> dataList = dataCollector.getResult().getList();
        for (Entry<String, ?> entry : dataList.entrySet()) {
          SimpleOrderedMap<Object> mtasResponseListItem = new SimpleOrderedMap<>();
          MtasDataItem<?, ?> dataItem = (MtasDataItem<?, ?>) entry.getValue();
          if (this.distances != null && !this.distances.isEmpty()) {
            SimpleOrderedMap<Object> mtasResponseListItemDistance = new SimpleOrderedMap<>();
            for (SubComponentDistance item : this.distances) {
              mtasResponseListItemDistance.add(item.key,
                  item.getDistance().compute(entry.getKey()));
            }
            mtasResponseListItem.add(Distance.NAME, mtasResponseListItemDistance);
          }
          mtasResponseListItem.addAll(dataItem.rewrite(showDebugInfo));
          if (functionList.containsKey(entry.getKey())) {
            mtasResponseListItem.add("functions",
                functionList.get(entry.getKey()));
          }
          if ((subDataType != null) && (dataItem.getSub() != null)) {
            MtasSolrMtasResult css = new MtasSolrMtasResult(dataItem.getSub(),
                subDataType, subStatsType, subStatsItems, subDistances,
                subSortType, subSortDirection, subStart, subNumber, functionData);
            if (dataItem.getSub().getCollectorType()
                .equals(DataCollector.COLLECTOR_TYPE_LIST)) {
              if (css.dataCollector.withTotal()) {
                mtasResponseListItem.add(
                    DataCollector.COLLECTOR_TYPE_LIST + "Total",
                    css.dataCollector.getSize());
              }
              mtasResponseListItem.add(DataCollector.COLLECTOR_TYPE_LIST,
                  css.getNamedList(showDebugInfo));
            } else if (dataItem.getSub().getCollectorType()
                .equals(DataCollector.COLLECTOR_TYPE_DATA)) {
              mtasResponseListItem.add(DataCollector.COLLECTOR_TYPE_DATA,
                  css.getData(showDebugInfo));
            }
          }
          mtasResponseList.add(entry.getKey(), mtasResponseListItem);
        }
        return mtasResponseList;
      } else {
        throw new IOException(
            "only allowed for " + DataCollector.COLLECTOR_TYPE_LIST);
      }
    }