/**
   * Gets the all predicates.
   *
   * @param criteriaBuilder the criteria builder
   * @return the all predicates
   */
  public Predicate[] getAllPredicates(CriteriaBuilder criteriaBuilder) {
    List<Predicate> allPredicates = new ArrayList<Predicate>();

    for (PredicateGroup predicateGroup : predicates.values()) {
      List<Predicate> andPredicates = predicateGroup.getAndPredicates();

      if (!andPredicates.isEmpty()) {
        allPredicates.add(
            criteriaBuilder.and(andPredicates.toArray(new Predicate[andPredicates.size()])));
      }

      List<Predicate> orPredicates = predicateGroup.getOrPredicates();

      if (!orPredicates.isEmpty()) {
        allPredicates.add(
            criteriaBuilder.or(orPredicates.toArray(new Predicate[orPredicates.size()])));
      }
    }

    if (!andWithOrPredicates.isEmpty()) {
      List<Predicate> allAndOrPredicates = new ArrayList<Predicate>();

      for (PredicateGroup predicateGroup : andWithOrPredicates.values()) {
        List<Predicate> andPredicates = predicateGroup.getAndPredicates();

        allAndOrPredicates.add(
            criteriaBuilder.and(andPredicates.toArray(new Predicate[andPredicates.size()])));
      }

      allPredicates.add(
          criteriaBuilder.or(allAndOrPredicates.toArray(new Predicate[allAndOrPredicates.size()])));
    }

    return allPredicates.toArray(new Predicate[allPredicates.size()]);
  }
  /**
   * Adds the or predicate.
   *
   * @param index the index
   * @param predicate the predicate
   */
  public void addOrPredicate(int index, Predicate predicate) {
    PredicateGroup predicateGroup = predicates.get(index);

    if (predicateGroup == null) {
      predicateGroup = new PredicateGroup();
      predicates.put(index, predicateGroup);
    }

    predicateGroup.addOrPredicate(predicate);
  }
  /**
   * Adds the and separated by or.
   *
   * @param index the index
   * @param predicate the predicate
   */
  public void addAndSeparatedByOr(int index, Predicate predicate) {
    PredicateGroup predicateGroup = andWithOrPredicates.get(index);

    if (predicateGroup == null) {
      predicateGroup = new PredicateGroup();
      andWithOrPredicates.put(index, predicateGroup);
    }

    predicateGroup.addAndPredicate(predicate);
  }