aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/xyz/driver/pdsuicommon/synchronization
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/scala/xyz/driver/pdsuicommon/synchronization')
-rw-r--r--src/main/scala/xyz/driver/pdsuicommon/synchronization/db/SlickDataSource.scala23
-rw-r--r--src/main/scala/xyz/driver/pdsuicommon/synchronization/db/SlickDbAction.scala70
-rw-r--r--src/main/scala/xyz/driver/pdsuicommon/synchronization/db/SlickDbDiff.scala52
-rw-r--r--src/main/scala/xyz/driver/pdsuicommon/synchronization/domain/FakeId.scala14
-rw-r--r--src/main/scala/xyz/driver/pdsuicommon/synchronization/utils/FakeIdGen.scala26
-rw-r--r--src/main/scala/xyz/driver/pdsuicommon/synchronization/utils/Refiner.scala12
-rw-r--r--src/main/scala/xyz/driver/pdsuicommon/synchronization/utils/package.scala64
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)
- }
- }
-}