/**
   * This method is recursively called and compose result <code>Criterion</code> for hibernate
   * query.
   *
   * @param currentRes
   * @return
   * @see Restrictions
   */
  private Criterion parseRestriction(Restrictions currentRes) {

    log.trace("parsing restriction {}", currentRes);
    if (currentRes instanceof Conjunction) { // inner node (AND, OR, ...)
      Conjunction conjunction = (Conjunction) currentRes;
      return parseConjuction(conjunction);
    } else if (currentRes instanceof Expression) { // leaf node
      Expression expression = (Expression) currentRes;
      return parseExpression(expression);
    } else {
      log.error("Cannot parse leaf query class {}", currentRes);
      throw new IllegalStateException(
          String.format(
              "Restrictions must be instance of 'Expression' or 'Conjunction', but %s is not",
              currentRes.getClass().getName()));
    }
  }