/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.jackrabbit.core.query.lucene; import javax.jcr.Node; import javax.jcr.RepositoryException; import javax.jcr.Value; import javax.jcr.query.QueryResult; import javax.jcr.query.RowIterator; import org.apache.jackrabbit.core.query.AbstractIndexingTest; /** * <code>IndexingRuleTest</code> performs indexing rule tests. */ public class IndexingRuleTest extends AbstractIndexingTest { private static final String NT_UNSTRUCTURED = "nt:unstructured"; private static final String TEXT = "the quick brown fox jumps over the lazy dog"; public void testRegexp() throws RepositoryException { Node node1 = testRootNode.addNode(nodeName1, NT_UNSTRUCTURED); node1.setProperty("rule", "regexp"); node1.setProperty("Text", "foo"); Node node2 = testRootNode.addNode(nodeName2, NT_UNSTRUCTURED); node2.setProperty("rule", "regexp"); node2.setProperty("OtherText", "foo"); Node node3 = testRootNode.addNode(nodeName3, NT_UNSTRUCTURED); node3.setProperty("rule", "regexp"); node3.setProperty("Textle", "foo"); testRootNode.save(); String stmt = "/jcr:root" + testRootNode.getPath() + "/*[jcr:contains(., 'foo')]"; checkResult(executeQuery(stmt), new Node[]{node1, node2}); } public void testBoost() throws RepositoryException { Node node1 = testRootNode.addNode(nodeName1, NT_UNSTRUCTURED); node1.setProperty("rule", "boost1"); node1.setProperty("text", TEXT); Node node2 = testRootNode.addNode(nodeName2, NT_UNSTRUCTURED); node2.setProperty("rule", "boost2"); node2.setProperty("text", TEXT); Node node3 = testRootNode.addNode(nodeName3, NT_UNSTRUCTURED); node3.setProperty("rule", "boost3"); node3.setProperty("text", TEXT); testRootNode.getSession().save(); String stmt = "/jcr:root" + testRootNode.getPath() + "/*[jcr:contains(@text, 'quick')] order by @jcr:score descending"; executeXPathQuery(stmt, new Node[] { node3, node2, node1 }); } public void testNodeScopeIndex() throws RepositoryException { Node node1 = testRootNode.addNode(nodeName1, NT_UNSTRUCTURED); node1.setProperty("rule", "nsiTrue"); node1.setProperty("text", TEXT); Node node2 = testRootNode.addNode(nodeName2, NT_UNSTRUCTURED); node2.setProperty("rule", "nsiFalse"); node2.setProperty("text", TEXT); testRootNode.save(); String stmt = "/jcr:root" + testRootNode.getPath() + "/*[jcr:contains(., 'quick')]"; checkResult(executeQuery(stmt), new Node[]{node1}); } public void testNodeType() throws RepositoryException { // assumes there is an index-rule for nt:hierarchyNode that // does not include the property jcr:created Node node1 = testRootNode.addNode(nodeName1, "nt:folder"); testRootNode.save(); String stmt = "/jcr:root" + testRootNode.getPath() + "/*[@" + jcrCreated + " = xs:dateTime('" + node1.getProperty(jcrCreated).getString() + "')]"; checkResult(executeQuery(stmt), new Node[]{}); } public void testUseInExcerpt() throws RepositoryException { Node node = testRootNode.addNode(nodeName1, NT_UNSTRUCTURED); node.setProperty("rule", "excerpt"); node.setProperty("title", "Apache Jackrabbit"); // the value below is for testing https://issues.apache.org/jira/browse/JCR-3610 node.setProperty("foo", "<some>markup</some>"); node.setProperty("text", "Jackrabbit is a JCR implementation"); testRootNode.save(); String stmt = "/jcr:root" + testRootNode.getPath() + "/*[jcr:contains(., 'jackrabbit implementation')]/rep:excerpt(.)"; RowIterator rows = executeQuery(stmt).getRows(); assertTrue("No results returned", rows.hasNext()); Value excerpt = rows.nextRow().getValue("rep:excerpt(.)"); assertNotNull("No excerpt created", excerpt); assertTrue("Title must not be present in excerpt", excerpt.getString().indexOf("Apache") == -1); assertTrue("Missing highlight", excerpt.getString().indexOf("<strong>implementation</strong>") != -1); stmt = "/jcr:root" + testRootNode.getPath() + "/*[jcr:contains(., 'apache')]/rep:excerpt(.)"; rows = executeQuery(stmt).getRows(); assertTrue("No results returned", rows.hasNext()); excerpt = rows.nextRow().getValue("rep:excerpt(.)"); assertNotNull("No excerpt created", excerpt); assertTrue("Title must not be present in excerpt", excerpt.getString().indexOf("Apache") == -1); } public void testExcerptOnExcludedProperty() throws RepositoryException { Node node = testRootNode.addNode(nodeName1, NT_UNSTRUCTURED); node.setProperty("rule", "excerpt"); node.setProperty("title", TEXT); testRootNode.save(); String stmt = "/jcr:root" + testRootNode.getPath() + "/*[jcr:contains(., 'quick')]/rep:excerpt(.)"; QueryResult result = executeQuery(stmt); checkResult(result, new Node[]{node}); Value excerpt = result.getRows().nextRow().getValue("rep:excerpt(.)"); assertNotNull("No excerpt created", excerpt); } public void testUseInExcerptWithAggregate() throws RepositoryException { Node node = testRootNode.addNode(nodeName1, NT_UNSTRUCTURED); node.setProperty("rule", "excerpt"); node.setProperty("title", "Apache Jackrabbit"); node.setProperty("text", "Jackrabbit is a JCR implementation"); Node aggregated = node.addNode("aggregated-node", NT_UNSTRUCTURED); aggregated.setProperty("rule", "excerpt"); aggregated.setProperty("title", "Apache Jackrabbit"); aggregated.setProperty("text", "Jackrabbit is a JCR implementation"); testRootNode.save(); String stmt = "/jcr:root" + testRootNode.getPath() + "/*[jcr:contains(., 'jackrabbit')]/rep:excerpt(.)"; RowIterator rows = executeQuery(stmt).getRows(); assertTrue("No results returned", rows.hasNext()); Value excerpt; while (rows.hasNext()) { excerpt = rows.nextRow().getValue("rep:excerpt(.)"); assertNotNull("No excerpt created", excerpt); assertTrue("Title must not be present in excerpt", excerpt.getString().indexOf("Apache") == -1); int idx = 0; int numHighlights = 0; for (;;) { idx = excerpt.getString().indexOf("<strong>", idx); if (idx == -1) { break; } numHighlights++; int endIdx = excerpt.getString().indexOf("</strong>", idx); assertEquals("wrong highlight", "Jackrabbit", excerpt.getString().substring(idx + "<strong>".length(), endIdx)); idx = endIdx; } assertTrue("Missing highlight", numHighlights > 0); } stmt = "/jcr:root" + testRootNode.getPath() + "/*[jcr:contains(., 'apache')]/rep:excerpt(.)"; rows = executeQuery(stmt).getRows(); assertTrue("No results returned", rows.hasNext()); excerpt = rows.nextRow().getValue("rep:excerpt(.)"); assertNotNull("No excerpt created", excerpt); assertTrue("Title must not be present in excerpt", excerpt.getString().indexOf("Apache") == -1); } }