/**
   * Add filter on descriptor columns .
   *
   * @param query
   * @param worklistDTO
   */
  public static void addDescriptorFilters(Query query, WorklistFilterDTO worklistDTO) {

    Map<String, DescriptorFilterDTO> descFilterMap = worklistDTO.descriptorFilterMap;

    if (null != descFilterMap) {

      Map<String, DataPath> descriptors = ProcessDefinitionUtils.getAllDescriptors(false);
      GenericDescriptorFilterModel filterModel =
          GenericDescriptorFilterModel.create(descriptors.values());
      filterModel.setFilterEnabled(true);

      for (Map.Entry<String, DescriptorFilterDTO> descriptor : descFilterMap.entrySet()) {
        Object value = null;
        String key = descriptor.getKey();

        // Boolean type desc
        if (descriptor.getValue().type.equals(ColumnDataType.BOOLEAN.toString())) {
          value = ((BooleanDTO) descriptor.getValue().value).equals;
        }
        // String type desc
        else if (descriptor.getValue().type.equals(ColumnDataType.STRING.toString())) {
          value = ((TextSearchDTO) descriptor.getValue().value).textSearch;
        }
        // Number type desc
        else if (descriptor.getValue().type.equals(ColumnDataType.NUMBER.toString())) {
          Number from = ((RangeDTO) descriptor.getValue().value).from;
          Number to = ((RangeDTO) descriptor.getValue().value).to;
          value = new NumberRange(from, to);
        }
        // Date type desc
        else if (descriptor.getValue().type.equals(ColumnDataType.DATE.toString())) {
          Long from = ((RangeDTO) descriptor.getValue().value).from;
          Long to = ((RangeDTO) descriptor.getValue().value).to;
          value = new DateRange();
          if (null != from) {
            ((DateRange) value).setFromDateValue(new Date(from));
          }
          if (null != to) {
            ((DateRange) value).setToDateValue(new Date(to));
          }
        }
        filterModel.setFilterValue(key, (Serializable) value);
      }
      DescriptorFilterUtils.applyFilters(query, filterModel);
    }
  }
  /**
   * Populates the descriptor filter values.
   *
   * @param worklistFilter
   * @param descriptorColumnsFilterJson
   */
  public static void populateDescriptorFilters(
      WorklistFilterDTO worklistFilter,
      JsonObject descriptorColumnsFilterJson,
      List<DescriptorColumnDTO> availableDescriptorColumns) {

    List<DescriptorColumnDTO> descriptorColumns = availableDescriptorColumns;

    Map<String, DescriptorFilterDTO> descriptorColumnMap =
        new HashMap<String, DescriptorFilterDTO>();

    for (DescriptorColumnDTO descriptorColumnDTO : descriptorColumns) {
      Object filterDTO = null;
      String id = descriptorColumnDTO.id;

      if (null != descriptorColumnsFilterJson.get(id)) {
        // String TYPE
        if (ColumnDataType.STRING.toString().equals(descriptorColumnDTO.type)) {
          filterDTO =
              new Gson()
                  .fromJson(
                      descriptorColumnsFilterJson.get(id), WorklistFilterDTO.TextSearchDTO.class);

        } else if (ColumnDataType.DATE.toString().equals(descriptorColumnDTO.type)
            || ColumnDataType.NUMBER.toString().equals(descriptorColumnDTO.type)) {
          filterDTO =
              new Gson()
                  .fromJson(descriptorColumnsFilterJson.get(id), WorklistFilterDTO.RangeDTO.class);
        } else if (ColumnDataType.BOOLEAN.toString().equals(descriptorColumnDTO.type)) {
          filterDTO =
              new Gson()
                  .fromJson(
                      descriptorColumnsFilterJson.get(id), WorklistFilterDTO.BooleanDTO.class);
        }
        descriptorColumnMap.put(id, new DescriptorFilterDTO(descriptorColumnDTO.type, filterDTO));
      }
    }

    worklistFilter.descriptorFilterMap = descriptorColumnMap;
  }