private void putCorrelation(
     HashMap<Integer, CorrelationLevel> correlationLevels,
     ReqResFieldCorrelation reqResFieldCorrelation) {
   int level = reqResFieldCorrelation.getLevel();
   CorrelationLevel correlationLevel = correlationLevels.get(level);
   if (correlationLevel == null) {
     correlationLevel = new CorrelationLevel(level);
     correlationLevels.put(level, correlationLevel);
   }
   correlationLevel.addCorrelation(reqResFieldCorrelation);
 }
  /**
   * First correlation algorithm result analysis : computes indicators on fields within single (top)
   * level, then tries to find if the exchange is like a query (and), post or get on id, and what
   * role those fields play in this pattern.
   *
   * @param correlationLevelMap
   * @param inFieldNb
   * @param outFieldNb
   */
  private void printCorrelations(
      HashMap<Integer, CorrelationLevel> correlationLevelMap, int inFieldNb, int outFieldNb) {
    System.out.println("Found correlations, sorted y level :");
    ArrayList<CorrelationLevel> correlationLevels =
        new ArrayList<CorrelationLevel>(correlationLevelMap.values());
    Collections.sort(
        correlationLevels,
        new Comparator<CorrelationLevel>() {
          @Override
          public int compare(CorrelationLevel corrLvl1, CorrelationLevel corrLvl2) {
            return -(corrLvl1.getLevel() - corrLvl2.getLevel());
          }
        });

    boolean isAnd, isPost, isGetOnId, isOr = false;
    ArrayList<String> andInPathes, orOutPathes = null;
    for (CorrelationLevel correlationLevel : correlationLevels) {
      // int levelCorrelationNb = correlationLevel.getCorrelations().size();
      System.out.println();
      System.out.println(correlationLevel.getLevel() + ":");
      for (ReqResFieldCorrelation correlation : correlationLevel.getCorrelations()) {
        System.out.println(
            "\t"
                + correlation.getInField()
                + "\t"
                + correlation.getOutField()
                + "\t"
                + correlation.getInfo());
      }

      // TODO better : all in SQL & SQL queries, or datamining...

      // for AND
      String maxInPath;
      int maxInPathNb = 0;
      // ArrayList<ReqResFieldCorrelation> maxInPathCorrelations = new
      // ArrayList<ReqResFieldCorrelation>();
      HashMap<String, Integer> inFieldPathCorrelationMap = new HashMap<String, Integer>();
      for (ReqResFieldCorrelation correlation : correlationLevel.getCorrelations()) {
        String path = correlation.getInField().getPath();
        Object found = inFieldPathCorrelationMap.get(path);
        int nb = 1;
        if (found != null) {
          nb += inFieldPathCorrelationMap.get(path);
          if (nb > maxInPathNb) {
            maxInPath = path;
            maxInPathNb = nb;
            // maxInPathCorrelations.clear();
          }
          // maxInPathCorrelations.add(correlation);
        }
        inFieldPathCorrelationMap.put(path, nb);
      }
      // ArrayList<ReqResFieldCorrelation> singleInPathCorrelations = new
      // ArrayList<ReqResFieldCorrelation>();
      // ArrayList<ReqResFieldCorrelation> otherInPathCorrelations = new
      // ArrayList<ReqResFieldCorrelation>();
      HashSet<String> maxInPathSet = new HashSet<String>();
      HashSet<String> singleInPathSet = new HashSet<String>();
      HashSet<String> otherInPathSet = new HashSet<String>();
      for (String inPath : inFieldPathCorrelationMap.keySet()) {
        Integer inPathNb = inFieldPathCorrelationMap.get(inPath);
        if (inFieldPathCorrelationMap.get(inPath) == 1) {
          singleInPathSet.add(inPath);
        } else if (inPathNb == maxInPathNb) { // except if nb == 1
          maxInPathSet.add(inPath);
        } else {
          otherInPathSet.add(inPath);
        }
      }
      isAnd =
          !maxInPathSet
              .isEmpty() /* && (outFieldNb / ((maxInPathNb == 0) ? 1 : maxInPathNb)) / inFieldNb >= 2*/; // OPTIONAL more result field than query ones ; maxInPathNb = nb of results, outFieldNb / maxInPathNb = nb of fields per item
      isPost =
          maxInPathSet.isEmpty()
              && otherInPathSet.isEmpty()
              && !singleInPathSet.isEmpty()
              && outFieldNb / inFieldNb < 2 & inFieldNb <= outFieldNb;
      isGetOnId =
          maxInPathSet.isEmpty()
              && otherInPathSet.isEmpty()
              && !singleInPathSet.isEmpty()
              && outFieldNb / inFieldNb >= 2;
      System.out.println(
          "max/other/single/diff: "
              + maxInPathSet
              + " ; "
              + otherInPathSet
              + " ; "
              + singleInPathSet
              + " ; "
              + inFieldNb
              + ", "
              + outFieldNb);
      if (isAnd) {
        System.out.println(
            "Query (and) ! on ["
                + maxInPathSet
                + "] and optional ["
                + otherInPathSet
                + " ; "
                + singleInPathSet
                + "]");
      } else if (isPost) {
        System.out.println(
            "post ! computed fields (including ids) are [out pathes which are not in correlations]");
      } else if (isGetOnId) {
        System.out.println("get on id ! id is [" + singleInPathSet + "]");
      }

      // for OR
      HashMap<String, Integer> outFieldPathCorrelationMap = new HashMap<String, Integer>();
      for (ReqResFieldCorrelation correlation : correlationLevel.getCorrelations()) {
        String path = correlation.getOutField().getPath();
        Object found = outFieldPathCorrelationMap.get(path);
        int nb = 1;
        if (found != null) {
          nb += outFieldPathCorrelationMap.get(path);
        }
        outFieldPathCorrelationMap.put(path, nb);
      }
      ArrayList<String> curOrOutPathes = new ArrayList<String>();
      for (String outPath : outFieldPathCorrelationMap.keySet()) {
        if (outFieldPathCorrelationMap.get(outPath) > 1) {
          curOrOutPathes.add(outPath);
        }
      }
      isOr = !curOrOutPathes.isEmpty();
      // TODO
    }
  }