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.user
21 
22 import com.sksamuel.elastic4s.ElasticApi
23 import com.sksamuel.elastic4s.requests.script.Script
24 import com.sksamuel.elastic4s.requests.searches.SearchRequest
25 import com.sksamuel.elastic4s.requests.searches.queries.Query
26 import com.sksamuel.elastic4s.requests.searches.sort.{ScriptSort, ScriptSortType, SortOrder}
27 import org.make.core.question.QuestionId
28 import org.make.core.user.indexed.OrganisationElasticsearchFieldNames
29 import enumeratum.values.StringEnum
30 import enumeratum.values.StringEnumEntry
31 
32 sealed trait OrganisationSortAlgorithm {
33   def sortDefinition(request: SearchRequest): SearchRequest
34 }
35 
36 /*
37  * This algorithm sorts organisations by their participation.
38  * - +1 point per proposal
39  * - +1 point per vote
40  */
41 final case class ParticipationAlgorithm(questionId: QuestionId) extends OrganisationSortAlgorithm {
42 
43   override def sortDefinition(request: SearchRequest): SearchRequest = {
44     val query: Query = request.query.getOrElse(ElasticApi.boolQuery())
45     request
46       .query(
47         ElasticApi
48           .must(
49             query,
50             ElasticApi
51               .nestedQuery(
52                 path = OrganisationElasticsearchFieldNames.countsByQuestion,
53                 query = ElasticApi.must(
54                   ElasticApi
55                     .termQuery(OrganisationElasticsearchFieldNames.countsByQuestionQuestionId, questionId.value),
56                   ElasticApi.scriptQuery(
57                     Script(
58                       "doc['countsByQuestion.proposalsCount'].value + doc['countsByQuestion.votesCount'].value > 0"
59                     )
60                   )
61                 )
62               )
63           )
64       )
65       .sortBy(
66         ScriptSort(
67           script = Script("doc['proposalsCount'].value + doc['votesCount'].value"),
68           scriptSortType = ScriptSortType.NUMBER,
69           order = Some(SortOrder.DESC),
70           nestedFilter = Some(
71             ElasticApi
72               .nestedQuery(
73                 path = OrganisationElasticsearchFieldNames.countsByQuestion,
74                 query =
75                   ElasticApi.termQuery(OrganisationElasticsearchFieldNames.countsByQuestionQuestionId, questionId.value)
76               )
77           )
78         )
79       )
80 
81   }
82 }
83 
84 object ParticipationAlgorithm {
85   val shortName: String = "participation"
86 }
87 
88 sealed abstract class OrganisationAlgorithmSelector(val value: String)
89     extends StringEnumEntry
90     with Product
91     with Serializable {
92   def select(questionId: Option[QuestionId]): Option[OrganisationSortAlgorithm]
93 }
94 
95 object OrganisationAlgorithmSelector extends StringEnum[OrganisationAlgorithmSelector] {
96 
97   case object participation extends OrganisationAlgorithmSelector("participation") {
98     override def select(questionId: Option[QuestionId]): Option[OrganisationSortAlgorithm] =
99       questionId.map(ParticipationAlgorithm(_))
100   }
101 
102   override val values: IndexedSeq[OrganisationAlgorithmSelector] = findValues
103   final val swaggerAllowableValues = "participation"
104   final val sortAlgorithmsName: Seq[String] = Seq(ParticipationAlgorithm.shortName)
105 }
Line Stmt Id Pos Tree Symbol Tests Code
44 5077 1693 - 1740 Apply scala.Option.getOrElse org.scalatest.testsuite request.query.getOrElse[com.sksamuel.elastic4s.requests.searches.queries.Query](com.sksamuel.elastic4s.ElasticApi.boolQuery())
44 1805 1717 - 1739 Apply com.sksamuel.elastic4s.api.QueryApi.boolQuery com.sksamuel.elastic4s.ElasticApi.boolQuery()
48 4677 1775 - 2407 Apply com.sksamuel.elastic4s.api.QueryApi.must org.scalatest.testsuite com.sksamuel.elastic4s.ElasticApi.must(query, com.sksamuel.elastic4s.ElasticApi.nestedQuery(org.make.core.user.indexed.OrganisationElasticsearchFieldNames.countsByQuestion, com.sksamuel.elastic4s.ElasticApi.must(com.sksamuel.elastic4s.ElasticApi.termQuery(org.make.core.user.indexed.OrganisationElasticsearchFieldNames.countsByQuestionQuestionId, ParticipationAlgorithm.this.questionId.value), com.sksamuel.elastic4s.ElasticApi.scriptQuery(com.sksamuel.elastic4s.requests.script.Script.apply("doc[\'countsByQuestion.proposalsCount\'].value + doc[\'countsByQuestion.votesCount\'].value > 0", 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)))))
51 1493 1834 - 2395 Apply com.sksamuel.elastic4s.api.QueryApi.nestedQuery org.scalatest.testsuite com.sksamuel.elastic4s.ElasticApi.nestedQuery(org.make.core.user.indexed.OrganisationElasticsearchFieldNames.countsByQuestion, com.sksamuel.elastic4s.ElasticApi.must(com.sksamuel.elastic4s.ElasticApi.termQuery(org.make.core.user.indexed.OrganisationElasticsearchFieldNames.countsByQuestionQuestionId, ParticipationAlgorithm.this.questionId.value), com.sksamuel.elastic4s.ElasticApi.scriptQuery(com.sksamuel.elastic4s.requests.script.Script.apply("doc[\'countsByQuestion.proposalsCount\'].value + doc[\'countsByQuestion.votesCount\'].value > 0", 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))))
52 3361 1896 - 1948 Select org.make.core.user.indexed.OrganisationElasticsearchFieldNames.countsByQuestion org.scalatest.testsuite org.make.core.user.indexed.OrganisationElasticsearchFieldNames.countsByQuestion
53 3569 1974 - 2379 Apply com.sksamuel.elastic4s.api.QueryApi.must org.scalatest.testsuite com.sksamuel.elastic4s.ElasticApi.must(com.sksamuel.elastic4s.ElasticApi.termQuery(org.make.core.user.indexed.OrganisationElasticsearchFieldNames.countsByQuestionQuestionId, ParticipationAlgorithm.this.questionId.value), com.sksamuel.elastic4s.ElasticApi.scriptQuery(com.sksamuel.elastic4s.requests.script.Script.apply("doc[\'countsByQuestion.proposalsCount\'].value + doc[\'countsByQuestion.votesCount\'].value > 0", 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)))
55 3459 2009 - 2132 Apply com.sksamuel.elastic4s.api.QueryApi.termQuery org.scalatest.testsuite com.sksamuel.elastic4s.ElasticApi.termQuery(org.make.core.user.indexed.OrganisationElasticsearchFieldNames.countsByQuestionQuestionId, ParticipationAlgorithm.this.questionId.value)
55 4595 2115 - 2131 Select org.make.core.question.QuestionId.value org.scalatest.testsuite ParticipationAlgorithm.this.questionId.value
55 1099 2051 - 2113 Select org.make.core.user.indexed.OrganisationElasticsearchFieldNames.countsByQuestionQuestionId org.scalatest.testsuite org.make.core.user.indexed.OrganisationElasticsearchFieldNames.countsByQuestionQuestionId
56 4600 2152 - 2361 Apply com.sksamuel.elastic4s.api.QueryApi.scriptQuery org.scalatest.testsuite com.sksamuel.elastic4s.ElasticApi.scriptQuery(com.sksamuel.elastic4s.requests.script.Script.apply("doc[\'countsByQuestion.proposalsCount\'].value + doc[\'countsByQuestion.votesCount\'].value > 0", 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))
57 2969 2196 - 2196 Select com.sksamuel.elastic4s.requests.script.Script.apply$default$3 org.scalatest.testsuite com.sksamuel.elastic4s.requests.script.Script.apply$default$3
57 3292 2196 - 2196 Select com.sksamuel.elastic4s.requests.script.Script.apply$default$6 org.scalatest.testsuite com.sksamuel.elastic4s.requests.script.Script.apply$default$6
57 962 2196 - 2196 Select com.sksamuel.elastic4s.requests.script.Script.apply$default$4 org.scalatest.testsuite com.sksamuel.elastic4s.requests.script.Script.apply$default$4
57 5121 2196 - 2196 Select com.sksamuel.elastic4s.requests.script.Script.apply$default$5 org.scalatest.testsuite com.sksamuel.elastic4s.requests.script.Script.apply$default$5
57 4995 2196 - 2196 Select com.sksamuel.elastic4s.requests.script.Script.apply$default$2 org.scalatest.testsuite com.sksamuel.elastic4s.requests.script.Script.apply$default$2
57 1382 2196 - 2341 Apply com.sksamuel.elastic4s.requests.script.Script.apply org.scalatest.testsuite com.sksamuel.elastic4s.requests.script.Script.apply("doc[\'countsByQuestion.proposalsCount\'].value + doc[\'countsByQuestion.votesCount\'].value > 0", 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)
58 1634 2226 - 2319 Literal <nosymbol> org.scalatest.testsuite "doc[\'countsByQuestion.proposalsCount\'].value + doc[\'countsByQuestion.votesCount\'].value > 0"
65 5085 1745 - 2974 Apply com.sksamuel.elastic4s.requests.searches.SearchRequest.sortBy org.scalatest.testsuite request.query(com.sksamuel.elastic4s.ElasticApi.must(query, com.sksamuel.elastic4s.ElasticApi.nestedQuery(org.make.core.user.indexed.OrganisationElasticsearchFieldNames.countsByQuestion, com.sksamuel.elastic4s.ElasticApi.must(com.sksamuel.elastic4s.ElasticApi.termQuery(org.make.core.user.indexed.OrganisationElasticsearchFieldNames.countsByQuestionQuestionId, ParticipationAlgorithm.this.questionId.value), com.sksamuel.elastic4s.ElasticApi.scriptQuery(com.sksamuel.elastic4s.requests.script.Script.apply("doc[\'countsByQuestion.proposalsCount\'].value + doc[\'countsByQuestion.votesCount\'].value > 0", 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)))))).sortBy({ <artifact> val x$1: com.sksamuel.elastic4s.requests.script.Script = com.sksamuel.elastic4s.requests.script.Script.apply("doc[\'proposalsCount\'].value + doc[\'votesCount\'].value", 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); <artifact> val x$2: com.sksamuel.elastic4s.requests.searches.sort.ScriptSortType = com.sksamuel.elastic4s.requests.searches.sort.ScriptSortType.NUMBER; <artifact> val x$3: Some[com.sksamuel.elastic4s.requests.searches.sort.SortOrder] @scala.reflect.internal.annotations.uncheckedBounds = scala.Some.apply[com.sksamuel.elastic4s.requests.searches.sort.SortOrder](com.sksamuel.elastic4s.requests.searches.sort.SortOrder.DESC); <artifact> val x$4: Some[com.sksamuel.elastic4s.requests.searches.queries.NestedQuery] @scala.reflect.internal.annotations.uncheckedBounds = scala.Some.apply[com.sksamuel.elastic4s.requests.searches.queries.NestedQuery](com.sksamuel.elastic4s.ElasticApi.nestedQuery(org.make.core.user.indexed.OrganisationElasticsearchFieldNames.countsByQuestion, com.sksamuel.elastic4s.ElasticApi.termQuery(org.make.core.user.indexed.OrganisationElasticsearchFieldNames.countsByQuestionQuestionId, ParticipationAlgorithm.this.questionId.value))); <artifact> val x$5: Option[com.sksamuel.elastic4s.requests.searches.sort.SortMode] @scala.reflect.internal.annotations.uncheckedBounds = com.sksamuel.elastic4s.requests.searches.sort.ScriptSort.apply$default$3; <artifact> val x$6: Option[String] @scala.reflect.internal.annotations.uncheckedBounds = com.sksamuel.elastic4s.requests.searches.sort.ScriptSort.apply$default$4; <artifact> val x$7: Option[com.sksamuel.elastic4s.requests.searches.sort.NestedSort] @scala.reflect.internal.annotations.uncheckedBounds = com.sksamuel.elastic4s.requests.searches.sort.ScriptSort.apply$default$7; com.sksamuel.elastic4s.requests.searches.sort.ScriptSort.apply(x$1, x$2, x$5, x$6, x$3, x$4, x$7) })
66 926 2439 - 2966 Apply com.sksamuel.elastic4s.requests.searches.sort.ScriptSort.apply org.scalatest.testsuite com.sksamuel.elastic4s.requests.searches.sort.ScriptSort.apply(x$1, x$2, x$5, x$6, x$3, x$4, x$7)
66 1452 2439 - 2439 Select com.sksamuel.elastic4s.requests.searches.sort.ScriptSort.apply$default$3 org.scalatest.testsuite com.sksamuel.elastic4s.requests.searches.sort.ScriptSort.apply$default$3
66 4992 2439 - 2439 Select com.sksamuel.elastic4s.requests.searches.sort.ScriptSort.apply$default$4 org.scalatest.testsuite com.sksamuel.elastic4s.requests.searches.sort.ScriptSort.apply$default$4
66 3021 2439 - 2439 Select com.sksamuel.elastic4s.requests.searches.sort.ScriptSort.apply$default$7 org.scalatest.testsuite com.sksamuel.elastic4s.requests.searches.sort.ScriptSort.apply$default$7
67 3579 2470 - 2533 Apply com.sksamuel.elastic4s.requests.script.Script.apply org.scalatest.testsuite com.sksamuel.elastic4s.requests.script.Script.apply("doc[\'proposalsCount\'].value + doc[\'votesCount\'].value", 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)
67 3136 2470 - 2470 Select com.sksamuel.elastic4s.requests.script.Script.apply$default$4 org.scalatest.testsuite com.sksamuel.elastic4s.requests.script.Script.apply$default$4
67 2908 2477 - 2532 Literal <nosymbol> org.scalatest.testsuite "doc[\'proposalsCount\'].value + doc[\'votesCount\'].value"
67 4547 2470 - 2470 Select com.sksamuel.elastic4s.requests.script.Script.apply$default$6 org.scalatest.testsuite com.sksamuel.elastic4s.requests.script.Script.apply$default$6
67 5064 2470 - 2470 Select com.sksamuel.elastic4s.requests.script.Script.apply$default$3 org.scalatest.testsuite com.sksamuel.elastic4s.requests.script.Script.apply$default$3
67 969 2470 - 2470 Select com.sksamuel.elastic4s.requests.script.Script.apply$default$2 org.scalatest.testsuite com.sksamuel.elastic4s.requests.script.Script.apply$default$2
67 1265 2470 - 2470 Select com.sksamuel.elastic4s.requests.script.Script.apply$default$5 org.scalatest.testsuite com.sksamuel.elastic4s.requests.script.Script.apply$default$5
68 1440 2562 - 2583 Select com.sksamuel.elastic4s.requests.searches.sort.ScriptSortType.NUMBER org.scalatest.testsuite com.sksamuel.elastic4s.requests.searches.sort.ScriptSortType.NUMBER
69 2915 2603 - 2623 Apply scala.Some.apply org.scalatest.testsuite scala.Some.apply[com.sksamuel.elastic4s.requests.searches.sort.SortOrder](com.sksamuel.elastic4s.requests.searches.sort.SortOrder.DESC)
69 4780 2608 - 2622 Select com.sksamuel.elastic4s.requests.searches.sort.SortOrder.DESC org.scalatest.testsuite com.sksamuel.elastic4s.requests.searches.sort.SortOrder.DESC
70 2430 2650 - 2956 Apply scala.Some.apply org.scalatest.testsuite scala.Some.apply[com.sksamuel.elastic4s.requests.searches.queries.NestedQuery](com.sksamuel.elastic4s.ElasticApi.nestedQuery(org.make.core.user.indexed.OrganisationElasticsearchFieldNames.countsByQuestion, com.sksamuel.elastic4s.ElasticApi.termQuery(org.make.core.user.indexed.OrganisationElasticsearchFieldNames.countsByQuestionQuestionId, ParticipationAlgorithm.this.questionId.value)))
72 4555 2668 - 2944 Apply com.sksamuel.elastic4s.api.QueryApi.nestedQuery org.scalatest.testsuite com.sksamuel.elastic4s.ElasticApi.nestedQuery(org.make.core.user.indexed.OrganisationElasticsearchFieldNames.countsByQuestion, com.sksamuel.elastic4s.ElasticApi.termQuery(org.make.core.user.indexed.OrganisationElasticsearchFieldNames.countsByQuestionQuestionId, ParticipationAlgorithm.this.questionId.value))
73 919 2730 - 2782 Select org.make.core.user.indexed.OrganisationElasticsearchFieldNames.countsByQuestion org.scalatest.testsuite org.make.core.user.indexed.OrganisationElasticsearchFieldNames.countsByQuestion
75 3145 2911 - 2927 Select org.make.core.question.QuestionId.value org.scalatest.testsuite ParticipationAlgorithm.this.questionId.value
75 1374 2826 - 2928 Apply com.sksamuel.elastic4s.api.QueryApi.termQuery org.scalatest.testsuite com.sksamuel.elastic4s.ElasticApi.termQuery(org.make.core.user.indexed.OrganisationElasticsearchFieldNames.countsByQuestionQuestionId, ParticipationAlgorithm.this.questionId.value)
75 5073 2847 - 2909 Select org.make.core.user.indexed.OrganisationElasticsearchFieldNames.countsByQuestionQuestionId org.scalatest.testsuite org.make.core.user.indexed.OrganisationElasticsearchFieldNames.countsByQuestionQuestionId
85 3098 3041 - 3056 Literal <nosymbol> org.make.api.question.questionapitest "participation"
99 4657 3557 - 3598 Apply scala.Option.map org.make.api.question.questionapitest questionId.map[org.make.core.user.ParticipationAlgorithm](((x$1: org.make.core.question.QuestionId) => ParticipationAlgorithm.apply(x$1)))
99 1379 3572 - 3597 Apply org.make.core.user.ParticipationAlgorithm.apply org.make.api.question.questionapitest ParticipationAlgorithm.apply(x$1)
103 2438 3719 - 3734 Literal <nosymbol> "participation"
104 1461 3785 - 3817 Select org.make.core.user.ParticipationAlgorithm.shortName org.make.api.question.questionapitest ParticipationAlgorithm.shortName
104 4935 3781 - 3818 Apply scala.collection.SeqFactory.Delegate.apply org.make.api.question.questionapitest scala.`package`.Seq.apply[String](ParticipationAlgorithm.shortName)