From: <fg...@us...> - 2010-08-28 13:18:52
|
Revision: 2919 http://openutils.svn.sourceforge.net/openutils/?rev=2919&view=rev Author: fgiust Date: 2010-08-28 13:18:46 +0000 (Sat, 28 Aug 2010) Log Message: ----------- better escaping of the "OR" keyword (jackrabbit bug?) Modified Paths: -------------- trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/xpath/utils/XPathTextUtils.java trunk/openutils-mgnlcriteria/src/test/java/net/sourceforge/openutils/mgnlcriteria/advanced/XpathEscapeTest.java Modified: trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/xpath/utils/XPathTextUtils.java =================================================================== --- trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/xpath/utils/XPathTextUtils.java 2010-08-28 12:54:34 UTC (rev 2918) +++ trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/xpath/utils/XPathTextUtils.java 2010-08-28 13:18:46 UTC (rev 2919) @@ -111,9 +111,7 @@ * org.apache.jackrabbit.core.query.QueryImpl.execute() * http://stackoverflow.com/questions/1311304/keyword-or-and-search-in-lucene */ - String parseString = StringUtils.trimToEmpty(str).startsWith("OR ") - ? str.replaceFirst("\\bOR\\b", "or") - : StringUtils.trimToEmpty(str); + String parseString = StringUtils.trimToEmpty(str); /* * http://lucene.apache.org/java/2_4_0/queryparsersyntax.html#Escaping%20Special%20Characters @@ -123,6 +121,11 @@ parseString = parseString.replaceAll(escapeChars, "\\\\$0"); parseString = parseString.replaceAll("\'", "\'\'"); + if (StringUtils.startsWith(parseString, "OR ")) + { + parseString = parseString.replaceFirst("\\bOR\\b", "\"OR\""); + } + return parseString; } Modified: trunk/openutils-mgnlcriteria/src/test/java/net/sourceforge/openutils/mgnlcriteria/advanced/XpathEscapeTest.java =================================================================== --- trunk/openutils-mgnlcriteria/src/test/java/net/sourceforge/openutils/mgnlcriteria/advanced/XpathEscapeTest.java 2010-08-28 12:54:34 UTC (rev 2918) +++ trunk/openutils-mgnlcriteria/src/test/java/net/sourceforge/openutils/mgnlcriteria/advanced/XpathEscapeTest.java 2010-08-28 13:18:46 UTC (rev 2919) @@ -181,28 +181,6 @@ } @Test - public void testEscapeReservedKeyword() throws Exception - { - String searchText = "OR SONO"; - Criteria criteria = JCRCriteriaFactory.createCriteria().setWorkspace(ContentRepository.WEBSITE); - criteria.setBasePath(StringUtils.EMPTY); - criteria.add(Restrictions.eq("@jcr:primaryType", "mgnl:content")); - criteria.add(Restrictions.contains("@title", searchText)); - try - { - AdvancedResult advResult = criteria.execute(); - CriteriaTestUtils.assertNumOfResults( - 1, - CriteriaTestUtils.collectCollectionFromResult(advResult), - searchText); - } - catch (JCRQueryException e) - { - Assert.fail("Search string not properly escaped. " + e.getMessage()); - } - } - - @Test public void testEscapePipes() throws Exception { String searchText = "giovanni paolo ||"; @@ -366,6 +344,42 @@ CriteriaTestUtils.assertNumOfResults(0, result, searchText); } + @Test + public void testEscapeOrKeyword() throws Exception + { + String searchText = "OR SONO"; + Criteria criteria = JCRCriteriaFactory.createCriteria().setWorkspace(ContentRepository.WEBSITE); + criteria.setBasePath(StringUtils.EMPTY); + criteria.add(Restrictions.eq("@jcr:primaryType", "mgnl:content")); + criteria.add(Restrictions.contains("@title", searchText)); + + Assert.assertEquals( + criteria.toXpathExpression(), + "//*[( (@jcr:primaryType='mgnl:content') and ( jcr:contains(@title, '\"OR\" SONO') ) )] "); + + AdvancedResult advResult = criteria.execute(); + CriteriaTestUtils.assertNumOfResults(1, CriteriaTestUtils.collectCollectionFromResult(advResult), searchText); + + } + + @Test + public void testEscapeAndKeyword() throws Exception + { + String searchText = "AND ME"; + Criteria criteria = JCRCriteriaFactory.createCriteria().setWorkspace(ContentRepository.WEBSITE); + criteria.setBasePath(StringUtils.EMPTY); + criteria.add(Restrictions.eq("@jcr:primaryType", "mgnl:content")); + criteria.add(Restrictions.contains("@title", searchText)); + + Assert.assertEquals( + criteria.toXpathExpression(), + "//*[( (@jcr:primaryType='mgnl:content') and ( jcr:contains(@title, 'AND ME') ) )] "); + + AdvancedResult advResult = criteria.execute(); + CriteriaTestUtils.assertNumOfResults(0, CriteriaTestUtils.collectCollectionFromResult(advResult), searchText); + + } + // broken in jackrabbit 2.0/2.1 @Test(enabled = false) public void testSmile() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |