From 1d3b497eaa72c3c1e1f66faa2702ce399d08f44e Mon Sep 17 00:00:00 2001 From: irinaschubert Date: Wed, 26 Oct 2022 17:39:34 +0200 Subject: [PATCH 01/11] fix bug --- mkdocs.yml | 4 ++-- .../instrumentation/InstrumentationSupport.scala | 4 ++-- .../org/knora/webapi/messages/StringFormatter.scala | 13 +++++++++++-- .../org/knora/webapi/routing/HealthRoute.scala | 6 +++--- .../org/knora/webapi/routing/v2/SearchRouteV2.scala | 3 ++- .../v2/searchResourceByLabelSubQuery.scala.txt | 2 +- 6 files changed, 21 insertions(+), 11 deletions(-) diff --git a/mkdocs.yml b/mkdocs.yml index 07bea41840..92a0dfc56f 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -43,8 +43,8 @@ nav: - Getting Lists: 03-apis/api-v2/getting-lists.md - XML to Standoff Mapping: 03-apis/api-v2/xml-to-standoff-mapping.md - Gravsearch - Virtual Graph Search: 03-apis/api-v2/query-language.md - - Editing Resources: 03-apis/api-v2/editing-resources.md - - Editing Values: 03-apis/api-v2/editing-values.md + - Creating and Editing Resources: 03-apis/api-v2/editing-resources.md + - Creating and Editing Values: 03-apis/api-v2/editing-values.md - Querying, Creating, and Updating Ontologies: 03-apis/api-v2/ontology-information.md - TEI/XML: 03-apis/api-v2/tei-xml.md - Permalinks: 03-apis/api-v2/permalinks.md diff --git a/webapi/src/main/scala/org/knora/webapi/instrumentation/InstrumentationSupport.scala b/webapi/src/main/scala/org/knora/webapi/instrumentation/InstrumentationSupport.scala index 4e98cdd08c..06f48043a5 100644 --- a/webapi/src/main/scala/org/knora/webapi/instrumentation/InstrumentationSupport.scala +++ b/webapi/src/main/scala/org/knora/webapi/instrumentation/InstrumentationSupport.scala @@ -43,13 +43,13 @@ trait InstrumentationSupport { /** * NOTE: The elapsed time of the span is saved somewhere by kamon, but * I have no idea how to get to it and this is why I'm calculating - * it in the metricsLogger.info line. This is a quick and dirty hack to + * it in the metricsLogger.debug line. This is a quick and dirty hack to * have at least something. */ val start = System.currentTimeMillis() Kamon.span(name) { future.andThen { case Success(_) => - metricsLogger.info(s"$name: {} ms", System.currentTimeMillis() - start) + metricsLogger.debug(s"$name: {} ms", System.currentTimeMillis() - start) } } } diff --git a/webapi/src/main/scala/org/knora/webapi/messages/StringFormatter.scala b/webapi/src/main/scala/org/knora/webapi/messages/StringFormatter.scala index 4a9afa57b0..118231636c 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/StringFormatter.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/StringFormatter.scala @@ -1666,8 +1666,6 @@ class StringFormatter private ( /** * Makes a string safe to be entered in the triplestore by escaping special chars. * - * If the param `revert` is set to `true`, the string is unescaped. - * * @param s a string. * @param errorFun a function that throws an exception. It will be called if the string is empty or contains * a carriage return (`\r`). @@ -1698,6 +1696,17 @@ class StringFormatter private ( SparqlEscapeInput ) + /** + * Replaces all characters that have a special meaning in the Lucene Query Parser syntax and normalizes spaces. + * + * @param s a string + * @return the normalized string + */ + def replaceLuceneQueryParserSyntaxCharacters(s: String): String = { + val stringWithoutSpecialCharacters = s.replaceAll("[\\+\\-&\\|!\\(\\)\\{\\}\\[\\]\\^\"~\\*\\?:\\\\/]", " ") + StringUtils.normalizeSpace(stringWithoutSpecialCharacters) + } + /** * Encodes a string for use in JSON, and encloses it in quotation marks. * diff --git a/webapi/src/main/scala/org/knora/webapi/routing/HealthRoute.scala b/webapi/src/main/scala/org/knora/webapi/routing/HealthRoute.scala index a0e98bf3ad..09d6266075 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/HealthRoute.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/HealthRoute.scala @@ -25,12 +25,12 @@ trait HealthCheck { protected def healthCheck(state: State): UIO[HttpResponse] = for { - _ <- ZIO.logInfo("get application state") + _ <- ZIO.logDebug("get application state") state <- state.get result <- setHealthState(state) - _ <- ZIO.logInfo("set health state") + _ <- ZIO.logDebug("set health state") response <- createResponse(result) - _ <- ZIO.logInfo("getting application state done") + _ <- ZIO.logDebug("getting application state done") } yield response private def setHealthState(state: AppState): UIO[HealthCheckResult] = diff --git a/webapi/src/main/scala/org/knora/webapi/routing/v2/SearchRouteV2.scala b/webapi/src/main/scala/org/knora/webapi/routing/v2/SearchRouteV2.scala index 1d759b3d6b..e27eb7fcd7 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/v2/SearchRouteV2.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/v2/SearchRouteV2.scala @@ -429,11 +429,12 @@ class SearchRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit "v2" / "searchbylabel" / Segment ) { searchval => // TODO: if a space is encoded as a "+", this is not converted back to a space get { requestContext => - val searchString = + val sparqlEncodedSearchString = stringFormatter.toSparqlEncodedString( searchval, throw BadRequestException(s"Invalid search string: '$searchval'") ) + val searchString = stringFormatter.replaceLuceneQueryParserSyntaxCharacters(sparqlEncodedSearchString) if (searchString.length < routeData.appConfig.v2.fulltextSearch.searchValueMinLength) { throw BadRequestException( diff --git a/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v2/searchResourceByLabelSubQuery.scala.txt b/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v2/searchResourceByLabelSubQuery.scala.txt index 15cb06e224..9ff371ce7a 100644 --- a/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v2/searchResourceByLabelSubQuery.scala.txt +++ b/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v2/searchResourceByLabelSubQuery.scala.txt @@ -31,7 +31,7 @@ SELECT (count(distinct ?resource) as ?count) } WHERE { - ?resource "@searchTerm.generateLiteralForLuceneIndexWithoutExactSequence" . + ?resource (rdfs:label "@searchTerm.generateLiteralForLuceneIndexWithoutExactSequence") . ?resource a ?resourceClass ; rdfs:label ?label . From d4dd090c86d632818eef5f4f81609ab1455dbf7c Mon Sep 17 00:00:00 2001 From: irinaschubert Date: Wed, 26 Oct 2022 17:39:40 +0200 Subject: [PATCH 02/11] add test --- test_data/all_data/books-data.ttl | 20 +++ .../SearchbylabelSpecialCharacters.jsonld | 127 ++++++++++++++++++ .../webapi/e2e/v2/SearchRouteV2R2RSpec.scala | 36 ++++- 3 files changed, 182 insertions(+), 1 deletion(-) create mode 100644 test_data/searchR2RV2/SearchbylabelSpecialCharacters.jsonld diff --git a/test_data/all_data/books-data.ttl b/test_data/all_data/books-data.ttl index ea2ff13517..7a83fa9c47 100644 --- a/test_data/all_data/books-data.ttl +++ b/test_data/all_data/books-data.ttl @@ -50,6 +50,16 @@ knora-base:hasPermissions "CR knora-admin:Creator|M knora-admin:ProjectMember|V knora-admin:KnownUser|RV knora-admin:UnknownUser" ; knora-base:attachedToUser . + + a knora-base:TextValue ; + knora-base:valueHasUUID "dFLLWiihTAqxJsh0iTQ1HQ"^^xsd:string ; + knora-base:isDeleted false ; + knora-base:valueCreationDate "2018-05-29T16:42:04.381Z"^^xsd:dateTime ; + knora-base:valueHasOrder 0 ; + knora-base:valueHasString "A title" ; + knora-base:hasPermissions "CR knora-admin:Creator|M knora-admin:ProjectMember|V knora-admin:KnownUser|RV knora-admin:UnknownUser" ; + knora-base:attachedToUser . + a knora-base:IntValue ; knora-base:valueHasUUID "SZyeLLmOTcCCuS3B0VksHQ"^^xsd:string ; @@ -137,6 +147,16 @@ rdfs:label "Treasure Island" ; knora-base:isDeleted false . + + a books:Book ; + knora-base:attachedToUser ; + knora-base:attachedToProject ; + knora-base:hasPermissions "CR knora-admin:Creator|M knora-admin:ProjectMember|V knora-admin:KnownUser|RV knora-admin:UnknownUser" ; + knora-base:creationDate "2019-11-29T10:00:00.673298Z"^^xsd:dateTime ; + books:hasTitle ; + rdfs:label "this / is + a - test & with \\ special ( characters ) in | the || label" ; + knora-base:isDeleted false . + a books:Page ; knora-base:attachedToUser ; diff --git a/test_data/searchR2RV2/SearchbylabelSpecialCharacters.jsonld b/test_data/searchR2RV2/SearchbylabelSpecialCharacters.jsonld new file mode 100644 index 0000000000..fee0cbabbe --- /dev/null +++ b/test_data/searchR2RV2/SearchbylabelSpecialCharacters.jsonld @@ -0,0 +1,127 @@ + +{ + "knora-api:arkUrl": { + "@value": "http://0.0.0.0:3336/ark:/72163/1/0801/_B3lQa6tSymIq7_7SowBsAD", + "@type": "xsd:anyURI" + }, + "rdfs:label": "Testbrief1", + "knora-api:versionArkUrl": { + "@value": "http://0.0.0.0:3336/ark:/72163/1/0801/_B3lQa6tSymIq7_7SowBsAD.20180604T085633879Z", + "@type": "xsd:anyURI" + }, + "knora-api:attachedToProject": { + "@id": "http://rdfh.ch/projects/yTerZGyxjZVqFMNNKXCDPF" + }, + "knora-api:userHasPermission": "RV", + "beol:hasRecipientValue": { + "knora-api:arkUrl": { + "@value": "http://0.0.0.0:3336/ark:/72163/1/0801/_B3lQa6tSymIq7_7SowBsAD/DVqPKuBBSIauVqjUC7bNvAe", + "@type": "xsd:anyURI" + }, + "knora-api:versionArkUrl": { + "@value": "http://0.0.0.0:3336/ark:/72163/1/0801/_B3lQa6tSymIq7_7SowBsAD/DVqPKuBBSIauVqjUC7bNvAe.20180604T085633879Z", + "@type": "xsd:anyURI" + }, + "knora-api:userHasPermission": "RV", + "knora-api:valueCreationDate": { + "@value": "2018-06-04T08:56:33.879Z", + "@type": "xsd:dateTimeStamp" + }, + "knora-api:attachedToUser": { + "@id": "http://rdfh.ch/users/PSGbemdjZi4kQ6GHJVkLGF" + }, + "knora-api:valueHasUUID": "DVqPKuBBSIauVqjUC7bNvA", + "knora-api:linkValueHasTarget": { + "knora-api:arkUrl": { + "@value": "http://0.0.0.0:3336/ark:/72163/1/0801/H7s3FmuWTkaCXa54eFANOAd", + "@type": "xsd:anyURI" + }, + "rdfs:label": "Testperson1", + "knora-api:versionArkUrl": { + "@value": "http://0.0.0.0:3336/ark:/72163/1/0801/H7s3FmuWTkaCXa54eFANOAd.20180604T085534086Z", + "@type": "xsd:anyURI" + }, + "knora-api:attachedToProject": { + "@id": "http://rdfh.ch/projects/yTerZGyxjZVqFMNNKXCDPF" + }, + "knora-api:userHasPermission": "RV", + "knora-api:creationDate": { + "@value": "2018-06-04T08:55:34.086Z", + "@type": "xsd:dateTimeStamp" + }, + "knora-api:attachedToUser": { + "@id": "http://rdfh.ch/users/PSGbemdjZi4kQ6GHJVkLGF" + }, + "knora-api:hasPermissions": "CR knora-admin:Creator|M knora-admin:ProjectMember|V knora-admin:KnownUser|RV knora-admin:UnknownUser", + "@type": "beol:person", + "@id": "http://rdfh.ch/0801/H7s3FmuWTkaCXa54eFANOA" + }, + "knora-api:hasPermissions": "CR knora-admin:Creator|M knora-admin:ProjectMember|V knora-admin:KnownUser|RV knora-admin:UnknownUser", + "@type": "knora-api:LinkValue", + "@id": "http://rdfh.ch/0801/_B3lQa6tSymIq7_7SowBsA/values/DVqPKuBBSIauVqjUC7bNvA" + }, + "knora-api:creationDate": { + "@value": "2018-06-04T08:56:33.879Z", + "@type": "xsd:dateTimeStamp" + }, + "knora-api:attachedToUser": { + "@id": "http://rdfh.ch/users/PSGbemdjZi4kQ6GHJVkLGF" + }, + "@type": "beol:letter", + "@id": "http://rdfh.ch/0801/_B3lQa6tSymIq7_7SowBsA", + "beol:hasAuthorValue": { + "knora-api:arkUrl": { + "@value": "http://0.0.0.0:3336/ark:/72163/1/0801/_B3lQa6tSymIq7_7SowBsAD/Cvp07eTqQQSnYdcvqlWW_gI", + "@type": "xsd:anyURI" + }, + "knora-api:versionArkUrl": { + "@value": "http://0.0.0.0:3336/ark:/72163/1/0801/_B3lQa6tSymIq7_7SowBsAD/Cvp07eTqQQSnYdcvqlWW_gI.20180604T085633879Z", + "@type": "xsd:anyURI" + }, + "knora-api:userHasPermission": "RV", + "knora-api:valueCreationDate": { + "@value": "2018-06-04T08:56:33.879Z", + "@type": "xsd:dateTimeStamp" + }, + "knora-api:attachedToUser": { + "@id": "http://rdfh.ch/users/PSGbemdjZi4kQ6GHJVkLGF" + }, + "knora-api:valueHasUUID": "Cvp07eTqQQSnYdcvqlWW_g", + "knora-api:linkValueHasTarget": { + "knora-api:arkUrl": { + "@value": "http://0.0.0.0:3336/ark:/72163/1/0801/VvYVIy=FSbOJBsh2d9ZFJwi", + "@type": "xsd:anyURI" + }, + "rdfs:label": "Testperson2", + "knora-api:versionArkUrl": { + "@value": "http://0.0.0.0:3336/ark:/72163/1/0801/VvYVIy=FSbOJBsh2d9ZFJwi.20180604T085622513Z", + "@type": "xsd:anyURI" + }, + "knora-api:attachedToProject": { + "@id": "http://rdfh.ch/projects/yTerZGyxjZVqFMNNKXCDPF" + }, + "knora-api:userHasPermission": "RV", + "knora-api:creationDate": { + "@value": "2018-06-04T08:56:22.513Z", + "@type": "xsd:dateTimeStamp" + }, + "knora-api:attachedToUser": { + "@id": "http://rdfh.ch/users/PSGbemdjZi4kQ6GHJVkLGF" + }, + "knora-api:hasPermissions": "CR knora-admin:Creator|M knora-admin:ProjectMember|V knora-admin:KnownUser|RV knora-admin:UnknownUser", + "@type": "beol:person", + "@id": "http://rdfh.ch/0801/VvYVIy-FSbOJBsh2d9ZFJw" + }, + "knora-api:hasPermissions": "CR knora-admin:Creator|M knora-admin:ProjectMember|V knora-admin:KnownUser|RV knora-admin:UnknownUser", + "@type": "knora-api:LinkValue", + "@id": "http://rdfh.ch/0801/_B3lQa6tSymIq7_7SowBsA/values/Cvp07eTqQQSnYdcvqlWW_g" + }, + "knora-api:hasPermissions": "CR knora-admin:Creator|M knora-admin:ProjectMember|V knora-admin:KnownUser|RV knora-admin:UnknownUser", + "@context": { + "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#", + "knora-api": "http://api.knora.org/ontology/knora-api/v2#", + "rdfs": "http://www.w3.org/2000/01/rdf-schema#", + "beol": "http://0.0.0.0:3333/ontology/0801/beol/v2#", + "xsd": "http://www.w3.org/2001/XMLSchema#" + } +} \ No newline at end of file diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/v2/SearchRouteV2R2RSpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/v2/SearchRouteV2R2RSpec.scala index 525df34688..688bc5dd03 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/v2/SearchRouteV2R2RSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/v2/SearchRouteV2R2RSpec.scala @@ -103,7 +103,8 @@ class SearchRouteV2R2RSpec extends R2RSpec { RdfDataObject( path = "test_data/e2e.v2.SearchRouteV2R2RSpec/gravsearchtest1-data.ttl", name = "http://www.knora.org/data/0666/gravsearchtest1" - ) + ), + RdfDataObject(path = "test_data/all_data/books-data.ttl", name = "http://www.knora.org/data/0001/anything") ) "The Search v2 Endpoint" should { @@ -10005,5 +10006,38 @@ class SearchRouteV2R2RSpec extends R2RSpec { compareJSONLDForResourcesResponse(expectedJSONLD = expectedAnswerJSONLD, receivedJSONLD = searchResponseStr) } } + + "perform a searchbylabel search for a label with special characters" in { + // HTTP GET to http://host/v2/searchbylabel/searchValue[limitToResourceClass=resourceClassIRI] + // [limitToProject=projectIRI][offset=Integer] + // encode the search string: "this / is + a - test & with \ special ( characters ) in | the || label" + val searchValueUriEncoded: String = + "this%20%2F%20is%20%2B%20a%20-%20test%20%26%20with%20%5C%20special%20(%20characters%20)%20in%20%7C%20the%20%7C%7C%20label" + // val limitToResourceClassUriEncoded: String = + // "http%3A%2F%2Fwww.knora.org%2Fontology%2F0001%2Fbooks%23Book" // "http%3A%2F%2F0.0.0.0%3A3333%2Fontology%2F0001%2Fbooks%2Fv2%23Book" + val offset: Int = 0 + + Get( + "/v2/searchbylabel/" + searchValueUriEncoded + + // "?limitToResourceClass=" + limitToResourceClassUriEncoded + + "&offset=" + offset + ) ~> searchPath ~> check { + + assert(status == StatusCodes.OK, response.toString) + + println(responseAs[String]) + + // Thread.sleep(1000000) + + val expectedAnswerJSONLD = readOrWriteTextFile( + responseAs[String], + Paths.get("..", "test_data/searchR2RV2/SearchbylabelSpecialCharacters.jsonld"), + writeTestDataFiles + ) + + compareJSONLDForResourcesResponse(expectedJSONLD = expectedAnswerJSONLD, receivedJSONLD = responseAs[String]) + + } + } } } From faab7146e43db7debc3a5b6a6cb830002f92bdc9 Mon Sep 17 00:00:00 2001 From: irinaschubert Date: Thu, 27 Oct 2022 16:53:37 +0200 Subject: [PATCH 03/11] Update books-data.ttl --- test_data/all_data/books-data.ttl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test_data/all_data/books-data.ttl b/test_data/all_data/books-data.ttl index 7a83fa9c47..fea1b794d3 100644 --- a/test_data/all_data/books-data.ttl +++ b/test_data/all_data/books-data.ttl @@ -151,7 +151,7 @@ a books:Book ; knora-base:attachedToUser ; knora-base:attachedToProject ; - knora-base:hasPermissions "CR knora-admin:Creator|M knora-admin:ProjectMember|V knora-admin:KnownUser|RV knora-admin:UnknownUser" ; + knora-base:hasPermissions "CR knora-admin:Creator|M knora-admin:ProjectMember|V knora-admin:KnownUser,knora-admin:UnknownUser" ; knora-base:creationDate "2019-11-29T10:00:00.673298Z"^^xsd:dateTime ; books:hasTitle ; rdfs:label "this / is + a - test & with \\ special ( characters ) in | the || label" ; From 0b8c9d26900e85b37d19fed795c17191701b1a24 Mon Sep 17 00:00:00 2001 From: irinaschubert Date: Thu, 27 Oct 2022 16:53:47 +0200 Subject: [PATCH 04/11] Update SearchbylabelSpecialCharacters.jsonld --- .../SearchbylabelSpecialCharacters.jsonld | 116 ++++-------------- 1 file changed, 22 insertions(+), 94 deletions(-) diff --git a/test_data/searchR2RV2/SearchbylabelSpecialCharacters.jsonld b/test_data/searchR2RV2/SearchbylabelSpecialCharacters.jsonld index fee0cbabbe..eaf2e79539 100644 --- a/test_data/searchR2RV2/SearchbylabelSpecialCharacters.jsonld +++ b/test_data/searchR2RV2/SearchbylabelSpecialCharacters.jsonld @@ -1,127 +1,55 @@ - { "knora-api:arkUrl": { - "@value": "http://0.0.0.0:3336/ark:/72163/1/0801/_B3lQa6tSymIq7_7SowBsAD", + "@value": "http://0.0.0.0:3336/ark:/72163/1/0001/book=instance=05I", "@type": "xsd:anyURI" }, - "rdfs:label": "Testbrief1", + "rdfs:label": "this / is + a - test & with \\ special ( characters ) in | the || label", "knora-api:versionArkUrl": { - "@value": "http://0.0.0.0:3336/ark:/72163/1/0801/_B3lQa6tSymIq7_7SowBsAD.20180604T085633879Z", + "@value": "http://0.0.0.0:3336/ark:/72163/1/0001/book=instance=05I.20191129T100000673298Z", "@type": "xsd:anyURI" }, "knora-api:attachedToProject": { - "@id": "http://rdfh.ch/projects/yTerZGyxjZVqFMNNKXCDPF" - }, - "knora-api:userHasPermission": "RV", - "beol:hasRecipientValue": { - "knora-api:arkUrl": { - "@value": "http://0.0.0.0:3336/ark:/72163/1/0801/_B3lQa6tSymIq7_7SowBsAD/DVqPKuBBSIauVqjUC7bNvAe", - "@type": "xsd:anyURI" - }, - "knora-api:versionArkUrl": { - "@value": "http://0.0.0.0:3336/ark:/72163/1/0801/_B3lQa6tSymIq7_7SowBsAD/DVqPKuBBSIauVqjUC7bNvAe.20180604T085633879Z", - "@type": "xsd:anyURI" - }, - "knora-api:userHasPermission": "RV", - "knora-api:valueCreationDate": { - "@value": "2018-06-04T08:56:33.879Z", - "@type": "xsd:dateTimeStamp" - }, - "knora-api:attachedToUser": { - "@id": "http://rdfh.ch/users/PSGbemdjZi4kQ6GHJVkLGF" - }, - "knora-api:valueHasUUID": "DVqPKuBBSIauVqjUC7bNvA", - "knora-api:linkValueHasTarget": { - "knora-api:arkUrl": { - "@value": "http://0.0.0.0:3336/ark:/72163/1/0801/H7s3FmuWTkaCXa54eFANOAd", - "@type": "xsd:anyURI" - }, - "rdfs:label": "Testperson1", - "knora-api:versionArkUrl": { - "@value": "http://0.0.0.0:3336/ark:/72163/1/0801/H7s3FmuWTkaCXa54eFANOAd.20180604T085534086Z", - "@type": "xsd:anyURI" - }, - "knora-api:attachedToProject": { - "@id": "http://rdfh.ch/projects/yTerZGyxjZVqFMNNKXCDPF" - }, - "knora-api:userHasPermission": "RV", - "knora-api:creationDate": { - "@value": "2018-06-04T08:55:34.086Z", - "@type": "xsd:dateTimeStamp" - }, - "knora-api:attachedToUser": { - "@id": "http://rdfh.ch/users/PSGbemdjZi4kQ6GHJVkLGF" - }, - "knora-api:hasPermissions": "CR knora-admin:Creator|M knora-admin:ProjectMember|V knora-admin:KnownUser|RV knora-admin:UnknownUser", - "@type": "beol:person", - "@id": "http://rdfh.ch/0801/H7s3FmuWTkaCXa54eFANOA" - }, - "knora-api:hasPermissions": "CR knora-admin:Creator|M knora-admin:ProjectMember|V knora-admin:KnownUser|RV knora-admin:UnknownUser", - "@type": "knora-api:LinkValue", - "@id": "http://rdfh.ch/0801/_B3lQa6tSymIq7_7SowBsA/values/DVqPKuBBSIauVqjUC7bNvA" + "@id": "http://rdfh.ch/projects/0001" }, + "knora-api:userHasPermission": "V", "knora-api:creationDate": { - "@value": "2018-06-04T08:56:33.879Z", + "@value": "2019-11-29T10:00:00.673298Z", "@type": "xsd:dateTimeStamp" }, - "knora-api:attachedToUser": { - "@id": "http://rdfh.ch/users/PSGbemdjZi4kQ6GHJVkLGF" - }, - "@type": "beol:letter", - "@id": "http://rdfh.ch/0801/_B3lQa6tSymIq7_7SowBsA", - "beol:hasAuthorValue": { + "knora-api:hasPermissions": "CR knora-admin:Creator|M knora-admin:ProjectMember|V knora-admin:KnownUser,knora-admin:UnknownUser", + "@type": "books:Book", + "@id": "http://rdfh.ch/0001/book-instance-05", + "books:hasTitle": { + "knora-api:valueAsString": "A title", "knora-api:arkUrl": { - "@value": "http://0.0.0.0:3336/ark:/72163/1/0801/_B3lQa6tSymIq7_7SowBsAD/Cvp07eTqQQSnYdcvqlWW_gI", + "@value": "http://0.0.0.0:3336/ark:/72163/1/0001/book=instance=05I/dFLLWiihTAqxJsh0iTQ1HQ0", "@type": "xsd:anyURI" }, "knora-api:versionArkUrl": { - "@value": "http://0.0.0.0:3336/ark:/72163/1/0801/_B3lQa6tSymIq7_7SowBsAD/Cvp07eTqQQSnYdcvqlWW_gI.20180604T085633879Z", + "@value": "http://0.0.0.0:3336/ark:/72163/1/0001/book=instance=05I/dFLLWiihTAqxJsh0iTQ1HQ0.20180529T164204381Z", "@type": "xsd:anyURI" }, "knora-api:userHasPermission": "RV", "knora-api:valueCreationDate": { - "@value": "2018-06-04T08:56:33.879Z", + "@value": "2018-05-29T16:42:04.381Z", "@type": "xsd:dateTimeStamp" }, "knora-api:attachedToUser": { - "@id": "http://rdfh.ch/users/PSGbemdjZi4kQ6GHJVkLGF" - }, - "knora-api:valueHasUUID": "Cvp07eTqQQSnYdcvqlWW_g", - "knora-api:linkValueHasTarget": { - "knora-api:arkUrl": { - "@value": "http://0.0.0.0:3336/ark:/72163/1/0801/VvYVIy=FSbOJBsh2d9ZFJwi", - "@type": "xsd:anyURI" - }, - "rdfs:label": "Testperson2", - "knora-api:versionArkUrl": { - "@value": "http://0.0.0.0:3336/ark:/72163/1/0801/VvYVIy=FSbOJBsh2d9ZFJwi.20180604T085622513Z", - "@type": "xsd:anyURI" - }, - "knora-api:attachedToProject": { - "@id": "http://rdfh.ch/projects/yTerZGyxjZVqFMNNKXCDPF" - }, - "knora-api:userHasPermission": "RV", - "knora-api:creationDate": { - "@value": "2018-06-04T08:56:22.513Z", - "@type": "xsd:dateTimeStamp" - }, - "knora-api:attachedToUser": { - "@id": "http://rdfh.ch/users/PSGbemdjZi4kQ6GHJVkLGF" - }, - "knora-api:hasPermissions": "CR knora-admin:Creator|M knora-admin:ProjectMember|V knora-admin:KnownUser|RV knora-admin:UnknownUser", - "@type": "beol:person", - "@id": "http://rdfh.ch/0801/VvYVIy-FSbOJBsh2d9ZFJw" + "@id": "http://rdfh.ch/users/BhkfBc3hTeS_IDo-JgXRbQ" }, + "knora-api:valueHasUUID": "dFLLWiihTAqxJsh0iTQ1HQ", "knora-api:hasPermissions": "CR knora-admin:Creator|M knora-admin:ProjectMember|V knora-admin:KnownUser|RV knora-admin:UnknownUser", - "@type": "knora-api:LinkValue", - "@id": "http://rdfh.ch/0801/_B3lQa6tSymIq7_7SowBsA/values/Cvp07eTqQQSnYdcvqlWW_g" + "@type": "knora-api:TextValue", + "@id": "http://rdfh.ch/0001/book-instance-05/values/has-title-value-05" + }, + "knora-api:attachedToUser": { + "@id": "http://rdfh.ch/users/9XBCrDV3SRa7kS1WwynB4Q" }, - "knora-api:hasPermissions": "CR knora-admin:Creator|M knora-admin:ProjectMember|V knora-admin:KnownUser|RV knora-admin:UnknownUser", "@context": { "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#", "knora-api": "http://api.knora.org/ontology/knora-api/v2#", "rdfs": "http://www.w3.org/2000/01/rdf-schema#", - "beol": "http://0.0.0.0:3333/ontology/0801/beol/v2#", + "books": "http://0.0.0.0:3333/ontology/0001/books/v2#", "xsd": "http://www.w3.org/2001/XMLSchema#" } } \ No newline at end of file From dce9df8e4dd4cd5e0f53961579edbad51f657100 Mon Sep 17 00:00:00 2001 From: irinaschubert Date: Thu, 27 Oct 2022 16:59:24 +0200 Subject: [PATCH 05/11] Update SearchRouteV2R2RSpec.scala --- .../webapi/e2e/v2/SearchRouteV2R2RSpec.scala | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/v2/SearchRouteV2R2RSpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/v2/SearchRouteV2R2RSpec.scala index 688bc5dd03..63f6cdf19b 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/v2/SearchRouteV2R2RSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/v2/SearchRouteV2R2RSpec.scala @@ -92,6 +92,8 @@ class SearchRouteV2R2RSpec extends R2RSpec { RdfDataObject(path = "test_data/all_data/anything-data.ttl", name = "http://www.knora.org/data/0001/anything"), RdfDataObject(path = "test_data/all_data/incunabula-data.ttl", name = "http://www.knora.org/data/0803/incunabula"), RdfDataObject(path = "test_data/all_data/beol-data.ttl", name = "http://www.knora.org/data/0801/beol"), + RdfDataObject(path = "test_data/ontologies/books-onto.ttl", name = "http://www.knora.org/ontology/0001/books"), + RdfDataObject(path = "test_data/all_data/books-data.ttl", name = "http://www.knora.org/data/0001/books"), RdfDataObject( path = "test_data/e2e.v2.SearchRouteV2R2RSpec/gravsearchtest1-admin.ttl", name = "http://www.knora.org/data/admin" @@ -103,8 +105,7 @@ class SearchRouteV2R2RSpec extends R2RSpec { RdfDataObject( path = "test_data/e2e.v2.SearchRouteV2R2RSpec/gravsearchtest1-data.ttl", name = "http://www.knora.org/data/0666/gravsearchtest1" - ), - RdfDataObject(path = "test_data/all_data/books-data.ttl", name = "http://www.knora.org/data/0001/anything") + ) ) "The Search v2 Endpoint" should { @@ -10008,26 +10009,25 @@ class SearchRouteV2R2RSpec extends R2RSpec { } "perform a searchbylabel search for a label with special characters" in { - // HTTP GET to http://host/v2/searchbylabel/searchValue[limitToResourceClass=resourceClassIRI] - // [limitToProject=projectIRI][offset=Integer] - // encode the search string: "this / is + a - test & with \ special ( characters ) in | the || label" - val searchValueUriEncoded: String = - "this%20%2F%20is%20%2B%20a%20-%20test%20%26%20with%20%5C%20special%20(%20characters%20)%20in%20%7C%20the%20%7C%7C%20label" - // val limitToResourceClassUriEncoded: String = - // "http%3A%2F%2Fwww.knora.org%2Fontology%2F0001%2Fbooks%23Book" // "http%3A%2F%2F0.0.0.0%3A3333%2Fontology%2F0001%2Fbooks%2Fv2%23Book" + + val searchValueUriEncoded: String = URLEncoder.encode( + "this / is + a - test & with \\ special ( characters ) in | the || label", + "UTF-8" + ) + val limitToResourceClassUriEncoded: String = URLEncoder.encode( + "http://0.0.0.0:3333/ontology/0001/books/v2#Book", + "UTF-8" + ) val offset: Int = 0 - Get( + val request = "/v2/searchbylabel/" + searchValueUriEncoded + - // "?limitToResourceClass=" + limitToResourceClassUriEncoded + + "?limitToResourceClass=" + limitToResourceClassUriEncoded + "&offset=" + offset - ) ~> searchPath ~> check { - - assert(status == StatusCodes.OK, response.toString) - println(responseAs[String]) + Get(request) ~> searchPath ~> check { - // Thread.sleep(1000000) + assert(status == StatusCodes.OK, response.toString) val expectedAnswerJSONLD = readOrWriteTextFile( responseAs[String], From 46327a14e4993f8c562654c52c4695cd779816af Mon Sep 17 00:00:00 2001 From: irinaschubert Date: Thu, 27 Oct 2022 17:25:46 +0200 Subject: [PATCH 06/11] fix invalid test data --- test_data/all_data/anything-data.ttl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test_data/all_data/anything-data.ttl b/test_data/all_data/anything-data.ttl index 0058d1d09e..1144ebbae8 100644 --- a/test_data/all_data/anything-data.ttl +++ b/test_data/all_data/anything-data.ttl @@ -2269,7 +2269,7 @@ knora-base:attachedToUser ; knora-base:attachedToProject ; knora-base:hasPermissions "V knora-admin:UnknownUser|M knora-admin:ProjectMember" ; - knora-base:creationDate "2019-11-29T10:00:00.673298Z"^^xsd:dateTime ; + knora-base:valueCreationDate "2019-11-29T10:00:00.673298Z"^^xsd:dateTime ; knora-base:isDeleted false . # Video Sequence Resource @@ -2355,7 +2355,7 @@ knora-base:attachedToUser ; knora-base:attachedToProject ; knora-base:hasPermissions "V knora-admin:UnknownUser|M knora-admin:ProjectMember" ; - knora-base:creationDate "2019-11-29T10:00:00.673298Z"^^xsd:dateTime ; + knora-base:valueCreationDate "2019-11-29T10:00:00.673298Z"^^xsd:dateTime ; knora-base:isDeleted false . # Audio Sequence Resource From 14a4614196a47f8b528e01e3b888c30b7cffe26c Mon Sep 17 00:00:00 2001 From: irinaschubert Date: Thu, 27 Oct 2022 20:08:18 +0200 Subject: [PATCH 07/11] adjust project iri --- test_data/all_data/books-data.ttl | 2 +- test_data/searchR2RV2/SearchbylabelSpecialCharacters.jsonld | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/test_data/all_data/books-data.ttl b/test_data/all_data/books-data.ttl index 941fa4347c..849fabf9b0 100644 --- a/test_data/all_data/books-data.ttl +++ b/test_data/all_data/books-data.ttl @@ -150,7 +150,7 @@ a books:Book ; knora-base:attachedToUser ; - knora-base:attachedToProject ; + knora-base:attachedToProject ; knora-base:hasPermissions "CR knora-admin:Creator|M knora-admin:ProjectMember|V knora-admin:KnownUser,knora-admin:UnknownUser" ; knora-base:creationDate "2019-11-29T10:00:00.673298Z"^^xsd:dateTime ; books:hasTitle ; diff --git a/test_data/searchR2RV2/SearchbylabelSpecialCharacters.jsonld b/test_data/searchR2RV2/SearchbylabelSpecialCharacters.jsonld index eaf2e79539..39b9d3abbc 100644 --- a/test_data/searchR2RV2/SearchbylabelSpecialCharacters.jsonld +++ b/test_data/searchR2RV2/SearchbylabelSpecialCharacters.jsonld @@ -9,7 +9,7 @@ "@type": "xsd:anyURI" }, "knora-api:attachedToProject": { - "@id": "http://rdfh.ch/projects/0001" + "@id": "http://rdfh.ch/projects/Lw3FC39BSzCwvmdOaTyLqQ" }, "knora-api:userHasPermission": "V", "knora-api:creationDate": { @@ -52,4 +52,4 @@ "books": "http://0.0.0.0:3333/ontology/0001/books/v2#", "xsd": "http://www.w3.org/2001/XMLSchema#" } -} \ No newline at end of file +} From c6727056c64021f636119d2ad67205af390cca83 Mon Sep 17 00:00:00 2001 From: irinaschubert Date: Thu, 27 Oct 2022 20:19:20 +0200 Subject: [PATCH 08/11] add more tests --- .../searchR2RV2/SearchbylabelSimple.jsonld | 80 ++++++++++++++++ .../searchR2RV2/SearchbylabelSimple.jsonld | 80 ++++++++++++++++ .../webapi/e2e/v2/SearchRouteV2R2RSpec.scala | 93 +++++++++++++++++++ 3 files changed, 253 insertions(+) create mode 100644 test_data/searchR2RV2/SearchbylabelSimple.jsonld create mode 100644 test_data/test_data/searchR2RV2/SearchbylabelSimple.jsonld diff --git a/test_data/searchR2RV2/SearchbylabelSimple.jsonld b/test_data/searchR2RV2/SearchbylabelSimple.jsonld new file mode 100644 index 0000000000..1b16ab08a3 --- /dev/null +++ b/test_data/searchR2RV2/SearchbylabelSimple.jsonld @@ -0,0 +1,80 @@ +{ + "knora-api:arkUrl": { + "@value": "http://0.0.0.0:3336/ark:/72163/1/0001/book=instance=04K", + "@type": "xsd:anyURI" + }, + "rdfs:label": "Treasure Island", + "knora-api:versionArkUrl": { + "@value": "http://0.0.0.0:3336/ark:/72163/1/0001/book=instance=04K.20191129T100000673298Z", + "@type": "xsd:anyURI" + }, + "knora-api:attachedToProject": { + "@id": "http://rdfh.ch/projects/Lw3FC39BSzCwvmdOaTyLqQ" + }, + "knora-api:userHasPermission": "RV", + "knora-api:creationDate": { + "@value": "2019-11-29T10:00:00.673298Z", + "@type": "xsd:dateTimeStamp" + }, + "knora-api:hasPermissions": "CR knora-admin:Creator|M knora-admin:ProjectMember|V knora-admin:KnownUser|RV knora-admin:UnknownUser", + "@type": "books:Book", + "books:hasTextType": { + "knora-api:arkUrl": { + "@value": "http://0.0.0.0:3336/ark:/72163/1/0001/book=instance=04K/00list_value_adventurQo", + "@type": "xsd:anyURI" + }, + "knora-api:userHasPermission": "RV", + "knora-api:valueCreationDate": { + "@value": "2018-05-29T16:42:04.381Z", + "@type": "xsd:dateTimeStamp" + }, + "knora-api:attachedToUser": { + "@id": "http://rdfh.ch/users/BhkfBc3hTeS_IDo-JgXRbQ" + }, + "knora-api:valueHasUUID": "00list_value_adventurQ", + "knora-api:hasPermissions": "CR knora-admin:Creator|M knora-admin:ProjectMember|V knora-admin:KnownUser|RV knora-admin:UnknownUser", + "@type": "knora-api:ListValue", + "@id": "http://rdfh.ch/0001/book-instance-04/values/has-list-value-03", + "knora-api:listValueAsListNode": { + "@id": "http://rdfh.ch/lists/0001/ynm02-05" + }, + "knora-api:versionArkUrl": { + "@value": "http://0.0.0.0:3336/ark:/72163/1/0001/book=instance=04K/00list_value_adventurQo.20180529T164204381Z", + "@type": "xsd:anyURI" + } + }, + "@id": "http://rdfh.ch/0001/book-instance-04", + "books:hasTitle": { + "knora-api:valueAsString": "Treasure Island", + "knora-api:arkUrl": { + "@value": "http://0.0.0.0:3336/ark:/72163/1/0001/book=instance=04K/IN4R19yYR0ygi3K2VEHpUQe", + "@type": "xsd:anyURI" + }, + "knora-api:versionArkUrl": { + "@value": "http://0.0.0.0:3336/ark:/72163/1/0001/book=instance=04K/IN4R19yYR0ygi3K2VEHpUQe.20180529T164204381Z", + "@type": "xsd:anyURI" + }, + "knora-api:userHasPermission": "RV", + "knora-api:valueCreationDate": { + "@value": "2018-05-29T16:42:04.381Z", + "@type": "xsd:dateTimeStamp" + }, + "knora-api:attachedToUser": { + "@id": "http://rdfh.ch/users/BhkfBc3hTeS_IDo-JgXRbQ" + }, + "knora-api:valueHasUUID": "IN4R19yYR0ygi3K2VEHpUQ", + "knora-api:hasPermissions": "CR knora-admin:Creator|M knora-admin:ProjectMember|V knora-admin:KnownUser|RV knora-admin:UnknownUser", + "@type": "knora-api:TextValue", + "@id": "http://rdfh.ch/0001/book-instance-04/values/has-title-value-04" + }, + "knora-api:attachedToUser": { + "@id": "http://rdfh.ch/users/9XBCrDV3SRa7kS1WwynB4Q" + }, + "@context": { + "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#", + "knora-api": "http://api.knora.org/ontology/knora-api/v2#", + "rdfs": "http://www.w3.org/2000/01/rdf-schema#", + "books": "http://0.0.0.0:3333/ontology/0001/books/v2#", + "xsd": "http://www.w3.org/2001/XMLSchema#" + } +} \ No newline at end of file diff --git a/test_data/test_data/searchR2RV2/SearchbylabelSimple.jsonld b/test_data/test_data/searchR2RV2/SearchbylabelSimple.jsonld new file mode 100644 index 0000000000..1b16ab08a3 --- /dev/null +++ b/test_data/test_data/searchR2RV2/SearchbylabelSimple.jsonld @@ -0,0 +1,80 @@ +{ + "knora-api:arkUrl": { + "@value": "http://0.0.0.0:3336/ark:/72163/1/0001/book=instance=04K", + "@type": "xsd:anyURI" + }, + "rdfs:label": "Treasure Island", + "knora-api:versionArkUrl": { + "@value": "http://0.0.0.0:3336/ark:/72163/1/0001/book=instance=04K.20191129T100000673298Z", + "@type": "xsd:anyURI" + }, + "knora-api:attachedToProject": { + "@id": "http://rdfh.ch/projects/Lw3FC39BSzCwvmdOaTyLqQ" + }, + "knora-api:userHasPermission": "RV", + "knora-api:creationDate": { + "@value": "2019-11-29T10:00:00.673298Z", + "@type": "xsd:dateTimeStamp" + }, + "knora-api:hasPermissions": "CR knora-admin:Creator|M knora-admin:ProjectMember|V knora-admin:KnownUser|RV knora-admin:UnknownUser", + "@type": "books:Book", + "books:hasTextType": { + "knora-api:arkUrl": { + "@value": "http://0.0.0.0:3336/ark:/72163/1/0001/book=instance=04K/00list_value_adventurQo", + "@type": "xsd:anyURI" + }, + "knora-api:userHasPermission": "RV", + "knora-api:valueCreationDate": { + "@value": "2018-05-29T16:42:04.381Z", + "@type": "xsd:dateTimeStamp" + }, + "knora-api:attachedToUser": { + "@id": "http://rdfh.ch/users/BhkfBc3hTeS_IDo-JgXRbQ" + }, + "knora-api:valueHasUUID": "00list_value_adventurQ", + "knora-api:hasPermissions": "CR knora-admin:Creator|M knora-admin:ProjectMember|V knora-admin:KnownUser|RV knora-admin:UnknownUser", + "@type": "knora-api:ListValue", + "@id": "http://rdfh.ch/0001/book-instance-04/values/has-list-value-03", + "knora-api:listValueAsListNode": { + "@id": "http://rdfh.ch/lists/0001/ynm02-05" + }, + "knora-api:versionArkUrl": { + "@value": "http://0.0.0.0:3336/ark:/72163/1/0001/book=instance=04K/00list_value_adventurQo.20180529T164204381Z", + "@type": "xsd:anyURI" + } + }, + "@id": "http://rdfh.ch/0001/book-instance-04", + "books:hasTitle": { + "knora-api:valueAsString": "Treasure Island", + "knora-api:arkUrl": { + "@value": "http://0.0.0.0:3336/ark:/72163/1/0001/book=instance=04K/IN4R19yYR0ygi3K2VEHpUQe", + "@type": "xsd:anyURI" + }, + "knora-api:versionArkUrl": { + "@value": "http://0.0.0.0:3336/ark:/72163/1/0001/book=instance=04K/IN4R19yYR0ygi3K2VEHpUQe.20180529T164204381Z", + "@type": "xsd:anyURI" + }, + "knora-api:userHasPermission": "RV", + "knora-api:valueCreationDate": { + "@value": "2018-05-29T16:42:04.381Z", + "@type": "xsd:dateTimeStamp" + }, + "knora-api:attachedToUser": { + "@id": "http://rdfh.ch/users/BhkfBc3hTeS_IDo-JgXRbQ" + }, + "knora-api:valueHasUUID": "IN4R19yYR0ygi3K2VEHpUQ", + "knora-api:hasPermissions": "CR knora-admin:Creator|M knora-admin:ProjectMember|V knora-admin:KnownUser|RV knora-admin:UnknownUser", + "@type": "knora-api:TextValue", + "@id": "http://rdfh.ch/0001/book-instance-04/values/has-title-value-04" + }, + "knora-api:attachedToUser": { + "@id": "http://rdfh.ch/users/9XBCrDV3SRa7kS1WwynB4Q" + }, + "@context": { + "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#", + "knora-api": "http://api.knora.org/ontology/knora-api/v2#", + "rdfs": "http://www.w3.org/2000/01/rdf-schema#", + "books": "http://0.0.0.0:3333/ontology/0001/books/v2#", + "xsd": "http://www.w3.org/2001/XMLSchema#" + } +} \ No newline at end of file diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/v2/SearchRouteV2R2RSpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/v2/SearchRouteV2R2RSpec.scala index 2ae9dd05ca..c74b2c9fc9 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/v2/SearchRouteV2R2RSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/v2/SearchRouteV2R2RSpec.scala @@ -10008,6 +10008,70 @@ class SearchRouteV2R2RSpec extends R2RSpec { } } + "perform a searchbylabel search for the label 'Treasure Island' with search string 'Treasure Island'" in { + + val searchValueUriEncoded: String = URLEncoder.encode( + "Treasure Island", + "UTF-8" + ) + val limitToResourceClassUriEncoded: String = URLEncoder.encode( + "http://0.0.0.0:3333/ontology/0001/books/v2#Book", + "UTF-8" + ) + val offset: Int = 0 + + val request = + "/v2/searchbylabel/" + searchValueUriEncoded + + "?limitToResourceClass=" + limitToResourceClassUriEncoded + + "&offset=" + offset + + Get(request) ~> searchPath ~> check { + + assert(status == StatusCodes.OK, response.toString) + + val expectedAnswerJSONLD = readOrWriteTextFile( + responseAs[String], + Paths.get("..", "test_data/searchR2RV2/SearchbylabelSimple.jsonld"), + writeTestDataFiles + ) + + compareJSONLDForResourcesResponse(expectedJSONLD = expectedAnswerJSONLD, receivedJSONLD = responseAs[String]) + + } + } + + "perform a searchbylabel search for the label 'Treasure Island' with search string 'Treasure'" in { + + val searchValueUriEncoded: String = URLEncoder.encode( + "Treasure", + "UTF-8" + ) + val limitToResourceClassUriEncoded: String = URLEncoder.encode( + "http://0.0.0.0:3333/ontology/0001/books/v2#Book", + "UTF-8" + ) + val offset: Int = 0 + + val request = + "/v2/searchbylabel/" + searchValueUriEncoded + + "?limitToResourceClass=" + limitToResourceClassUriEncoded + + "&offset=" + offset + + Get(request) ~> searchPath ~> check { + + assert(status == StatusCodes.OK, response.toString) + + val expectedAnswerJSONLD = readOrWriteTextFile( + responseAs[String], + Paths.get("..", "test_data/searchR2RV2/SearchbylabelSimple.jsonld"), + writeTestDataFiles + ) + + compareJSONLDForResourcesResponse(expectedJSONLD = expectedAnswerJSONLD, receivedJSONLD = responseAs[String]) + + } + } + "perform a searchbylabel search for a label with special characters" in { val searchValueUriEncoded: String = URLEncoder.encode( @@ -10039,5 +10103,34 @@ class SearchRouteV2R2RSpec extends R2RSpec { } } + + "perform a searchbylabel search for the label 'Treasure Island' but providing the wrong class" in { + + val searchValueUriEncoded: String = URLEncoder.encode( + "Treasure", + "UTF-8" + ) + val limitToResourceClassUriEncoded: String = URLEncoder.encode( + "http://0.0.0.0:3333/ontology/0001/books/v2#Page", + "UTF-8" + ) + val offset: Int = 0 + + val request = + "/v2/searchbylabel/" + searchValueUriEncoded + + "?limitToResourceClass=" + limitToResourceClassUriEncoded + + "&offset=" + offset + + Get(request) ~> searchPath ~> check { + + assert(status == StatusCodes.OK, response.toString) + + val expectedAnswerJSONLD = "{}" + + compareJSONLDForResourcesResponse(expectedJSONLD = expectedAnswerJSONLD, receivedJSONLD = responseAs[String]) + + } + } + } } From caedbce64863555214f70fb3adfea490faa1bf5f Mon Sep 17 00:00:00 2001 From: irinaschubert Date: Thu, 27 Oct 2022 20:25:11 +0200 Subject: [PATCH 09/11] Update UsersResponderADM.scala --- .../org/knora/webapi/responders/admin/UsersResponderADM.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/webapi/src/main/scala/org/knora/webapi/responders/admin/UsersResponderADM.scala b/webapi/src/main/scala/org/knora/webapi/responders/admin/UsersResponderADM.scala index 02043318d9..a7de7f653b 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/admin/UsersResponderADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/admin/UsersResponderADM.scala @@ -1801,7 +1801,7 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde */ private def getUserFromCacheOrTriplestore( identifier: UserIdentifierADM - ): Future[Option[UserADM]] = // tracedFuture("admin-user-get-user-from-cache-or-triplestore") { + ): Future[Option[UserADM]] = tracedFuture("admin-user-get-user-from-cache-or-triplestore") { if (cacheServiceSettings.cacheServiceEnabled) { // caching enabled getUserFromCache(identifier).flatMap { @@ -1830,7 +1830,7 @@ class UsersResponderADM(responderData: ResponderData) extends Responder(responde log.debug("getUserFromCacheOrTriplestore - caching disabled. getting from triplestore.") getUserFromTriplestore(identifier = identifier) } - // } + } /** * Tries to retrieve a [[UserADM]] from the triplestore. From 89c8aa27cb38b6d8ff846852ba76a27963a41a95 Mon Sep 17 00:00:00 2001 From: irinaschubert Date: Thu, 27 Oct 2022 20:25:54 +0200 Subject: [PATCH 10/11] Delete SearchbylabelSimple.jsonld --- .../searchR2RV2/SearchbylabelSimple.jsonld | 80 ------------------- 1 file changed, 80 deletions(-) delete mode 100644 test_data/test_data/searchR2RV2/SearchbylabelSimple.jsonld diff --git a/test_data/test_data/searchR2RV2/SearchbylabelSimple.jsonld b/test_data/test_data/searchR2RV2/SearchbylabelSimple.jsonld deleted file mode 100644 index 1b16ab08a3..0000000000 --- a/test_data/test_data/searchR2RV2/SearchbylabelSimple.jsonld +++ /dev/null @@ -1,80 +0,0 @@ -{ - "knora-api:arkUrl": { - "@value": "http://0.0.0.0:3336/ark:/72163/1/0001/book=instance=04K", - "@type": "xsd:anyURI" - }, - "rdfs:label": "Treasure Island", - "knora-api:versionArkUrl": { - "@value": "http://0.0.0.0:3336/ark:/72163/1/0001/book=instance=04K.20191129T100000673298Z", - "@type": "xsd:anyURI" - }, - "knora-api:attachedToProject": { - "@id": "http://rdfh.ch/projects/Lw3FC39BSzCwvmdOaTyLqQ" - }, - "knora-api:userHasPermission": "RV", - "knora-api:creationDate": { - "@value": "2019-11-29T10:00:00.673298Z", - "@type": "xsd:dateTimeStamp" - }, - "knora-api:hasPermissions": "CR knora-admin:Creator|M knora-admin:ProjectMember|V knora-admin:KnownUser|RV knora-admin:UnknownUser", - "@type": "books:Book", - "books:hasTextType": { - "knora-api:arkUrl": { - "@value": "http://0.0.0.0:3336/ark:/72163/1/0001/book=instance=04K/00list_value_adventurQo", - "@type": "xsd:anyURI" - }, - "knora-api:userHasPermission": "RV", - "knora-api:valueCreationDate": { - "@value": "2018-05-29T16:42:04.381Z", - "@type": "xsd:dateTimeStamp" - }, - "knora-api:attachedToUser": { - "@id": "http://rdfh.ch/users/BhkfBc3hTeS_IDo-JgXRbQ" - }, - "knora-api:valueHasUUID": "00list_value_adventurQ", - "knora-api:hasPermissions": "CR knora-admin:Creator|M knora-admin:ProjectMember|V knora-admin:KnownUser|RV knora-admin:UnknownUser", - "@type": "knora-api:ListValue", - "@id": "http://rdfh.ch/0001/book-instance-04/values/has-list-value-03", - "knora-api:listValueAsListNode": { - "@id": "http://rdfh.ch/lists/0001/ynm02-05" - }, - "knora-api:versionArkUrl": { - "@value": "http://0.0.0.0:3336/ark:/72163/1/0001/book=instance=04K/00list_value_adventurQo.20180529T164204381Z", - "@type": "xsd:anyURI" - } - }, - "@id": "http://rdfh.ch/0001/book-instance-04", - "books:hasTitle": { - "knora-api:valueAsString": "Treasure Island", - "knora-api:arkUrl": { - "@value": "http://0.0.0.0:3336/ark:/72163/1/0001/book=instance=04K/IN4R19yYR0ygi3K2VEHpUQe", - "@type": "xsd:anyURI" - }, - "knora-api:versionArkUrl": { - "@value": "http://0.0.0.0:3336/ark:/72163/1/0001/book=instance=04K/IN4R19yYR0ygi3K2VEHpUQe.20180529T164204381Z", - "@type": "xsd:anyURI" - }, - "knora-api:userHasPermission": "RV", - "knora-api:valueCreationDate": { - "@value": "2018-05-29T16:42:04.381Z", - "@type": "xsd:dateTimeStamp" - }, - "knora-api:attachedToUser": { - "@id": "http://rdfh.ch/users/BhkfBc3hTeS_IDo-JgXRbQ" - }, - "knora-api:valueHasUUID": "IN4R19yYR0ygi3K2VEHpUQ", - "knora-api:hasPermissions": "CR knora-admin:Creator|M knora-admin:ProjectMember|V knora-admin:KnownUser|RV knora-admin:UnknownUser", - "@type": "knora-api:TextValue", - "@id": "http://rdfh.ch/0001/book-instance-04/values/has-title-value-04" - }, - "knora-api:attachedToUser": { - "@id": "http://rdfh.ch/users/9XBCrDV3SRa7kS1WwynB4Q" - }, - "@context": { - "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#", - "knora-api": "http://api.knora.org/ontology/knora-api/v2#", - "rdfs": "http://www.w3.org/2000/01/rdf-schema#", - "books": "http://0.0.0.0:3333/ontology/0001/books/v2#", - "xsd": "http://www.w3.org/2001/XMLSchema#" - } -} \ No newline at end of file From b79723d2148b25cfa4165710a4f77a1c12d45fa9 Mon Sep 17 00:00:00 2001 From: irinaschubert Date: Fri, 28 Oct 2022 09:36:52 +0200 Subject: [PATCH 11/11] add documentation and complete test --- .../api-v2/reading-and-searching-resources.md | 13 +++++++++---- test_data/all_data/books-data.ttl | 2 +- .../SearchbylabelSpecialCharacters.jsonld | 2 +- .../org/knora/webapi/messages/StringFormatter.scala | 2 +- .../knora/webapi/e2e/v2/SearchRouteV2R2RSpec.scala | 2 +- 5 files changed, 13 insertions(+), 8 deletions(-) diff --git a/docs/03-apis/api-v2/reading-and-searching-resources.md b/docs/03-apis/api-v2/reading-and-searching-resources.md index 191a7774e8..ac621b045b 100644 --- a/docs/03-apis/api-v2/reading-and-searching-resources.md +++ b/docs/03-apis/api-v2/reading-and-searching-resources.md @@ -462,12 +462,17 @@ character: - Zeitglöcklein des Lebens With each character added to the last term, the selection gets more -specific. The first term should at least contain four characters. To +specific. The first term should at least contain three characters. To make this kind of "search as you type" possible, a wildcard character is automatically added to the last search term. -Search by label automatically adds Lucene operators, -search strings are expected not to contain any characters with a special meaning in -[Lucene Query Parser syntax](../../07-lucene/index.md). + +Characters provided by the user that have a special meaning in the Lucene Query Parser +syntax are replaced by a whitespace character for this search. If a user types "Zeit-Glöcklein" +it is interpreted as "Zeit Glöcklein". Whitespace is normalized afterwards. The special +characters that are replaced are: +`+`, `-`, `&`, `|`, `!`, `(`, `)`, `[`, `]`, `{`, `}`, `^`, `"`, `~`, `*`, `?`, `:`, `\` + +If the `rdfs:label` of a resource contains a special character, it is found nonetheless. ``` HTTP GET to http://host/v2/searchbylabel/searchValue[limitToResourceClass=resourceClassIRI] diff --git a/test_data/all_data/books-data.ttl b/test_data/all_data/books-data.ttl index 849fabf9b0..61693657bf 100644 --- a/test_data/all_data/books-data.ttl +++ b/test_data/all_data/books-data.ttl @@ -154,7 +154,7 @@ knora-base:hasPermissions "CR knora-admin:Creator|M knora-admin:ProjectMember|V knora-admin:KnownUser,knora-admin:UnknownUser" ; knora-base:creationDate "2019-11-29T10:00:00.673298Z"^^xsd:dateTime ; books:hasTitle ; - rdfs:label "this / is + a - test & with \\ special ( characters ) in | the || label" ; + rdfs:label "this .,:; is + a - test & with \\ special ( characters ) in [] {} | the || label?!" ; knora-base:isDeleted false . diff --git a/test_data/searchR2RV2/SearchbylabelSpecialCharacters.jsonld b/test_data/searchR2RV2/SearchbylabelSpecialCharacters.jsonld index 39b9d3abbc..62ef786f79 100644 --- a/test_data/searchR2RV2/SearchbylabelSpecialCharacters.jsonld +++ b/test_data/searchR2RV2/SearchbylabelSpecialCharacters.jsonld @@ -3,7 +3,7 @@ "@value": "http://0.0.0.0:3336/ark:/72163/1/0001/book=instance=05I", "@type": "xsd:anyURI" }, - "rdfs:label": "this / is + a - test & with \\ special ( characters ) in | the || label", + "rdfs:label": "this .,:; is + a - test & with \\ special ( characters ) in [] {} | the || label?!", "knora-api:versionArkUrl": { "@value": "http://0.0.0.0:3336/ark:/72163/1/0001/book=instance=05I.20191129T100000673298Z", "@type": "xsd:anyURI" diff --git a/webapi/src/main/scala/org/knora/webapi/messages/StringFormatter.scala b/webapi/src/main/scala/org/knora/webapi/messages/StringFormatter.scala index 9b830459fd..08ed3e7604 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/StringFormatter.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/StringFormatter.scala @@ -1703,7 +1703,7 @@ class StringFormatter private ( * @return the normalized string */ def replaceLuceneQueryParserSyntaxCharacters(s: String): String = { - val stringWithoutSpecialCharacters = s.replaceAll("[\\+\\-&\\|!\\(\\)\\{\\}\\[\\]\\^\"~\\*\\?:\\\\/]", " ") + val stringWithoutSpecialCharacters = s.replaceAll("[\\+\\-&\\|!\\(\\)\\{\\}\\[\\]\\^\"~\\*\\?:\\\\]", " ") StringUtils.normalizeSpace(stringWithoutSpecialCharacters) } diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/v2/SearchRouteV2R2RSpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/v2/SearchRouteV2R2RSpec.scala index c74b2c9fc9..21b321b41b 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/v2/SearchRouteV2R2RSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/v2/SearchRouteV2R2RSpec.scala @@ -10075,7 +10075,7 @@ class SearchRouteV2R2RSpec extends R2RSpec { "perform a searchbylabel search for a label with special characters" in { val searchValueUriEncoded: String = URLEncoder.encode( - "this / is + a - test & with \\ special ( characters ) in | the || label", + "this .,:; is + a - test & with \\ special ( characters ) in [] {} | the || label?!", "UTF-8" ) val limitToResourceClassUriEncoded: String = URLEncoder.encode(