diff --git a/src/main/java/de/metas/ui/web/window/model/filters/DocumentFilterParam.java b/src/main/java/de/metas/ui/web/window/model/filters/DocumentFilterParam.java index 76341071b..da01eb7ab 100644 --- a/src/main/java/de/metas/ui/web/window/model/filters/DocumentFilterParam.java +++ b/src/main/java/de/metas/ui/web/window/model/filters/DocumentFilterParam.java @@ -41,6 +41,7 @@ public static final DocumentFilterParam ofSqlWhereClause(final boolean joinAnd, public static enum Operator { EQUAL, NOT_EQUAL, // + IN_ARRAY, // LIKE, // /** Like (case-insensitive) */ LIKE_I, // diff --git a/src/main/java/de/metas/ui/web/window/model/sql/SqlDocumentFiltersBuilder.java b/src/main/java/de/metas/ui/web/window/model/sql/SqlDocumentFiltersBuilder.java index fa21223c4..4b24cd47d 100644 --- a/src/main/java/de/metas/ui/web/window/model/sql/SqlDocumentFiltersBuilder.java +++ b/src/main/java/de/metas/ui/web/window/model/sql/SqlDocumentFiltersBuilder.java @@ -1,7 +1,10 @@ package de.metas.ui.web.window.model.sql; import java.util.ArrayList; +import java.util.Collection; import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; import org.adempiere.db.DBConstants; import org.compiere.util.DB; @@ -126,67 +129,79 @@ private String buildSqlWhereClause(final List sqlParams, final DocumentF final SqlEntityFieldBinding fieldBinding = entityBinding.getFieldByFieldName(fieldName); final String columnSql = fieldBinding.getColumnSql(); - final String columnName = fieldBinding.getColumnName(); - final DocumentFieldWidgetType widgetType = fieldBinding.getWidgetType(); - final Class targetClass = fieldBinding.getSqlValueClass(); - final Object sqlValue = SqlDocumentsRepository.convertValueToPO(filterParam.getValue(), columnName, widgetType, targetClass); final Operator operator = filterParam.getOperator(); switch (operator) { case EQUAL: { + final Object sqlValue = convertToSqlValue(filterParam.getValue(), fieldBinding); final boolean negate = false; return buildSqlWhereClause_Equals(columnSql, sqlValue, negate, sqlParams); } case NOT_EQUAL: { + final Object sqlValue = convertToSqlValue(filterParam.getValue(), fieldBinding); final boolean negate = true; return buildSqlWhereClause_Equals(columnSql, sqlValue, negate, sqlParams); } + case IN_ARRAY: + { + final List sqlValuesList = convertToSqlValuesList(filterParam.getValue(), fieldBinding); + return buildSqlWhereClause_InArray(columnSql, sqlValuesList, sqlParams); + } case GREATER: { + final Object sqlValue = convertToSqlValue(filterParam.getValue(), fieldBinding); return buildSqlWhereClause_Compare(columnSql, ">", sqlValue, sqlParams); } case GREATER_OR_EQUAL: { + final Object sqlValue = convertToSqlValue(filterParam.getValue(), fieldBinding); return buildSqlWhereClause_Compare(columnSql, ">=", sqlValue, sqlParams); } case LESS: { + final Object sqlValue = convertToSqlValue(filterParam.getValue(), fieldBinding); return buildSqlWhereClause_Compare(columnSql, "<", sqlValue, sqlParams); } case LESS_OR_EQUAL: { + final Object sqlValue = convertToSqlValue(filterParam.getValue(), fieldBinding); return buildSqlWhereClause_Compare(columnSql, "<=", sqlValue, sqlParams); } case LIKE: { + final Object sqlValue = convertToSqlValue(filterParam.getValue(), fieldBinding); final boolean negate = false; final boolean ignoreCase = false; return buildSqlWhereClause_Like(columnSql, negate, ignoreCase, sqlValue, sqlParams); } case NOT_LIKE: { + final Object sqlValue = convertToSqlValue(filterParam.getValue(), fieldBinding); final boolean negate = true; final boolean ignoreCase = false; return buildSqlWhereClause_Like(columnSql, negate, ignoreCase, sqlValue, sqlParams); } case LIKE_I: { + final Object sqlValue = convertToSqlValue(filterParam.getValue(), fieldBinding); final boolean negate = false; final boolean ignoreCase = true; return buildSqlWhereClause_Like(columnSql, negate, ignoreCase, sqlValue, sqlParams); } case NOT_LIKE_I: { + final Object sqlValue = convertToSqlValue(filterParam.getValue(), fieldBinding); final boolean negate = true; final boolean ignoreCase = true; return buildSqlWhereClause_Like(columnSql, negate, ignoreCase, sqlValue, sqlParams); } case BETWEEN: { - final Object sqlValueTo = SqlDocumentsRepository.convertValueToPO(filterParam.getValueTo(), columnName, widgetType, targetClass); + final Object sqlValue = convertToSqlValue(filterParam.getValue(), fieldBinding); + final Object sqlValueTo = convertToSqlValue(filterParam.getValueTo(), fieldBinding); return buildSqlWhereClause_Between(columnSql, sqlValue, sqlValueTo, sqlParams); } default: @@ -196,6 +211,33 @@ private String buildSqlWhereClause(final List sqlParams, final DocumentF } } + private Object convertToSqlValue(final Object value, final SqlEntityFieldBinding fieldBinding) + { + final String columnName = fieldBinding.getColumnName(); + final DocumentFieldWidgetType widgetType = fieldBinding.getWidgetType(); + final Class targetClass = fieldBinding.getSqlValueClass(); + final Object sqlValue = SqlDocumentsRepository.convertValueToPO(value, columnName, widgetType, targetClass); + return sqlValue; + } + + private List convertToSqlValuesList(final Object valuesAsObj, final SqlEntityFieldBinding fieldBinding) + { + final Stream valuesStream; + if (valuesAsObj instanceof Collection) + { + Collection valuesCollection = (Collection)valuesAsObj; + valuesStream = valuesCollection.stream(); + } + else + { + throw new IllegalArgumentException("Value type not supported: " + valuesAsObj); + } + + return valuesStream + .map(value -> convertToSqlValue(value, fieldBinding)) + .collect(Collectors.toCollection(ArrayList::new)); + } + private static final String buildSqlWhereClause_Equals(final String sqlColumnExpr, final Object sqlValue, final boolean negate, final List sqlParams) { if (sqlValue == null) @@ -224,6 +266,11 @@ private static final String buildSqlWhereClause_Compare(final String sqlColumnEx .toString(); } + private static final String buildSqlWhereClause_InArray(final String sqlColumnExpr, final List sqlValues, final List sqlParams) + { + return DB.buildSqlList(sqlColumnExpr, sqlValues, sqlParams); + } + private static final String buildSqlWhereClause_Like(final String sqlColumnExpr, final boolean negate, final boolean ignoreCase, final Object sqlValue, final List sqlParams) { if (sqlValue == null) @@ -295,11 +342,11 @@ public String replaceTableNameWithTableAlias(final String sql) public SqlDocumentFiltersBuilder addFilters(final List filters) { - if(filters == null || filters.isEmpty()) + if (filters == null || filters.isEmpty()) { return this; } - + this.filters.addAll(filters); return this; }