Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: Speedup /projects endpoint #2824

Merged
merged 4 commits into from
Sep 6, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Original file line number Diff line number Diff line change
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]]
}
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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)")
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
throw new UnsupportedOperationException("not implemented (yet)")
throw new UnsupportedOperationException("Not yet implemented.")

}

object KnoraProjectRepoInMemory {
Expand Down
Original file line number Diff line number Diff line change
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")
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
throw new UnsupportedOperationException("not yet implemented")
throw new UnsupportedOperationException("Not yet implemented.")

}

object KnoraProjectRepoInMemory {
Expand Down