Skip to content

Commit

Permalink
feat: project.dateModified in search results for projects (#1595)
Browse files Browse the repository at this point in the history
Add `dateModified` to recently-viewed and search results for projects
  • Loading branch information
eikek authored Jul 12, 2023
1 parent 6fa8242 commit 720149b
Show file tree
Hide file tree
Showing 22 changed files with 116 additions and 79 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ import eu.timepit.refined.numeric.Positive
import io.renku.graph.acceptancetests.data.Project._
import io.renku.graph.model.entities.Project.ProjectMember
import io.renku.graph.model.projects.{GitLabId, Name, Path}
import io.renku.graph.model.{projects, testentities}
import io.renku.graph.model.testentities
import io.renku.tinytypes._
import io.renku.tinytypes.constraints._

Expand All @@ -37,7 +37,6 @@ final case class Project(entitiesProject: testentities.RenkuProject,
id: GitLabId,
maybeCreator: Option[ProjectMember],
members: NonEmptyList[ProjectMember],
dateModified: projects.DateModified,
urls: Urls,
starsCount: StarsCount,
permissions: Permissions,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,6 @@ import io.renku.graph.model.testentities.projectMembers
import io.renku.graph.model.versions.CliVersion
import org.scalacheck.Gen

import java.time.Instant.now

package object data extends TSData with ProjectFunctions {

implicit val cliVersion: CliVersion = currentVersionPair.cliVersion
Expand All @@ -44,14 +42,13 @@ package object data extends TSData with ProjectFunctions {
projectGen: Gen[testentities.RenkuProject],
commitsCount: CommitsCount = CommitsCount.one
): Gen[Project] = for {
project <- projectGen
id <- projectIds
members <- projectMembers.toGeneratorOfNonEmptyList(max = 3)
dateModified <- timestamps(min = project.dateCreated.value, max = now).toGeneratorOf[projects.DateModified]
urls <- urlsObjects
starsCount <- starsCounts
permissions <- permissionsObjects
statistics <- statisticsObjects.map(_.copy(commitsCount = commitsCount))
project <- projectGen
id <- projectIds
members <- projectMembers.toGeneratorOfNonEmptyList(max = 3)
urls <- urlsObjects
starsCount <- starsCounts
permissions <- permissionsObjects
statistics <- statisticsObjects.map(_.copy(commitsCount = commitsCount))
_ = if (project.members.nonEmpty)
throw new Exception(show"Test project should not have members")
_ = if (project.maybeCreator.flatMap(_.maybeGitLabId).nonEmpty)
Expand All @@ -60,7 +57,6 @@ package object data extends TSData with ProjectFunctions {
id,
maybeCreator = project.maybeCreator.map(_.to[ProjectMember]),
members,
dateModified,
urls,
starsCount,
permissions,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ package object knowledgegraph {
"name": ${project.name.value},
"visibility": ${project.entitiesProject.visibility.value},
"created": ${(project.entitiesProject.dateCreated, project.entitiesProject.maybeCreator)},
"dateModified": ${project.dateModified.value},
"dateModified": ${project.entitiesProject.dateModified.value},
"urls": ${project.urls.toJson},
"forking": ${project.entitiesProject.forksCount -> project.entitiesProject},
"keywords": ${project.entitiesProject.keywords.map(_.value).toList.sorted},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@ trait JsonEncoders {
"created_at" -> project.entitiesProject.dateCreated.value.asJson,
"updated_at" -> project.entitiesProject.dateModified.value.asJson,
"creator_id" -> project.maybeCreator.map(_.gitLabId).asJson,
"last_activity_at" -> project.dateModified.value.asJson,
"last_activity_at" -> project.entitiesProject.dateModified.value.asJson,
"permissions" -> project.permissions.asJson,
"statistics" -> project.statistics.asJson,
"forked_from_project" -> (project.entitiesProject match {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,24 +36,27 @@ private case object ProjectsQuery extends EntityQuery[model.Entity.Project] {
private val pathVar = VarName("path")
private val visibilityVar = VarName("visibility")
private val dateVar = VarName("date")
private val dateModifiedVar = VarName("dateModified")
private val maybeCreatorNameVar = VarName("maybeCreatorName")
private val maybeDescriptionVar = VarName("maybeDescription")
private val keywordsVar = VarName("keywords")
private val imagesVar = VarName("images")

// local vars
private val projectIdVar = VarName("projectId")
private val someDateVar = VarName("someDate")
private val someCreatorNameVar = VarName("someCreatorName")
private val keywordVar = VarName("keyword")
private val encodedImageUrlVar = VarName("encodedImageUrl")
private val projectIdVar = VarName("projectId")
private val someDateVar = VarName("someDate")
private val someDateModifiedVar = VarName("someDateModified")
private val someCreatorNameVar = VarName("someCreatorName")
private val keywordVar = VarName("keyword")
private val encodedImageUrlVar = VarName("encodedImageUrl")

override val selectVariables: Set[String] = Set(entityTypeVar,
matchingScoreVar,
nameVar,
pathVar,
visibilityVar,
dateVar,
dateModifiedVar,
maybeCreatorNameVar,
maybeDescriptionVar,
keywordsVar,
Expand All @@ -65,6 +68,7 @@ private case object ProjectsQuery extends EntityQuery[model.Entity.Project] {
sparql"""|{
| SELECT $entityTypeVar $matchingScoreVar $nameVar $pathVar $visibilityVar
| (MIN($someDateVar) AS $dateVar)
| (MAX($someDateModifiedVar) AS $dateModifiedVar)
| (SAMPLE($someCreatorNameVar) AS $maybeCreatorNameVar)
| $maybeDescriptionVar
| (GROUP_CONCAT(DISTINCT $keywordVar; separator=',') AS $keywordsVar)
Expand All @@ -79,6 +83,7 @@ private case object ProjectsQuery extends EntityQuery[model.Entity.Project] {
| $projectIdVar a renku:DiscoverableProject;
| schema:name $nameVar;
| renku:projectPath $pathVar;
| schema:dateModified $someDateModifiedVar;
| schema:dateCreated $someDateVar.
|
| ${filters.maybeOnDateCreated(someDateVar)}
Expand Down Expand Up @@ -201,6 +206,7 @@ private case object ProjectsQuery extends EntityQuery[model.Entity.Project] {
name <- read[projects.Name](nameVar)
visibility <- read[projects.Visibility](visibilityVar)
dateCreated <- read[projects.DateCreated](dateVar)
dateModified <- read[projects.DateModified](dateModifiedVar)
maybeCreatorName <- read[Option[persons.Name]](maybeCreatorNameVar)
maybeDescription <- read[Option[projects.Description]](maybeDescriptionVar)
images <- read[Option[String]](imagesVar) >>= toListOfImageUris
Expand All @@ -211,6 +217,7 @@ private case object ProjectsQuery extends EntityQuery[model.Entity.Project] {
name,
visibility,
dateCreated,
dateModified,
maybeCreatorName,
keywords,
maybeDescription,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ object model {
name: projects.Name,
visibility: projects.Visibility,
date: projects.DateCreated,
dateModified: projects.DateModified,
maybeCreator: Option[persons.Name],
keywords: List[projects.Keyword],
maybeDescription: Option[projects.Description],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ private object EntityConverters {
project.name,
project.visibility,
project.dateCreated,
project.dateModified,
project.maybeCreator.map(_.name),
project.keywords.toList.sorted,
project.maybeDescription,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,8 @@ object ProjectQuery extends (Criteria => Option[SparqlQuery]) {
| schema:name ${v.projectName};
| renku:projectPath ${v.projectPath};
| renku:projectVisibility ${v.visibility};
| schema:dateCreated ${v.date}.
| schema:dateModified ${v.dateModified};
| schema:dateCreated ${v.dateCreated}.
|
| Optional {
| ?projectId schema:creator ?creator.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,8 @@ object Variables {
val projectPath = VarName("projectPath")
val visibility = VarName("visibility")
val creatorNames = VarName("creatorNames")
val date = VarName("date")
val dateCreated = VarName("dateCreated")
val dateModified = VarName("dateModified")
val description = VarName("description")
val keywords = VarName("keywords")
val images = VarName("images")
Expand All @@ -123,7 +124,8 @@ object Variables {
projectPath,
visibility,
creatorNames,
date,
dateCreated,
dateModified,
description,
viewedDate,
keywords,
Expand All @@ -136,7 +138,8 @@ object Variables {
name <- read[projects.Name](projectName)
path <- read[projects.Path](projectPath)
visibility <- read[projects.Visibility](visibility)
dateCreated <- read[projects.DateCreated](date)
dateCreated <- read[projects.DateCreated](dateCreated)
dateModified <- read[projects.DateModified](dateModified)
maybeCreatorName <- read[Option[persons.Name]](creatorNames)
keywords <-
read[Option[String]](keywords) >>= toListOf[projects.Keyword, projects.Keyword.type](projects.Keyword)
Expand All @@ -148,6 +151,7 @@ object Variables {
name,
visibility,
dateCreated,
dateModified,
maybeCreatorName,
keywords,
maybeDescription,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ class ProjectQuerySpec extends SearchTestBase {
name = project.name,
visibility = project.visibility,
date = project.dateCreated,
dateModified = project.dateModified,
maybeCreator = project.maybeCreator.map(_.name),
keywords = project.keywords.toList.sorted,
maybeDescription = project.maybeDescription,
Expand Down Expand Up @@ -82,6 +83,7 @@ class ProjectQuerySpec extends SearchTestBase {
name = project.name,
visibility = project.visibility,
date = project.dateCreated,
dateModified = project.dateModified,
maybeCreator = project.maybeCreator.map(_.name),
keywords = project.keywords.toList.sorted,
maybeDescription = project.maybeDescription,
Expand Down Expand Up @@ -115,6 +117,7 @@ class ProjectQuerySpec extends SearchTestBase {
name = project1.name,
visibility = project1.visibility,
date = project1.dateCreated,
dateModified = project1.dateModified,
maybeCreator = project1.maybeCreator.map(_.name),
keywords = project1.keywords.toList.sorted,
maybeDescription = project1.maybeDescription,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ class RecentEntitiesFinderSpec extends SearchTestBase {
name = project2.name,
visibility = project2.visibility,
date = project2.dateCreated,
dateModified = project2.dateModified,
maybeCreator = project2.maybeCreator.map(_.name),
keywords = project2.keywords.toList.sorted,
maybeDescription = project2.maybeDescription,
Expand Down Expand Up @@ -145,6 +146,7 @@ class RecentEntitiesFinderSpec extends SearchTestBase {
name = project2.name,
visibility = project2.visibility,
date = project2.dateCreated,
dateModified = project2.dateModified,
maybeCreator = project2.maybeCreator.map(_.name),
keywords = project2.keywords.toList.sorted,
maybeDescription = project2.maybeDescription,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,7 @@ private class EndpointDocsImpl()(implicit gitLabUrl: GitLabUrl, renkuApiUrl: ren
projects.Name("name"),
projects.Visibility.Public,
projects.DateCreated(Instant.parse("2012-11-15T10:00:00.000Z")),
projects.DateModified(Instant.parse("2012-11-16T10:00:00.000Z")),
persons.Name("Jan Kowalski").some,
List(projects.Keyword("key")),
projects.Description("Some project").some,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ final class EndpointDocsImpl()(implicit gitLabUrl: GitLabUrl, renkuApiUrl: renku
projects.Name("name"),
projects.Visibility.Public,
projects.DateCreated(Instant.parse("2012-11-15T10:00:00.000Z")),
projects.DateModified(Instant.parse("2012-11-16T10:00:00.000Z")),
persons.Name("Jan Kowalski").some,
List(projects.Keyword("key")),
projects.Description("Some project").some,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ class ModelEncoderSpec extends AnyFlatSpec with should.Matchers with DiffInstanc
name = projects.Name("my-project"),
visibility = Visibility.Public,
date = projects.DateCreated(Instant.parse("2013-03-31T13:03:45Z")),
dateModified = projects.DateModified(Instant.parse("2013-04-30T16:03:45Z")),
maybeCreator = Some(persons.Name("John Creator")),
keywords = List("word", "super-word").map(projects.Keyword),
maybeDescription = Some(projects.Description("description of it")),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ import io.renku.graph.tokenrepository.AccessTokenFinder
import io.renku.graph.tokenrepository.AccessTokenFinder.Implicits._
import io.renku.http.client.GitLabClient

import java.time.Instant

private trait GLDataFinder[F[_]] {
def fetchGLData(path: projects.Path): F[Option[DataExtract.GL]]
}
Expand Down Expand Up @@ -63,7 +65,8 @@ private class GLDataFinderImpl[F[_]: Async: GitLabClient: AccessTokenFinder] ext
(cursor.downField("path_with_namespace").as[projects.Path],
cursor.downField("name").as[projects.Name],
cursor.downField("visibility").as[projects.Visibility],
cursor.downField("updated_at").as[Option[projects.DateModified]],
cursor.downField("updated_at").as[Option[Instant]],
cursor.downField("last_activity_at").as[Option[Instant]],
cursor.downField("description").as[Option[projects.Description]],
cursor.downField("topics").as[Set[Option[projects.Keyword]]].map(_.flatten),
cursor.downField("avatar_url").as[Option[ImageUri]]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ private class TSDataFinderImpl[F[_]: MonadThrow](tsClient: TSClient[F]) extends
SparqlQuery.ofUnsafe(
show"$categoryName: find data",
Prefixes of (renku -> "renku", schema -> "schema"),
sparql"""|SELECT ?id ?path ?name ?visibility ?maybeDateModified ?maybeDesc
sparql"""|SELECT ?id ?path ?name ?visibility ?dateModified ?maybeDesc
| (GROUP_CONCAT(DISTINCT ?keyword; separator=',') AS ?keywords)
| (GROUP_CONCAT(DISTINCT ?encodedImageUrl; separator=',') AS ?images)
|WHERE {
Expand All @@ -61,8 +61,8 @@ private class TSDataFinderImpl[F[_]: MonadThrow](tsClient: TSClient[F]) extends
| ?id a schema:Project;
| renku:projectPath ?path;
| schema:name ?name;
| renku:projectVisibility ?visibility.
| OPTIONAL { ?id schema:dateModified ?maybeDateModified }
| renku:projectVisibility ?visibility;
| schema:dateModified ?dateModified.
| OPTIONAL { ?id schema:description ?maybeDesc }
| OPTIONAL { ?dsId schema:keywords ?keyword }
| OPTIONAL {
Expand All @@ -73,7 +73,7 @@ private class TSDataFinderImpl[F[_]: MonadThrow](tsClient: TSClient[F]) extends
| }
| }
|}
|GROUP BY ?id ?path ?name ?visibility ?maybeDateModified ?maybeDesc
|GROUP BY ?id ?path ?name ?visibility ?dateModified ?maybeDesc
|LIMIT 1
|""".stripMargin
)
Expand All @@ -96,14 +96,14 @@ private class TSDataFinderImpl[F[_]: MonadThrow](tsClient: TSClient[F]) extends
.getOrElse(Nil.asRight)

for {
id <- extract[projects.ResourceId]("id")
path <- extract[projects.Path]("path")
name <- extract[projects.Name]("name")
visibility <- extract[projects.Visibility]("visibility")
maybeDateModified <- extract[Option[projects.DateModified]]("maybeDateModified")
maybeDesc <- extract[Option[projects.Description]]("maybeDesc")
keywords <- extract[Option[String]]("keywords") >>= toSetOfKeywords
images <- extract[Option[String]]("images") >>= toListOfImageUris
} yield DataExtract.TS(id, path, name, visibility, maybeDateModified, maybeDesc, keywords, images)
id <- extract[projects.ResourceId]("id")
path <- extract[projects.Path]("path")
name <- extract[projects.Name]("name")
visibility <- extract[projects.Visibility]("visibility")
dateModified <- extract[projects.DateModified]("dateModified")
maybeDesc <- extract[Option[projects.Description]]("maybeDesc")
keywords <- extract[Option[String]]("keywords") >>= toSetOfKeywords
images <- extract[Option[String]]("images") >>= toListOfImageUris
} yield DataExtract.TS(id, path, name, visibility, dateModified.some, maybeDesc, keywords, images)
}(toOption(show"Multiple projects or values for '$path'"))
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ import io.renku.graph.model.images.{Image, ImageUri}
import io.renku.graph.model.projects
import io.renku.triplesstore.SparqlQuery

import java.time.Instant

private sealed trait DataExtract {
val path: projects.Path
val name: projects.Name
Expand All @@ -41,14 +43,18 @@ private object DataExtract {
keywords: Set[projects.Keyword],
images: List[ImageUri]
) extends DataExtract
final case class GL(path: projects.Path,
name: projects.Name,
visibility: projects.Visibility,
maybeDateModified: Option[projects.DateModified],
maybeDesc: Option[projects.Description],
keywords: Set[projects.Keyword],
maybeImage: Option[ImageUri]
) extends DataExtract
final case class GL(path: projects.Path,
name: projects.Name,
visibility: projects.Visibility,
updatedAt: Option[Instant],
lastActivityAt: Option[Instant],
maybeDesc: Option[projects.Description],
keywords: Set[projects.Keyword],
maybeImage: Option[ImageUri]
) extends DataExtract {
override val maybeDateModified =
List(updatedAt, lastActivityAt).max.map(projects.DateModified.apply)
}
final case class Payload(path: projects.Path,
name: projects.Name,
maybeDesc: Option[projects.Description],
Expand Down
Loading

0 comments on commit 720149b

Please sign in to comment.