diff options
Diffstat (limited to 'src/main/scala/xyz/driver/pdsuicommon/synchronization')
7 files changed, 0 insertions, 261 deletions
diff --git a/src/main/scala/xyz/driver/pdsuicommon/synchronization/db/SlickDataSource.scala b/src/main/scala/xyz/driver/pdsuicommon/synchronization/db/SlickDataSource.scala deleted file mode 100644 index 63514ec..0000000 --- a/src/main/scala/xyz/driver/pdsuicommon/synchronization/db/SlickDataSource.scala +++ /dev/null @@ -1,23 +0,0 @@ -package xyz.driver.pdsuicommon.synchronization.db - -import slick.dbio.DBIO - -import scalaz.OptionT - -trait SlickDataSource[T] { - - val isDictionary: Boolean = false - - /** - * @return New entity - */ - def create(x: T): DBIO[T] - - /** - * @return Updated entity - */ - def update(x: T): OptionT[DBIO, T] - - def delete(x: T): OptionT[DBIO, Unit] - -} diff --git a/src/main/scala/xyz/driver/pdsuicommon/synchronization/db/SlickDbAction.scala b/src/main/scala/xyz/driver/pdsuicommon/synchronization/db/SlickDbAction.scala deleted file mode 100644 index 57cc3d4..0000000 --- a/src/main/scala/xyz/driver/pdsuicommon/synchronization/db/SlickDbAction.scala +++ /dev/null @@ -1,70 +0,0 @@ -package xyz.driver.pdsuicommon.synchronization.db - -import slick.dbio.DBIO -import xyz.driver.pdsuicommon.logging._ -import xyz.driver.pdsuicommon.synchronization.utils.{FakeIdGen, FakeIdMap} - -import scala.concurrent.ExecutionContext -import scalaz.Monad - -trait SlickDbAction[+T] { - def entity: T -} - -object SlickDbAction { - - final case class Create[T](entity: T) extends SlickDbAction[T] - final case class Update[T](entity: T) extends SlickDbAction[T] - final case class Delete[T](entity: T) extends SlickDbAction[T] - - // Use it only inside of a transaction! - def unsafeRun[T](actions: List[SlickDbAction[T]], dataSource: SlickDataSource[T])( - implicit core: FakeIdGen[T], - executionContext: ExecutionContext, - dbioMonad: Monad[DBIO]): DBIO[FakeIdMap[T]] = { - unsafeRun(DBIO.successful(FakeIdMap.empty))(actions, dataSource) - } - - // Use it only inside of a transaction! - def unsafeRun[T](initial: DBIO[FakeIdMap[T]])(actions: List[SlickDbAction[T]], dataSource: SlickDataSource[T])( - implicit core: FakeIdGen[T], - executionContext: ExecutionContext, - dbioMonad: Monad[DBIO]): DBIO[FakeIdMap[T]] = { - // TODO Squash Updates and Delete to one operation, when bugs in repositories will be fixed - actions.foldLeft(initial) { - case (previousActions, Create(x)) => - for { - r <- previousActions - newArm <- dataSource.create(x) - } yield { - r + (core(newArm) -> newArm) - } - - case (previousActions, Update(x)) => - for { - r <- previousActions - updatedArm <- dataSource.update(x).getOrElse(x) - } yield { - r - core(updatedArm) + (core(updatedArm) -> updatedArm) - } - - case (previousActions, Delete(_)) if dataSource.isDictionary => - previousActions // We don't delete entities from dictionaries - - case (previousActions, Delete(x)) => - for { - r <- previousActions - _ <- dataSource.delete(x).run - } yield { - r - core(x) - } - } - } - - implicit def toPhiString[T](input: SlickDbAction[T])(implicit inner: T => PhiString): PhiString = input match { - case Create(x) => phi"Create($x)" - case Update(x) => phi"Update($x)" - case Delete(x) => phi"Delete($x)" - } - -} diff --git a/src/main/scala/xyz/driver/pdsuicommon/synchronization/db/SlickDbDiff.scala b/src/main/scala/xyz/driver/pdsuicommon/synchronization/db/SlickDbDiff.scala deleted file mode 100644 index c226659..0000000 --- a/src/main/scala/xyz/driver/pdsuicommon/synchronization/db/SlickDbDiff.scala +++ /dev/null @@ -1,52 +0,0 @@ -package xyz.driver.pdsuicommon.synchronization.db - -import xyz.driver.pdsuicommon.synchronization.domain.FakeId -import xyz.driver.pdsuicommon.synchronization.utils.{FakeIdGen, Refiner} - -import scala.annotation.tailrec -import scala.collection.breakOut -import scala.collection.immutable.SortedSet - -object SlickDbDiff { - - /** - * Calculates DB-actions to synchronize origEntities with draftEntities. - */ - def calc[DraftT, OrigT](origEntities: Iterable[OrigT], draftEntities: Iterable[DraftT])( - implicit draftFakeIdGen: FakeIdGen[DraftT], - origFakeIdGen: FakeIdGen[OrigT], - refiner: Refiner[DraftT, OrigT]): List[SlickDbAction[OrigT]] = { - val origMap: Map[FakeId, OrigT] = origEntities.map(x => origFakeIdGen(x) -> x)(breakOut) - val uniqueDraftEntities = SortedSet.newBuilder[DraftT](Ordering.by[DraftT, FakeId](draftFakeIdGen)) - uniqueDraftEntities ++= draftEntities - - loop(origMap, uniqueDraftEntities.result(), List.empty) - } - - @tailrec private def loop[DraftT, OrigT](origEntitiesMap: Map[FakeId, OrigT], - draftEntities: Iterable[DraftT], - actions: List[SlickDbAction[OrigT]])( - implicit draftFakeIdGen: FakeIdGen[DraftT], - refiner: Refiner[DraftT, OrigT]): List[SlickDbAction[OrigT]] = { - draftEntities.headOption match { - case None => - // The rest original entities are not a part of draft, so we will delete them - val toDelete: List[SlickDbAction[OrigT]] = origEntitiesMap.values.map(x => SlickDbAction.Delete(x))(breakOut) - actions ++ toDelete - - case Some(currRaw) => - val rawCore = draftFakeIdGen.getFor(currRaw) - val action: Option[SlickDbAction[OrigT]] = origEntitiesMap.get(rawCore) match { - // It is a new entity, because it doesn't exist among originals - case None => Some(SlickDbAction.Create(refiner.refine(currRaw))) - case Some(orig) => - val draft = refiner.refresh(orig, currRaw) - if (draft == orig) None - else Some(SlickDbAction.Update(draft)) - } - - loop(origEntitiesMap - rawCore, draftEntities.tail, action.map(_ :: actions).getOrElse(actions)) - } - } - -} diff --git a/src/main/scala/xyz/driver/pdsuicommon/synchronization/domain/FakeId.scala b/src/main/scala/xyz/driver/pdsuicommon/synchronization/domain/FakeId.scala deleted file mode 100644 index 38e442b..0000000 --- a/src/main/scala/xyz/driver/pdsuicommon/synchronization/domain/FakeId.scala +++ /dev/null @@ -1,14 +0,0 @@ -package xyz.driver.pdsuicommon.synchronization.domain - -/* - It is like an Id for entities those haven't an Id, but should be unique. - For example, - RawArm has the name, the kind and the intervention fields. - It has not an Id, but should be identified by the name field. - So, the name field is a fake id for RawArm. - */ -final case class FakeId(value: String) - -object FakeId { - implicit val ordering: Ordering[FakeId] = Ordering.by(_.value) -} diff --git a/src/main/scala/xyz/driver/pdsuicommon/synchronization/utils/FakeIdGen.scala b/src/main/scala/xyz/driver/pdsuicommon/synchronization/utils/FakeIdGen.scala deleted file mode 100644 index 196aab1..0000000 --- a/src/main/scala/xyz/driver/pdsuicommon/synchronization/utils/FakeIdGen.scala +++ /dev/null @@ -1,26 +0,0 @@ -package xyz.driver.pdsuicommon.synchronization.utils - -import xyz.driver.pdsuicommon.synchronization.domain.FakeId - -/** - * Used to generate a fake id from an entity. - * A fake id is used in comparison between entities with different types, - * for example, RawTrial and Trial. - * - * @see FakeId - */ -trait FakeIdGen[-T] extends (T => FakeId) { - - def getFor(x: T): FakeId - - override def apply(x: T): FakeId = getFor(x) - -} - -object FakeIdGen { - - def create[T](f: T => FakeId) = new FakeIdGen[T] { - override def getFor(x: T): FakeId = f(x) - } - -} diff --git a/src/main/scala/xyz/driver/pdsuicommon/synchronization/utils/Refiner.scala b/src/main/scala/xyz/driver/pdsuicommon/synchronization/utils/Refiner.scala deleted file mode 100644 index 768b889..0000000 --- a/src/main/scala/xyz/driver/pdsuicommon/synchronization/utils/Refiner.scala +++ /dev/null @@ -1,12 +0,0 @@ -package xyz.driver.pdsuicommon.synchronization.utils - -/** - * Allows to extract a data from the From entity to convert/update in to the To entity. - */ -trait Refiner[-From, To] { - - def refine(raw: From): To - - def refresh(orig: To, update: From): To - -} diff --git a/src/main/scala/xyz/driver/pdsuicommon/synchronization/utils/package.scala b/src/main/scala/xyz/driver/pdsuicommon/synchronization/utils/package.scala deleted file mode 100644 index 1b30158..0000000 --- a/src/main/scala/xyz/driver/pdsuicommon/synchronization/utils/package.scala +++ /dev/null @@ -1,64 +0,0 @@ -package xyz.driver.pdsuicommon.synchronization - -import java.net.URL -import java.nio.ByteBuffer -import java.util.UUID - -import xyz.driver.pdsuicommon.domain.{LongId, UuidId} -import xyz.driver.pdsuicommon.http.HttpFetcher -import xyz.driver.pdsuicommon.json.JsonSerializer -import xyz.driver.pdsuicommon.synchronization.domain.FakeId - -import scala.collection.breakOut -import scala.concurrent.{ExecutionContext, Future} -import scala.io.Codec - -package object utils { - - type FakeIdMap[T] = Map[FakeId, T] - - object FakeIdMap { - - def empty[T]: FakeIdMap[T] = Map.empty - - def create[T](xs: Seq[T])(implicit fakeIdExtractor: FakeIdGen[T]): FakeIdMap[T] = { - xs.map({ x => - fakeIdExtractor.getFor(x) -> x - })(breakOut) - } - - } - - /** - * Requests domain objects from the repository using - * ids of fetched dictionary entities - * - * @param getList repository access function - * @param xs sequence of entity objects - * @param id function that extracts id from the entity - * @tparam Id Type of Id (for example [[LongId]], [[UuidId]]) - * @tparam K Type parameter for Id - * @tparam D Domain object type name - * @tparam E Dictionary entity object type name - */ - def domainFromEntities[K, D, E, Id[_]](getList: Set[Id[K]] => Seq[D], xs: Seq[E])(id: E => Id[K]): Seq[D] = { - getList(xs.map(x => id(x)).toSet) - } - - /** Version of [[domainFromEntities]] for LongId */ - def domainFromEntitiesLong[K, D, E](getList: Set[LongId[K]] => Seq[D], xs: Seq[E])(id: E => Long): Seq[D] = { - domainFromEntities(getList, xs)(e => LongId(id(e))) - } - - /** Version of [[domainFromEntities]] for UuidId */ - def domainFromEntitiesUUID[K, D, E](getList: Set[UuidId[K]] => Seq[D], xs: Seq[E])(id: E => UUID): Seq[D] = { - domainFromEntities(getList, xs)(e => UuidId(id(e))) - } - - def fetch[T](httpFetcher: HttpFetcher, url: URL)(implicit m: Manifest[T], ec: ExecutionContext): Future[T] = { - httpFetcher(url).map { rawContent => - val content = Codec.UTF8.decoder.decode(ByteBuffer.wrap(rawContent)).toString - JsonSerializer.deserialize[T](content) - } - } -} |