blob: f4f5e4a197edd1d5261ddb1da7d58ec49016cabd [file] [log] [blame]
/*
* 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.oak.jcr.query;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.query.Query;
import javax.jcr.query.QueryManager;
import javax.jcr.query.QueryResult;
import javax.jcr.query.RowIterator;
import org.apache.jackrabbit.core.query.AbstractQueryTest;
/**
* Tests the fulltext index.
*/
public class QueryFulltextTest extends AbstractQueryTest {
public void testScore() throws Exception {
Session session = superuser;
QueryManager qm = session.getWorkspace().getQueryManager();
Node n1 = testRootNode.addNode("node1");
n1.setProperty("text", "hello hello hello");
Node n2 = testRootNode.addNode("node2");
n2.setProperty("text", "hello");
session.save();
String xpath = "/jcr:root//*[jcr:contains(@text, 'hello')] order by jcr:score()";
Query q = qm.createQuery(xpath, "xpath");
String result = getResult(q.execute(), "jcr:score");
// expect two numbers (any value)
result = result.replaceAll("[0-9\\.]+", "n");
assertEquals("n, n", result);
}
public void testNativeMatchAll() throws Exception {
Session session = superuser;
QueryManager qm = session.getWorkspace().getQueryManager();
String sql2 = "select [jcr:path] as [path] from [nt:base] " +
"where native('solr', '*:*')";
Query q = qm.createQuery(sql2, Query.JCR_SQL2);
QueryResult result = q.execute();
NodeIterator nodes = result.getNodes();
while (nodes.hasNext()) {
Node node = nodes.nextNode();
assertNotNull(node);
}
}
public void testFulltext() throws Exception {
Session session = superuser;
QueryManager qm = session.getWorkspace().getQueryManager();
Node n1 = testRootNode.addNode("node1");
n1.setProperty("text", "hello");
Node n2 = testRootNode.addNode("node2");
n2.setProperty("text", "hallo");
Node n3 = testRootNode.addNode("node3");
n3.setProperty("text", "hello hallo");
session.save();
// lowercase "or" mean search for the term "or"
String sql2 = "select [jcr:path] as [path] from [nt:base] " +
"where contains([text], 'hello or hallo') order by [jcr:path]";
Query q = qm.createQuery(sql2, Query.JCR_SQL2);
assertEquals("", getResult(q.execute(), "path"));
}
public void testFulltextRelativeProperty() throws Exception {
Session session = superuser;
QueryManager qm = session.getWorkspace().getQueryManager();
Node n1 = testRootNode.addNode("node1");
n1.setProperty("text", "hello");
Node n2 = testRootNode.addNode("node2");
n2.setProperty("text", "hallo");
Node n3 = testRootNode.addNode("node3");
n3.setProperty("text", "hello hallo");
session.save();
Query q;
String sql2 = "select [jcr:path] as [path] from [nt:base] " +
"where ISCHILDNODE([/testroot])" +
" AND CONTAINS(text, 'hallo')";
q = qm.createQuery(sql2, Query.JCR_SQL2);
assertEquals("/testroot/node2, /testroot/node3", getResult(q.execute(), "path"));
sql2 = "select [jcr:path] as [path] from [nt:base] "
+ "where contains([node1/text], 'hello') order by [jcr:path]";
q = qm.createQuery(sql2, Query.JCR_SQL2);
assertEquals("/testroot", getResult(q.execute(), "path"));
sql2 = "select [jcr:path] as [path] from [nt:base] "
+ "where contains([node2/text], 'hello OR hallo') order by [jcr:path]";
q = qm.createQuery(sql2, Query.JCR_SQL2);
assertEquals("/testroot", getResult(q.execute(), "path"));
sql2 = "select [jcr:path] as [path] from [nt:base] "
+ "where contains([node1/text], 'hello') "
+ "and contains([node2/text], 'hallo') "
+ "order by [jcr:path]";
q = qm.createQuery(sql2, Query.JCR_SQL2);
assertEquals("/testroot", getResult(q.execute(), "path"));
}
public void testInValues() throws Exception {
Session session = superuser;
QueryManager qm = session.getWorkspace().getQueryManager();
Node n1 = testRootNode.addNode("node1");
n1.setProperty("text", "hello");
Node n2 = testRootNode.addNode("node2");
n2.setProperty("text", "hallo");
Node n3 = testRootNode.addNode("node3");
n3.setProperty("text", "hello hallo");
session.save();
String sql2 = "select [jcr:path] as [path], [jcr:score], * from [nt:base] as a " +
"where [text] in('hello', 'hallo')";
Query q = qm.createQuery(sql2, Query.JCR_SQL2);
String path = getResult(q.execute(), "path");
assertEquals("/testroot/node1, /testroot/node2", path);
}
static String getResult(QueryResult result, String propertyName) throws RepositoryException {
StringBuilder buff = new StringBuilder();
RowIterator it = result.getRows();
while (it.hasNext()) {
if (buff.length() > 0) {
buff.append(", ");
}
buff.append(it.nextRow().getValue(propertyName).getString());
}
return buff.toString();
}
}