/*
* 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.exoplatform.services.jcr.api.core.query;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import javax.jcr.query.Query;
import javax.jcr.query.QueryResult;
/**
* Performs tests with the <code>CONTAINS</code> function.
*/
public class FulltextQueryTest extends AbstractQueryTest {
public void testFulltextSimpleSQL1() throws Exception {
Node foo = testRootNode.addNode("foo");
foo.setProperty("mytext", new String[]{"the quick brown fox jumps over the lazy dog."});
testRootNode.save();
String sql = "SELECT * FROM nt:unstructured"
+ " WHERE jcr:path LIKE '" + testRoot + "/%"
+ "' AND CONTAINS(., 'fox')";
Query q = superuser.getWorkspace().getQueryManager().createQuery(sql, Query.SQL);
QueryResult result = q.execute();
checkResult(result, 1);
}
public void testFulltextSimpleSQL2() throws Exception {
Node foo = testRootNode.addNode("foo");
foo.setProperty("mytext", new String[]{"the quick brown fox jumps over the lazy dog."});
testRootNode.save();
String sql = "SELECT * FROM nt:unstructured"
+ " WHERE \"jcr:path\" = '" + testRoot + "/foo"
+ "' AND CONTAINS(., 'fox')";
Query q = superuser.getWorkspace().getQueryManager().createQuery(sql, Query.SQL);
QueryResult result = q.execute();
checkResult(result, 1);
}
public void testFulltextMultiWordSQL() throws Exception {
Node n = testRootNode.addNode("node1");
n.setProperty("title", new String[]{"test text"});
n.setProperty("mytext", new String[]{"the quick brown fox jumps over the lazy dog."});
n = testRootNode.addNode("node2");
n.setProperty("title", new String[]{"other text"});
n.setProperty("mytext", new String[]{"the quick brown fox jumps over the lazy dog."});
testRootNode.save();
String sql = "SELECT * FROM nt:unstructured"
+ " WHERE \"jcr:path\" LIKE '" + testRoot + "/%"
+ "' AND CONTAINS(., 'fox test')";
Query q = superuser.getWorkspace().getQueryManager().createQuery(sql, Query.SQL);
QueryResult result = q.execute();
checkResult(result, 1);
}
public void testFulltextPhraseSQL() throws Exception {
Node n = testRootNode.addNode("node1");
n.setProperty("title", new String[]{"test text"});
n.setProperty("mytext", new String[]{"the quick brown jumps fox over the lazy dog."});
n = testRootNode.addNode("node2");
n.setProperty("title", new String[]{"other text"});
n.setProperty("mytext", new String[]{"the quick brown fox jumps over the lazy dog."});
testRootNode.save();
String sql = "SELECT * FROM nt:unstructured"
+ " WHERE \"jcr:path\" LIKE '" + testRoot + "/%"
+ "' AND CONTAINS(., 'text \"fox jumps\"')";
Query q = superuser.getWorkspace().getQueryManager().createQuery(sql, Query.SQL);
QueryResult result = q.execute();
checkResult(result, 1);
}
public void testFulltextExcludeSQL() throws Exception {
Node n = testRootNode.addNode("node1");
n.setProperty("title", new String[]{"test text"});
n.setProperty("mytext", new String[]{"the quick brown fox jumps over the lazy dog."});
n = testRootNode.addNode("node2");
n.setProperty("title", new String[]{"other text"});
n.setProperty("mytext", new String[]{"the quick brown fox jumps over the lazy dog."});
superuser.getRootNode().save();
String sql = "SELECT * FROM nt:unstructured"
+ " WHERE \"jcr:path\" LIKE '" + testRoot + "/%"
+ "' AND CONTAINS(., 'text ''fox jumps'' -other')";
Query q = superuser.getWorkspace().getQueryManager().createQuery(sql, Query.SQL);
QueryResult result = q.execute();
checkResult(result, 1);
}
public void testFulltextOrSQL() throws Exception {
Node n = testRootNode.addNode("node1");
n.setProperty("title", new String[]{"test text"});
n.setProperty("mytext", new String[]{"the quick brown fox jumps over the lazy dog."});
n = testRootNode.addNode("node2");
n.setProperty("title", new String[]{"other text"});
n.setProperty("mytext", new String[]{"the quick brown fox jumps over the lazy dog."});
testRootNode.save();
String sql = "SELECT * FROM nt:unstructured"
+ " WHERE \"jcr:path\" LIKE '" + testRoot + "/%"
+ "' AND CONTAINS(., '''fox jumps'' test OR other')";
Query q = superuser.getWorkspace().getQueryManager().createQuery(sql, Query.SQL);
QueryResult result = q.execute();
checkResult(result, 2);
}
public void testFulltextIntercapSQL() throws Exception {
Node n = testRootNode.addNode("node1");
n.setProperty("title", new String[]{"tEst text"});
n.setProperty("mytext", new String[]{"The quick brown Fox jumps over the lazy dog."});
n = testRootNode.addNode("node2");
n.setProperty("title", new String[]{"Other text"});
n.setProperty("mytext", new String[]{"the quick brown FOX jumPs over the lazy dog."});
testRootNode.save();
String sql = "SELECT * FROM nt:unstructured"
+ " WHERE \"jcr:path\" LIKE '" + testRoot + "/%"
+ "' AND CONTAINS(., '''fox juMps'' Test OR otheR')";
Query q = superuser.getWorkspace().getQueryManager().createQuery(sql, Query.SQL);
QueryResult result = q.execute();
checkResult(result, 2);
}
public void testContainsStarSQL() throws RepositoryException {
Node n = testRootNode.addNode("node1");
n.setProperty("title", new String[]{"tEst text"});
n.setProperty("mytext", new String[]{"The quick brown Fox jumps over the lazy dog."});
n = testRootNode.addNode("node2");
n.setProperty("title", new String[]{"The quick brown Fox jumps over the lazy dog."});
n.setProperty("mytext", new String[]{"text text"});
testRootNode.save();
String sql = "SELECT * FROM nt:unstructured"
+ " WHERE jcr:path LIKE '" + testRoot + "/%"
+ "' AND CONTAINS(., 'fox jumps')";
Query q = superuser.getWorkspace().getQueryManager().createQuery(sql, Query.SQL);
checkResult(q.execute(), 2);
}
public void testContainsStarXPath() throws RepositoryException {
Node n = testRootNode.addNode("node1");
n.setProperty("title", new String[]{"tEst text"});
n.setProperty("mytext", new String[]{"The quick brown Fox jumps over the lazy dog."});
n = testRootNode.addNode("node2");
n.setProperty("title", new String[]{"The quick brown Fox jumps over the lazy dog."});
n.setProperty("mytext", new String[]{"text text"});
testRootNode.save();
String sql = "/jcr:root" + testRoot + "/element(*, nt:unstructured)"
+ "[jcr:contains(., 'quick fox')]";
Query q = superuser.getWorkspace().getQueryManager().createQuery(sql, Query.XPATH);
checkResult(q.execute(), 2);
}
public void testContainsPropScopeSQL() throws RepositoryException {
Node n = testRootNode.addNode("node1");
n.setProperty("title", new String[]{"tEst text"});
n.setProperty("mytext", new String[]{"The quick brown Fox jumps over the lazy dog."});
n = testRootNode.addNode("node2");
n.setProperty("title", new String[]{"The quick brown Fox jumps over the lazy dog."});
n.setProperty("mytext", new String[]{"text text"});
testRootNode.save();
String sql = "SELECT * FROM nt:unstructured"
+ " WHERE jcr:path LIKE '" + testRoot + "/%"
+ "' AND CONTAINS(title, 'fox jumps')";
Query q = superuser.getWorkspace().getQueryManager().createQuery(sql, Query.SQL);
checkResult(q.execute(), 1);
}
public void testContainsPropScopeXPath() throws RepositoryException {
Node n = testRootNode.addNode("node1");
n.setProperty("title", new String[]{"tEst text"});
n.setProperty("mytext", new String[]{"The quick brown Fox jumps over the lazy dog."});
n = testRootNode.addNode("node2");
n.setProperty("title", new String[]{"The quick brown Fox jumps over the lazy dog."});
n.setProperty("mytext", new String[]{"text text"});
testRootNode.save();
String sql = "/jcr:root" + testRoot + "/element(*, nt:unstructured)"
+ "[jcr:contains(@title, 'quick fox')]";
Query q = superuser.getWorkspace().getQueryManager().createQuery(sql, Query.XPATH);
checkResult(q.execute(), 1);
}
public void testWildcard() throws RepositoryException {
String content = "The quick brown Fox jumps over the lazy dog.";
// single * wildcard
executeContainsQuery("qu*", content, true);
executeContainsQuery("qu*ck", content, true);
executeContainsQuery("quick*", content, true);
executeContainsQuery("*quick", content, true);
executeContainsQuery("qu*Ck", content, true);
// multiple * wildcard
executeContainsQuery("*o*", content, true);
executeContainsQuery("*ump*", content, true);
executeContainsQuery("qu**ck", content, true);
executeContainsQuery("q***u**c*k", content, true);
executeContainsQuery("*uMp*", content, true);
// single ? wildcard
executeContainsQuery("quic?", content, true);
executeContainsQuery("?uick", content, true);
executeContainsQuery("qu?ck", content, true);
executeContainsQuery("qu?cK", content, true);
// multiple ? wildcard
executeContainsQuery("q??ck", content, true);
executeContainsQuery("?uic?", content, true);
executeContainsQuery("??iCk", content, true);
// no matches
executeContainsQuery("*ab*", content, false);
executeContainsQuery("q***j**c*k", content, false);
}
public void testPredefinedEntityReference() throws RepositoryException {
String content = "Max&Moritz";
executeContainsQuery("max&moritz", content, true);
}
/**
* Executes a query and checks if the query matched the test node.
*
* @param statement the query statement.
* @param content the content for the test node.
* @param match if the query matches the node.
* @throws RepositoryException if an error occurs.
*/
private void executeContainsQuery(String statement,
String content,
boolean match) throws RepositoryException {
while (testRootNode.hasNode(nodeName1)) {
testRootNode.getNode(nodeName1).remove();
}
testRootNode.addNode(nodeName1).setProperty("text", content);
testRootNode.save();
StringBuffer stmt = new StringBuffer();
stmt.append("/jcr:root").append(testRoot).append("/*");
stmt.append("[jcr:contains(., '").append(statement);
stmt.append("')]");
Query q = superuser.getWorkspace().getQueryManager().createQuery(stmt.toString(), Query.XPATH);
checkResult(q.execute(), match ? 1 : 0);
stmt = new StringBuffer();
stmt.append("SELECT * FROM nt:base ");
stmt.append("WHERE jcr:path LIKE '").append(testRoot).append("/%' ");
stmt.append("AND CONTAINS(., '").append(statement).append("')");
q = superuser.getWorkspace().getQueryManager().createQuery(stmt.toString(), Query.SQL);
checkResult(q.execute(), match ? 1 : 0);
}
}