Skip to content

Commit

Permalink
fix: query-patterns-should-not-be-separated DEV-2473 (#2786)
Browse files Browse the repository at this point in the history
Co-authored-by: Marcin Procyk <marcin.procyk@dasch.swiss>
  • Loading branch information
seakayone and mpro7 committed Aug 15, 2023
1 parent 00379ce commit 0aae817
Show file tree
Hide file tree
Showing 3 changed files with 225 additions and 164 deletions.
Expand Up @@ -57,15 +57,21 @@ final case class ConstructTransformer(
simulateInference = true,
limitInferenceToOntologies = limit
)
case FilterNotExistsPattern(patterns) =>
ZIO.foreach(patterns)(transformPattern(_, limit).map(FilterNotExistsPattern))
case MinusPattern(patterns) => ZIO.foreach(patterns)(transformPattern(_, limit).map(MinusPattern))
case OptionalPattern(patterns) => ZIO.foreach(patterns)(transformPattern(_, limit).map(OptionalPattern))
case FilterNotExistsPattern(patterns) => transformInner(patterns, limit, FilterNotExistsPattern.apply)
case MinusPattern(patterns) => transformInner(patterns, limit, MinusPattern.apply)
case OptionalPattern(patterns) => transformInner(patterns, limit, OptionalPattern.apply)
case UnionPattern(blocks) =>
ZIO.foreach(blocks)(optimizeAndTransformPatterns(_, limit)).map(block => Seq(UnionPattern(block)))
case pattern: QueryPattern => ZIO.succeed(Seq(pattern))
}

private def transformInner[Outer <: QueryPattern](
inner: Seq[QueryPattern],
limit: Option[Set[SmartIri]],
outer: Seq[QueryPattern] => Outer
): Task[Seq[Outer]] =
ZIO.foreach(inner)(transformPattern(_, limit)).map(t => Seq(outer.apply(t.flatten)))

}

object ConstructTransformer {
Expand Down
@@ -0,0 +1,70 @@
/*
* 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.ZIO
import zio.test.ZIOSpecDefault
import zio.test.assertTrue

import org.knora.webapi.messages.IriConversions._
import org.knora.webapi.messages.SmartIri
import org.knora.webapi.messages.StringFormatter
import org.knora.webapi.messages.util.search._
import org.knora.webapi.slice.ontology.repo.service.OntologyCacheFake
import org.knora.webapi.slice.resourceinfo.domain.IriConverter

object ConstructTransformerSpec extends ZIOSpecDefault {

private implicit val sf: StringFormatter = StringFormatter.getInitializedTestInstance

private def constructTransformerTransform(q: ConstructQuery, limit: Option[Set[SmartIri]] = None) =
ZIO.serviceWithZIO[ConstructTransformer](_.transform(q, limit))

val spec = suite("ConstructTransformerLive")(
test(
"Given an optional pattern in the Where clause it should transform the inner but not split the pattern"
) {
val query = ConstructQuery(
constructClause = ConstructClause(
statements = Vector(
StatementPattern(
subj = QueryVariable("letter"),
pred = IriRef("http://api.knora.org/ontology/knora-api/simple/v2#isMainResource".toSmartIri),
obj = XsdLiteral("true", "http://www.w3.org/2001/XMLSchema#boolean".toSmartIri)
)
)
),
whereClause = WhereClause(
patterns = Vector(
OptionalPattern(
patterns = Vector(
StatementPattern(
subj = QueryVariable("person1"),
pred = IriRef("http://0.0.0.0:3333/ontology/0801/beol/simple/v2#hasFamilyName".toSmartIri),
obj = QueryVariable("name")
),
StatementPattern(
subj = IriRef("http://0.0.0.0:3333/ontology/0801/beol/simple/v2#hasFamilyName".toSmartIri),
pred = IriRef("http://api.knora.org/ontology/knora-api/simple/v2#objectType".toSmartIri),
obj = IriRef("http://www.w3.org/2001/XMLSchema#string".toSmartIri)
)
)
)
)
)
)
for {
transformed <- constructTransformerTransform(query)
} yield assertTrue(transformed.whereClause.patterns.count(_.isInstanceOf[OptionalPattern]) == 1)
}
).provide(
ConstructTransformer.layer,
IriConverter.layer,
StringFormatter.test,
OntologyInferencer.layer,
OntologyCacheFake.emptyCache
)
}

0 comments on commit 0aae817

Please sign in to comment.