/*
* 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.lucene.spell;
import org.apache.jackrabbit.test.AbstractJCRTest;
import org.exoplatform.services.jcr.impl.core.NodeImpl;
import java.util.Calendar;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import javax.jcr.Value;
import javax.jcr.query.Query;
import javax.jcr.query.QueryManager;
import javax.jcr.query.Row;
import javax.jcr.query.RowIterator;
/**
* <code>SpellCheckerTest</code> performs some spell checker tests.
*/
public class SpellCheckerTest extends AbstractJCRTest
{
public void testSpellChecker() throws RepositoryException
{
String text = "the quick brown fox jumps over the lazy dog";
testRootNode.setProperty("prop", text);
superuser.save();
// wait a couple of seconds, refresh interval in test config is 5 seconds
try
{
Thread.sleep(5 * 1000);
// perform a dummy check
performCheck("quick", "quick");
// wait again because refresh is done asynchronous
Thread.sleep(1 * 1000);
}
catch (InterruptedException e)
{
// ignore
}
performCheck("quik", "quick");
}
public void testSpellCheckerComplexQuery() throws RepositoryException
{
String text = "the quick brown fox jumps over the lazy dog";
Node n = testRootNode.addNode("testNode");
n.setProperty("prop", text);
superuser.save();
// wait a couple of seconds, refresh interval in test config is 5 seconds
try
{
Thread.sleep(5 * 1000);
// perform a dummy check
performCheck("quick", "quick");
// wait again because refresh is done asynchronous
Thread.sleep(1 * 1000);
}
catch (InterruptedException e)
{
// ignore
}
performCheck("quik OR (-foo bar)", "quick OR (-fox bar)");
}
public void testSpellCheckerComplexQuery2() throws RepositoryException
{
String text = "the quick brown fox jumps over the lazy dog and something else";
Node doc = testRootNode.addNode("file", "nt:file");//.setProperty("prop", text);
NodeImpl cont = (NodeImpl)doc.addNode("jcr:content", "nt:resource");
cont.setProperty("jcr:mimeType", "text/plain");
cont.setProperty("jcr:lastModified", Calendar.getInstance());
cont.setProperty("jcr:data", text);
superuser.save();
// wait a couple of seconds, refresh interval in test config is 5 seconds
try
{
Thread.sleep(5 * 1000);
// perform a dummy check
performCheck("quick", "quick");
// wait again because refresh is done asynchronous
Thread.sleep(1 * 1000);
}
catch (InterruptedException e)
{
// ignore
}
performCheck("quik % # &&& AND (-foo bar)", "quick % # &&& AND (-fox bar)");
}
public void testSpellCheckerCorrectWords() throws RepositoryException
{
String text = "the quick brown fox jumps over the lazy dog";
testRootNode.setProperty("prop", text);
superuser.save();
// wait a couple of seconds, refresh interval in test config is 5 seconds
try
{
Thread.sleep(5 * 1000);
// perform a dummy check
performCheck("quick", "quick");
// wait again because refresh is done asynchronous
Thread.sleep(1 * 1000);
}
catch (InterruptedException e)
{
// ignore
}
performCheck("quick", "quick");
}
public void testSpellCheckerIncorrectWords() throws RepositoryException
{
String text = "the quick brown fox jumps over the lazy dog";
testRootNode.setProperty("prop", text);
superuser.save();
// wait a couple of seconds, refresh interval in test config is 5 seconds
try
{
Thread.sleep(5 * 1000);
// perform a dummy check
performCheck("quick", "quick");
// wait again because refresh is done asynchronous
Thread.sleep(1 * 1000);
}
catch (InterruptedException e)
{
// ignore
}
String statement = "gismeteo";
QueryManager qm = superuser.getWorkspace().getQueryManager();
Query query = qm.createQuery("/jcr:root[rep:spellcheck('" + statement + "')]/(rep:spellcheck())", Query.XPATH);
RowIterator rows = query.execute().getRows();
assertEquals("no results returned", 1, rows.getSize());
Row r = rows.nextRow();
Value v = r.getValue("rep:spellcheck()");
assertNull("must not return a suggestion", v);
query =
qm.createQuery("select rep:spellcheck() from nt:base where " + "jcr:path = '/' and spellcheck('" + statement
+ "')", Query.SQL);
rows = query.execute().getRows();
assertEquals("no results returned", 1, rows.getSize());
r = rows.nextRow();
v = r.getValue("rep:spellcheck()");
assertNull("must not return a suggestion", v);
}
protected void performCheck(String statement, String expected) throws RepositoryException
{
QueryManager qm = superuser.getWorkspace().getQueryManager();
Query query = qm.createQuery("/jcr:root[rep:spellcheck('" + statement + "')]/(rep:spellcheck())", Query.XPATH);
RowIterator rows = query.execute().getRows();
assertEquals("no results returned", 1, rows.getSize());
Row r = rows.nextRow();
Value v = r.getValue("rep:spellcheck()");
if (statement.equals(expected))
{
assertNull("must not return a suggestion", v);
}
else
{
assertNotNull("no suggestion returned", v);
assertEquals("wrong suggestion returned", expected, v.getString());
}
query =
qm.createQuery("select rep:spellcheck() from nt:base where " + "jcr:path = '/' and spellcheck('" + statement
+ "')", Query.SQL);
rows = query.execute().getRows();
assertEquals("no results returned", 1, rows.getSize());
r = rows.nextRow();
v = r.getValue("rep:spellcheck()");
if (statement.equals(expected))
{
assertNull("must not return a suggestion", v);
}
else
{
assertNotNull("no suggestion returned", v);
assertEquals("wrong suggestion returned", expected, v.getString());
}
}
}