Skip to content

Commit 094f81a

Browse files
committed
PIN-4722: Improve get purposes performances
1 parent f0b43f1 commit 094f81a

File tree

2 files changed

+39
-12
lines changed

2 files changed

+39
-12
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package it.pagopa.interop.purposeprocess.common.readmodel
2+
3+
import spray.json.DefaultJsonProtocol._
4+
import spray.json.RootJsonFormat
5+
6+
final case class ReadModelId(id: String)
7+
8+
object ReadModelId {
9+
implicit val rmiFormat: RootJsonFormat[ReadModelId] = jsonFormat1(ReadModelId.apply)
10+
}

src/main/scala/it/pagopa/interop/purposeprocess/common/readmodel/ReadModelPurposeQueries.scala

+29-12
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ import it.pagopa.interop.purposemanagement.model.purpose._
66
import org.mongodb.scala.Document
77
import org.mongodb.scala.bson.conversions.Bson
88
import org.mongodb.scala.model.Aggregates._
9-
import org.mongodb.scala.model.{Field, Filters}
109
import org.mongodb.scala.model.Projections.{computed, fields, include}
1110
import org.mongodb.scala.model.Sorts.ascending
11+
import org.mongodb.scala.model.{Field, Filters, Projections}
1212

1313
import java.util.UUID
1414
import scala.concurrent.{ExecutionContext, Future}
@@ -60,18 +60,16 @@ object ReadModelPurposeQueries extends ReadModelQuery {
6060
limit: Int,
6161
exactMatchOnTitle: Boolean = false
6262
)(implicit ec: ExecutionContext, readModel: ReadModelService): Future[PaginatedResult[PersistentPurpose]] = {
63+
6364
val simpleFilters: Bson = listPurposesFilters(title, eServicesIds, consumersIds, states, exactMatchOnTitle)
64-
val query: Seq[Bson] = Seq(
65-
`match`(simpleFilters),
66-
lookup("eservices", "data.eserviceId", "data.id", "eservices"),
67-
addFields(Field("eservice", Document("""{ $arrayElemAt: [ "$eservices", 0 ] }"""))),
68-
`match`(
69-
Filters
70-
.and(listPurposesAuthorizationFilters(excludeDraft), listPurposesProducersFilters(producersIds))
71-
)
72-
)
7365

7466
for {
67+
producersFilter <- producersEservicesFilter(producersIds)
68+
query = Seq(
69+
`match`(simpleFilters),
70+
`match`(listPurposesAuthorizationFilters(excludeDraft)),
71+
`match`(producersFilter)
72+
)
7573
// Using aggregate to perform case insensitive sorting
7674
// N.B.: Required because DocumentDB does not support collation
7775
purposes <- readModel.aggregate[PersistentPurpose](
@@ -160,6 +158,25 @@ object ReadModelPurposeQueries extends ReadModelQuery {
160158
mapToVarArgs(versionsFilter :: Nil)(Filters.and).getOrElse(Filters.empty())
161159
}
162160

163-
private def listPurposesProducersFilters(producersIds: Seq[String]): Bson =
164-
mapToVarArgs(producersIds.map(Filters.eq("eservices.data.producerId", _)))(Filters.or).getOrElse(Filters.empty())
161+
private def producersEservicesFilter(
162+
producersIds: Seq[String]
163+
)(implicit ec: ExecutionContext, readModel: ReadModelService): Future[Bson] = {
164+
val producersEservicesIds: Future[Seq[ReadModelId]] =
165+
if (producersIds.isEmpty) {
166+
Future.successful(Seq.empty)
167+
} else {
168+
readModel.find[ReadModelId](
169+
"eservices",
170+
mapToVarArgs(producersIds.map(Filters.eq("data.producerId", _)))(Filters.or).getOrElse(Filters.empty()),
171+
Projections.include("data.id"),
172+
offset = 0,
173+
limit = Int.MaxValue
174+
)
175+
}
176+
177+
producersEservicesIds.map(ids =>
178+
mapToVarArgs(ids.map(id => Filters.eq("data.eserviceId", id.id)))(Filters.or).getOrElse(Filters.empty())
179+
)
180+
181+
}
165182
}

0 commit comments

Comments
 (0)