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.core.proposal
21 
22 import com.sksamuel.elastic4s.ElasticApi._
23 import com.sksamuel.elastic4s.ElasticDsl.{functionScoreQuery, scriptScore}
24 import com.sksamuel.elastic4s.requests.script.Script
25 import com.sksamuel.elastic4s.requests.searches.SearchRequest
26 import com.sksamuel.elastic4s.requests.searches.collapse.CollapseRequest
27 import com.sksamuel.elastic4s.requests.searches.queries.InnerHit
28 import com.sksamuel.elastic4s.requests.searches.queries.funcscorer.{CombineFunction, WeightScore}
29 import com.sksamuel.elastic4s.requests.searches.sort.{FieldSort, ScoreSort, SortOrder}
30 import enumeratum.values.{StringEnum, StringEnumEntry}
31 import org.make.core.proposal.indexed.ProposalElasticsearchFieldName
32 import org.make.core.technical.enumeratum.EnumKeys.StringEnumKeys
33 import org.make.core.user.UserType
34 
35 sealed trait SortAlgorithm {
36   def sortDefinition(request: SearchRequest): SearchRequest
37   protected def docField(value: ProposalElasticsearchFieldName): String = s"doc['${value.field}']"
38 }
39 
40 trait RandomBaseAlgorithm {
41   def seed: Int
42 }
43 
44 // Sorts randomly from the given seed
45 final case class RandomAlgorithm(override val seed: Int) extends SortAlgorithm with RandomBaseAlgorithm {
46   override def sortDefinition(request: SearchRequest): SearchRequest = {
47     request.query.map { query =>
48       request.query(functionScoreQuery().query(query).functions(randomScore(seed = seed).fieldName("id")))
49     }.getOrElse(request)
50 
51   }
52 }
53 
54 /*
55  * This algorithm aims to show hot quality content to the user.
56  * Which means:
57  * - tagged proposals will be chosen in priority
58  * - Recent proposals will have a priority boost
59  * - Proposals on which organisations have voted will be boosted
60  */
61 final case class TaggedFirstAlgorithm(override val seed: Int) extends SortAlgorithm with RandomBaseAlgorithm {
62 
63   override def sortDefinition(request: SearchRequest): SearchRequest = {
64     request
65       .query(
66         functionScoreQuery()
67           .query(request.query.getOrElse(matchAllQuery()))
68           .functions(
69             WeightScore(50d, Some(existsQuery(ProposalElasticsearchFieldName.tagId.field))),
70             WeightScore(
71               10d,
72               Some(scriptQuery(s"${docField(ProposalElasticsearchFieldName.organisationId)}.size() > 1"))
73             ),
74             WeightScore(
75               5d,
76               Some(scriptQuery(s"${docField(ProposalElasticsearchFieldName.organisationId)}.size() == 1"))
77             ),
78             exponentialScore(field = ProposalElasticsearchFieldName.createdAt.field, scale = "7d", origin = "now")
79               .weight(30d)
80               .decay(0.33d),
81             randomScore(seed = seed).fieldName("id").weight(5d)
82           )
83           .scoreMode("sum")
84           .boostMode(CombineFunction.Replace)
85       )
86   }
87 }
88 
89 // Sorts the proposals by most actor votes and then randomly from the given seed
90 final case class ActorVoteAlgorithm(override val seed: Int) extends SortAlgorithm with RandomBaseAlgorithm {
91   override def sortDefinition(request: SearchRequest): SearchRequest = {
92     val scriptActorVoteNumber = s"${docField(ProposalElasticsearchFieldName.organisationId)}.size()"
93     val actorVoteScript = s"$scriptActorVoteNumber > 0 ? ($scriptActorVoteNumber + 1) * 10 : 1"
94     request.query.map { query =>
95       request
96         .query(
97           functionScoreQuery()
98             .query(query)
99             .functions(scriptScore(Script(script = actorVoteScript)), randomScore(seed = seed).fieldName("id"))
100             .scoreMode("sum")
101             .boostMode(CombineFunction.Sum)
102         )
103     }.getOrElse(request)
104   }
105 }
106 
107 // Sort proposal by their controversy score
108 case object ControversyAlgorithm extends SortAlgorithm {
109   override def sortDefinition(request: SearchRequest): SearchRequest = {
110     request.sortByFieldDesc(ProposalElasticsearchFieldName.controversyLowerBound.field)
111   }
112 }
113 
114 // Sort proposal by their top score
115 case object PopularAlgorithm extends SortAlgorithm {
116   override def sortDefinition(request: SearchRequest): SearchRequest = {
117     request.sortByFieldDesc(ProposalElasticsearchFieldName.scoreLowerBound.field)
118   }
119 }
120 
121 case object B2BFirstAlgorithm extends SortAlgorithm {
122   override def sortDefinition(request: SearchRequest): SearchRequest = {
123     val userTypeScript =
124       s"""${docField(ProposalElasticsearchFieldName.authorUserType)}.value == \"${UserType.UserTypeUser.value}\" ? 1 : 100"""
125     request.query.map { query =>
126       request
127         .query(
128           functionScoreQuery()
129             .query(query)
130             .functions(scriptScore(Script(script = userTypeScript)))
131             .boostMode(CombineFunction.Replace)
132         )
133         .sortBy(ScoreSort(SortOrder.Desc) +: request.sorts)
134     }.getOrElse(request)
135   }
136 }
137 
138 final case class CreationDateAlgorithm(order: SortOrder) extends SortAlgorithm {
139   override def sortDefinition(request: SearchRequest): SearchRequest =
140     request.sortBy(FieldSort(field = ProposalElasticsearchFieldName.createdAt.field, order = order))
141 }
142 
143 final case class SegmentFirstAlgorithm(segment: String) extends SortAlgorithm {
144   override def sortDefinition(request: SearchRequest): SearchRequest = {
145     val segmentField = docField(ProposalElasticsearchFieldName.segment)
146     val pointsIfMatchesSegmentScript =
147       s"""$segmentField.size() > 0 && $segmentField.value == "$segment" ? 10 : 1"""
148     request.query.map { query =>
149       request.query(
150         functionScoreQuery()
151           .query(query)
152           .functions(
153             scriptScore(Script(pointsIfMatchesSegmentScript)),
154             gaussianScore(ProposalElasticsearchFieldName.createdAt.field, "now", "7d")
155               .decay(0.8d)
156           )
157           .scoreMode("sum")
158           .boostMode(CombineFunction.Replace)
159       )
160     }.getOrElse(request)
161   }
162 }
163 
164 case object Featured extends SortAlgorithm {
165   override def sortDefinition(request: SearchRequest): SearchRequest = {
166     val sort = FieldSort(field = ProposalElasticsearchFieldName.createdAt.field, order = SortOrder.Desc)
167     request
168       .collapse(
169         CollapseRequest(ProposalElasticsearchFieldName.authorUserId.field).inner(InnerHit("last").sortBy(sort).size(1))
170       )
171       .sortBy(sort)
172   }
173 }
174 
175 sealed abstract class AlgorithmSelector(val value: String, val build: Int => SortAlgorithm) extends StringEnumEntry
176 
177 case object AlgorithmSelector extends StringEnum[AlgorithmSelector] with StringEnumKeys[AlgorithmSelector] {
178 
179   case object Random extends AlgorithmSelector("random", randomSeed => RandomAlgorithm(randomSeed))
180 
181   case object TaggedFirst extends AlgorithmSelector("taggedFirst", randomSeed => TaggedFirstAlgorithm(randomSeed))
182 
183   case object ActorVote extends AlgorithmSelector("actorVote", randomSeed => ActorVoteAlgorithm(randomSeed))
184 
185   case object Controversy extends AlgorithmSelector("controversy", _ => ControversyAlgorithm)
186 
187   case object Popular extends AlgorithmSelector("popular", _ => PopularAlgorithm)
188 
189   case object B2BFirst extends AlgorithmSelector("B2BFirst", _ => B2BFirstAlgorithm)
190 
191   override val values: IndexedSeq[AlgorithmSelector] = findValues
192 
193   def select(sortAlgorithm: Option[String], randomSeed: Int): Option[SortAlgorithm] =
194     sortAlgorithm.flatMap(withValueOpt).map(_.build(randomSeed))
195 
196 }
Line Stmt Id Pos Tree Symbol Tests Code
49 1836 2018 - 2178 Apply scala.Option.getOrElse org.scalatest.testsuite request.query.map[com.sksamuel.elastic4s.requests.searches.SearchRequest](((query: com.sksamuel.elastic4s.requests.searches.queries.Query) => request.query(com.sksamuel.elastic4s.ElasticDsl.functionScoreQuery().query(query).functions(com.sksamuel.elastic4s.ElasticApi.randomScore(RandomAlgorithm.this.seed).fieldName("id"))))).getOrElse[com.sksamuel.elastic4s.requests.searches.SearchRequest](request)
65 2191 2626 - 3509 Apply com.sksamuel.elastic4s.requests.searches.SearchRequest.query request.query(com.sksamuel.elastic4s.ElasticDsl.functionScoreQuery().query(request.query.getOrElse[com.sksamuel.elastic4s.requests.searches.queries.Query](com.sksamuel.elastic4s.ElasticApi.matchAllQuery())).functions(com.sksamuel.elastic4s.requests.searches.queries.funcscorer.WeightScore.apply(50.0, scala.Some.apply[com.sksamuel.elastic4s.requests.searches.queries.ExistsQuery](com.sksamuel.elastic4s.ElasticApi.existsQuery(org.make.core.proposal.indexed.ProposalElasticsearchFieldName.tagId.field))), com.sksamuel.elastic4s.requests.searches.queries.funcscorer.WeightScore.apply(10.0, scala.Some.apply[com.sksamuel.elastic4s.requests.searches.queries.ScriptQuery](com.sksamuel.elastic4s.ElasticApi.scriptQuery(("".+(TaggedFirstAlgorithm.this.docField(org.make.core.proposal.indexed.ProposalElasticsearchFieldName.organisationId)).+(".size() > 1"): String)))), com.sksamuel.elastic4s.requests.searches.queries.funcscorer.WeightScore.apply(5.0, scala.Some.apply[com.sksamuel.elastic4s.requests.searches.queries.ScriptQuery](com.sksamuel.elastic4s.ElasticApi.scriptQuery(("".+(TaggedFirstAlgorithm.this.docField(org.make.core.proposal.indexed.ProposalElasticsearchFieldName.organisationId)).+(".size() == 1"): String)))), { <artifact> val x$1: String = org.make.core.proposal.indexed.ProposalElasticsearchFieldName.createdAt.field; <artifact> val x$2: String("7d") = "7d"; <artifact> val x$3: String("now") = "now"; com.sksamuel.elastic4s.ElasticApi.exponentialScore(x$1, "now", "7d") }.weight(30.0).decay(0.33), com.sksamuel.elastic4s.ElasticApi.randomScore(TaggedFirstAlgorithm.this.seed).fieldName("id").weight(5.0)).scoreMode("sum").boostMode(com.sksamuel.elastic4s.requests.searches.queries.funcscorer.CombineFunction.Replace))
67 5036 2718 - 2733 Apply com.sksamuel.elastic4s.api.QueryApi.matchAllQuery com.sksamuel.elastic4s.ElasticApi.matchAllQuery()
67 3061 2694 - 2734 Apply scala.Option.getOrElse request.query.getOrElse[com.sksamuel.elastic4s.requests.searches.queries.Query](com.sksamuel.elastic4s.ElasticApi.matchAllQuery())
69 2257 2782 - 2785 Literal <nosymbol> 50.0
69 681 2770 - 2849 Apply com.sksamuel.elastic4s.requests.searches.queries.funcscorer.WeightScore.apply com.sksamuel.elastic4s.requests.searches.queries.funcscorer.WeightScore.apply(50.0, scala.Some.apply[com.sksamuel.elastic4s.requests.searches.queries.ExistsQuery](com.sksamuel.elastic4s.ElasticApi.existsQuery(org.make.core.proposal.indexed.ProposalElasticsearchFieldName.tagId.field)))
69 5363 2804 - 2846 Select org.make.core.proposal.indexed.ProposalElasticsearchFieldName.Simple.field org.make.core.proposal.indexed.ProposalElasticsearchFieldName.tagId.field
69 3488 2792 - 2847 Apply com.sksamuel.elastic4s.api.QueryApi.existsQuery com.sksamuel.elastic4s.ElasticApi.existsQuery(org.make.core.proposal.indexed.ProposalElasticsearchFieldName.tagId.field)
69 1417 2787 - 2848 Apply scala.Some.apply scala.Some.apply[com.sksamuel.elastic4s.requests.searches.queries.ExistsQuery](com.sksamuel.elastic4s.ElasticApi.existsQuery(org.make.core.proposal.indexed.ProposalElasticsearchFieldName.tagId.field))
70 3068 2863 - 3014 Apply com.sksamuel.elastic4s.requests.searches.queries.funcscorer.WeightScore.apply com.sksamuel.elastic4s.requests.searches.queries.funcscorer.WeightScore.apply(10.0, scala.Some.apply[com.sksamuel.elastic4s.requests.searches.queries.ScriptQuery](com.sksamuel.elastic4s.ElasticApi.scriptQuery(("".+(TaggedFirstAlgorithm.this.docField(org.make.core.proposal.indexed.ProposalElasticsearchFieldName.organisationId)).+(".size() > 1"): String))))
71 3927 2890 - 2893 Literal <nosymbol> 10.0
72 1846 2914 - 2999 Apply com.sksamuel.elastic4s.api.QueryApi.scriptQuery com.sksamuel.elastic4s.ElasticApi.scriptQuery(("".+(TaggedFirstAlgorithm.this.docField(org.make.core.proposal.indexed.ProposalElasticsearchFieldName.organisationId)).+(".size() > 1"): String))
72 5285 2909 - 3000 Apply scala.Some.apply scala.Some.apply[com.sksamuel.elastic4s.requests.searches.queries.ScriptQuery](com.sksamuel.elastic4s.ElasticApi.scriptQuery(("".+(TaggedFirstAlgorithm.this.docField(org.make.core.proposal.indexed.ProposalElasticsearchFieldName.organisationId)).+(".size() > 1"): String)))
74 1674 3028 - 3179 Apply com.sksamuel.elastic4s.requests.searches.queries.funcscorer.WeightScore.apply com.sksamuel.elastic4s.requests.searches.queries.funcscorer.WeightScore.apply(5.0, scala.Some.apply[com.sksamuel.elastic4s.requests.searches.queries.ScriptQuery](com.sksamuel.elastic4s.ElasticApi.scriptQuery(("".+(TaggedFirstAlgorithm.this.docField(org.make.core.proposal.indexed.ProposalElasticsearchFieldName.organisationId)).+(".size() == 1"): String))))
75 2182 3055 - 3057 Literal <nosymbol> 5.0
76 3666 3073 - 3165 Apply scala.Some.apply scala.Some.apply[com.sksamuel.elastic4s.requests.searches.queries.ScriptQuery](com.sksamuel.elastic4s.ElasticApi.scriptQuery(("".+(TaggedFirstAlgorithm.this.docField(org.make.core.proposal.indexed.ProposalElasticsearchFieldName.organisationId)).+(".size() == 1"): String)))
76 5567 3078 - 3164 Apply com.sksamuel.elastic4s.api.QueryApi.scriptQuery com.sksamuel.elastic4s.ElasticApi.scriptQuery(("".+(TaggedFirstAlgorithm.this.docField(org.make.core.proposal.indexed.ProposalElasticsearchFieldName.organisationId)).+(".size() == 1"): String))
80 694 3193 - 3350 Apply com.sksamuel.elastic4s.requests.searches.queries.funcscorer.ExponentialDecayScore.decay { <artifact> val x$1: String = org.make.core.proposal.indexed.ProposalElasticsearchFieldName.createdAt.field; <artifact> val x$2: String("7d") = "7d"; <artifact> val x$3: String("now") = "now"; com.sksamuel.elastic4s.ElasticApi.exponentialScore(x$1, "now", "7d") }.weight(30.0).decay(0.33)
81 3859 3364 - 3415 Apply com.sksamuel.elastic4s.requests.searches.queries.funcscorer.RandomScoreFunction.weight com.sksamuel.elastic4s.ElasticApi.randomScore(TaggedFirstAlgorithm.this.seed).fieldName("id").weight(5.0)
83 1956 3449 - 3454 Literal <nosymbol> "sum"
84 5296 3477 - 3500 Select com.sksamuel.elastic4s.requests.searches.queries.funcscorer.CombineFunction.Replace com.sksamuel.elastic4s.requests.searches.queries.funcscorer.CombineFunction.Replace
84 3335 2656 - 3501 Apply com.sksamuel.elastic4s.requests.searches.queries.funcscorer.FunctionScoreQuery.boostMode com.sksamuel.elastic4s.ElasticDsl.functionScoreQuery().query(request.query.getOrElse[com.sksamuel.elastic4s.requests.searches.queries.Query](com.sksamuel.elastic4s.ElasticApi.matchAllQuery())).functions(com.sksamuel.elastic4s.requests.searches.queries.funcscorer.WeightScore.apply(50.0, scala.Some.apply[com.sksamuel.elastic4s.requests.searches.queries.ExistsQuery](com.sksamuel.elastic4s.ElasticApi.existsQuery(org.make.core.proposal.indexed.ProposalElasticsearchFieldName.tagId.field))), com.sksamuel.elastic4s.requests.searches.queries.funcscorer.WeightScore.apply(10.0, scala.Some.apply[com.sksamuel.elastic4s.requests.searches.queries.ScriptQuery](com.sksamuel.elastic4s.ElasticApi.scriptQuery(("".+(TaggedFirstAlgorithm.this.docField(org.make.core.proposal.indexed.ProposalElasticsearchFieldName.organisationId)).+(".size() > 1"): String)))), com.sksamuel.elastic4s.requests.searches.queries.funcscorer.WeightScore.apply(5.0, scala.Some.apply[com.sksamuel.elastic4s.requests.searches.queries.ScriptQuery](com.sksamuel.elastic4s.ElasticApi.scriptQuery(("".+(TaggedFirstAlgorithm.this.docField(org.make.core.proposal.indexed.ProposalElasticsearchFieldName.organisationId)).+(".size() == 1"): String)))), { <artifact> val x$1: String = org.make.core.proposal.indexed.ProposalElasticsearchFieldName.createdAt.field; <artifact> val x$2: String("7d") = "7d"; <artifact> val x$3: String("now") = "now"; com.sksamuel.elastic4s.ElasticApi.exponentialScore(x$1, "now", "7d") }.weight(30.0).decay(0.33), com.sksamuel.elastic4s.ElasticApi.randomScore(TaggedFirstAlgorithm.this.seed).fieldName("id").weight(5.0)).scoreMode("sum").boostMode(com.sksamuel.elastic4s.requests.searches.queries.funcscorer.CombineFunction.Replace)
103 5572 3981 - 4317 Apply scala.Option.getOrElse org.scalatest.testsuite request.query.map[com.sksamuel.elastic4s.requests.searches.SearchRequest](((query: com.sksamuel.elastic4s.requests.searches.queries.Query) => request.query(com.sksamuel.elastic4s.ElasticDsl.functionScoreQuery().query(query).functions(com.sksamuel.elastic4s.ElasticDsl.scriptScore(com.sksamuel.elastic4s.requests.script.Script.apply(actorVoteScript, com.sksamuel.elastic4s.requests.script.Script.apply$default$2, com.sksamuel.elastic4s.requests.script.Script.apply$default$3, com.sksamuel.elastic4s.requests.script.Script.apply$default$4, com.sksamuel.elastic4s.requests.script.Script.apply$default$5, com.sksamuel.elastic4s.requests.script.Script.apply$default$6)), com.sksamuel.elastic4s.ElasticApi.randomScore(ActorVoteAlgorithm.this.seed).fieldName("id")).scoreMode("sum").boostMode(com.sksamuel.elastic4s.requests.searches.queries.funcscorer.CombineFunction.Sum)))).getOrElse[com.sksamuel.elastic4s.requests.searches.SearchRequest](request)
110 1687 4503 - 4586 Apply com.sksamuel.elastic4s.requests.searches.SearchRequest.sortByFieldDesc org.scalatest.testsuite request.sortByFieldDesc(org.make.core.proposal.indexed.ProposalElasticsearchFieldName.controversyLowerBound.field)
110 3478 4527 - 4585 Select org.make.core.proposal.indexed.ProposalElasticsearchFieldName.Simple.field org.scalatest.testsuite org.make.core.proposal.indexed.ProposalElasticsearchFieldName.controversyLowerBound.field
117 4820 4784 - 4836 Select org.make.core.proposal.indexed.ProposalElasticsearchFieldName.Simple.field org.scalatest.testsuite org.make.core.proposal.indexed.ProposalElasticsearchFieldName.scoreLowerBound.field
117 3871 4760 - 4837 Apply com.sksamuel.elastic4s.requests.searches.SearchRequest.sortByFieldDesc org.scalatest.testsuite request.sortByFieldDesc(org.make.core.proposal.indexed.ProposalElasticsearchFieldName.scoreLowerBound.field)
134 1832 5127 - 5454 Apply scala.Option.getOrElse org.scalatest.testsuite request.query.map[com.sksamuel.elastic4s.requests.searches.SearchRequest](((query: com.sksamuel.elastic4s.requests.searches.queries.Query) => request.query(com.sksamuel.elastic4s.ElasticDsl.functionScoreQuery().query(query).functions(com.sksamuel.elastic4s.ElasticDsl.scriptScore(com.sksamuel.elastic4s.requests.script.Script.apply(userTypeScript, com.sksamuel.elastic4s.requests.script.Script.apply$default$2, com.sksamuel.elastic4s.requests.script.Script.apply$default$3, com.sksamuel.elastic4s.requests.script.Script.apply$default$4, com.sksamuel.elastic4s.requests.script.Script.apply$default$5, com.sksamuel.elastic4s.requests.script.Script.apply$default$6))).boostMode(com.sksamuel.elastic4s.requests.searches.queries.funcscorer.CombineFunction.Replace)).sortBy({ final <synthetic> <artifact> val rassoc$1: com.sksamuel.elastic4s.requests.searches.sort.ScoreSort = com.sksamuel.elastic4s.requests.searches.sort.ScoreSort.apply(com.sksamuel.elastic4s.requests.searches.sort.SortOrder.Desc); request.sorts.+:[com.sksamuel.elastic4s.requests.searches.sort.Sort](rassoc$1) }))).getOrElse[com.sksamuel.elastic4s.requests.searches.SearchRequest](request)
140 3322 5618 - 5714 Apply com.sksamuel.elastic4s.requests.searches.SearchRequest.sortBy request.sortBy({ <artifact> val x$1: String = org.make.core.proposal.indexed.ProposalElasticsearchFieldName.createdAt.field; <artifact> val x$2: com.sksamuel.elastic4s.requests.searches.sort.SortOrder = CreationDateAlgorithm.this.order; <artifact> val x$3: Option[Any] @scala.reflect.internal.annotations.uncheckedBounds = com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply$default$2; <artifact> val x$4: Option[String] @scala.reflect.internal.annotations.uncheckedBounds = com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply$default$3; <artifact> val x$5: Option[com.sksamuel.elastic4s.requests.searches.queries.Query] @scala.reflect.internal.annotations.uncheckedBounds = com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply$default$4; <artifact> val x$6: Option[String] @scala.reflect.internal.annotations.uncheckedBounds = com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply$default$5; <artifact> val x$7: Option[com.sksamuel.elastic4s.requests.searches.sort.SortMode] @scala.reflect.internal.annotations.uncheckedBounds = com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply$default$6; <artifact> val x$8: Option[String] @scala.reflect.internal.annotations.uncheckedBounds = com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply$default$8; <artifact> val x$9: Option[com.sksamuel.elastic4s.requests.searches.sort.NestedSort] @scala.reflect.internal.annotations.uncheckedBounds = com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply$default$9; com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply(x$1, x$3, x$4, x$5, x$6, x$7, x$2, x$8, x$9) })
140 1761 5633 - 5633 Select com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply$default$9 com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply$default$9
140 5514 5633 - 5633 Select com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply$default$3 com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply$default$3
140 3345 5707 - 5712 Select org.make.core.proposal.CreationDateAlgorithm.order CreationDateAlgorithm.this.order
140 3880 5633 - 5633 Select com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply$default$8 com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply$default$8
140 4834 5633 - 5633 Select com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply$default$6 com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply$default$6
140 5103 5651 - 5697 Select org.make.core.proposal.indexed.ProposalElasticsearchFieldName.Simple.field org.make.core.proposal.indexed.ProposalElasticsearchFieldName.createdAt.field
140 5106 5633 - 5713 Apply com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply(x$1, x$3, x$4, x$5, x$6, x$7, x$2, x$8, x$9)
140 1475 5633 - 5633 Select com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply$default$5 com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply$default$5
140 3484 5633 - 5633 Select com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply$default$4 com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply$default$4
140 2204 5633 - 5633 Select com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply$default$2 com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply$default$2
145 1236 5903 - 5941 Select org.make.core.proposal.indexed.ProposalElasticsearchFieldName.segment org.scalatest.testsuite org.make.core.proposal.indexed.ProposalElasticsearchFieldName.segment
145 5371 5894 - 5942 Apply org.make.core.proposal.SortAlgorithm.docField org.scalatest.testsuite SegmentFirstAlgorithm.this.docField(org.make.core.proposal.indexed.ProposalElasticsearchFieldName.segment)
160 3418 6070 - 6490 Apply scala.Option.getOrElse org.scalatest.testsuite request.query.map[com.sksamuel.elastic4s.requests.searches.SearchRequest](((query: com.sksamuel.elastic4s.requests.searches.queries.Query) => request.query(com.sksamuel.elastic4s.ElasticDsl.functionScoreQuery().query(query).functions(com.sksamuel.elastic4s.ElasticDsl.scriptScore(com.sksamuel.elastic4s.requests.script.Script.apply(pointsIfMatchesSegmentScript, com.sksamuel.elastic4s.requests.script.Script.apply$default$2, com.sksamuel.elastic4s.requests.script.Script.apply$default$3, com.sksamuel.elastic4s.requests.script.Script.apply$default$4, com.sksamuel.elastic4s.requests.script.Script.apply$default$5, com.sksamuel.elastic4s.requests.script.Script.apply$default$6)), com.sksamuel.elastic4s.ElasticApi.gaussianScore(org.make.core.proposal.indexed.ProposalElasticsearchFieldName.createdAt.field, "now", "7d").decay(0.8)).scoreMode("sum").boostMode(com.sksamuel.elastic4s.requests.searches.queries.funcscorer.CombineFunction.Replace)))).getOrElse[com.sksamuel.elastic4s.requests.searches.SearchRequest](request)
166 5637 6631 - 6631 Select com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply$default$8 org.scalatest.testsuite com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply$default$8
166 1605 6631 - 6720 Apply com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply org.scalatest.testsuite com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply(x$1, x$3, x$4, x$5, x$6, x$7, x$2, x$8, x$9)
166 3806 6631 - 6631 Select com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply$default$2 org.scalatest.testsuite com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply$default$2
166 1772 6631 - 6631 Select com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply$default$3 org.scalatest.testsuite com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply$default$3
166 1075 6631 - 6631 Select com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply$default$6 org.scalatest.testsuite com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply$default$6
166 1479 6649 - 6695 Select org.make.core.proposal.indexed.ProposalElasticsearchFieldName.Simple.field org.scalatest.testsuite org.make.core.proposal.indexed.ProposalElasticsearchFieldName.createdAt.field
166 5050 6631 - 6631 Select com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply$default$4 org.scalatest.testsuite com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply$default$4
166 4702 6705 - 6719 Select com.sksamuel.elastic4s.requests.searches.sort.SortOrder.Desc org.scalatest.testsuite com.sksamuel.elastic4s.requests.searches.sort.SortOrder.Desc
166 3332 6631 - 6631 Select com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply$default$5 org.scalatest.testsuite com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply$default$5
166 3427 6631 - 6631 Select com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply$default$9 org.scalatest.testsuite com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply$default$9
171 4976 6725 - 6897 Apply com.sksamuel.elastic4s.requests.searches.SearchRequest.sortBy org.scalatest.testsuite request.collapse(com.sksamuel.elastic4s.requests.searches.collapse.CollapseRequest.apply(org.make.core.proposal.indexed.ProposalElasticsearchFieldName.authorUserId.field, com.sksamuel.elastic4s.requests.searches.collapse.CollapseRequest.apply$default$2, com.sksamuel.elastic4s.requests.searches.collapse.CollapseRequest.apply$default$3).inner(com.sksamuel.elastic4s.requests.searches.queries.InnerHit.apply("last", com.sksamuel.elastic4s.requests.searches.queries.InnerHit.apply$default$2, com.sksamuel.elastic4s.requests.searches.queries.InnerHit.apply$default$3, com.sksamuel.elastic4s.requests.searches.queries.InnerHit.apply$default$4, com.sksamuel.elastic4s.requests.searches.queries.InnerHit.apply$default$5, com.sksamuel.elastic4s.requests.searches.queries.InnerHit.apply$default$6, com.sksamuel.elastic4s.requests.searches.queries.InnerHit.apply$default$7, com.sksamuel.elastic4s.requests.searches.queries.InnerHit.apply$default$8, com.sksamuel.elastic4s.requests.searches.queries.InnerHit.apply$default$9, com.sksamuel.elastic4s.requests.searches.queries.InnerHit.apply$default$10, com.sksamuel.elastic4s.requests.searches.queries.InnerHit.apply$default$11).sortBy(sort).size(1))).sortBy(sort)
194 2027 7920 - 7939 Apply scala.Function1.apply x$4.build.apply(randomSeed)
194 3868 7902 - 7914 Apply enumeratum.values.ValueEnum.withValueOpt AlgorithmSelector.this.withValueOpt(i)
194 5057 7880 - 7940 Apply scala.Option.map org.make.api.proposal.proposalapitest sortAlgorithm.flatMap[org.make.core.proposal.AlgorithmSelector](((i: String) => AlgorithmSelector.this.withValueOpt(i))).map[org.make.core.proposal.SortAlgorithm](((x$4: org.make.core.proposal.AlgorithmSelector) => x$4.build.apply(randomSeed)))