diff --git a/common/source/java/ch/systemsx/cisd/common/shared/basic/AlternativesStringFilter.java b/common/source/java/ch/systemsx/cisd/common/shared/basic/AlternativesStringFilter.java index e36dd81a1b328bc309242e4a1beec317c060f9ba..73f64973fac171c8d894d82696777b176e7f03cb 100644 --- a/common/source/java/ch/systemsx/cisd/common/shared/basic/AlternativesStringFilter.java +++ b/common/source/java/ch/systemsx/cisd/common/shared/basic/AlternativesStringFilter.java @@ -248,14 +248,38 @@ public class AlternativesStringFilter } } + static class ConjunctionMatcher implements Matcher + { + private Matcher m1; + + private Matcher m2; + + ConjunctionMatcher(Matcher m1, Matcher m2) + { + this.m1 = m1; + this.m2 = m2; + } + + public boolean matches(String value) + { + return m1.matches(value) && m2.matches(value); + } + } + /** * Sets a new filter <var>value</var>. */ public void setFilterValue(String value) { alternatives.clear(); + boolean conjunct = false; for (String s : StringUtils.tokenize(value)) { + if (s.equals("&") && alternatives.size() > 0) + { + conjunct = true; + continue; + } final boolean negateValue = s.startsWith(PREFIX_NOT); if (negateValue) { @@ -270,6 +294,11 @@ public class AlternativesStringFilter { matcher = new NegationMatcher(matcher); } + if (conjunct) + { + Matcher previousMatcher = alternatives.remove(alternatives.size() - 1); + matcher = new ConjunctionMatcher(previousMatcher, matcher); + } alternatives.add(matcher); } } diff --git a/common/sourceTest/java/ch/systemsx/cisd/common/shared/basic/AlternativesStringFilterTest.java b/common/sourceTest/java/ch/systemsx/cisd/common/shared/basic/AlternativesStringFilterTest.java index 0d20af51193178cf5ac9e50c2d8a82fab174c104..a618849bd7a344d951d5667fbaa16be89c4a7618 100644 --- a/common/sourceTest/java/ch/systemsx/cisd/common/shared/basic/AlternativesStringFilterTest.java +++ b/common/sourceTest/java/ch/systemsx/cisd/common/shared/basic/AlternativesStringFilterTest.java @@ -453,4 +453,25 @@ public class AlternativesStringFilterTest assertTrue(filter.passes("!=10.3")); } + @Test + public void testNumericalConjunction() + { + AlternativesStringFilter filter = prepare(">5 & <10"); + assertFalse(filter.passes("4")); + assertTrue(filter.passes("7")); + assertFalse(filter.passes("12")); + } + + @Test + public void testNonNumericalConjunction() + { + AlternativesStringFilter filter = prepare("ab & ba"); + assertFalse(filter.passes("ab")); + assertFalse(filter.passes("abb")); + assertTrue(filter.passes("aba")); + assertTrue(filter.passes("bab")); + assertTrue(filter.passes("abba")); + assertFalse(filter.passes("ba")); + assertFalse(filter.passes("bba")); + } }