METAMODEL-1103: Fixed Closes #115
Project: http://git-wip-us.apache.org/repos/asf/metamodel/repo Commit: http://git-wip-us.apache.org/repos/asf/metamodel/commit/1910d56f Tree: http://git-wip-us.apache.org/repos/asf/metamodel/tree/1910d56f Diff: http://git-wip-us.apache.org/repos/asf/metamodel/diff/1910d56f Branch: refs/heads/5.x Commit: 1910d56f40bd5b4cd6a10b1b312d763059dfc8bd Parents: 250b12d Author: kaspersorensen <i.am.kasper.soren...@gmail.com> Authored: Fri Jul 15 16:04:50 2016 -0700 Committer: kaspersorensen <i.am.kasper.soren...@gmail.com> Committed: Fri Jul 15 16:04:50 2016 -0700 ---------------------------------------------------------------------- CHANGES.md | 1 + .../org/apache/metamodel/util/WildcardPattern.java | 13 ++++++++++--- .../org/apache/metamodel/util/WildcardPatternTest.java | 11 +++++++++++ 3 files changed, 22 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/metamodel/blob/1910d56f/CHANGES.md ---------------------------------------------------------------------- diff --git a/CHANGES.md b/CHANGES.md index 65223ac..0b2b49d 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,6 +1,7 @@ ### Apache MetaModel 4.5.4 (work in progress) * [METAMODEL-1099] - Created a new DataContextFactory SPI and a extensible registry of implementations based on ServiceLoader. + * [METAMODEL-1103] - Fixed a bug pertaining to anchoring of wildcards in LIKE operands. * [METAMODEL-1088] - Add support for aliases in MongoDB. * [METAMODEL-1086] - Fixed encoding issue when CsvDataContext is instantiated with InputStream. * [METAMODEL-1094]Â - Added support for Apache Cassandra version 3.x. http://git-wip-us.apache.org/repos/asf/metamodel/blob/1910d56f/core/src/main/java/org/apache/metamodel/util/WildcardPattern.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/metamodel/util/WildcardPattern.java b/core/src/main/java/org/apache/metamodel/util/WildcardPattern.java index 648c2ca..715e0d2 100644 --- a/core/src/main/java/org/apache/metamodel/util/WildcardPattern.java +++ b/core/src/main/java/org/apache/metamodel/util/WildcardPattern.java @@ -32,14 +32,20 @@ import org.apache.metamodel.query.FilterItem; public final class WildcardPattern implements Serializable { private static final long serialVersionUID = 857462137797209624L; + private final boolean _startsWithDelim; + private final boolean _endsWithDelim; private String _pattern; private char _wildcard; - private boolean _endsWithDelim; public WildcardPattern(String pattern, char wildcard) { _pattern = pattern; _wildcard = wildcard; - _endsWithDelim = (_pattern.charAt(pattern.length() - 1) == _wildcard); + if(_pattern.isEmpty()){ + _startsWithDelim = _endsWithDelim = false; + } else { + _startsWithDelim = _pattern.charAt(0) == _wildcard; + _endsWithDelim = _pattern.charAt(pattern.length() - 1) == _wildcard; + } } public boolean matches(String value) { @@ -50,9 +56,10 @@ public final class WildcardPattern implements Serializable { Character.toString(_wildcard)); int charIndex = 0; while (st.hasMoreTokens()) { + int oldIndex = charIndex; String token = st.nextToken(); charIndex = value.indexOf(token, charIndex); - if (charIndex == -1) { + if (charIndex == -1 || !_startsWithDelim && oldIndex == 0 && charIndex != 0) { return false; } charIndex = charIndex + token.length(); http://git-wip-us.apache.org/repos/asf/metamodel/blob/1910d56f/core/src/test/java/org/apache/metamodel/util/WildcardPatternTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/metamodel/util/WildcardPatternTest.java b/core/src/test/java/org/apache/metamodel/util/WildcardPatternTest.java index 1e075dd..4bc45f7 100644 --- a/core/src/test/java/org/apache/metamodel/util/WildcardPatternTest.java +++ b/core/src/test/java/org/apache/metamodel/util/WildcardPatternTest.java @@ -41,5 +41,16 @@ public class WildcardPatternTest extends TestCase { assertTrue(pattern.matches("foobarbar")); assertFalse(pattern.matches("w00p")); + pattern = new WildcardPattern("oba%", '%'); + assertTrue(pattern.matches("obar")); + assertFalse(pattern.matches("foobar")); + + pattern = new WildcardPattern("bar", '%'); + assertTrue(pattern.matches("bar")); + assertFalse(pattern.matches("foobar")); + + pattern = new WildcardPattern("", '%'); + assertTrue(pattern.matches("")); + assertFalse(pattern.matches("foo")); } } \ No newline at end of file