Index: main/plugin-repository/src/org/ametys/plugins/repository/query/expression/StringExpression.java =================================================================== --- main/plugin-repository/src/org/ametys/plugins/repository/query/expression/StringExpression.java (revision 25396) +++ main/plugin-repository/src/org/ametys/plugins/repository/query/expression/StringExpression.java (working copy) @@ -72,13 +72,33 @@ public String build() { - if (_caseInsensitive) + if (_operator.equals(Operator.WD)) { - return "fn:lower-case(" + _metadata.build() + ") " + _operator + " '" + _value.toLowerCase().replaceAll("'", "''") + "'"; + if (_caseInsensitive) + { + return "jcr:like(fn:lower-case(" + _metadata.build() + "), '%" + _escapeValue(_value.toLowerCase()) + "%')"; + } + else + { + return "jcr:like(" + _metadata.build() + ", '%" + _escapeValue(_value) + "%')"; + } } else { - return _metadata.build() + " " + _operator + " '" + _value.replaceAll("'", "''") + "'"; + if (_caseInsensitive) + { + return "fn:lower-case(" + _metadata.build() + ") " + _operator + " '" + _value.toLowerCase().replaceAll("'", "''") + "'"; + } + else + { + return _metadata.build() + " " + _operator + " '" + _value.replaceAll("'", "''") + "'"; + } } } + + private String _escapeValue(String value) + { + // First escape ' - " \ _ and %, Then escape ' into '' for XQuery compliance + return value.replaceAll("(['\\-_\"\\\\%])", "\\\\$1").replaceAll("'", "''"); + } } Index: main/plugin-repository/src/org/ametys/plugins/repository/query/expression/Expression.java =================================================================== --- main/plugin-repository/src/org/ametys/plugins/repository/query/expression/Expression.java (revision 25396) +++ main/plugin-repository/src/org/ametys/plugins/repository/query/expression/Expression.java (working copy) @@ -24,6 +24,15 @@ /** Enumeration of available operators in {@link Expression} */ public enum Operator { + /** Constant of test's operator for 'like' comparison */ + WD + { + @Override + public String toString() + { + return "~"; + } + }, /** Constant of test's operator for 'less than' comparison */ LT {