From b1197576e9fa07a0ceaaaedfcff22a1e2d22829e Mon Sep 17 00:00:00 2001 From: Tobias Schweizer Date: Tue, 13 Apr 2021 14:42:27 +0200 Subject: [PATCH] feat(ext search v1): add support for URI values (DSP-1522) (#1842) * test(ext search v1): add support for URI values * test(ext search v1): add support for URI values * refactor(search responder v1): comment out println --- .../api-v1/reading-and-searching-resources.md | 1 + .../responders/v1/SearchResponderV1.scala | 11 +++++++++++ .../sparql/v1/searchExtendedGraphDB.scala.txt | 8 ++++++++ .../sparql/v1/searchExtendedStandard.scala.txt | 8 ++++++++ .../knora/webapi/e2e/v1/SearchV1R2RSpec.scala | 17 +++++++++++++++++ 5 files changed, 45 insertions(+) diff --git a/docs/03-apis/api-v1/reading-and-searching-resources.md b/docs/03-apis/api-v1/reading-and-searching-resources.md index dc234fadb0..6daa524d14 100644 --- a/docs/03-apis/api-v1/reading-and-searching-resources.md +++ b/docs/03-apis/api-v1/reading-and-searching-resources.md @@ -302,6 +302,7 @@ operators: | Text Value | MATCH_BOOLEAN, MATCH, EQ, !EQ, LIKE, !LIKE, EXISTS | | Geometry Value | EXISTS | | Geoname Value | EQ, EXISTS | +| URI Value | EQ, EXISTS | | Resource Pointer | EQ, EXISTS | | Color Value | EQ, EXISTS | | List Value | EQ, EXISTS | diff --git a/webapi/src/main/scala/org/knora/webapi/responders/v1/SearchResponderV1.scala b/webapi/src/main/scala/org/knora/webapi/responders/v1/SearchResponderV1.scala index 999695fdcb..08e81a1fd6 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/v1/SearchResponderV1.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/v1/SearchResponderV1.scala @@ -90,6 +90,10 @@ class SearchResponderV1(responderData: ResponderData) extends Responder(responde SearchComparisonOperatorV1.EQ, SearchComparisonOperatorV1.EXISTS ), + OntologyConstants.KnoraBase.UriValue -> Set( + SearchComparisonOperatorV1.EQ, + SearchComparisonOperatorV1.EXISTS + ), OntologyConstants.KnoraBase.Resource -> Set( SearchComparisonOperatorV1.EQ, SearchComparisonOperatorV1.EXISTS @@ -526,6 +530,13 @@ class SearchResponderV1(responderData: ResponderData) extends Responder(responde searchParamWithoutValue.copy(searchValue = Some(searchString)) + case OntologyConstants.KnoraBase.UriValue => + // validate URI + val searchString = stringFormatter.validateAndEscapeIri( + searchval, + throw BadRequestException(s"Invalid URI: $searchval")) + searchParamWithoutValue.copy(searchValue = Some(searchString)) + case OntologyConstants.KnoraBase.ListValue => // check if string represents a node in a list val searchString = stringFormatter.validateAndEscapeIri( diff --git a/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/searchExtendedGraphDB.scala.txt b/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/searchExtendedGraphDB.scala.txt index 6bef86ffb4..90363916a4 100644 --- a/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/searchExtendedGraphDB.scala.txt +++ b/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/searchExtendedGraphDB.scala.txt @@ -289,6 +289,14 @@ WHERE { } + case "http://www.knora.org/ontology/knora-base#UriValue" => { + + ?valueObject@index knora-base:valueHasUri '@searchCriterion.searchValue'^^xsd:anyURI . + + BIND('@searchCriterion.searchValue' AS ?literal@index) + + } + case other => { @{throw SparqlGenerationException(s"Value type $other is not supported with comparison operator ${searchCriterion.comparisonOperator}"); ()} } diff --git a/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/searchExtendedStandard.scala.txt b/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/searchExtendedStandard.scala.txt index 2655b94d99..547e57bc05 100644 --- a/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/searchExtendedStandard.scala.txt +++ b/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/v1/searchExtendedStandard.scala.txt @@ -281,6 +281,14 @@ WHERE { } + case "http://www.knora.org/ontology/knora-base#UriValue" => { + + ?valueObject@index knora-base:valueHasUri '@searchCriterion.searchValue'^^xsd:anyURI . + + BIND('@searchCriterion.searchValue' AS ?literal@index) + + } + case other => { @{throw SparqlGenerationException(s"Value type $other is not supported with comparison operator ${searchCriterion.comparisonOperator}"); ()} } diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/v1/SearchV1R2RSpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/v1/SearchV1R2RSpec.scala index f75a52d59f..d92a9f3735 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/v1/SearchV1R2RSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/v1/SearchV1R2RSpec.scala @@ -329,6 +329,23 @@ class SearchV1R2RSpec extends R2RSpec { } + "perform an extended search for an anything:Thing with a URI" in { + + val props = + "&property_id=http%3A%2F%2Fwww.knora.org%2Fontology%2F0001%2Fanything%23hasUri&compop=EQ&searchval=http%3A%2F%2Fwww.google.ch" + val filter = + "&show_nrows=25&start_at=0&filter_by_restype=http%3A%2F%2Fwww.knora.org%2Fontology%2F0001%2Fanything%23Thing" + + Get("/v1/search/?searchtype=extended" + props + filter) ~> searchPath ~> check { + + assert(status == StatusCodes.OK, response.toString) + + checkNumberOfHits(responseAs[String], 1) + + } + + } + } }