| /** |
| * 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.jena.query.text; |
| |
| import static org.junit.Assert.assertTrue; |
| |
| import java.util.Arrays ; |
| import java.util.HashSet ; |
| import java.util.Map ; |
| import java.util.Set ; |
| |
| import org.apache.jena.atlas.lib.StrUtils ; |
| import org.junit.Test ; |
| |
| /* |
| * This abstract class defines a collection of test methods for testing |
| * test searches. Its subclasses create a dataset using the index to |
| * to be tested and then call the test methods in this class to run |
| * the actual tests. |
| */ |
| public abstract class AbstractTestDatasetWithTextIndex extends AbstractTestDatasetWithTextIndexBase { |
| |
| @Test |
| public void testOneSimpleResult() { |
| final String turtle = StrUtils.strjoinNL( |
| TURTLE_PROLOG, |
| "<" + RESOURCE_BASE + "testOneSimpleResult>", |
| " rdfs:label 'bar testOneSimpleResult barfoo foo'", |
| "." |
| ); |
| String queryString = StrUtils.strjoinNL( |
| QUERY_PROLOG, |
| "SELECT ?s", |
| "WHERE {", |
| " ?s text:query ( rdfs:label 'testOneSimpleResult' 10 ) .", |
| "}" |
| ); |
| Set<String> expectedURIs = new HashSet<>() ; |
| expectedURIs.addAll( Arrays.asList("http://example.org/data/resource/testOneSimpleResult")) ; |
| doTestSearch(turtle, queryString, expectedURIs); |
| } |
| |
| static final String R_S1 = RESOURCE_BASE + "s1" ; |
| static final String R_S2 = RESOURCE_BASE + "s2" ; |
| static final String PF_DATA = StrUtils.strjoinNL( |
| TURTLE_PROLOG, |
| "<" + R_S1 + "> rdfs:label 'text' .", |
| "<" + R_S2 + "> rdfs:label 'fuzz' ." |
| ); |
| |
| @Test |
| public void propertyFunctionText_1() { |
| final String turtle = PF_DATA ; |
| String queryString = StrUtils.strjoinNL( |
| QUERY_PROLOG, |
| "SELECT ?s", |
| "WHERE {", |
| " ?s text:query (rdfs:label 'text') .", |
| "}" |
| ); |
| Set<String> expectedURIs = new HashSet<>(); |
| expectedURIs.addAll( Arrays.asList( R_S1 ) ) ; |
| doTestSearch(turtle, queryString, expectedURIs); |
| } |
| |
| @Test |
| public void propertyFunctionText_1_dft() { |
| // As before but using default field. |
| final String turtle = PF_DATA ; |
| String queryString = StrUtils.strjoinNL( |
| QUERY_PROLOG, |
| "SELECT ?s", |
| "WHERE {", |
| " ?s text:query ('text') .", |
| "}" |
| ); |
| Set<String> expectedURIs = new HashSet<>(); |
| expectedURIs.addAll( Arrays.asList( R_S1 ) ) ; |
| doTestSearch(turtle, queryString, expectedURIs); |
| } |
| |
| |
| @Test |
| public void propertyFunctionText_1_score() { |
| // As before but capturing the score in a variable. |
| final String turtle = PF_DATA ; |
| String queryString = StrUtils.strjoinNL( |
| QUERY_PROLOG, |
| "SELECT ?s ?score", |
| "WHERE {", |
| " (?s ?score) text:query ('text') .", |
| "}" |
| ); |
| |
| Set<String> expectedURIs = new HashSet<>(); |
| expectedURIs.addAll( Arrays.asList( R_S1 ) ) ; |
| doTestSearchWithScores(turtle, queryString, expectedURIs); |
| } |
| |
| @Test |
| public void propertyFunctionText_2() { |
| final String turtle = PF_DATA ; |
| String queryString = StrUtils.strjoinNL( |
| QUERY_PROLOG, |
| "SELECT ?s", |
| "WHERE {", |
| " ?s text:query ( rdfs:label 'text') .", |
| " ?s rdfs:label 'text' .", |
| "}" |
| ); |
| Set<String> expectedURIs = new HashSet<>(); |
| expectedURIs.addAll( Arrays.asList( R_S1 ) ) ; |
| doTestSearch(turtle, queryString, expectedURIs); |
| } |
| |
| @Test |
| public void propertyFunctionText_2_dft() { |
| final String turtle = PF_DATA ; |
| String queryString = StrUtils.strjoinNL( |
| QUERY_PROLOG, |
| "SELECT ?s", |
| "WHERE {", |
| " ?s text:query ('text') .", |
| " ?s rdfs:label 'text' .", |
| "}" |
| ); |
| Set<String> expectedURIs = new HashSet<>(); |
| expectedURIs.addAll( Arrays.asList( R_S1 ) ) ; |
| doTestSearch(turtle, queryString, expectedURIs); |
| } |
| |
| @Test |
| public void propertyFunctionText_2_score() { |
| // As before but capturing the score in a variable. |
| final String turtle = PF_DATA ; |
| String queryString = StrUtils.strjoinNL( |
| QUERY_PROLOG, |
| "SELECT ?s ?score", |
| "WHERE {", |
| " (?s ?score) text:query ('text') .", |
| " ?s rdfs:label 'text' .", |
| "}" |
| ); |
| |
| Set<String> expectedURIs = new HashSet<>(); |
| expectedURIs.addAll( Arrays.asList( R_S1 ) ) ; |
| doTestSearchWithScores(turtle, queryString, expectedURIs); |
| } |
| |
| @Test |
| public void propertyFunctionText_3() { |
| final String turtle = PF_DATA ; |
| String queryString = StrUtils.strjoinNL( |
| QUERY_PROLOG, |
| "SELECT ?s", |
| "WHERE {", |
| " ?s rdfs:label 'text' .", |
| " ?s text:query ( rdfs:label 'text') .", |
| "}" |
| ); |
| Set<String> expectedURIs = new HashSet<>(); |
| expectedURIs.addAll( Arrays.asList( R_S1 ) ) ; |
| doTestSearch(turtle, queryString, expectedURIs); |
| } |
| |
| @Test |
| public void propertyFunctionText_3_dft() { |
| final String turtle = PF_DATA ; |
| String queryString = StrUtils.strjoinNL( |
| QUERY_PROLOG, |
| "SELECT ?s", |
| "WHERE {", |
| " ?s rdfs:label 'text' .", |
| " ?s text:query ('text') .", |
| "}" |
| ); |
| Set<String> expectedURIs = new HashSet<>(); |
| expectedURIs.addAll( Arrays.asList( R_S1 ) ) ; |
| doTestSearch(turtle, queryString, expectedURIs); |
| } |
| |
| @Test |
| public void propertyFunctionText_3_score() { |
| // As before but capturing the score in a variable. |
| final String turtle = PF_DATA ; |
| String queryString = StrUtils.strjoinNL( |
| QUERY_PROLOG, |
| "SELECT ?s ?score", |
| "WHERE {", |
| " ?s rdfs:label 'text' .", |
| " (?s ?score) text:query ('text') .", |
| "}" |
| ); |
| |
| Set<String> expectedURIs = new HashSet<>(); |
| expectedURIs.addAll( Arrays.asList( R_S1 ) ) ; |
| doTestSearchWithScores(turtle, queryString, expectedURIs); |
| } |
| |
| @Test |
| public void propertyFunctionText_4() { |
| final String turtle = PF_DATA ; |
| String queryString = StrUtils.strjoinNL( |
| QUERY_PROLOG, |
| "SELECT ?s", |
| "WHERE {", |
| " ?s rdfs:label 'text' .", |
| " ?s text:query ( rdfs:label 'fuzz') .", |
| "}" |
| ); |
| Set<String> expectedURIs = new HashSet<>(); |
| doTestSearch(turtle, queryString, expectedURIs); |
| } |
| |
| @Test |
| public void propertyFunctionText_5() { |
| final String turtle = PF_DATA ; |
| String queryString = StrUtils.strjoinNL( |
| QUERY_PROLOG, |
| "SELECT ?s", |
| "WHERE {", |
| " BIND('text' AS ?t)", |
| " ?s text:query ( rdfs:label ?t) .", |
| "}" |
| ); |
| Set<String> expectedURIs = new HashSet<>(); |
| expectedURIs.addAll( Arrays.asList( R_S1 ) ) ; |
| doTestSearch(turtle, queryString, expectedURIs); |
| } |
| |
| @Test |
| public void propertyFunctionText_6() { |
| final String turtle = PF_DATA ; |
| String queryString = StrUtils.strjoinNL( |
| QUERY_PROLOG, |
| "SELECT ?s", |
| "WHERE {", |
| " BIND(rdfs:label AS ?P)", |
| " ?s text:query ( ?P 'text') .", |
| "}" |
| ); |
| Set<String> expectedURIs = new HashSet<>(); |
| expectedURIs.addAll( Arrays.asList( R_S1 ) ) ; |
| doTestSearch(turtle, queryString, expectedURIs); |
| } |
| |
| |
| @Test |
| public void propertyFunctionText_7() { |
| final String turtle = PF_DATA ; |
| String queryString = StrUtils.strjoinNL( |
| QUERY_PROLOG, |
| "SELECT ?s", |
| "WHERE {", |
| " BIND(1 AS ?C)", |
| " ?s text:query ( rdfs:label 'text' ?C) .", |
| "}" |
| ); |
| Set<String> expectedURIs = new HashSet<>(); |
| expectedURIs.addAll( Arrays.asList( R_S1 ) ) ; |
| doTestSearch(turtle, queryString, expectedURIs); |
| } |
| |
| @Test |
| public void propertyFunctionText_8() { |
| final String turtle = PF_DATA ; |
| String queryString = StrUtils.strjoinNL( |
| QUERY_PROLOG, |
| "SELECT ?s", |
| "WHERE {", |
| " ?s rdfs:label 'text' .", |
| " ?s text:query 'text' .", |
| " ?s rdfs:label 'text' .", |
| "}" |
| ); |
| Set<String> expectedURIs = new HashSet<>(); |
| expectedURIs.addAll( Arrays.asList( R_S1 ) ) ; |
| doTestSearch(turtle, queryString, expectedURIs); |
| } |
| |
| @Test |
| public void testMultipleResults() { |
| String label = "testMultipleResults"; |
| final String turtle = StrUtils.strjoinNL( |
| TURTLE_PROLOG, |
| "<" + RESOURCE_BASE + label +"1>", |
| " rdfs:label '" + label + "1'", |
| ".", |
| "<" + RESOURCE_BASE + label + "2>", |
| " rdfs:label '" + label + "2'", |
| "." |
| ); |
| String queryString = StrUtils.strjoinNL( |
| QUERY_PROLOG, |
| "SELECT ?s", |
| "WHERE {", |
| " ?s text:query ( rdfs:label '" + label + "?' 10 ) .", |
| "}" |
| ); |
| Set<String> expectedURIs = new HashSet<>() ; |
| expectedURIs.addAll( Arrays.asList( |
| "http://example.org/data/resource/" + label + "1", |
| "http://example.org/data/resource/" + label + "2" |
| )); |
| doTestSearch(turtle, queryString, expectedURIs); |
| } |
| |
| @Test |
| public void testMultipleResults_dft() { |
| String label = "testMultipleResults"; |
| final String turtle = StrUtils.strjoinNL( |
| TURTLE_PROLOG, |
| "<" + RESOURCE_BASE + label +"1>", |
| " rdfs:label '" + label + "1'", |
| ".", |
| "<" + RESOURCE_BASE + label + "2>", |
| " rdfs:label '" + label + "2'", |
| "." |
| ); |
| String queryString = StrUtils.strjoinNL( |
| QUERY_PROLOG, |
| "SELECT ?s", |
| "WHERE {", |
| " ?s text:query ('" + label + "?' 10 ) .", |
| "}" |
| ); |
| Set<String> expectedURIs = new HashSet<>() ; |
| expectedURIs.addAll( Arrays.asList( |
| "http://example.org/data/resource/" + label + "1", |
| "http://example.org/data/resource/" + label + "2" |
| )); |
| doTestSearch(turtle, queryString, expectedURIs); |
| } |
| |
| @Test |
| public void testMultipleResults_score() { |
| final String turtle = StrUtils.strjoinNL( |
| TURTLE_PROLOG, |
| "<" + RESOURCE_BASE + "brownfox>", |
| " rdfs:label 'The quick brown fox jumped over the lazy dog.'", |
| ".", |
| "<" + RESOURCE_BASE + "redfox>", |
| " rdfs:label 'red fox'", |
| "." |
| ); |
| String queryString = StrUtils.strjoinNL( |
| QUERY_PROLOG, |
| "SELECT ?s ?score", |
| "WHERE {", |
| " (?s ?score) text:query ( rdfs:label 'brown fox' 10 ) .", |
| "}" |
| ); |
| Set<String> expectedURIs = new HashSet<>(); |
| expectedURIs.addAll( Arrays.asList( |
| RESOURCE_BASE + "brownfox", |
| RESOURCE_BASE + "redfox" |
| )); |
| Map<String,Float> scores = doTestSearchWithScores(turtle, queryString, expectedURIs); |
| // the entry for ("The quick brown fox...") should have a higher score since it's a better match |
| assertTrue(scores.get(RESOURCE_BASE + "brownfox") > scores.get(RESOURCE_BASE + "redfox")); |
| } |
| |
| @Test |
| public void testSearchCorrectField() { |
| String label = "tscf"; |
| String label2 = "tscfo"; |
| final String turtle = StrUtils.strjoinNL( |
| TURTLE_PROLOG, |
| "<" + RESOURCE_BASE + label +"1>", |
| " rdfs:label '" + label + "a' ; ", |
| " rdfs:comment '" + label2 + "a' ;", |
| ".", |
| "<" + RESOURCE_BASE + label + "2>", |
| " rdfs:label '" + label2 + "b' ; ", |
| " rdfs:comment '" + label + "b' ; ", |
| "." |
| ); |
| String queryStringLabel = StrUtils.strjoinNL( |
| QUERY_PROLOG, |
| "SELECT ?s", |
| "WHERE {", |
| " ?s text:query ( rdfs:label '" + label + "?' 10 ) .", |
| "}" |
| ); |
| String queryStringComment = StrUtils.strjoinNL( |
| QUERY_PROLOG, |
| "SELECT ?s", |
| "WHERE {", |
| " ?s text:query ( rdfs:comment '" + label + "?' 10 ) .", |
| "}" |
| ); |
| Set<String> expectedURIsLabel = new HashSet<>() ; |
| expectedURIsLabel.addAll( Arrays.asList( |
| "http://example.org/data/resource/" + label + "1" |
| )); |
| Set<String> expectedURIsComment = new HashSet<>() ; |
| expectedURIsComment.addAll( Arrays.asList( |
| "http://example.org/data/resource/" + label + "2" |
| )); |
| doTestSearch("label:", turtle, queryStringLabel, expectedURIsLabel); |
| doTestSearch("comment:", turtle, queryStringComment, expectedURIsComment); |
| } |
| |
| @Test |
| public void testSearchDefaultField() { |
| String label = "testSearchDefaultField"; |
| String label2 = "testSearchDefaultFieldOther"; |
| final String turtle = StrUtils.strjoinNL( |
| TURTLE_PROLOG, |
| "<" + RESOURCE_BASE + label +"1>", |
| " rdfs:label '" + label + "1' ; ", |
| " rdfs:comment '" + label2 + "1' ;", |
| ".", |
| "<" + RESOURCE_BASE + label + "2>", |
| " rdfs:label '" + label2 + "2' ; ", |
| " rdfs:comment '" + label + "2' ; ", |
| "." |
| ); |
| String queryString = StrUtils.strjoinNL( |
| QUERY_PROLOG, |
| "SELECT ?s", |
| "WHERE {", |
| " ?s text:query ( rdfs:label '" + label + "?' 10 ) .", |
| "}" |
| ); |
| Set<String> expectedURIs = new HashSet<>() ; |
| expectedURIs.addAll( Arrays.asList( |
| "http://example.org/data/resource/" + label + "1" |
| )); |
| doTestSearch("default field:", turtle, queryString, expectedURIs); |
| } |
| |
| @Test |
| public void testSearchDefaultField_dft() { |
| String label = "testSearchDefaultField"; |
| String label2 = "testSearchDefaultFieldOther"; |
| final String turtle = StrUtils.strjoinNL( |
| TURTLE_PROLOG, |
| "<" + RESOURCE_BASE + label +"1>", |
| " rdfs:label '" + label + "1' ; ", |
| " rdfs:comment '" + label2 + "1' ;", |
| ".", |
| "<" + RESOURCE_BASE + label + "2>", |
| " rdfs:label '" + label2 + "2' ; ", |
| " rdfs:comment '" + label + "2' ; ", |
| "." |
| ); |
| String queryString = StrUtils.strjoinNL( |
| QUERY_PROLOG, |
| "SELECT ?s", |
| "WHERE {", |
| " ?s text:query ('" + label + "?' 10 ) .", |
| "}" |
| ); |
| Set<String> expectedURIs = new HashSet<>() ; |
| expectedURIs.addAll( Arrays.asList( |
| "http://example.org/data/resource/" + label + "1" |
| )); |
| doTestSearch("default field:", turtle, queryString, expectedURIs); |
| } |
| |
| @Test |
| public void testSearchLimitsResults() { |
| String label = "testSearchLimitsResults"; |
| final String turtle = StrUtils.strjoinNL( |
| TURTLE_PROLOG, |
| "<" + RESOURCE_BASE + label + "1>", |
| " rdfs:label '" + label + "' ;", |
| ".", |
| "<" + RESOURCE_BASE + label + "2>", |
| " rdfs:label '" + label + "' ;", |
| ".", |
| "<" + RESOURCE_BASE + label + "3>", |
| " rdfs:label '" + label + "' ;", |
| ".", |
| "<" + RESOURCE_BASE + label + "4>", |
| " rdfs:label '" + label + "' ;", |
| "." |
| ); |
| String queryString = StrUtils.strjoinNL( |
| QUERY_PROLOG, |
| "SELECT ?s", |
| "WHERE {", |
| " ?s text:query ( '" + label + "' 3 ) .", |
| "}" |
| ); |
| Set<String> expectedURIs = new HashSet<>() ; |
| expectedURIs.addAll( Arrays.asList( |
| "http://example.org/data/resource/" + label + "1", |
| "http://example.org/data/resource/" + label + "2", |
| "http://example.org/data/resource/" + label + "3", |
| "http://example.org/data/resource/" + label + "4" |
| )); |
| doTestSearch("default field:", turtle, queryString, expectedURIs, 3 ); |
| } |
| } |