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.idea
21 
22 import java.time.ZonedDateTime
23 
24 import cats.implicits._
25 import grizzled.slf4j.Logging
26 import org.make.api.extensions.MakeDBExecutionContextComponent
27 import org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea
28 import org.make.api.technical.DatabaseTransactions._
29 import org.make.api.technical.ScalikeSupport._
30 import org.make.api.technical.ShortenedNames
31 import org.make.core.DateHelper
32 import org.make.core.idea.{Idea, IdeaId, IdeaStatus}
33 import org.make.core.operation.OperationId
34 import org.make.core.question.QuestionId
35 import scalikejdbc._
36 
37 import scala.concurrent.Future
38 
39 trait DefaultPersistentIdeaServiceComponent extends PersistentIdeaServiceComponent {
40   this: MakeDBExecutionContextComponent =>
41 
42   override lazy val persistentIdeaService: PersistentIdeaService = new DefaultPersistentIdeaService
43 
44   class DefaultPersistentIdeaService extends PersistentIdeaService with ShortenedNames with Logging {
45 
46     private val ideaAlias = PersistentIdea.ideaAlias
47     private val column = PersistentIdea.column
48 
49     override def findOne(ideaId: IdeaId): Future[Option[Idea]] = {
50       implicit val context: EC = readExecutionContext
51       val futurePersistentIdea = Future(NamedDB("READ").retryableTx { implicit session =>
52         withSQL {
53           select
54             .from(PersistentIdea.as(ideaAlias))
55             .where(sqls.eq(ideaAlias.id, ideaId.value))
56         }.map(PersistentIdea.apply()).single()
57       })
58 
59       futurePersistentIdea.map(_.map(_.toIdea))
60     }
61 
62     override def findOneByName(questionId: QuestionId, name: String): Future[Option[Idea]] = {
63       implicit val context: EC = readExecutionContext
64       val futurePersistentIdea = Future(NamedDB("READ").retryableTx { implicit session =>
65         withSQL {
66           select
67             .from(PersistentIdea.as(ideaAlias))
68             .where(sqls.eq(ideaAlias.questionId, questionId.value).and(sqls.eq(ideaAlias.name, name)))
69         }.map(PersistentIdea.apply()).single()
70       })
71 
72       futurePersistentIdea.map(_.map(_.toIdea))
73     }
74 
75     override def findAll(ideaFilters: IdeaFiltersRequest): Future[Seq[Idea]] = {
76       implicit val context: EC = readExecutionContext
77 
78       val futurePersistentIdeas = Future(NamedDB("READ").retryableTx { implicit session =>
79         withSQL {
80           select
81             .from(PersistentIdea.as(ideaAlias))
82             .where(
83               sqls.toAndConditionOpt(
84                 ideaFilters.questionId.map(questionId => sqls.eq(ideaAlias.questionId, questionId.value))
85               )
86             )
87         }.map(PersistentIdea.apply()).list()
88       })
89 
90       futurePersistentIdeas.map(_.map(_.toIdea))
91     }
92 
93     def findAllByIdeaIds(ids: Seq[IdeaId]): Future[Seq[Idea]] = {
94       implicit val cxt: EC = readExecutionContext
95       val futurePersistentIdeas = Future(NamedDB("READ").retryableTx { implicit session =>
96         withSQL {
97           select
98             .from(PersistentIdea.as(ideaAlias))
99             .where(sqls.in(ideaAlias.id, ids.map(_.value)))
100         }.map(PersistentIdea.apply()).list()
101       })
102 
103       futurePersistentIdeas.map(_.map(_.toIdea))
104     }
105 
106     override def persist(idea: Idea): Future[Idea] = {
107       implicit val context: EC = writeExecutionContext
108       Future(NamedDB("WRITE").retryableTx { implicit session =>
109         withSQL {
110           insert
111             .into(PersistentIdea)
112             .namedValues(
113               column.id -> idea.ideaId.value,
114               column.name -> idea.name,
115               column.questionId -> idea.questionId.map(_.value),
116               column.operationId -> idea.operationId.map(_.value),
117               column.status -> idea.status,
118               column.createdAt -> DateHelper.now(),
119               column.updatedAt -> DateHelper.now()
120             )
121         }.execute()
122       }).as(idea)
123     }
124 
125     override def modify(ideaId: IdeaId, name: String, status: IdeaStatus): Future[Int] = {
126       implicit val context: EC = writeExecutionContext
127       Future(NamedDB("WRITE").retryableTx { implicit session =>
128         withSQL {
129           update(PersistentIdea)
130             .set(column.name -> name, column.updatedAt -> DateHelper.now(), column.status -> status)
131             .where(
132               sqls
133                 .eq(column.id, ideaId.value)
134             )
135         }.update()
136       })
137     }
138 
139     override def updateIdea(idea: Idea): Future[Int] = {
140       implicit val context: EC = writeExecutionContext
141       Future(NamedDB("WRITE").retryableTx { implicit session =>
142         withSQL {
143           update(PersistentIdea)
144             .set(
145               column.name -> idea.name,
146               column.operationId -> idea.operationId.map(_.value),
147               column.questionId -> idea.questionId.map(_.value),
148               column.status -> idea.status,
149               column.updatedAt -> DateHelper.now()
150             )
151             .where(
152               sqls
153                 .eq(column.id, idea.ideaId.value)
154             )
155         }.update()
156       })
157     }
158   }
159 }
160 
161 object DefaultPersistentIdeaServiceComponent {
162 
163   final case class PersistentIdea(
164     id: String,
165     name: String,
166     question: Option[String],
167     questionId: Option[String],
168     operationId: Option[String],
169     status: Option[String],
170     createdAt: ZonedDateTime,
171     updatedAt: ZonedDateTime
172   ) {
173     def toIdea: Idea =
174       Idea(
175         ideaId = IdeaId(id),
176         name = name,
177         questionId = questionId.map(QuestionId.apply),
178         operationId = operationId.map(OperationId.apply),
179         status = status.flatMap(IdeaStatus.withValueOpt).getOrElse(IdeaStatus.Activated),
180         createdAt = Some(createdAt),
181         updatedAt = Some(updatedAt)
182       )
183   }
184 
185   object PersistentIdea extends SQLSyntaxSupport[PersistentIdea] with ShortenedNames with Logging {
186 
187     override val columnNames: Seq[String] =
188       Seq("id", "name", "question_id", "operation_id", "question", "status", "created_at", "updated_at")
189 
190     override val tableName: String = "idea"
191 
192     lazy val ideaAlias: QuerySQLSyntaxProvider[SQLSyntaxSupport[PersistentIdea], PersistentIdea] = syntax("idea")
193 
194     def apply(
195       ideaResultName: ResultName[PersistentIdea] = ideaAlias.resultName
196     )(resultSet: WrappedResultSet): PersistentIdea = {
197       PersistentIdea.apply(
198         id = resultSet.string(ideaResultName.id),
199         name = resultSet.string(ideaResultName.name),
200         question = resultSet.stringOpt(ideaResultName.question),
201         questionId = resultSet.stringOpt(ideaResultName.questionId),
202         operationId = resultSet.stringOpt(ideaResultName.operationId),
203         status = resultSet.stringOpt(ideaResultName.status),
204         createdAt = resultSet.zonedDateTime(ideaResultName.createdAt),
205         updatedAt = resultSet.zonedDateTime(ideaResultName.updatedAt)
206       )
207     }
208   }
209 }
Line Stmt Id Pos Tree Symbol Tests Code
47 20244 1778 - 1799 Select scalikejdbc.SQLSyntaxSupportFeature.SQLSyntaxSupport.column org.scalatest.testsuite org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea.column
50 21705 1901 - 1921 Select org.make.api.extensions.MakeDBExecutionContextComponent.readExecutionContext DefaultPersistentIdeaServiceComponent.this.readExecutionContext
51 21374 1955 - 2206 ApplyToImplicitArgs scala.concurrent.Future.apply scala.concurrent.Future.apply[Option[org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea]]({ <artifact> val qual$1: org.make.api.technical.DatabaseTransactions.RichDatabase = org.make.api.technical.DatabaseTransactions.RichDatabase({ <artifact> val x$1: String("READ") = "READ"; <artifact> val x$2: scalikejdbc.SettingsProvider = scalikejdbc.NamedDB.apply$default$2; <artifact> val x$3: scalikejdbc.ConnectionPoolContext = scalikejdbc.NamedDB.apply$default$3("READ", x$2); scalikejdbc.NamedDB.apply("READ", x$2)(x$3) }); <artifact> val x$7: scalikejdbc.DBSession => Option[org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea] @scala.reflect.internal.annotations.uncheckedBounds = ((implicit session: scalikejdbc.DBSession) => { <synthetic> <stable> <artifact> val stabilizer$1: scalikejdbc.SQLToOption[org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea,scalikejdbc.HasExtractor] @scala.reflect.internal.annotations.uncheckedBounds = scalikejdbc.`package`.withSQL.apply[Nothing](scalikejdbc.`package`.select.from[Nothing](org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea.as(DefaultPersistentIdeaService.this.ideaAlias)).where(scalikejdbc.`package`.sqls.eq[String]((DefaultPersistentIdeaService.this.ideaAlias.field("id"): scalikejdbc.interpolation.SQLSyntax), ideaId.value)(scalikejdbc.this.ParameterBinderFactory.stringParameterBinderFactory))).map[org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea]({ <synthetic> val eta$0$1: scalikejdbc.ResultName[org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea] = org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea.apply$default$1; ((resultSet: scalikejdbc.WrappedResultSet) => org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea.apply(eta$0$1)(resultSet)) }).single; { <artifact> val x$4: scalikejdbc.DBSession = session; <artifact> val x$5: scalikejdbc.SQL[org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea,scalikejdbc.HasExtractor] =:= scalikejdbc.SQL[org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea,scalikejdbc.HasExtractor] @scala.reflect.internal.annotations.uncheckedBounds = GeneralizedTypeConstraintsForWithExtractor.this.=:=.tpEquals[scalikejdbc.SQL[org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea,scalikejdbc.HasExtractor]]; <artifact> val x$6: scalikejdbc.ConnectionPoolContext = stabilizer$1.apply$default$2(); stabilizer$1.apply()(x$4, x$6, x$5) } }); <artifact> val x$8: scalikejdbc.TxBoundary[Option[org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea]] @scala.reflect.internal.annotations.uncheckedBounds = qual$1.retryableTx$default$2[Option[org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea]](x$7); qual$1.retryableTx[Option[org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea]](x$7)(x$8) })(context)
59 20280 2214 - 2255 ApplyToImplicitArgs scala.concurrent.Future.map futurePersistentIdea.map[Option[org.make.core.idea.Idea]](((x$1: Option[org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea]) => x$1.map[org.make.core.idea.Idea](((x$2: org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea) => x$2.toIdea))))(context)
63 21992 2391 - 2411 Select org.make.api.extensions.MakeDBExecutionContextComponent.readExecutionContext DefaultPersistentIdeaServiceComponent.this.readExecutionContext
64 21041 2445 - 2743 ApplyToImplicitArgs scala.concurrent.Future.apply scala.concurrent.Future.apply[Option[org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea]]({ <artifact> val qual$1: org.make.api.technical.DatabaseTransactions.RichDatabase = org.make.api.technical.DatabaseTransactions.RichDatabase({ <artifact> val x$1: String("READ") = "READ"; <artifact> val x$2: scalikejdbc.SettingsProvider = scalikejdbc.NamedDB.apply$default$2; <artifact> val x$3: scalikejdbc.ConnectionPoolContext = scalikejdbc.NamedDB.apply$default$3("READ", x$2); scalikejdbc.NamedDB.apply("READ", x$2)(x$3) }); <artifact> val x$7: scalikejdbc.DBSession => Option[org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea] @scala.reflect.internal.annotations.uncheckedBounds = ((implicit session: scalikejdbc.DBSession) => { <synthetic> <stable> <artifact> val stabilizer$1: scalikejdbc.SQLToOption[org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea,scalikejdbc.HasExtractor] @scala.reflect.internal.annotations.uncheckedBounds = scalikejdbc.`package`.withSQL.apply[Nothing](scalikejdbc.`package`.select.from[Nothing](org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea.as(DefaultPersistentIdeaService.this.ideaAlias)).where(scalikejdbc.`package`.sqls.eq[String]((DefaultPersistentIdeaService.this.ideaAlias.field("questionId"): scalikejdbc.interpolation.SQLSyntax), questionId.value)(scalikejdbc.this.ParameterBinderFactory.stringParameterBinderFactory).and(scalikejdbc.`package`.sqls.eq[String]((DefaultPersistentIdeaService.this.ideaAlias.field("name"): scalikejdbc.interpolation.SQLSyntax), name)(scalikejdbc.this.ParameterBinderFactory.stringParameterBinderFactory)))).map[org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea]({ <synthetic> val eta$0$1: scalikejdbc.ResultName[org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea] = org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea.apply$default$1; ((resultSet: scalikejdbc.WrappedResultSet) => org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea.apply(eta$0$1)(resultSet)) }).single; { <artifact> val x$4: scalikejdbc.DBSession = session; <artifact> val x$5: scalikejdbc.SQL[org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea,scalikejdbc.HasExtractor] =:= scalikejdbc.SQL[org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea,scalikejdbc.HasExtractor] @scala.reflect.internal.annotations.uncheckedBounds = GeneralizedTypeConstraintsForWithExtractor.this.=:=.tpEquals[scalikejdbc.SQL[org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea,scalikejdbc.HasExtractor]]; <artifact> val x$6: scalikejdbc.ConnectionPoolContext = stabilizer$1.apply$default$2(); stabilizer$1.apply()(x$4, x$6, x$5) } }); <artifact> val x$8: scalikejdbc.TxBoundary[Option[org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea]] @scala.reflect.internal.annotations.uncheckedBounds = qual$1.retryableTx$default$2[Option[org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea]](x$7); qual$1.retryableTx[Option[org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea]](x$7)(x$8) })(context)
72 20043 2751 - 2792 ApplyToImplicitArgs scala.concurrent.Future.map futurePersistentIdea.map[Option[org.make.core.idea.Idea]](((x$3: Option[org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea]) => x$3.map[org.make.core.idea.Idea](((x$4: org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea) => x$4.toIdea))))(context)
76 19619 2914 - 2934 Select org.make.api.extensions.MakeDBExecutionContextComponent.readExecutionContext org.scalatest.testsuite DefaultPersistentIdeaServiceComponent.this.readExecutionContext
78 21201 2970 - 3357 ApplyToImplicitArgs scala.concurrent.Future.apply org.scalatest.testsuite scala.concurrent.Future.apply[List[org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea]]({ <artifact> val qual$1: org.make.api.technical.DatabaseTransactions.RichDatabase = org.make.api.technical.DatabaseTransactions.RichDatabase({ <artifact> val x$1: String("READ") = "READ"; <artifact> val x$2: scalikejdbc.SettingsProvider = scalikejdbc.NamedDB.apply$default$2; <artifact> val x$3: scalikejdbc.ConnectionPoolContext = scalikejdbc.NamedDB.apply$default$3("READ", x$2); scalikejdbc.NamedDB.apply("READ", x$2)(x$3) }); <artifact> val x$7: scalikejdbc.DBSession => List[org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea] @scala.reflect.internal.annotations.uncheckedBounds = ((implicit session: scalikejdbc.DBSession) => { <synthetic> <stable> <artifact> val stabilizer$1: scalikejdbc.SQLToList[org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea,scalikejdbc.HasExtractor] @scala.reflect.internal.annotations.uncheckedBounds = scalikejdbc.`package`.withSQL.apply[Nothing](scalikejdbc.`package`.select.from[Nothing](org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea.as(DefaultPersistentIdeaService.this.ideaAlias)).where(scalikejdbc.`package`.sqls.toAndConditionOpt(ideaFilters.questionId.map[scalikejdbc.interpolation.SQLSyntax](((questionId: org.make.core.question.QuestionId) => scalikejdbc.`package`.sqls.eq[String]((DefaultPersistentIdeaService.this.ideaAlias.field("questionId"): scalikejdbc.interpolation.SQLSyntax), questionId.value)(scalikejdbc.this.ParameterBinderFactory.stringParameterBinderFactory)))))).map[org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea]({ <synthetic> val eta$0$1: scalikejdbc.ResultName[org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea] = org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea.apply$default$1; ((resultSet: scalikejdbc.WrappedResultSet) => org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea.apply(eta$0$1)(resultSet)) }).list; { <artifact> val x$4: scalikejdbc.DBSession = session; <artifact> val x$5: scalikejdbc.SQL[org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea,scalikejdbc.HasExtractor] =:= scalikejdbc.SQL[org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea,scalikejdbc.HasExtractor] @scala.reflect.internal.annotations.uncheckedBounds = GeneralizedTypeConstraintsForWithExtractor.this.=:=.tpEquals[scalikejdbc.SQL[org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea,scalikejdbc.HasExtractor]]; <artifact> val x$6: scalikejdbc.ConnectionPoolContext = stabilizer$1.apply$default$2(); stabilizer$1.apply()(x$4, x$6, x$5) } }); <artifact> val x$8: scalikejdbc.TxBoundary[List[org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea]] @scala.reflect.internal.annotations.uncheckedBounds = qual$1.retryableTx$default$2[List[org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea]](x$7); qual$1.retryableTx[List[org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea]](x$7)(x$8) })(context)
90 20248 3365 - 3407 ApplyToImplicitArgs scala.concurrent.Future.map org.scalatest.testsuite futurePersistentIdeas.map[List[org.make.core.idea.Idea]](((x$5: List[org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea]) => x$5.map[org.make.core.idea.Idea](((x$6: org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea) => x$6.toIdea))))(context)
94 21834 3510 - 3530 Select org.make.api.extensions.MakeDBExecutionContextComponent.readExecutionContext DefaultPersistentIdeaServiceComponent.this.readExecutionContext
95 20857 3565 - 3818 ApplyToImplicitArgs scala.concurrent.Future.apply scala.concurrent.Future.apply[List[org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea]]({ <artifact> val qual$1: org.make.api.technical.DatabaseTransactions.RichDatabase = org.make.api.technical.DatabaseTransactions.RichDatabase({ <artifact> val x$1: String("READ") = "READ"; <artifact> val x$2: scalikejdbc.SettingsProvider = scalikejdbc.NamedDB.apply$default$2; <artifact> val x$3: scalikejdbc.ConnectionPoolContext = scalikejdbc.NamedDB.apply$default$3("READ", x$2); scalikejdbc.NamedDB.apply("READ", x$2)(x$3) }); <artifact> val x$7: scalikejdbc.DBSession => List[org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea] @scala.reflect.internal.annotations.uncheckedBounds = ((implicit session: scalikejdbc.DBSession) => { <synthetic> <stable> <artifact> val stabilizer$1: scalikejdbc.SQLToList[org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea,scalikejdbc.HasExtractor] @scala.reflect.internal.annotations.uncheckedBounds = scalikejdbc.`package`.withSQL.apply[Nothing](scalikejdbc.`package`.select.from[Nothing](org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea.as(DefaultPersistentIdeaService.this.ideaAlias)).where(scalikejdbc.`package`.sqls.in[String]((DefaultPersistentIdeaService.this.ideaAlias.field("id"): scalikejdbc.interpolation.SQLSyntax), ids.map[String](((x$7: org.make.core.idea.IdeaId) => x$7.value)))(scalikejdbc.this.ParameterBinderFactory.stringParameterBinderFactory))).map[org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea]({ <synthetic> val eta$0$1: scalikejdbc.ResultName[org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea] = org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea.apply$default$1; ((resultSet: scalikejdbc.WrappedResultSet) => org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea.apply(eta$0$1)(resultSet)) }).list; { <artifact> val x$4: scalikejdbc.DBSession = session; <artifact> val x$5: scalikejdbc.SQL[org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea,scalikejdbc.HasExtractor] =:= scalikejdbc.SQL[org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea,scalikejdbc.HasExtractor] @scala.reflect.internal.annotations.uncheckedBounds = GeneralizedTypeConstraintsForWithExtractor.this.=:=.tpEquals[scalikejdbc.SQL[org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea,scalikejdbc.HasExtractor]]; <artifact> val x$6: scalikejdbc.ConnectionPoolContext = stabilizer$1.apply$default$2(); stabilizer$1.apply()(x$4, x$6, x$5) } }); <artifact> val x$8: scalikejdbc.TxBoundary[List[org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea]] @scala.reflect.internal.annotations.uncheckedBounds = qual$1.retryableTx$default$2[List[org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea]](x$7); qual$1.retryableTx[List[org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea]](x$7)(x$8) })(cxt)
103 20418 3826 - 3868 ApplyToImplicitArgs scala.concurrent.Future.map futurePersistentIdeas.map[List[org.make.core.idea.Idea]](((x$8: List[org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea]) => x$8.map[org.make.core.idea.Idea](((x$9: org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea) => x$9.toIdea))))(cxt)
107 21974 3964 - 3985 Select org.make.api.extensions.MakeDBExecutionContextComponent.writeExecutionContext org.scalatest.testsuite DefaultPersistentIdeaServiceComponent.this.writeExecutionContext
122 21046 3992 - 4561 Apply cats.Functor.Ops.as org.scalatest.testsuite cats.implicits.toFunctorOps[scala.concurrent.Future, Boolean](scala.concurrent.Future.apply[Boolean]({ <artifact> val qual$1: org.make.api.technical.DatabaseTransactions.RichDatabase = org.make.api.technical.DatabaseTransactions.RichDatabase({ <artifact> val x$1: String("WRITE") = "WRITE"; <artifact> val x$2: scalikejdbc.SettingsProvider = scalikejdbc.NamedDB.apply$default$2; <artifact> val x$3: scalikejdbc.ConnectionPoolContext = scalikejdbc.NamedDB.apply$default$3("WRITE", x$2); scalikejdbc.NamedDB.apply("WRITE", x$2)(x$3) }); <artifact> val x$4: scalikejdbc.DBSession => Boolean @scala.reflect.internal.annotations.uncheckedBounds = ((implicit session: scalikejdbc.DBSession) => scalikejdbc.`package`.withSQL.apply[scalikejdbc.UpdateOperation](scalikejdbc.`package`.insert.into(org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea).namedValues((DefaultPersistentIdeaService.this.column.field("id"): scalikejdbc.interpolation.SQLSyntax).->[String](idea.ideaId.value)(scalikejdbc.this.ParameterBinderFactory.stringParameterBinderFactory), (DefaultPersistentIdeaService.this.column.field("name"): scalikejdbc.interpolation.SQLSyntax).->[String](idea.name)(scalikejdbc.this.ParameterBinderFactory.stringParameterBinderFactory), (DefaultPersistentIdeaService.this.column.field("questionId"): scalikejdbc.interpolation.SQLSyntax).->[Option[String]](idea.questionId.map[String](((x$10: org.make.core.question.QuestionId) => x$10.value)))(scalikejdbc.this.ParameterBinderFactory.optionalParameterBinderFactory[String](scalikejdbc.this.ParameterBinderFactory.stringParameterBinderFactory)), (DefaultPersistentIdeaService.this.column.field("operationId"): scalikejdbc.interpolation.SQLSyntax).->[Option[String]](idea.operationId.map[String](((x$11: org.make.core.operation.OperationId) => x$11.value)))(scalikejdbc.this.ParameterBinderFactory.optionalParameterBinderFactory[String](scalikejdbc.this.ParameterBinderFactory.stringParameterBinderFactory)), (DefaultPersistentIdeaService.this.column.field("status"): scalikejdbc.interpolation.SQLSyntax).->[org.make.core.idea.IdeaStatus](idea.status)(org.make.api.technical.ScalikeSupport.stringEnumBinders[org.make.core.idea.IdeaStatus]((IdeaStatus: enumeratum.values.StringEnum[org.make.core.idea.IdeaStatus]))), (DefaultPersistentIdeaService.this.column.field("createdAt"): scalikejdbc.interpolation.SQLSyntax).->[java.time.ZonedDateTime](org.make.core.DateHelper.now())(scalikejdbc.this.ParameterBinderFactory.javaTimeZonedDateTimeParameterBinderFactory), (DefaultPersistentIdeaService.this.column.field("updatedAt"): scalikejdbc.interpolation.SQLSyntax).->[java.time.ZonedDateTime](org.make.core.DateHelper.now())(scalikejdbc.this.ParameterBinderFactory.javaTimeZonedDateTimeParameterBinderFactory))).execute.apply()(session)); <artifact> val x$5: scalikejdbc.TxBoundary[Boolean] @scala.reflect.internal.annotations.uncheckedBounds = qual$1.retryableTx$default$2[Boolean](x$4); qual$1.retryableTx[Boolean](x$4)(x$5) })(context))(cats.implicits.catsStdInstancesForFuture(context)).as[org.make.core.idea.Idea](idea)
126 19994 4693 - 4714 Select org.make.api.extensions.MakeDBExecutionContextComponent.writeExecutionContext DefaultPersistentIdeaServiceComponent.this.writeExecutionContext
127 19544 4721 - 5056 ApplyToImplicitArgs scala.concurrent.Future.apply scala.concurrent.Future.apply[Int]({ <artifact> val qual$1: org.make.api.technical.DatabaseTransactions.RichDatabase = org.make.api.technical.DatabaseTransactions.RichDatabase({ <artifact> val x$1: String("WRITE") = "WRITE"; <artifact> val x$2: scalikejdbc.SettingsProvider = scalikejdbc.NamedDB.apply$default$2; <artifact> val x$3: scalikejdbc.ConnectionPoolContext = scalikejdbc.NamedDB.apply$default$3("WRITE", x$2); scalikejdbc.NamedDB.apply("WRITE", x$2)(x$3) }); <artifact> val x$4: scalikejdbc.DBSession => Int @scala.reflect.internal.annotations.uncheckedBounds = ((implicit session: scalikejdbc.DBSession) => scalikejdbc.`package`.withSQL.apply[scalikejdbc.UpdateOperation](scalikejdbc.`package`.update.apply(org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea).set((DefaultPersistentIdeaService.this.column.field("name"): scalikejdbc.interpolation.SQLSyntax).->[String](name)(scalikejdbc.this.ParameterBinderFactory.stringParameterBinderFactory), (DefaultPersistentIdeaService.this.column.field("updatedAt"): scalikejdbc.interpolation.SQLSyntax).->[java.time.ZonedDateTime](org.make.core.DateHelper.now())(scalikejdbc.this.ParameterBinderFactory.javaTimeZonedDateTimeParameterBinderFactory), (DefaultPersistentIdeaService.this.column.field("status"): scalikejdbc.interpolation.SQLSyntax).->[org.make.core.idea.IdeaStatus](status)(org.make.api.technical.ScalikeSupport.stringEnumBinders[org.make.core.idea.IdeaStatus]((IdeaStatus: enumeratum.values.StringEnum[org.make.core.idea.IdeaStatus])))).where(scalikejdbc.`package`.sqls.eq[String]((DefaultPersistentIdeaService.this.column.field("id"): scalikejdbc.interpolation.SQLSyntax), ideaId.value)(scalikejdbc.this.ParameterBinderFactory.stringParameterBinderFactory))).update.apply()(session)); <artifact> val x$5: scalikejdbc.TxBoundary[Int] @scala.reflect.internal.annotations.uncheckedBounds = qual$1.retryableTx$default$2[Int](x$4); qual$1.retryableTx[Int](x$4)(x$5) })(context)
140 21202 5154 - 5175 Select org.make.api.extensions.MakeDBExecutionContextComponent.writeExecutionContext DefaultPersistentIdeaServiceComponent.this.writeExecutionContext
141 20216 5182 - 5720 ApplyToImplicitArgs scala.concurrent.Future.apply scala.concurrent.Future.apply[Int]({ <artifact> val qual$1: org.make.api.technical.DatabaseTransactions.RichDatabase = org.make.api.technical.DatabaseTransactions.RichDatabase({ <artifact> val x$1: String("WRITE") = "WRITE"; <artifact> val x$2: scalikejdbc.SettingsProvider = scalikejdbc.NamedDB.apply$default$2; <artifact> val x$3: scalikejdbc.ConnectionPoolContext = scalikejdbc.NamedDB.apply$default$3("WRITE", x$2); scalikejdbc.NamedDB.apply("WRITE", x$2)(x$3) }); <artifact> val x$4: scalikejdbc.DBSession => Int @scala.reflect.internal.annotations.uncheckedBounds = ((implicit session: scalikejdbc.DBSession) => scalikejdbc.`package`.withSQL.apply[scalikejdbc.UpdateOperation](scalikejdbc.`package`.update.apply(org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea).set((DefaultPersistentIdeaService.this.column.field("name"): scalikejdbc.interpolation.SQLSyntax).->[String](idea.name)(scalikejdbc.this.ParameterBinderFactory.stringParameterBinderFactory), (DefaultPersistentIdeaService.this.column.field("operationId"): scalikejdbc.interpolation.SQLSyntax).->[Option[String]](idea.operationId.map[String](((x$12: org.make.core.operation.OperationId) => x$12.value)))(scalikejdbc.this.ParameterBinderFactory.optionalParameterBinderFactory[String](scalikejdbc.this.ParameterBinderFactory.stringParameterBinderFactory)), (DefaultPersistentIdeaService.this.column.field("questionId"): scalikejdbc.interpolation.SQLSyntax).->[Option[String]](idea.questionId.map[String](((x$13: org.make.core.question.QuestionId) => x$13.value)))(scalikejdbc.this.ParameterBinderFactory.optionalParameterBinderFactory[String](scalikejdbc.this.ParameterBinderFactory.stringParameterBinderFactory)), (DefaultPersistentIdeaService.this.column.field("status"): scalikejdbc.interpolation.SQLSyntax).->[org.make.core.idea.IdeaStatus](idea.status)(org.make.api.technical.ScalikeSupport.stringEnumBinders[org.make.core.idea.IdeaStatus]((IdeaStatus: enumeratum.values.StringEnum[org.make.core.idea.IdeaStatus]))), (DefaultPersistentIdeaService.this.column.field("updatedAt"): scalikejdbc.interpolation.SQLSyntax).->[java.time.ZonedDateTime](org.make.core.DateHelper.now())(scalikejdbc.this.ParameterBinderFactory.javaTimeZonedDateTimeParameterBinderFactory)).where(scalikejdbc.`package`.sqls.eq[String]((DefaultPersistentIdeaService.this.column.field("id"): scalikejdbc.interpolation.SQLSyntax), idea.ideaId.value)(scalikejdbc.this.ParameterBinderFactory.stringParameterBinderFactory))).update.apply()(session)); <artifact> val x$5: scalikejdbc.TxBoundary[Int] @scala.reflect.internal.annotations.uncheckedBounds = qual$1.retryableTx$default$2[Int](x$4); qual$1.retryableTx[Int](x$4)(x$5) })(context)
174 19964 6068 - 6407 Apply org.make.core.idea.Idea.apply org.make.core.idea.Idea.apply(x$1, x$2, x$4, x$3, x$5, x$6, x$7)
175 20807 6091 - 6101 Apply org.make.core.idea.IdeaId.apply org.make.core.idea.IdeaId.apply(PersistentIdea.this.id)
175 21746 6098 - 6100 Select org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea.id PersistentIdea.this.id
176 20273 6118 - 6122 Select org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea.name PersistentIdea.this.name
177 21006 6145 - 6177 Apply scala.Option.map PersistentIdea.this.questionId.map[org.make.core.question.QuestionId](((value: String) => org.make.core.question.QuestionId.apply(value)))
177 21975 6160 - 6176 Apply org.make.core.question.QuestionId.apply org.make.core.question.QuestionId.apply(value)
178 19500 6201 - 6235 Apply scala.Option.map PersistentIdea.this.operationId.map[org.make.core.operation.OperationId](((value: String) => org.make.core.operation.OperationId.apply(value)))
178 20002 6217 - 6234 Apply org.make.core.operation.OperationId.apply org.make.core.operation.OperationId.apply(value)
179 20171 6304 - 6324 Select org.make.core.idea.IdeaStatus.Activated org.make.core.idea.IdeaStatus.Activated
179 21080 6269 - 6292 Apply enumeratum.values.ValueEnum.withValueOpt org.make.core.idea.IdeaStatus.withValueOpt(i)
179 21723 6254 - 6325 Apply scala.Option.getOrElse PersistentIdea.this.status.flatMap[org.make.core.idea.IdeaStatus](((i: String) => org.make.core.idea.IdeaStatus.withValueOpt(i))).getOrElse[org.make.core.idea.IdeaStatus](org.make.core.idea.IdeaStatus.Activated)
180 20278 6347 - 6362 Apply scala.Some.apply scala.Some.apply[java.time.ZonedDateTime](PersistentIdea.this.createdAt)
180 20816 6352 - 6361 Select org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea.createdAt PersistentIdea.this.createdAt
181 21038 6384 - 6399 Apply scala.Some.apply scala.Some.apply[java.time.ZonedDateTime](PersistentIdea.this.updatedAt)
181 21878 6389 - 6398 Select org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea.updatedAt PersistentIdea.this.updatedAt
188 21547 6564 - 6662 Apply scala.collection.SeqFactory.Delegate.apply org.scalatest.testsuite scala.`package`.Seq.apply[String]("id", "name", "question_id", "operation_id", "question", "status", "created_at", "updated_at")
190 21088 6701 - 6707 Literal <nosymbol> org.scalatest.testsuite "idea"
197 21625 6972 - 7512 Apply org.make.api.idea.DefaultPersistentIdeaServiceComponent.PersistentIdea.apply DefaultPersistentIdeaServiceComponent.this.PersistentIdea.apply(resultSet.string(scalikejdbc.`package`.scalikejdbcSQLSyntaxToStringImplicitDef((ideaResultName.field("id"): scalikejdbc.interpolation.SQLSyntax))), resultSet.string(scalikejdbc.`package`.scalikejdbcSQLSyntaxToStringImplicitDef((ideaResultName.field("name"): scalikejdbc.interpolation.SQLSyntax))), resultSet.stringOpt(scalikejdbc.`package`.scalikejdbcSQLSyntaxToStringImplicitDef((ideaResultName.field("question"): scalikejdbc.interpolation.SQLSyntax))), resultSet.stringOpt(scalikejdbc.`package`.scalikejdbcSQLSyntaxToStringImplicitDef((ideaResultName.field("questionId"): scalikejdbc.interpolation.SQLSyntax))), resultSet.stringOpt(scalikejdbc.`package`.scalikejdbcSQLSyntaxToStringImplicitDef((ideaResultName.field("operationId"): scalikejdbc.interpolation.SQLSyntax))), resultSet.stringOpt(scalikejdbc.`package`.scalikejdbcSQLSyntaxToStringImplicitDef((ideaResultName.field("status"): scalikejdbc.interpolation.SQLSyntax))), resultSet.zonedDateTime(scalikejdbc.`package`.scalikejdbcSQLSyntaxToStringImplicitDef((ideaResultName.field("createdAt"): scalikejdbc.interpolation.SQLSyntax))), resultSet.zonedDateTime(scalikejdbc.`package`.scalikejdbcSQLSyntaxToStringImplicitDef((ideaResultName.field("updatedAt"): scalikejdbc.interpolation.SQLSyntax))))
198 21832 7007 - 7042 Apply scalikejdbc.WrappedResultSet.string resultSet.string(scalikejdbc.`package`.scalikejdbcSQLSyntaxToStringImplicitDef((ideaResultName.field("id"): scalikejdbc.interpolation.SQLSyntax)))
198 20136 7024 - 7041 ApplyImplicitView scalikejdbc.interpolation.Implicits.scalikejdbcSQLSyntaxToStringImplicitDef scalikejdbc.`package`.scalikejdbcSQLSyntaxToStringImplicitDef((ideaResultName.field("id"): scalikejdbc.interpolation.SQLSyntax))
199 20822 7076 - 7095 ApplyImplicitView scalikejdbc.interpolation.Implicits.scalikejdbcSQLSyntaxToStringImplicitDef scalikejdbc.`package`.scalikejdbcSQLSyntaxToStringImplicitDef((ideaResultName.field("name"): scalikejdbc.interpolation.SQLSyntax))
199 20417 7059 - 7096 Apply scalikejdbc.WrappedResultSet.string resultSet.string(scalikejdbc.`package`.scalikejdbcSQLSyntaxToStringImplicitDef((ideaResultName.field("name"): scalikejdbc.interpolation.SQLSyntax)))
200 20999 7117 - 7161 Apply scalikejdbc.WrappedResultSet.stringOpt resultSet.stringOpt(scalikejdbc.`package`.scalikejdbcSQLSyntaxToStringImplicitDef((ideaResultName.field("question"): scalikejdbc.interpolation.SQLSyntax)))
200 21882 7137 - 7160 ApplyImplicitView scalikejdbc.interpolation.Implicits.scalikejdbcSQLSyntaxToStringImplicitDef scalikejdbc.`package`.scalikejdbcSQLSyntaxToStringImplicitDef((ideaResultName.field("question"): scalikejdbc.interpolation.SQLSyntax))
201 21552 7184 - 7230 Apply scalikejdbc.WrappedResultSet.stringOpt resultSet.stringOpt(scalikejdbc.`package`.scalikejdbcSQLSyntaxToStringImplicitDef((ideaResultName.field("questionId"): scalikejdbc.interpolation.SQLSyntax)))
201 20086 7204 - 7229 ApplyImplicitView scalikejdbc.interpolation.Implicits.scalikejdbcSQLSyntaxToStringImplicitDef scalikejdbc.`package`.scalikejdbcSQLSyntaxToStringImplicitDef((ideaResultName.field("questionId"): scalikejdbc.interpolation.SQLSyntax))
202 20215 7254 - 7301 Apply scalikejdbc.WrappedResultSet.stringOpt resultSet.stringOpt(scalikejdbc.`package`.scalikejdbcSQLSyntaxToStringImplicitDef((ideaResultName.field("operationId"): scalikejdbc.interpolation.SQLSyntax)))
202 21216 7274 - 7300 ApplyImplicitView scalikejdbc.interpolation.Implicits.scalikejdbcSQLSyntaxToStringImplicitDef scalikejdbc.`package`.scalikejdbcSQLSyntaxToStringImplicitDef((ideaResultName.field("operationId"): scalikejdbc.interpolation.SQLSyntax))
203 21789 7340 - 7361 ApplyImplicitView scalikejdbc.interpolation.Implicits.scalikejdbcSQLSyntaxToStringImplicitDef scalikejdbc.`package`.scalikejdbcSQLSyntaxToStringImplicitDef((ideaResultName.field("status"): scalikejdbc.interpolation.SQLSyntax))
203 20802 7320 - 7362 Apply scalikejdbc.WrappedResultSet.stringOpt resultSet.stringOpt(scalikejdbc.`package`.scalikejdbcSQLSyntaxToStringImplicitDef((ideaResultName.field("status"): scalikejdbc.interpolation.SQLSyntax)))
204 22000 7384 - 7433 Apply scalikejdbc.WrappedResultSet.zonedDateTime resultSet.zonedDateTime(scalikejdbc.`package`.scalikejdbcSQLSyntaxToStringImplicitDef((ideaResultName.field("createdAt"): scalikejdbc.interpolation.SQLSyntax)))
204 20259 7408 - 7432 ApplyImplicitView scalikejdbc.interpolation.Implicits.scalikejdbcSQLSyntaxToStringImplicitDef scalikejdbc.`package`.scalikejdbcSQLSyntaxToStringImplicitDef((ideaResultName.field("createdAt"): scalikejdbc.interpolation.SQLSyntax))
205 21002 7479 - 7503 ApplyImplicitView scalikejdbc.interpolation.Implicits.scalikejdbcSQLSyntaxToStringImplicitDef scalikejdbc.`package`.scalikejdbcSQLSyntaxToStringImplicitDef((ideaResultName.field("updatedAt"): scalikejdbc.interpolation.SQLSyntax))
205 20090 7455 - 7504 Apply scalikejdbc.WrappedResultSet.zonedDateTime resultSet.zonedDateTime(scalikejdbc.`package`.scalikejdbcSQLSyntaxToStringImplicitDef((ideaResultName.field("updatedAt"): scalikejdbc.interpolation.SQLSyntax)))