Нет описания

AkkaStreamComponents.scala 5.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. package fr.natan.akkastreamfileprocessingapi.service
  2. import akka.NotUsed
  3. import akka.actor.ActorSystem
  4. import akka.stream.alpakka.csv.scaladsl.{CsvParsing, CsvToMap}
  5. import akka.stream.scaladsl.{Compression, FileIO, Flow, Sink, Source}
  6. import fr.natan.akkastreamfileprocessingapi.businessexceptions.FileNotFoundException
  7. import fr.natan.akkastreamfileprocessingapi.models.ModelsAndJsonMap.{Episode, Person, TvSerie}
  8. import fr.natan.akkastreamfileprocessingapi.models.ModelsBuilder.{buildEpisodeModel, buildPersonModel, buildTvSerieModel}
  9. import fr.natan.akkastreamfileprocessingapi.valitator.Validators.fileExists
  10. import java.io.File
  11. import java.nio.file.Paths
  12. import scala.concurrent.Future
  13. //noinspection SpellCheckingInspection
  14. object AkkaStreamComponents {
  15. implicit val actorSystem: ActorSystem = ActorSystem("AkkaStreamActor")
  16. //flows building
  17. def buildPersonFlow (): Flow[Map[String, String], Person, NotUsed] = {
  18. val personFlow: Flow[Map[String, String], Person, NotUsed] =
  19. Flow[Map[String, String]]
  20. .map((rowMap: Map[String, String]) => {
  21. buildPersonModel(rowMap)
  22. })
  23. personFlow
  24. }
  25. def filterPersonByIdFlow(personID: String): Flow[Map[String, String], Person, NotUsed] = {
  26. val personFlowFilter: Flow[Map[String, String], Person, NotUsed] =
  27. Flow[Map[String, String]]
  28. .filter((rowMap: Map[String, String]) => {
  29. rowMap.getOrElse(key = "nconst", default = "") == personID
  30. })
  31. .map(rowMap => {
  32. buildPersonModel(personMap = rowMap)
  33. })
  34. personFlowFilter
  35. }
  36. def filterPersonByNameFlow(primaryName: String): Flow[Map[String, String], Person, NotUsed] = {
  37. val personFlowFilter: Flow[Map[String, String], Person, NotUsed] =
  38. Flow[Map[String, String]]
  39. .filter((rowMap: Map[String, String]) => {
  40. rowMap.getOrElse(key = "primaryName", default = "") == primaryName
  41. })
  42. .map((rowMap: Map[String, String]) => {
  43. buildPersonModel(personMap = rowMap)
  44. })
  45. personFlowFilter
  46. }
  47. def buildTvSerieFlow(): Flow[Map[String, String], TvSerie, NotUsed] = {
  48. val tvSerieFlow: Flow[Map[String, String], TvSerie, NotUsed] =
  49. Flow[Map[String, String]]
  50. .map((rowMap: Map[String, String]) => {
  51. buildTvSerieModel(tvSerieMap = rowMap)
  52. })
  53. tvSerieFlow
  54. }
  55. def buildEpisodeFlow (): Flow[Map[String, String], Episode, NotUsed] ={
  56. val episodeFlow: Flow[Map[String, String], Episode, NotUsed] =
  57. Flow[Map[String, String]]
  58. .map((rowMap: Map[String, String])=>{
  59. buildEpisodeModel(episodeMap = rowMap)
  60. })
  61. episodeFlow
  62. }
  63. //filters flow
  64. def filterTvSerieByIdFlow(tvSerieID: String): Flow[Map[String, String], TvSerie, NotUsed] = {
  65. val tvSerieFlowFilter: Flow[Map[String, String], TvSerie, NotUsed] =
  66. Flow[Map[String, String]]
  67. .filter((rowMap: Map[String, String]) => rowMap.getOrElse(key = "tconst", default = "") == tvSerieID)
  68. .map((rowMap: Map[String, String]) => {
  69. buildTvSerieModel(tvSerieMap = rowMap)
  70. })
  71. tvSerieFlowFilter
  72. }
  73. def filterTvSerieByPrimaryTitleFlow(tvSeriePrimaryTitle: String): Flow[Map[String, String], TvSerie, NotUsed] = {
  74. val filterFlowFilter: Flow[Map[String, String], TvSerie, NotUsed] = Flow[Map[String, String]]
  75. .filter((rows: Map[String, String]) => {
  76. rows.getOrElse(key = "primaryTitle", default = "") == tvSeriePrimaryTitle
  77. })
  78. .map(rowMap => {
  79. val tvSerie: TvSerie = buildTvSerieModel(tvSerieMap = rowMap)
  80. tvSerie
  81. })
  82. filterFlowFilter
  83. }
  84. //source building
  85. private def buildSource(inputFile: File): Source[Map[String, String], NotUsed] = {
  86. var datasource: Source[Map[String, String], NotUsed] = null
  87. if (!fileExists(inputFile.getPath)) {
  88. return null
  89. }
  90. datasource = Source
  91. .single(inputFile)
  92. .flatMapConcat((filename: File) => {
  93. FileIO.fromPath(
  94. Paths.get(filename.getPath)
  95. )
  96. }
  97. )
  98. .via(Compression.gunzip())
  99. .via(CsvParsing.lineScanner(CsvParsing.Tab, CsvParsing.DoubleQuote, CsvParsing.DoubleQuote))
  100. .via(CsvToMap.toMapAsStrings())
  101. datasource
  102. }
  103. def buildAndValidateSource(inputFile: File): Source[Map[String, String], _] = {
  104. val source: Source[Map[String, String], _] = buildSource(inputFile = inputFile)
  105. if (source == null) {
  106. throw new FileNotFoundException(filename = inputFile.getPath)
  107. }
  108. source
  109. }
  110. //sinks building
  111. def buildMaxPersonsSink(): Sink[Person, Future[IndexedSeq[Person]]] = {
  112. val listPersonsSink: Sink[Person, Future[IndexedSeq[Person]]] =
  113. Sink.collection[Person, IndexedSeq[Person]]
  114. listPersonsSink
  115. }
  116. def buildMaxTvSeriesSink(): Sink[TvSerie, Future[IndexedSeq[TvSerie]]] = {
  117. val tvSeriesSink: Sink[TvSerie, Future[IndexedSeq[TvSerie]]] = Sink
  118. .collection[TvSerie, IndexedSeq[TvSerie]]
  119. tvSeriesSink
  120. }
  121. def buildMaxEpisodesSink(): Sink[Episode, Future[IndexedSeq[Episode]]] = {
  122. val episodeSink: Sink[Episode, Future[IndexedSeq[Episode]]] = Sink
  123. .collection[Episode, IndexedSeq[Episode]]
  124. episodeSink
  125. }
  126. }

Powered by TurnKey Linux.