1 /*
2  *  Make.org Core API
3  *  Copyright (C) 2018 Make.org
4  *
5  * This program is free software: you can redistribute it and/or modify
6  *  it under the terms of the GNU Affero General Public License as
7  *  published by the Free Software Foundation, either version 3 of the
8  *  License, or (at your option) any later version.
9  *
10  *  This program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  *  GNU Affero General Public License for more details.
14  *
15  *  You should have received a copy of the GNU Affero General Public License
16  *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
17  *
18  */
19 
20 package org.make.api.technical.elasticsearch
21 
22 import java.time.format.DateTimeFormatter
23 import cats.implicits._
24 import com.sksamuel.elastic4s.ElasticClient
25 import com.sksamuel.elastic4s.akka.{AkkaHttpClient, AkkaHttpClientSettings}
26 import com.sksamuel.elastic4s.ElasticDsl._
27 import com.sksamuel.elastic4s.requests.indexes.admin.AliasExistsResponse
28 import grizzled.slf4j.Logging
29 import org.make.api.technical.security.SecurityHelper
30 import org.make.api.technical.ActorSystemComponent
31 import org.make.core.DateHelper
32 import akka.actor.typed.scaladsl.adapter._
33 
34 import scala.concurrent.ExecutionContext.Implicits.global
35 import scala.concurrent.Future
36 import scala.io.{Codec, Source}
37 
38 trait ElasticsearchClient {
39   def client: ElasticClient
40   def createIndexName(aliasName: String): String
41   def hashForAlias(aliasName: String): String
42   def getCurrentIndicesName: Future[Seq[String]]
43   def getHashFromIndex(index: String): String
44   def mappingForAlias: String => String
45   def initialize(): Future[Unit]
46 }
47 
48 trait ElasticsearchClientComponent {
49   def elasticsearchClient: ElasticsearchClient
50 }
51 
52 trait DefaultElasticsearchClientComponent extends ElasticsearchClientComponent with Logging {
53   self: ElasticsearchConfigurationComponent with ActorSystemComponent =>
54 
55   override lazy val elasticsearchClient: ElasticsearchClient = new DefaultElasticsearchClient
56 
57   class DefaultElasticsearchClient extends ElasticsearchClient {
58 
59     private lazy val allAliases =
60       Seq(
61         elasticsearchConfiguration.ideaAliasName,
62         elasticsearchConfiguration.proposalAliasName,
63         elasticsearchConfiguration.organisationAliasName,
64         elasticsearchConfiguration.operationOfQuestionAliasName,
65         elasticsearchConfiguration.postAliasName
66       )
67 
68     // create index
69     lazy val elasticsearchIdeaMapping: String =
70       Source.fromResource("elasticsearch-mappings/idea.json")(Codec.UTF8).getLines().mkString("")
71     lazy val elasticsearchProposalMapping: String =
72       Source.fromResource("elasticsearch-mappings/proposal.json")(Codec.UTF8).getLines().mkString("")
73     lazy val elasticsearchOrganisationMapping: String =
74       Source.fromResource("elasticsearch-mappings/organisation.json")(Codec.UTF8).getLines().mkString("")
75     lazy val elasticsearchOperationOfQuestionMapping: String =
76       Source.fromResource("elasticsearch-mappings/operation-of-question.json")(Codec.UTF8).getLines().mkString("")
77     lazy val elasticsearchPostMapping: String =
78       Source.fromResource("elasticsearch-mappings/post.json")(Codec.UTF8).getLines().mkString("")
79 
80     override lazy val client: ElasticClient = ElasticClient(
81       AkkaHttpClient(AkkaHttpClientSettings(elasticsearchConfiguration.connectionString.split(",").toSeq))(
82         actorSystem.toClassic
83       )
84     )
85 
86     private val dateFormatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss")
87 
88     override def mappingForAlias: String => String = {
89       case alias if alias == elasticsearchConfiguration.ideaAliasName         => elasticsearchIdeaMapping
90       case alias if alias == elasticsearchConfiguration.proposalAliasName     => elasticsearchProposalMapping
91       case alias if alias == elasticsearchConfiguration.organisationAliasName => elasticsearchOrganisationMapping
92       case alias if alias == elasticsearchConfiguration.operationOfQuestionAliasName =>
93         elasticsearchOperationOfQuestionMapping
94       case alias if alias == elasticsearchConfiguration.postAliasName => elasticsearchPostMapping
95     }
96 
97     override def hashForAlias(aliasName: String): String = {
98       val shortHashLength = 12
99       val localMapping: String = mappingForAlias(aliasName)
100       SecurityHelper.defaultHash(localMapping).take(shortHashLength).toLowerCase()
101     }
102 
103     override def createIndexName(aliasName: String): String = {
104       Seq(
105         elasticsearchConfiguration.indexName,
106         aliasName,
107         dateFormatter.format(DateHelper.now()),
108         hashForAlias(aliasName)
109       ).mkString("-")
110     }
111 
112     override def getHashFromIndex(index: String): String =
113       index.split("-").lastOption.getOrElse("")
114 
115     override def getCurrentIndicesName: Future[Seq[String]] = {
116       client
117         .executeAsFuture(getAliases(Seq.empty, allAliases))
118         .map(_.mappings.map { case (index, _) => index.name }.toSeq)
119         .recover {
120           case e: Exception =>
121             logger.error("fail to retrieve ES alias", e)
122             Seq.empty
123         }
124     }
125 
126     private def createInitialIndexAndAlias(aliasName: String): Future[Unit] = {
127       val newIndexName = createIndexName(aliasName)
128       client
129         .executeAsFuture(createIndex(newIndexName).source(mappingForAlias(aliasName)))
130         .flatMap { _ =>
131           logger.info(s"Elasticsearch index $newIndexName created")
132           client
133             .executeAsFuture(aliases(addAlias(aliasName, newIndexName)))
134             .map { _ =>
135               logger.info(s"Elasticsearch alias $aliasName created")
136             }
137         }
138     }
139 
140     override def initialize(): Future[Unit] = {
141       Future
142         .traverse(allAliases) { aliasName =>
143           client.executeAsFuture(aliasExists(aliasName)).flatMap {
144             case AliasExistsResponse(true) =>
145               logger.info(s"Elasticsearch alias $aliasName exist")
146               Future.unit
147             case AliasExistsResponse(false) =>
148               logger.info(s"Elasticsearch alias $aliasName not found")
149               createInitialIndexAndAlias(aliasName)
150           }
151         }
152         .void
153     }
154   }
155 }
Line Stmt Id Pos Tree Symbol Tests Code
86 8066 3547 - 3592 Apply java.time.format.DateTimeFormatter.ofPattern org.scalatest.testsuite java.time.format.DateTimeFormatter.ofPattern("yyyyMMddHHmmss")
89 8720 3669 - 3718 Apply java.lang.Object.== alias.==(DefaultElasticsearchClientComponent.this.elasticsearchConfiguration.ideaAliasName)
90 8325 3775 - 3828 Apply java.lang.Object.== alias.==(DefaultElasticsearchClientComponent.this.elasticsearchConfiguration.proposalAliasName)
91 8128 3885 - 3942 Apply java.lang.Object.== alias.==(DefaultElasticsearchClientComponent.this.elasticsearchConfiguration.organisationAliasName)
92 8750 3999 - 4063 Apply java.lang.Object.== alias.==(DefaultElasticsearchClientComponent.this.elasticsearchConfiguration.operationOfQuestionAliasName)
94 8382 4135 - 4184 Apply java.lang.Object.== alias.==(DefaultElasticsearchClientComponent.this.elasticsearchConfiguration.postAliasName)
98 8000 4309 - 4311 Literal <nosymbol> 12
99 8820 4345 - 4371 Apply scala.Function1.apply DefaultElasticsearchClient.this.mappingForAlias.apply(aliasName)
100 8438 4378 - 4454 Apply java.lang.String.toLowerCase scala.Predef.augmentString(org.make.api.technical.security.SecurityHelper.defaultHash(localMapping)).take(shortHashLength).toLowerCase()
109 8067 4532 - 4703 Apply scala.collection.IterableOnceOps.mkString scala.`package`.Seq.apply[String](DefaultElasticsearchClientComponent.this.elasticsearchConfiguration.indexName, aliasName, DefaultElasticsearchClient.this.dateFormatter.format(org.make.core.DateHelper.now()), DefaultElasticsearchClient.this.hashForAlias(aliasName)).mkString("-")
113 8723 4776 - 4817 Apply scala.Option.getOrElse scala.Predef.refArrayOps[String](index.split("-")).lastOption.getOrElse[String]("")
117 8780 4920 - 4920 Select com.sksamuel.elastic4s.handlers.alias.IndexAliasHandlers.GetAliasHandler com.sksamuel.elastic4s.ElasticDsl.GetAliasHandler
117 8385 4920 - 4920 Select scala.concurrent.ExecutionContext.Implicits.global scala.concurrent.ExecutionContext.Implicits.global
117 8002 4920 - 4920 Apply scala.reflect.ManifestFactory.classType scala.reflect.ManifestFactory.classType[com.sksamuel.elastic4s.handlers.alias.IndexAliases](classOf[com.sksamuel.elastic4s.handlers.alias.IndexAliases])
117 8310 4932 - 4941 TypeApply scala.collection.SeqFactory.Delegate.empty scala.`package`.Seq.empty[Nothing]
117 8132 4921 - 4954 Apply com.sksamuel.elastic4s.api.AliasesApi.getAliases com.sksamuel.elastic4s.ElasticDsl.getAliases(scala.`package`.Seq.empty[Nothing], DefaultElasticsearchClient.this.allAliases)
118 8856 5005 - 5015 Select com.sksamuel.elastic4s.Index.name index.name
118 8467 4969 - 5023 Select scala.collection.IterableOnceOps.toSeq x$1.mappings.map[String](((x0$1: (com.sksamuel.elastic4s.Index, Seq[com.sksamuel.elastic4s.handlers.alias.Alias])) => x0$1 match { case (_1: com.sksamuel.elastic4s.Index, _2: Seq[com.sksamuel.elastic4s.handlers.alias.Alias]): (com.sksamuel.elastic4s.Index, Seq[com.sksamuel.elastic4s.handlers.alias.Alias])((index @ _), _) => index.name })).toSeq
118 8102 4968 - 4968 Select scala.concurrent.ExecutionContext.Implicits.global scala.concurrent.ExecutionContext.Implicits.global
119 8177 5042 - 5042 Apply org.make.api.technical.elasticsearch.DefaultElasticsearchClientComponent.DefaultElasticsearchClient.$anonfun.<init> new $anonfun()
119 8428 4889 - 5163 ApplyToImplicitArgs scala.concurrent.Future.recover elasticsearch.this.`package`.RichHttpClient(DefaultElasticsearchClient.this.client).executeAsFuture[com.sksamuel.elastic4s.requests.alias.GetAliasesRequest, com.sksamuel.elastic4s.handlers.alias.IndexAliases](com.sksamuel.elastic4s.ElasticDsl.getAliases(scala.`package`.Seq.empty[Nothing], DefaultElasticsearchClient.this.allAliases))(com.sksamuel.elastic4s.ElasticDsl.GetAliasHandler, scala.concurrent.ExecutionContext.Implicits.global, scala.reflect.ManifestFactory.classType[com.sksamuel.elastic4s.handlers.alias.IndexAliases](classOf[com.sksamuel.elastic4s.handlers.alias.IndexAliases])).map[Seq[String]](((x$1: com.sksamuel.elastic4s.handlers.alias.IndexAliases) => x$1.mappings.map[String](((x0$1: (com.sksamuel.elastic4s.Index, Seq[com.sksamuel.elastic4s.handlers.alias.Alias])) => x0$1 match { case (_1: com.sksamuel.elastic4s.Index, _2: Seq[com.sksamuel.elastic4s.handlers.alias.Alias]): (com.sksamuel.elastic4s.Index, Seq[com.sksamuel.elastic4s.handlers.alias.Alias])((index @ _), _) => index.name })).toSeq))(scala.concurrent.ExecutionContext.Implicits.global).recover[Seq[String]](({ @SerialVersionUID(value = 0) final <synthetic> class $anonfun extends scala.runtime.AbstractPartialFunction[Throwable,Seq[String]] with java.io.Serializable { def <init>(): <$anon: Throwable => Seq[String]> = { $anonfun.super.<init>(); () }; final override def applyOrElse[A1 <: Throwable, B1 >: Seq[String]](x1: A1, default: A1 => B1): B1 = ((x1.asInstanceOf[Throwable]: Throwable): Throwable @unchecked) match { case (e @ (_: Exception)) => { DefaultElasticsearchClientComponent.this.logger.error("fail to retrieve ES alias", e); scala.`package`.Seq.empty[Nothing] } case (defaultCase$ @ _) => default.apply(x1) }; final def isDefinedAt(x1: Throwable): Boolean = ((x1.asInstanceOf[Throwable]: Throwable): Throwable @unchecked) match { case (e @ (_: Exception)) => true case (defaultCase$ @ _) => false } }; new $anonfun() }: PartialFunction[Throwable,Seq[String]]))(scala.concurrent.ExecutionContext.Implicits.global)
119 8783 5042 - 5042 Select scala.concurrent.ExecutionContext.Implicits.global scala.concurrent.ExecutionContext.Implicits.global
121 8705 5087 - 5131 Apply grizzled.slf4j.Logger.error DefaultElasticsearchClientComponent.this.logger.error("fail to retrieve ES alias", e)
122 8311 5144 - 5153 TypeApply scala.collection.SeqFactory.Delegate.empty scala.`package`.Seq.empty[Nothing]
127 8049 5276 - 5302 Apply org.make.api.technical.elasticsearch.DefaultElasticsearchClientComponent.DefaultElasticsearchClient.createIndexName DefaultElasticsearchClient.this.createIndexName(aliasName)
129 8454 5341 - 5401 Apply com.sksamuel.elastic4s.requests.indexes.CreateIndexRequest.source com.sksamuel.elastic4s.ElasticDsl.createIndex(newIndexName).source(DefaultElasticsearchClient.this.mappingForAlias.apply(aliasName))
129 8106 5340 - 5340 Select com.sksamuel.elastic4s.handlers.index.IndexAdminHandlers.CreateIndexHandler com.sksamuel.elastic4s.ElasticDsl.CreateIndexHandler
129 8718 5340 - 5340 Select scala.concurrent.ExecutionContext.Implicits.global scala.concurrent.ExecutionContext.Implicits.global
129 8359 5340 - 5340 Apply scala.reflect.ManifestFactory.classType scala.reflect.ManifestFactory.classType[com.sksamuel.elastic4s.requests.indexes.CreateIndexResponse](classOf[com.sksamuel.elastic4s.requests.indexes.CreateIndexResponse])
129 8625 5374 - 5400 Apply scala.Function1.apply DefaultElasticsearchClient.this.mappingForAlias.apply(aliasName)
130 8768 5309 - 5701 ApplyToImplicitArgs scala.concurrent.Future.flatMap elasticsearch.this.`package`.RichHttpClient(DefaultElasticsearchClient.this.client).executeAsFuture[com.sksamuel.elastic4s.requests.indexes.CreateIndexRequest, com.sksamuel.elastic4s.requests.indexes.CreateIndexResponse](com.sksamuel.elastic4s.ElasticDsl.createIndex(newIndexName).source(DefaultElasticsearchClient.this.mappingForAlias.apply(aliasName)))(com.sksamuel.elastic4s.ElasticDsl.CreateIndexHandler, scala.concurrent.ExecutionContext.Implicits.global, scala.reflect.ManifestFactory.classType[com.sksamuel.elastic4s.requests.indexes.CreateIndexResponse](classOf[com.sksamuel.elastic4s.requests.indexes.CreateIndexResponse])).flatMap[Unit](((x$2: com.sksamuel.elastic4s.requests.indexes.CreateIndexResponse) => { DefaultElasticsearchClientComponent.this.logger.info(("Elasticsearch index ".+(newIndexName).+(" created"): String)); elasticsearch.this.`package`.RichHttpClient(DefaultElasticsearchClient.this.client).executeAsFuture[com.sksamuel.elastic4s.requests.alias.IndicesAliasesRequest, com.sksamuel.elastic4s.requests.indexes.admin.AliasActionResponse](com.sksamuel.elastic4s.ElasticDsl.aliases(com.sksamuel.elastic4s.ElasticDsl.addAlias(aliasName, newIndexName)))(com.sksamuel.elastic4s.ElasticDsl.IndexAliasesHandler, scala.concurrent.ExecutionContext.Implicits.global, scala.reflect.ManifestFactory.classType[com.sksamuel.elastic4s.requests.indexes.admin.AliasActionResponse](classOf[com.sksamuel.elastic4s.requests.indexes.admin.AliasActionResponse])).map[Unit](((x$3: com.sksamuel.elastic4s.requests.indexes.admin.AliasActionResponse) => DefaultElasticsearchClientComponent.this.logger.info(("Elasticsearch alias ".+(aliasName).+(" created"): String))))(scala.concurrent.ExecutionContext.Implicits.global) }))(scala.concurrent.ExecutionContext.Implicits.global)
130 8144 5420 - 5420 Select scala.concurrent.ExecutionContext.Implicits.global scala.concurrent.ExecutionContext.Implicits.global
131 8148 5437 - 5494 Apply grizzled.slf4j.Logger.info DefaultElasticsearchClientComponent.this.logger.info(("Elasticsearch index ".+(newIndexName).+(" created"): String))
133 8456 5540 - 5540 Apply scala.reflect.ManifestFactory.classType scala.reflect.ManifestFactory.classType[com.sksamuel.elastic4s.requests.indexes.admin.AliasActionResponse](classOf[com.sksamuel.elastic4s.requests.indexes.admin.AliasActionResponse])
133 8788 5549 - 5582 Apply com.sksamuel.elastic4s.api.AliasesApi.addAlias com.sksamuel.elastic4s.ElasticDsl.addAlias(aliasName, newIndexName)
133 8423 5541 - 5583 Apply com.sksamuel.elastic4s.api.AliasesApi.aliases com.sksamuel.elastic4s.ElasticDsl.aliases(com.sksamuel.elastic4s.ElasticDsl.addAlias(aliasName, newIndexName))
133 8030 5540 - 5540 Select com.sksamuel.elastic4s.handlers.alias.IndexAliasHandlers.IndexAliasesHandler com.sksamuel.elastic4s.ElasticDsl.IndexAliasesHandler
133 8670 5540 - 5540 Select scala.concurrent.ExecutionContext.Implicits.global scala.concurrent.ExecutionContext.Implicits.global
134 8702 5602 - 5602 Select scala.concurrent.ExecutionContext.Implicits.global scala.concurrent.ExecutionContext.Implicits.global
134 8333 5505 - 5691 ApplyToImplicitArgs scala.concurrent.Future.map elasticsearch.this.`package`.RichHttpClient(DefaultElasticsearchClient.this.client).executeAsFuture[com.sksamuel.elastic4s.requests.alias.IndicesAliasesRequest, com.sksamuel.elastic4s.requests.indexes.admin.AliasActionResponse](com.sksamuel.elastic4s.ElasticDsl.aliases(com.sksamuel.elastic4s.ElasticDsl.addAlias(aliasName, newIndexName)))(com.sksamuel.elastic4s.ElasticDsl.IndexAliasesHandler, scala.concurrent.ExecutionContext.Implicits.global, scala.reflect.ManifestFactory.classType[com.sksamuel.elastic4s.requests.indexes.admin.AliasActionResponse](classOf[com.sksamuel.elastic4s.requests.indexes.admin.AliasActionResponse])).map[Unit](((x$3: com.sksamuel.elastic4s.requests.indexes.admin.AliasActionResponse) => DefaultElasticsearchClientComponent.this.logger.info(("Elasticsearch alias ".+(aliasName).+(" created"): String))))(scala.concurrent.ExecutionContext.Implicits.global)
135 8108 5623 - 5677 Apply grizzled.slf4j.Logger.info DefaultElasticsearchClientComponent.this.logger.info(("Elasticsearch alias ".+(aliasName).+(" created"): String))
142 8059 5800 - 5800 Select scala.concurrent.ExecutionContext.Implicits.global scala.concurrent.ExecutionContext.Implicits.global
142 8687 5800 - 5800 ApplyToImplicitArgs cats.instances.FutureInstances.catsStdInstancesForFuture cats.implicits.catsStdInstancesForFuture(scala.concurrent.ExecutionContext.Implicits.global)
142 8020 5800 - 5800 TypeApply scala.collection.BuildFromLowPriority2.buildFromIterableOps collection.this.BuildFrom.buildFromIterableOps[Seq, String, Unit]
142 8669 5800 - 5800 Select scala.concurrent.ExecutionContext.Implicits.global scala.concurrent.ExecutionContext.Implicits.global
142 8491 5763 - 6212 ApplyToImplicitArgs scala.concurrent.Future.traverse scala.concurrent.Future.traverse[String, Unit, Seq](DefaultElasticsearchClient.this.allAliases)(((aliasName: String) => elasticsearch.this.`package`.RichHttpClient(DefaultElasticsearchClient.this.client).executeAsFuture[com.sksamuel.elastic4s.requests.admin.AliasExistsRequest, com.sksamuel.elastic4s.requests.indexes.admin.AliasExistsResponse](com.sksamuel.elastic4s.ElasticDsl.aliasExists(aliasName))(com.sksamuel.elastic4s.ElasticDsl.AliasExistsHandler, scala.concurrent.ExecutionContext.Implicits.global, scala.reflect.ManifestFactory.classType[com.sksamuel.elastic4s.requests.indexes.admin.AliasExistsResponse](classOf[com.sksamuel.elastic4s.requests.indexes.admin.AliasExistsResponse])).flatMap[Unit](((x0$1: com.sksamuel.elastic4s.requests.indexes.admin.AliasExistsResponse) => x0$1 match { case (exists: Boolean): com.sksamuel.elastic4s.requests.indexes.admin.AliasExistsResponse(true) => { DefaultElasticsearchClientComponent.this.logger.info(("Elasticsearch alias ".+(aliasName).+(" exist"): String)); scala.concurrent.Future.unit } case (exists: Boolean): com.sksamuel.elastic4s.requests.indexes.admin.AliasExistsResponse(false) => { DefaultElasticsearchClientComponent.this.logger.info(("Elasticsearch alias ".+(aliasName).+(" not found"): String)); DefaultElasticsearchClient.this.createInitialIndexAndAlias(aliasName) } }))(scala.concurrent.ExecutionContext.Implicits.global)))(collection.this.BuildFrom.buildFromIterableOps[Seq, String, Unit], scala.concurrent.ExecutionContext.Implicits.global)
143 8624 5847 - 5847 Select scala.concurrent.ExecutionContext.Implicits.global scala.concurrent.ExecutionContext.Implicits.global
143 8459 5847 - 5847 Apply scala.reflect.ManifestFactory.classType scala.reflect.ManifestFactory.classType[com.sksamuel.elastic4s.requests.indexes.admin.AliasExistsResponse](classOf[com.sksamuel.elastic4s.requests.indexes.admin.AliasExistsResponse])
143 8773 5880 - 5880 Select scala.concurrent.ExecutionContext.Implicits.global scala.concurrent.ExecutionContext.Implicits.global
143 8384 5848 - 5870 Apply com.sksamuel.elastic4s.api.IndexAdminApi.aliasExists com.sksamuel.elastic4s.ElasticDsl.aliasExists(aliasName)
143 8019 5847 - 5847 Select com.sksamuel.elastic4s.handlers.index.IndexAdminHandlers.AliasExistsHandler com.sksamuel.elastic4s.ElasticDsl.AliasExistsHandler
143 8371 5825 - 6202 ApplyToImplicitArgs scala.concurrent.Future.flatMap elasticsearch.this.`package`.RichHttpClient(DefaultElasticsearchClient.this.client).executeAsFuture[com.sksamuel.elastic4s.requests.admin.AliasExistsRequest, com.sksamuel.elastic4s.requests.indexes.admin.AliasExistsResponse](com.sksamuel.elastic4s.ElasticDsl.aliasExists(aliasName))(com.sksamuel.elastic4s.ElasticDsl.AliasExistsHandler, scala.concurrent.ExecutionContext.Implicits.global, scala.reflect.ManifestFactory.classType[com.sksamuel.elastic4s.requests.indexes.admin.AliasExistsResponse](classOf[com.sksamuel.elastic4s.requests.indexes.admin.AliasExistsResponse])).flatMap[Unit](((x0$1: com.sksamuel.elastic4s.requests.indexes.admin.AliasExistsResponse) => x0$1 match { case (exists: Boolean): com.sksamuel.elastic4s.requests.indexes.admin.AliasExistsResponse(true) => { DefaultElasticsearchClientComponent.this.logger.info(("Elasticsearch alias ".+(aliasName).+(" exist"): String)); scala.concurrent.Future.unit } case (exists: Boolean): com.sksamuel.elastic4s.requests.indexes.admin.AliasExistsResponse(false) => { DefaultElasticsearchClientComponent.this.logger.info(("Elasticsearch alias ".+(aliasName).+(" not found"): String)); DefaultElasticsearchClient.this.createInitialIndexAndAlias(aliasName) } }))(scala.concurrent.ExecutionContext.Implicits.global)
145 8091 5942 - 5994 Apply grizzled.slf4j.Logger.info DefaultElasticsearchClientComponent.this.logger.info(("Elasticsearch alias ".+(aliasName).+(" exist"): String))
146 8704 6009 - 6020 Select scala.concurrent.Future.unit scala.concurrent.Future.unit
148 8326 6082 - 6138 Apply grizzled.slf4j.Logger.info DefaultElasticsearchClientComponent.this.logger.info(("Elasticsearch alias ".+(aliasName).+(" not found"): String))
149 7939 6153 - 6190 Apply org.make.api.technical.elasticsearch.DefaultElasticsearchClientComponent.DefaultElasticsearchClient.createInitialIndexAndAlias DefaultElasticsearchClient.this.createInitialIndexAndAlias(aliasName)
152 8358 5763 - 6226 Select cats.Functor.Ops.void cats.implicits.toFunctorOps[scala.concurrent.Future, Seq[Unit]](scala.concurrent.Future.traverse[String, Unit, Seq](DefaultElasticsearchClient.this.allAliases)(((aliasName: String) => elasticsearch.this.`package`.RichHttpClient(DefaultElasticsearchClient.this.client).executeAsFuture[com.sksamuel.elastic4s.requests.admin.AliasExistsRequest, com.sksamuel.elastic4s.requests.indexes.admin.AliasExistsResponse](com.sksamuel.elastic4s.ElasticDsl.aliasExists(aliasName))(com.sksamuel.elastic4s.ElasticDsl.AliasExistsHandler, scala.concurrent.ExecutionContext.Implicits.global, scala.reflect.ManifestFactory.classType[com.sksamuel.elastic4s.requests.indexes.admin.AliasExistsResponse](classOf[com.sksamuel.elastic4s.requests.indexes.admin.AliasExistsResponse])).flatMap[Unit](((x0$1: com.sksamuel.elastic4s.requests.indexes.admin.AliasExistsResponse) => x0$1 match { case (exists: Boolean): com.sksamuel.elastic4s.requests.indexes.admin.AliasExistsResponse(true) => { DefaultElasticsearchClientComponent.this.logger.info(("Elasticsearch alias ".+(aliasName).+(" exist"): String)); scala.concurrent.Future.unit } case (exists: Boolean): com.sksamuel.elastic4s.requests.indexes.admin.AliasExistsResponse(false) => { DefaultElasticsearchClientComponent.this.logger.info(("Elasticsearch alias ".+(aliasName).+(" not found"): String)); DefaultElasticsearchClient.this.createInitialIndexAndAlias(aliasName) } }))(scala.concurrent.ExecutionContext.Implicits.global)))(collection.this.BuildFrom.buildFromIterableOps[Seq, String, Unit], scala.concurrent.ExecutionContext.Implicits.global))(cats.implicits.catsStdInstancesForFuture(scala.concurrent.ExecutionContext.Implicits.global)).void