Skip to content

Commit

Permalink
refactor: rework removing of type annotations (DEV-2079) (#2611)
Browse files Browse the repository at this point in the history
  • Loading branch information
BalduinLandolt committed Apr 25, 2023
1 parent b975d01 commit 461b0b6
Show file tree
Hide file tree
Showing 9 changed files with 34 additions and 57 deletions.
9 changes: 3 additions & 6 deletions webapi/src/it/scala/org/knora/webapi/core/LayersTest.scala
Expand Up @@ -13,8 +13,9 @@ import org.knora.webapi.messages.util.PermissionUtilADMLive
import org.knora.webapi.messages.util.ValueUtilV1
import org.knora.webapi.messages.util.ValueUtilV1Live
import org.knora.webapi.messages.util.search.QueryTraverser
import org.knora.webapi.messages.util.search.gravsearch.prequery.InferenceOptimizationService
import org.knora.webapi.messages.util.search.gravsearch.transformers.SparqlTransformerLive
import org.knora.webapi.messages.util.search.gravsearch.types.GravsearchTypeInspectionUtil
import org.knora.webapi.messages.util.search.gravsearch.types.GravsearchTypeInspectionRunner
import org.knora.webapi.messages.util.standoff.StandoffTagUtilV2
import org.knora.webapi.messages.util.standoff.StandoffTagUtilV2Live
import org.knora.webapi.responders.IriService
Expand Down Expand Up @@ -89,6 +90,7 @@ import org.knora.webapi.slice.ontology.repo.service.OntologyCache
import org.knora.webapi.slice.ontology.repo.service.OntologyCacheLive
import org.knora.webapi.slice.ontology.repo.service.OntologyRepoLive
import org.knora.webapi.slice.ontology.repo.service.PredicateRepositoryLive
import org.knora.webapi.slice.resourceinfo.api.ResourceInfoRoute
import org.knora.webapi.slice.resourceinfo.api.RestResourceInfoService
import org.knora.webapi.slice.resourceinfo.domain.IriConverter
import org.knora.webapi.slice.resourceinfo.domain.ResourceInfoRepo
Expand All @@ -109,9 +111,6 @@ import org.knora.webapi.store.triplestore.upgrade.RepositoryUpdater
import org.knora.webapi.testcontainers.FusekiTestContainer
import org.knora.webapi.testcontainers.SipiTestContainer
import org.knora.webapi.testservices.TestClientService
import org.knora.webapi.slice.resourceinfo.api.ResourceInfoRoute
import org.knora.webapi.messages.util.search.gravsearch.types.GravsearchTypeInspectionRunner
import org.knora.webapi.messages.util.search.gravsearch.prequery.InferenceOptimizationService
object LayersTest {

/**
Expand All @@ -132,7 +131,6 @@ object LayersTest {
with CkanResponderV1
with ConstructResponseUtilV2
with GravsearchTypeInspectionRunner
with GravsearchTypeInspectionUtil
with GroupsResponderADM
with HttpServer
with IIIFRequestMessageHandler
Expand Down Expand Up @@ -196,7 +194,6 @@ object LayersTest {
CkanResponderV1Live.layer,
ConstructResponseUtilV2Live.layer,
GravsearchTypeInspectionRunner.layer,
GravsearchTypeInspectionUtil.layer,
GroupsResponderADMLive.layer,
HttpServer.layer,
HttpServerZ.layer,
Expand Down
Expand Up @@ -34,7 +34,7 @@ class GravsearchToCountPrequeryTransformerSpec extends CoreSpec {
querySchemaMaybe = constructQuery.querySchema
inspectionResult <- inspectionRunner.flatMap(_.inspectTypes(whereClause, anythingAdminUser))
_ <- GravsearchQueryChecker.checkConstructClause(constructClause, inspectionResult)
sanitizedWhereClause <- ZIO.serviceWithZIO[GravsearchTypeInspectionUtil](_.removeTypeAnnotations(whereClause))
sanitizedWhereClause <- GravsearchTypeInspectionUtil.removeTypeAnnotations(whereClause)
querySchema <-
ZIO.fromOption(querySchemaMaybe).orElseFail(AssertionException(s"WhereClause has no querySchema"))
transformer =
Expand Down
Expand Up @@ -33,7 +33,7 @@ class GravsearchToPrequeryTransformerSpec extends CoreSpec {
constructClause = constructQuery.constructClause
whereClause = constructQuery.whereClause
querySchemaMaybe = constructQuery.querySchema
sanitizedWhereClause <- ZIO.serviceWithZIO[GravsearchTypeInspectionUtil](_.removeTypeAnnotations(whereClause))
sanitizedWhereClause <- GravsearchTypeInspectionUtil.removeTypeAnnotations(whereClause)
typeInspectionResult <- inspectionRunner.flatMap(_.inspectTypes(whereClause, anythingAdminUser))
_ <- GravsearchQueryChecker.checkConstructClause(constructClause, typeInspectionResult)
querySchema <- ZIO.fromOption(querySchemaMaybe).orElseFail(AssertionException(s"WhereClause has no querySchema"))
Expand Down
Expand Up @@ -1319,8 +1319,7 @@ class GravsearchTypeInspectorSpec extends CoreSpec with ImplicitSender {
val whereClauseWithoutAnnotations = UnsafeZioRun.runOrThrow {
for {
parsedQuery <- ZIO.attempt(GravsearchParser.parseQuery(QueryWithExplicitTypeAnnotations))
util <- ZIO.service[GravsearchTypeInspectionUtil]
result <- util.removeTypeAnnotations(parsedQuery.whereClause)
result <- GravsearchTypeInspectionUtil.removeTypeAnnotations(parsedQuery.whereClause)
} yield result
}
whereClauseWithoutAnnotations should ===(whereClauseWithoutAnnotations)
Expand Down
3 changes: 0 additions & 3 deletions webapi/src/main/scala/org/knora/webapi/core/LayersLive.scala
Expand Up @@ -21,7 +21,6 @@ import org.knora.webapi.messages.util.search.QueryTraverser
import org.knora.webapi.messages.util.search.gravsearch.prequery.InferenceOptimizationService
import org.knora.webapi.messages.util.search.gravsearch.transformers.SparqlTransformerLive
import org.knora.webapi.messages.util.search.gravsearch.types.GravsearchTypeInspectionRunner
import org.knora.webapi.messages.util.search.gravsearch.types.GravsearchTypeInspectionUtil
import org.knora.webapi.messages.util.standoff.StandoffTagUtilV2
import org.knora.webapi.messages.util.standoff.StandoffTagUtilV2Live
import org.knora.webapi.responders.IriService
Expand Down Expand Up @@ -133,7 +132,6 @@ object LayersLive {
with CkanResponderV1
with ConstructResponseUtilV2
with GravsearchTypeInspectionRunner
with GravsearchTypeInspectionUtil
with GroupsResponderADM
with HttpServer
with IIIFRequestMessageHandler
Expand Down Expand Up @@ -204,7 +202,6 @@ object LayersLive {
CkanResponderV1Live.layer,
ConstructResponseUtilV2Live.layer,
GravsearchTypeInspectionRunner.layer,
GravsearchTypeInspectionUtil.layer,
GroupsResponderADMLive.layer,
HttpServer.layer,
HttpServerZ.layer, // this is the new ZIO HTTP server layer
Expand Down
Expand Up @@ -130,7 +130,7 @@ final case class QueryTraverser(
* @param limitInferenceToOntologies a set of ontology IRIs, to which the simulated inference will be limited. If `None`, all possible inference will be done.
* @return the transformed query patterns.
*/
def transformWherePatterns(
private def transformWherePatterns(
patterns: Seq[QueryPattern],
inputOrderBy: Seq[OrderCriterion],
whereTransformer: WhereTransformer,
Expand Down
@@ -1,3 +1,8 @@
/*
* Copyright © 2021 - 2023 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors.
* SPDX-License-Identifier: Apache-2.0
*/

package org.knora.webapi.messages.util.search.gravsearch.transformers

import zio._
Expand Down
Expand Up @@ -13,16 +13,12 @@ import org.knora.webapi.IRI
import org.knora.webapi.messages.OntologyConstants
import org.knora.webapi.messages.SmartIri
import org.knora.webapi.messages.util.search._
import org.knora.webapi.messages.util.search.gravsearch.types.GravsearchTypeInspectionUtil.AnnotationRemovingWhereTransformer

/**
* Utilities for Gravsearch type inspection.
*/
object GravsearchTypeInspectionUtil {

val layer: ZLayer[QueryTraverser, Nothing, GravsearchTypeInspectionUtil] =
ZLayer.fromFunction(GravsearchTypeInspectionUtil.apply _)

/**
* A trait for case objects representing type annotation properties.
*/
Expand Down Expand Up @@ -157,28 +153,6 @@ object GravsearchTypeInspectionUtil {
def toTypeableEntities(entities: Seq[Entity]): Set[TypeableEntity] =
entities.flatMap(entity => maybeTypeableEntity(entity)).toSet

/**
* A [[WhereTransformer]] for removing Gravsearch type annotations from a WHERE clause.
*/
private class AnnotationRemovingWhereTransformer extends WhereTransformer {
override def transformStatementInWhere(
statementPattern: StatementPattern,
inputOrderBy: Seq[OrderCriterion],
limitInferenceToOntologies: Option[Set[SmartIri]] = None
): Task[Seq[QueryPattern]] = ZIO.attempt {
if (mustBeAnnotationStatement(statementPattern)) {
Seq.empty[QueryPattern]
} else {
Seq(statementPattern)
}
}

override def optimiseQueryPatterns(patterns: Seq[QueryPattern]): Task[Seq[QueryPattern]] = ZIO.succeed(patterns)

override def transformLuceneQueryPattern(luceneQueryPattern: LuceneQueryPattern): Task[Seq[QueryPattern]] =
ZIO.succeed(Seq(luceneQueryPattern))
}

/**
* Determines whether a statement pattern must represent a Gravsearch type annotation.
*
Expand Down Expand Up @@ -250,22 +224,31 @@ object GravsearchTypeInspectionUtil {
case _ => false
}
}
}

final case class GravsearchTypeInspectionUtil(queryTraverser: QueryTraverser) {

/**
* Removes Gravsearch type annotations from a WHERE clause.
*
* @param whereClause the WHERE clause.
* @return the same WHERE clause, minus any type annotations.
*/
def removeTypeAnnotations(whereClause: WhereClause): Task[WhereClause] =
for {
wherePatterns <- queryTraverser.transformWherePatterns(
patterns = whereClause.patterns,
inputOrderBy = Seq.empty[OrderCriterion],
whereTransformer = new AnnotationRemovingWhereTransformer
)
} yield whereClause.copy(patterns = wherePatterns)
def removeTypeAnnotations(whereClause: WhereClause): Task[WhereClause] = {
val patterns = whereClause.patterns.flatMap(transformPattern)
ZIO.succeed(whereClause.copy(patterns = patterns))
}

private def transformPattern(pattern: QueryPattern): Seq[QueryPattern] =
pattern match {
case filterNotExistsPattern: FilterNotExistsPattern =>
Seq(FilterNotExistsPattern(filterNotExistsPattern.patterns.flatMap(transformPattern)))
case minusPattern: MinusPattern => Seq(MinusPattern(minusPattern.patterns.flatMap(transformPattern)))
case optionalPattern: OptionalPattern => Seq(OptionalPattern(optionalPattern.patterns.flatMap(transformPattern)))
case unionPattern: UnionPattern => Seq(UnionPattern(unionPattern.blocks.map(_.flatMap(transformPattern))))
case filterPattern: FilterPattern => Seq(filterPattern)
case luceneQueryPattern: LuceneQueryPattern => Seq(luceneQueryPattern)
case valuesPattern: ValuesPattern => Seq(valuesPattern)
case bindPattern: BindPattern => Seq(bindPattern)
case statementPattern: StatementPattern =>
if (mustBeAnnotationStatement(statementPattern)) Seq.empty[QueryPattern]
else Seq(statementPattern)
}
}
Expand Up @@ -63,7 +63,6 @@ trait SearchResponderV2
final case class SearchResponderV2Live(
private val appConfig: AppConfig,
private val triplestoreService: TriplestoreService,
private val gravsearchTypeInspectionUtil: GravsearchTypeInspectionUtil,
private val messageRelay: MessageRelay,
private val constructResponseUtilV2: ConstructResponseUtilV2,
private val ontologyCache: OntologyCache,
Expand Down Expand Up @@ -378,7 +377,7 @@ final case class SearchResponderV2Live(
// Do type inspection and remove type annotations from the WHERE clause.
typeInspectionResult <- gravsearchTypeInspectionRunner.inspectTypes(inputQuery.whereClause, requestingUser)

whereClauseWithoutAnnotations <- gravsearchTypeInspectionUtil.removeTypeAnnotations(inputQuery.whereClause)
whereClauseWithoutAnnotations <- GravsearchTypeInspectionUtil.removeTypeAnnotations(inputQuery.whereClause)

// Validate schemas and predicates in the CONSTRUCT clause.
_ <- GravsearchQueryChecker.checkConstructClause(inputQuery.constructClause, typeInspectionResult)
Expand Down Expand Up @@ -453,7 +452,7 @@ final case class SearchResponderV2Live(
for {
// Do type inspection and remove type annotations from the WHERE clause.
typeInspectionResult <- gravsearchTypeInspectionRunner.inspectTypes(inputQuery.whereClause, requestingUser)
whereClauseWithoutAnnotations <- gravsearchTypeInspectionUtil.removeTypeAnnotations(inputQuery.whereClause)
whereClauseWithoutAnnotations <- GravsearchTypeInspectionUtil.removeTypeAnnotations(inputQuery.whereClause)

// Validate schemas and predicates in the CONSTRUCT clause.
_ <- GravsearchQueryChecker.checkConstructClause(inputQuery.constructClause, typeInspectionResult)
Expand Down Expand Up @@ -1068,7 +1067,6 @@ object SearchResponderV2Live {
val layer: ZLayer[
AppConfig
with TriplestoreService
with GravsearchTypeInspectionUtil
with MessageRelay
with ConstructResponseUtilV2
with OntologyCache
Expand All @@ -1085,7 +1083,6 @@ object SearchResponderV2Live {
for {
appConfig <- ZIO.service[AppConfig]
triplestoreService <- ZIO.service[TriplestoreService]
gravsearchTypeInspectionUtil <- ZIO.service[GravsearchTypeInspectionUtil]
messageRelay <- ZIO.service[MessageRelay]
constructResponseUtilV2 <- ZIO.service[ConstructResponseUtilV2]
ontologyCache <- ZIO.service[OntologyCache]
Expand All @@ -1100,7 +1097,6 @@ object SearchResponderV2Live {
new SearchResponderV2Live(
appConfig,
triplestoreService,
gravsearchTypeInspectionUtil,
messageRelay,
constructResponseUtilV2,
ontologyCache,
Expand Down

0 comments on commit 461b0b6

Please sign in to comment.