Skip to content

Commit

Permalink
refactor: Speedup /projects endpoint (#2824)
Browse files Browse the repository at this point in the history
  • Loading branch information
seakayone committed Sep 6, 2023
1 parent f124f85 commit 22d5146
Show file tree
Hide file tree
Showing 5 changed files with 31 additions and 5 deletions.
Expand Up @@ -15,5 +15,6 @@ import org.knora.webapi.slice.resourceinfo.domain.InternalIri

trait KnoraProjectRepo extends Repository[KnoraProject, InternalIri] {
def findById(id: ProjectIdentifierADM): Task[Option[KnoraProject]]
def findByShortcode(shortcode: Shortcode) = findById(ShortcodeIdentifier(shortcode))
def findByShortcode(shortcode: Shortcode): Task[Option[KnoraProject]] = findById(ShortcodeIdentifier(shortcode))
def findOntologies(project: KnoraProject): Task[List[InternalIri]]
}
Expand Up @@ -60,14 +60,13 @@ final case class ProjectADMServiceLive(
private val projectRepo: KnoraProjectRepo
) extends ProjectADMService {

override def findAll: Task[List[ProjectADM]] = projectRepo.findAll().flatMap(ZIO.foreach(_)(toProjectADM))
override def findAll: Task[List[ProjectADM]] = projectRepo.findAll().flatMap(ZIO.foreachPar(_)(toProjectADM))
override def findByProjectIdentifier(projectId: ProjectIdentifierADM): Task[Option[ProjectADM]] =
projectRepo.findById(projectId).flatMap(ZIO.foreach(_)(toProjectADM))

private def toProjectADM(knoraProject: KnoraProject): Task[ProjectADM] =
for {
ontologies <- ontologyRepo.findByProject(knoraProject.id)
ontologyIris = ontologies.map(_.ontologyMetadata.ontologyIri.toIri)
ontologyIris <- projectRepo.findOntologies(knoraProject)
} yield ProjectADM(
id = knoraProject.id.value,
shortname = knoraProject.shortname,
Expand All @@ -78,7 +77,7 @@ final case class ProjectADMServiceLive(
logo = knoraProject.logo,
status = knoraProject.status,
selfjoin = knoraProject.selfjoin,
ontologies = ontologyIris
ontologies = ontologyIris.map(_.value)
).unescape

override def findAllProjectsKeywords: Task[ProjectsKeywordsGetResponseADM] =
Expand Down
Expand Up @@ -32,6 +32,7 @@ import org.knora.webapi.slice.ontology.domain.service.OntologyRepo
import org.knora.webapi.slice.resourceinfo.domain.InternalIri
import org.knora.webapi.store.triplestore.api.TriplestoreService
import org.knora.webapi.store.triplestore.api.TriplestoreService.Queries.Construct
import org.knora.webapi.store.triplestore.api.TriplestoreService.Queries.Select

final case class KnoraProjectRepoLive(
private val triplestore: TriplestoreService,
Expand Down Expand Up @@ -84,6 +85,25 @@ final case class KnoraProjectRepoLive(
selfjoin <- mapper.getSingleOrFail[BooleanLiteralV2](HasSelfJoinEnabled, propsMap).map(_.value)
} yield KnoraProject(projectIri, shortname, shortcode, longname, description, keywords, logo, status, selfjoin)
}

override def findOntologies(project: KnoraProject): Task[List[InternalIri]] = {
val query =
s"""
|PREFIX owl: <http://www.w3.org/2002/07/owl#>
|PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
|PREFIX knora-admin: <http://www.knora.org/ontology/knora-admin#>
|PREFIX knora-base: <http://www.knora.org/ontology/knora-base#>
|
|SELECT ?ontologyIri WHERE {
| BIND(<${project.id.value}> AS ?projectIri)
| ?ontologyIri a owl:Ontology .
| ?ontologyIri knora-base:attachedToProject ?projectIri .
| ?projectIri a knora-admin:knoraProject .
|} order by ?projectIri""".stripMargin
triplestore
.query(Select(query))
.map(_.results.bindings.flatMap(_.rowMap.get("ontologyIri")).map(InternalIri).toList)
}
}

object KnoraProjectRepoLive {
Expand Down
Expand Up @@ -29,6 +29,9 @@ final case class KnoraProjectRepoInMemory(projects: Ref[List[KnoraProject]])
}
)
)

override def findOntologies(project: KnoraProject): Task[List[InternalIri]] =
throw new UnsupportedOperationException("not implemented (yet)")
}

object KnoraProjectRepoInMemory {
Expand Down
Expand Up @@ -29,6 +29,9 @@ final case class KnoraProjectRepoInMemory(projects: Ref[List[KnoraProject]])
case IriIdentifier(iri) => _.id.value == iri.value
})
)

override def findOntologies(project: KnoraProject): Task[List[InternalIri]] =
throw new UnsupportedOperationException("not yet implemented")
}

object KnoraProjectRepoInMemory {
Expand Down

0 comments on commit 22d5146

Please sign in to comment.