blob: 87d82dfb06166c9c19c6414a048b5666946d655c [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.query.ast;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.text.ParseException;
import org.apache.jackrabbit.oak.spi.query.fulltext.FullTextExpression;
import org.apache.jackrabbit.oak.spi.query.fulltext.FullTextParser;
import org.apache.jackrabbit.oak.spi.query.fulltext.FullTextTerm;
import org.junit.Test;
/**
* Test the fulltext parsing and evaluation.
*/
public class FullTextTest {
@Test
public void fulltextChars() {
for (char c : "a\u00e4\u00dfzAZ\u00c409+\u3360".toCharArray()) {
assertTrue("char:" + c, FullTextTerm.isFullTextCharacter(c));
}
for (char c : "@-.,;!?\t\n\f".toCharArray()) {
assertFalse("char:" + c, FullTextTerm.isFullTextCharacter(c));
}
}
@Test
public void and() throws ParseException {
assertEquals("\"hello\" \"world\"", convertPattern("hello world"));
assertEquals("\"hello\" \"world\"", convertPattern("hello world"));
assertEquals("\"hello\" \"world\"", convertPattern("hello world"));
assertEquals("\"hello\" \"world\"", convertPattern("hello \t world"));
assertEquals("\"hello\" \"or\" \"world\"", convertPattern("hello or world"));
assertFalse(test("hello world", "hello"));
assertFalse(test("hello world", "world"));
assertTrue(test("hello world", "world hello"));
assertTrue(test("hello world ", "hello world"));
assertEquals("\"hello\"", convertPattern("hello hello"));
}
@Test
public void or() throws ParseException {
assertEquals("\"hello\" OR \"world\"", convertPattern("hello OR world"));
assertTrue(test("hello OR world", "hello"));
assertTrue(test("hello OR world", "world"));
assertFalse(test("hello OR world", "hi"));
}
@Test
public void minusLiteral() throws ParseException {
assertEquals("\"-\"", convertPattern("-"));
assertEquals("\"-\"", convertPattern("- "));
assertEquals("\"-\"", convertPattern("- -"));
assertEquals("\"-\" \"hello\"", convertPattern("- hello"));
assertEquals("\"hello\" \"-\" \"world\"", convertPattern("hello - world"));
assertEquals("\"hello\" \"-\" \"world\"", convertPattern("hello - world"));
assertEquals("\"hello\" \"-\"", convertPattern("hello -"));
assertEquals("\"hello\" \"-\"", convertPattern("hello -"));
assertEquals("\"hello\" \"-\"", convertPattern("hello - hello"));
assertTrue(test("-", "hello - world"));
assertTrue(test("- ", "hello - world"));
assertTrue(test("- -", "hello - world"));
assertTrue(test("- hello", "hello - world"));
assertTrue(test("hello - world", "hello - world"));
assertTrue(test("hello - \"wonderful world\"", "hello - wonderful world"));
assertTrue(test("hello -", "hello -"));
}
@Test
public void not() throws ParseException {
assertEquals("\"hello\" -\"wonderful world\"", convertPattern("hello -\"wonderful world\""));
assertTrue(test("hello -\"wonderful world\"", "hello"));
assertTrue(test("hello -\"wonderful world\"", "hello wonderful"));
assertTrue(test("hello -\"wonderful world\"", "hello world"));
assertFalse(test("hello -\"wonderful world\"", "hello wonderful world"));
assertFalse(test("hello -\"wonderful world\"", "wonderful world"));
assertTrue(test("hello \"-wonderful world\"", "hello this beautiful -wonderful world"));
assertEquals("\"hello\" -\"world\"", convertPattern("hello -world"));
assertTrue(test("hello -world", "hello"));
assertFalse(test("hello -world", "hello world"));
}
@Test
public void quoted() throws ParseException {
assertEquals("\"hello world\"", convertPattern("\"hello world\""));
assertEquals("\"hello world\" \"world\"", convertPattern("\"hello world\" world"));
assertTrue(test("\"hello world\"", "hello world"));
assertFalse(test("\"hello world\"", "world hello"));
assertTrue(test("\"hello-world\"", "hello-world"));
assertTrue(test("\"hello\\-world\"", "hello-world"));
assertTrue(test("\"hello \\\"world\\\"\"", "hello \"world\""));
assertTrue(test("\"hello world\" -hallo", "hello world"));
assertFalse(test("\"hello world\" -hallo", "hallo hello world"));
}
@Test
public void escaped() throws ParseException {
assertEquals("\"\\\"hello world\\\"\"", convertPattern("\"\\\"hello world\\\"\""));
assertFalse(test("\\\"hello\\\"", "hello"));
assertTrue(test("\"hello\"", "\"hello\""));
assertTrue(test("\\\"hello\\\"", "\"hello\""));
assertFalse(test("\\-1 2 3", "1 2 3"));
assertTrue(test("\\-1 2 3", "-1 2 3"));
}
@Test
public void boost() throws ParseException {
assertEquals("\"hello\"^2", convertPattern("hello^2"));
assertEquals("\"hello world\"^2", convertPattern("\"hello world\"^2"));
assertTrue(test("hello^2", "hello"));
assertTrue(test("\"hello\"^0.2", "hello"));
}
@Test
public void invalid() throws ParseException {
testInvalid("", "(*); expected: term");
testInvalid("x OR ", "x OR(*); expected: term");
testInvalid("\"", "(*)\"; expected: double quote");
testInvalid("\\", "(*)\\; expected: escaped char");
testInvalid("\"\\", "\"(*)\\; expected: escaped char");
testInvalid("\"x\"y", "\"x\"(*)y; expected: space");
}
private static void testInvalid(String pattern, String expectedMessage) {
try {
test(pattern, "");
fail("Expected exception " + expectedMessage);
} catch (ParseException e) {
String msg = e.getMessage();
assertTrue(msg.startsWith("FullText expression: "));
msg = msg.substring("FullText expression: ".length());
assertEquals(expectedMessage, msg);
}
}
private static String convertPattern(String pattern) throws ParseException {
FullTextExpression e = FullTextParser.parse(null, pattern);
return e.toString();
}
private static boolean test(String pattern, String value) throws ParseException {
FullTextExpression e = FullTextParser.parse(null, pattern);
return e.evaluate(value);
}
}