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
21 package user
22 
23 import com.sksamuel.elastic4s.{ElasticApi, ElasticDsl}
24 import com.sksamuel.elastic4s.requests.common.Operator
25 import com.sksamuel.elastic4s.requests.searches.queries.Query
26 import com.sksamuel.elastic4s.requests.searches.sort.{FieldSort, SortOrder}
27 import org.make.core.technical.Pagination
28 import org.make.core.reference.{Country, Language}
29 import org.make.core.user.indexed.OrganisationElasticsearchFieldNames
30 
31 /**
32   * The class holding the entire search query
33   *
34   * @param filters       organisation of search filters
35   * @param limit         number of items to fetch
36   * @param offset          number of items to skip
37   * @param sortAlgorithm algorithm used for sorting
38   */
39 final case class OrganisationSearchQuery(
40   filters: Option[OrganisationSearchFilters] = None,
41   limit: Option[Pagination.Limit] = None,
42   offset: Option[Pagination.Offset] = None,
43   sort: Option[String] = None,
44   order: Option[Order] = None,
45   sortAlgorithm: Option[OrganisationSortAlgorithm] = None
46 )
47 
48 /**
49   * The class holding the filters
50   *
51   * @param organisationIds   The organisationIds to filter
52   * @param organisationName  Name of the organisation to search
53   * @param slug              Slug to filter
54   * @param description       Description to search
55   * @param country           Country to filter
56   * @param language          Language to filter
57   */
58 final case class OrganisationSearchFilters(
59   organisationIds: Option[OrganisationIdsSearchFilter] = None,
60   organisationName: Option[OrganisationNameSearchFilter] = None,
61   slug: Option[SlugSearchFilter] = None,
62   description: Option[DescriptionSearchFilter] = None,
63   country: Option[CountrySearchFilter] = None,
64   language: Option[LanguageSearchFilter] = None
65 )
66 
67 object OrganisationSearchFilters extends ElasticDsl {
68 
69   def parse(
70     organisationIds: Option[OrganisationIdsSearchFilter] = None,
71     organisationName: Option[OrganisationNameSearchFilter] = None,
72     slug: Option[SlugSearchFilter] = None,
73     description: Option[DescriptionSearchFilter] = None,
74     country: Option[CountrySearchFilter] = None,
75     language: Option[LanguageSearchFilter] = None
76   ): Option[OrganisationSearchFilters] = {
77 
78     (organisationIds, organisationName, slug, description, country, language) match {
79       case (None, None, None, None, None, None) => None
80       case _ =>
81         Some(OrganisationSearchFilters(organisationIds, organisationName, slug, description, country, language))
82     }
83   }
84 
85   /**
86     * Build elasticsearch search filters from searchQuery
87     *
88     * @param organisationSearchQuery search query
89     *
90     * @return sequence of query definitions
91     */
92   def getOrganisationSearchFilters(organisationSearchQuery: OrganisationSearchQuery): Seq[Query] =
93     Seq(
94       buildOrganisationIdsSearchFilter(organisationSearchQuery),
95       buildOrganisationNameSearchFilter(organisationSearchQuery),
96       buildSlugSearchFilter(organisationSearchQuery),
97       buildDescriptionSearchFilter(organisationSearchQuery),
98       buildCountrySearchFilter(organisationSearchQuery),
99       buildLanguageSearchFilter(organisationSearchQuery)
100     ).flatten
101 
102   def getSkipSearch(organisationSearchQuery: OrganisationSearchQuery): Int =
103     organisationSearchQuery.offset.fold(0)(_.extractInt)
104 
105   def getLimitSearch(organisationSearchQuery: OrganisationSearchQuery): Int =
106     organisationSearchQuery.limit.fold(10)(_.extractInt)
107 
108   def getSort(organisationSearchQuery: OrganisationSearchQuery): Option[FieldSort] = {
109     val order = organisationSearchQuery.order.map(_.sortOrder)
110 
111     organisationSearchQuery.sort.map { sort =>
112       val sortFieldName: String = if (sort == OrganisationElasticsearchFieldNames.organisationName) {
113         OrganisationElasticsearchFieldNames.organisationNameKeyword
114       } else {
115         sort
116       }
117       FieldSort(field = sortFieldName, order = order.getOrElse(SortOrder.ASC))
118     }
119   }
120 
121   def buildOrganisationIdsSearchFilter(organisationSearchQuery: OrganisationSearchQuery): Option[Query] = {
122     organisationSearchQuery.filters.flatMap {
123       _.organisationIds match {
124         case Some(OrganisationIdsSearchFilter(Seq(organisationId))) =>
125           Some(ElasticApi.termQuery(OrganisationElasticsearchFieldNames.organisationId, organisationId.value))
126         case Some(OrganisationIdsSearchFilter(organisationIds)) =>
127           Some(ElasticApi.termsQuery(OrganisationElasticsearchFieldNames.organisationId, organisationIds.map(_.value)))
128         case _ => None
129       }
130     }
131   }
132 
133   def buildOrganisationNameSearchFilter(organisationSearchQuery: OrganisationSearchQuery): Option[Query] = {
134     val query: Option[Query] = for {
135       filters                            <- organisationSearchQuery.filters
136       OrganisationNameSearchFilter(text) <- filters.organisationName
137     } yield {
138       val language = filters.language.map(_.language).getOrElse(Language("fr"))
139       val fieldsBoosts: Map[String, Double] =
140         Map(
141           Some(OrganisationElasticsearchFieldNames.organisationName) -> 3d,
142           OrganisationElasticsearchFieldNames.organisationNameLanguageSubfield(language) -> 2d,
143           OrganisationElasticsearchFieldNames.organisationNameLanguageSubfield(language, stemmed = true) -> 1.5d
144         ).collect {
145           case (Some(key), value) => key -> value
146         }
147       functionScoreQuery(multiMatchQuery(text).fields(fieldsBoosts).fuzziness("Auto:4,7").operator(Operator.AND))
148     }
149 
150     query match {
151       case None => None
152       case _    => query
153     }
154   }
155 
156   def buildSlugSearchFilter(organisationSearchQuery: OrganisationSearchQuery): Option[Query] = {
157     organisationSearchQuery.filters.flatMap {
158       _.slug match {
159         case Some(SlugSearchFilter(slug)) =>
160           Some(ElasticApi.termQuery(OrganisationElasticsearchFieldNames.slug, slug))
161         case _ => None
162       }
163     }
164   }
165 
166   def buildDescriptionSearchFilter(organisationSearchQuery: OrganisationSearchQuery): Option[Query] = {
167     organisationSearchQuery.filters.flatMap {
168       _.description match {
169         case Some(DescriptionSearchFilter(description)) =>
170           Some(ElasticApi.matchQuery(OrganisationElasticsearchFieldNames.description, description))
171         case _ => None
172       }
173     }
174   }
175 
176   def buildCountrySearchFilter(organisationSearchQuery: OrganisationSearchQuery): Option[Query] = {
177     organisationSearchQuery.filters.flatMap {
178       _.country match {
179         case Some(CountrySearchFilter(country)) =>
180           Some(ElasticApi.termsQuery(OrganisationElasticsearchFieldNames.country, country.value))
181         case _ => None
182       }
183     }
184   }
185 
186   def buildLanguageSearchFilter(organisationSearchQuery: OrganisationSearchQuery): Option[Query] = {
187     organisationSearchQuery.filters.flatMap {
188       _.language match {
189         case Some(LanguageSearchFilter(language)) =>
190           Some(ElasticApi.termsQuery(OrganisationElasticsearchFieldNames.language, language.value))
191         case _ => None
192       }
193     }
194   }
195 }
196 
197 final case class OrganisationIdsSearchFilter(organisationIds: Seq[UserId])
198 final case class OrganisationNameSearchFilter(text: String)
199 final case class SlugSearchFilter(slug: String)
200 final case class DescriptionSearchFilter(description: String)
201 final case class CountrySearchFilter(country: Country)
202 final case class LanguageSearchFilter(language: Language)
Line Stmt Id Pos Tree Symbol Tests Code
79 5113 3071 - 3075 Select scala.None org.make.api.organisation.organisationservicetest scala.None
81 2349 3100 - 3204 Apply scala.Some.apply org.scalatest.testsuite,org.make.api.organisation.organisationservicetest scala.Some.apply[org.make.core.user.OrganisationSearchFilters](OrganisationSearchFilters.apply(organisationIds, organisationName, slug, description, country, language))
81 3122 3105 - 3203 Apply org.make.core.user.OrganisationSearchFilters.apply org.scalatest.testsuite,org.make.api.organisation.organisationservicetest OrganisationSearchFilters.apply(organisationIds, organisationName, slug, description, country, language)
94 5367 3507 - 3564 Apply org.make.core.user.OrganisationSearchFilters.buildOrganisationIdsSearchFilter org.scalatest.testsuite OrganisationSearchFilters.this.buildOrganisationIdsSearchFilter(organisationSearchQuery)
95 3431 3572 - 3630 Apply org.make.core.user.OrganisationSearchFilters.buildOrganisationNameSearchFilter org.scalatest.testsuite OrganisationSearchFilters.this.buildOrganisationNameSearchFilter(organisationSearchQuery)
96 1487 3638 - 3684 Apply org.make.core.user.OrganisationSearchFilters.buildSlugSearchFilter org.scalatest.testsuite OrganisationSearchFilters.this.buildSlugSearchFilter(organisationSearchQuery)
97 621 3692 - 3745 Apply org.make.core.user.OrganisationSearchFilters.buildDescriptionSearchFilter org.scalatest.testsuite OrganisationSearchFilters.this.buildDescriptionSearchFilter(organisationSearchQuery)
98 4001 3753 - 3802 Apply org.make.core.user.OrganisationSearchFilters.buildCountrySearchFilter org.scalatest.testsuite OrganisationSearchFilters.this.buildCountrySearchFilter(organisationSearchQuery)
99 1962 3810 - 3860 Apply org.make.core.user.OrganisationSearchFilters.buildLanguageSearchFilter org.scalatest.testsuite OrganisationSearchFilters.this.buildLanguageSearchFilter(organisationSearchQuery)
100 5061 3867 - 3867 TypeApply scala.Predef.$conforms org.scalatest.testsuite scala.Predef.$conforms[Option[com.sksamuel.elastic4s.requests.searches.queries.Query]]
100 3344 3496 - 3874 ApplyToImplicitArgs scala.collection.IterableOps.flatten org.scalatest.testsuite scala.`package`.Seq.apply[Option[com.sksamuel.elastic4s.requests.searches.queries.Query]](OrganisationSearchFilters.this.buildOrganisationIdsSearchFilter(organisationSearchQuery), OrganisationSearchFilters.this.buildOrganisationNameSearchFilter(organisationSearchQuery), OrganisationSearchFilters.this.buildSlugSearchFilter(organisationSearchQuery), OrganisationSearchFilters.this.buildDescriptionSearchFilter(organisationSearchQuery), OrganisationSearchFilters.this.buildCountrySearchFilter(organisationSearchQuery), OrganisationSearchFilters.this.buildLanguageSearchFilter(organisationSearchQuery)).flatten[com.sksamuel.elastic4s.requests.searches.queries.Query](scala.Predef.$conforms[Option[com.sksamuel.elastic4s.requests.searches.queries.Query]])
103 5630 3996 - 4008 Select org.make.core.technical.Pagination.extractInt org.scalatest.testsuite x$1.extractInt
103 3599 3957 - 4009 Apply scala.Option.fold org.scalatest.testsuite organisationSearchQuery.offset.fold[Int](0)(((x$1: org.make.core.technical.Pagination.Offset) => x$1.extractInt))
103 2282 3993 - 3994 Literal <nosymbol> org.scalatest.testsuite 0
106 632 4132 - 4144 Select org.make.core.technical.Pagination.extractInt org.scalatest.testsuite x$2.extractInt
106 1435 4128 - 4130 Literal <nosymbol> org.scalatest.testsuite 10
106 4010 4093 - 4145 Apply scala.Option.fold org.scalatest.testsuite organisationSearchQuery.limit.fold[Int](10)(((x$2: org.make.core.technical.Pagination.Limit) => x$2.extractInt))
109 5219 4250 - 4296 Apply scala.Option.map org.scalatest.testsuite organisationSearchQuery.order.map[com.sksamuel.elastic4s.requests.searches.sort.SortOrder](((x$3: org.make.core.Order) => x$3.sortOrder))
109 1914 4284 - 4295 Select org.make.core.Order.sortOrder org.scalatest.testsuite x$3.sortOrder
111 3819 4302 - 4635 Apply scala.Option.map org.scalatest.testsuite organisationSearchQuery.sort.map[com.sksamuel.elastic4s.requests.searches.sort.FieldSort](((sort: String) => { val sortFieldName: String = if (sort.==(org.make.core.user.indexed.OrganisationElasticsearchFieldNames.organisationName)) org.make.core.user.indexed.OrganisationElasticsearchFieldNames.organisationNameKeyword else sort; { <artifact> val x$1: String = sortFieldName; <artifact> val x$2: com.sksamuel.elastic4s.requests.searches.sort.SortOrder = order.getOrElse[com.sksamuel.elastic4s.requests.searches.sort.SortOrder](com.sksamuel.elastic4s.requests.searches.sort.SortOrder.ASC); <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) } }))
112 3271 4391 - 4443 Select org.make.core.user.indexed.OrganisationElasticsearchFieldNames.organisationName org.scalatest.testsuite org.make.core.user.indexed.OrganisationElasticsearchFieldNames.organisationName
112 2293 4383 - 4443 Apply java.lang.Object.== org.scalatest.testsuite sort.==(org.make.core.user.indexed.OrganisationElasticsearchFieldNames.organisationName)
113 5523 4455 - 4514 Select org.make.core.user.indexed.OrganisationElasticsearchFieldNames.organisationNameKeyword org.scalatest.testsuite org.make.core.user.indexed.OrganisationElasticsearchFieldNames.organisationNameKeyword
113 3552 4455 - 4514 Block org.make.core.user.indexed.OrganisationElasticsearchFieldNames.organisationNameKeyword org.scalatest.testsuite org.make.core.user.indexed.OrganisationElasticsearchFieldNames.organisationNameKeyword
115 1478 4538 - 4542 Ident org.make.core.user.OrganisationSearchFilters.sort sort
117 3959 4598 - 4628 Apply scala.Option.getOrElse org.scalatest.testsuite order.getOrElse[com.sksamuel.elastic4s.requests.searches.sort.SortOrder](com.sksamuel.elastic4s.requests.searches.sort.SortOrder.ASC)
117 1922 4557 - 4557 Select com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply$default$2 org.scalatest.testsuite com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply$default$2
117 4760 4557 - 4629 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)
117 1428 4557 - 4557 Select com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply$default$9 org.scalatest.testsuite com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply$default$9
117 3560 4557 - 4557 Select com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply$default$8 org.scalatest.testsuite com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply$default$8
117 5453 4557 - 4557 Select com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply$default$6 org.scalatest.testsuite com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply$default$6
117 4920 4614 - 4627 Select com.sksamuel.elastic4s.requests.searches.sort.SortOrder.ASC com.sksamuel.elastic4s.requests.searches.sort.SortOrder.ASC
117 2306 4557 - 4557 Select com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply$default$5 org.scalatest.testsuite com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply$default$5
117 5168 4557 - 4557 Select com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply$default$3 org.scalatest.testsuite com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply$default$3
117 3119 4557 - 4557 Select com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply$default$4 org.scalatest.testsuite com.sksamuel.elastic4s.requests.searches.sort.FieldSort.apply$default$4
122 3082 4753 - 5232 Apply scala.Option.flatMap org.scalatest.testsuite organisationSearchQuery.filters.flatMap[com.sksamuel.elastic4s.requests.searches.queries.Query](((x$4: org.make.core.user.OrganisationSearchFilters) => x$4.organisationIds match { case (value: org.make.core.user.OrganisationIdsSearchFilter): Some[org.make.core.user.OrganisationIdsSearchFilter]((organisationIds: Seq[org.make.core.user.UserId]): org.make.core.user.OrganisationIdsSearchFilter(scala.`package`.Seq.unapplySeq[org.make.core.user.UserId](<unapply-selector>) <unapply> ((organisationId @ _)))) => scala.Some.apply[com.sksamuel.elastic4s.requests.searches.term.TermQuery](com.sksamuel.elastic4s.ElasticApi.termQuery(org.make.core.user.indexed.OrganisationElasticsearchFieldNames.organisationId, organisationId.value)) case (value: org.make.core.user.OrganisationIdsSearchFilter): Some[org.make.core.user.OrganisationIdsSearchFilter]((organisationIds: Seq[org.make.core.user.UserId]): org.make.core.user.OrganisationIdsSearchFilter((organisationIds @ _))) => scala.Some.apply[com.sksamuel.elastic4s.requests.searches.term.TermsQuery[String]](com.sksamuel.elastic4s.ElasticApi.termsQuery[String](org.make.core.user.indexed.OrganisationElasticsearchFieldNames.organisationId, organisationIds.map[String](((x$5: org.make.core.user.UserId) => x$5.value)))) case _ => scala.None }))
123 1862 4801 - 4818 Select org.make.core.user.OrganisationSearchFilters.organisationIds org.scalatest.testsuite x$4.organisationIds
125 5466 4908 - 5008 Apply scala.Some.apply scala.Some.apply[com.sksamuel.elastic4s.requests.searches.term.TermQuery](com.sksamuel.elastic4s.ElasticApi.termQuery(org.make.core.user.indexed.OrganisationElasticsearchFieldNames.organisationId, organisationId.value))
125 5056 4934 - 4984 Select org.make.core.user.indexed.OrganisationElasticsearchFieldNames.organisationId org.make.core.user.indexed.OrganisationElasticsearchFieldNames.organisationId
125 1146 4913 - 5007 Apply com.sksamuel.elastic4s.api.QueryApi.termQuery com.sksamuel.elastic4s.ElasticApi.termQuery(org.make.core.user.indexed.OrganisationElasticsearchFieldNames.organisationId, organisationId.value)
125 3128 4986 - 5006 Select org.make.core.user.UserId.value organisationId.value
127 3946 5091 - 5194 Apply com.sksamuel.elastic4s.api.QueryApi.termsQuery com.sksamuel.elastic4s.ElasticApi.termsQuery[String](org.make.core.user.indexed.OrganisationElasticsearchFieldNames.organisationId, organisationIds.map[String](((x$5: org.make.core.user.UserId) => x$5.value)))
127 4768 5165 - 5193 Apply scala.collection.IterableOps.map organisationIds.map[String](((x$5: org.make.core.user.UserId) => x$5.value))
127 1431 5185 - 5192 Select org.make.core.user.UserId.value x$5.value
127 1873 5086 - 5195 Apply scala.Some.apply scala.Some.apply[com.sksamuel.elastic4s.requests.searches.term.TermsQuery[String]](com.sksamuel.elastic4s.ElasticApi.termsQuery[String](org.make.core.user.indexed.OrganisationElasticsearchFieldNames.organisationId, organisationIds.map[String](((x$5: org.make.core.user.UserId) => x$5.value))))
127 3509 5113 - 5163 Select org.make.core.user.indexed.OrganisationElasticsearchFieldNames.organisationId org.make.core.user.indexed.OrganisationElasticsearchFieldNames.organisationId
128 5311 5214 - 5218 Select scala.None org.scalatest.testsuite scala.None
135 2964 5378 - 6166 Apply scala.Option.flatMap org.scalatest.testsuite organisationSearchQuery.filters.flatMap[com.sksamuel.elastic4s.requests.searches.queries.Query](((filters: org.make.core.user.OrganisationSearchFilters) => filters.organisationName.withFilter(((check$ifrefutable$1: org.make.core.user.OrganisationNameSearchFilter) => (check$ifrefutable$1: org.make.core.user.OrganisationNameSearchFilter @unchecked) match { case (text: String): org.make.core.user.OrganisationNameSearchFilter((text @ _)) => true case _ => false })).map[com.sksamuel.elastic4s.requests.searches.queries.Query](((x$7: org.make.core.user.OrganisationNameSearchFilter) => (x$7: org.make.core.user.OrganisationNameSearchFilter @unchecked) match { case (text: String): org.make.core.user.OrganisationNameSearchFilter((text @ _)) => { val language: org.make.core.reference.Language = filters.language.map[org.make.core.reference.Language](((x$6: org.make.core.user.LanguageSearchFilter) => x$6.language)).getOrElse[org.make.core.reference.Language](org.make.core.reference.Language.apply("fr")); val fieldsBoosts: Map[String,Double] = scala.Predef.Map.apply[Option[String], Double](scala.Predef.ArrowAssoc[Some[String]](scala.Some.apply[String](org.make.core.user.indexed.OrganisationElasticsearchFieldNames.organisationName)).->[Double](3.0), scala.Predef.ArrowAssoc[Option[String]](org.make.core.user.indexed.OrganisationElasticsearchFieldNames.organisationNameLanguageSubfield(language, org.make.core.user.indexed.OrganisationElasticsearchFieldNames.organisationNameLanguageSubfield$default$2)).->[Double](2.0), scala.Predef.ArrowAssoc[Option[String]](org.make.core.user.indexed.OrganisationElasticsearchFieldNames.organisationNameLanguageSubfield(language, true)).->[Double](1.5)).collect[String, Double](({ @SerialVersionUID(value = 0) final <synthetic> class $anonfun extends scala.runtime.AbstractPartialFunction[(Option[String], Double),(String, Double)] with java.io.Serializable { def <init>(): <$anon: ((Option[String], Double)) => (String, Double)> = { $anonfun.super.<init>(); () }; final override def applyOrElse[A1 <: (Option[String], Double), B1 >: (String, Double)](x1: A1, default: A1 => B1): B1 = ((x1.asInstanceOf[(Option[String], Double)]: (Option[String], Double)): (Option[String], Double) @unchecked) match { case (_1: Option[String], _2: Double): (Option[String], Double)((value: String): Some[String]((key @ _)), (value @ _)) => scala.Predef.ArrowAssoc[String](key).->[Double](value) case (defaultCase$ @ _) => default.apply(x1) }; final def isDefinedAt(x1: (Option[String], Double)): Boolean = ((x1.asInstanceOf[(Option[String], Double)]: (Option[String], Double)): (Option[String], Double) @unchecked) match { case (_1: Option[String], _2: Double): (Option[String], Double)((value: String): Some[String]((key @ _)), (value @ _)) => true case (defaultCase$ @ _) => false } }; new $anonfun() }: PartialFunction[(Option[String], Double),(String, Double)])); OrganisationSearchFilters.this.functionScoreQuery(OrganisationSearchFilters.this.multiMatchQuery(text).fields(fieldsBoosts).fuzziness("Auto:4,7").operator(com.sksamuel.elastic4s.requests.common.Operator.AND)) } }))))
136 4930 5466 - 6166 Apply scala.Option.WithFilter.map org.scalatest.testsuite filters.organisationName.withFilter(((check$ifrefutable$1: org.make.core.user.OrganisationNameSearchFilter) => (check$ifrefutable$1: org.make.core.user.OrganisationNameSearchFilter @unchecked) match { case (text: String): org.make.core.user.OrganisationNameSearchFilter((text @ _)) => true case _ => false })).map[com.sksamuel.elastic4s.requests.searches.queries.Query](((x$7: org.make.core.user.OrganisationNameSearchFilter) => (x$7: org.make.core.user.OrganisationNameSearchFilter @unchecked) match { case (text: String): org.make.core.user.OrganisationNameSearchFilter((text @ _)) => { val language: org.make.core.reference.Language = filters.language.map[org.make.core.reference.Language](((x$6: org.make.core.user.LanguageSearchFilter) => x$6.language)).getOrElse[org.make.core.reference.Language](org.make.core.reference.Language.apply("fr")); val fieldsBoosts: Map[String,Double] = scala.Predef.Map.apply[Option[String], Double](scala.Predef.ArrowAssoc[Some[String]](scala.Some.apply[String](org.make.core.user.indexed.OrganisationElasticsearchFieldNames.organisationName)).->[Double](3.0), scala.Predef.ArrowAssoc[Option[String]](org.make.core.user.indexed.OrganisationElasticsearchFieldNames.organisationNameLanguageSubfield(language, org.make.core.user.indexed.OrganisationElasticsearchFieldNames.organisationNameLanguageSubfield$default$2)).->[Double](2.0), scala.Predef.ArrowAssoc[Option[String]](org.make.core.user.indexed.OrganisationElasticsearchFieldNames.organisationNameLanguageSubfield(language, true)).->[Double](1.5)).collect[String, Double](({ @SerialVersionUID(value = 0) final <synthetic> class $anonfun extends scala.runtime.AbstractPartialFunction[(Option[String], Double),(String, Double)] with java.io.Serializable { def <init>(): <$anon: ((Option[String], Double)) => (String, Double)> = { $anonfun.super.<init>(); () }; final override def applyOrElse[A1 <: (Option[String], Double), B1 >: (String, Double)](x1: A1, default: A1 => B1): B1 = ((x1.asInstanceOf[(Option[String], Double)]: (Option[String], Double)): (Option[String], Double) @unchecked) match { case (_1: Option[String], _2: Double): (Option[String], Double)((value: String): Some[String]((key @ _)), (value @ _)) => scala.Predef.ArrowAssoc[String](key).->[Double](value) case (defaultCase$ @ _) => default.apply(x1) }; final def isDefinedAt(x1: (Option[String], Double)): Boolean = ((x1.asInstanceOf[(Option[String], Double)]: (Option[String], Double)): (Option[String], Double) @unchecked) match { case (_1: Option[String], _2: Double): (Option[String], Double)((value: String): Some[String]((key @ _)), (value @ _)) => true case (defaultCase$ @ _) => false } }; new $anonfun() }: PartialFunction[(Option[String], Double),(String, Double)])); OrganisationSearchFilters.this.functionScoreQuery(OrganisationSearchFilters.this.multiMatchQuery(text).fields(fieldsBoosts).fuzziness("Auto:4,7").operator(com.sksamuel.elastic4s.requests.common.Operator.AND)) } }))
138 1368 5585 - 5595 Select org.make.core.user.LanguageSearchFilter.language x$6.language
138 5581 5607 - 5621 Apply org.make.core.reference.Language.apply org.scalatest.testsuite org.make.core.reference.Language.apply("fr")
138 3687 5564 - 5622 Apply scala.Option.getOrElse org.scalatest.testsuite filters.language.map[org.make.core.reference.Language](((x$6: org.make.core.user.LanguageSearchFilter) => x$6.language)).getOrElse[org.make.core.reference.Language](org.make.core.reference.Language.apply("fr"))
141 1441 5692 - 5756 Apply scala.Predef.ArrowAssoc.-> org.scalatest.testsuite scala.Predef.ArrowAssoc[Some[String]](scala.Some.apply[String](org.make.core.user.indexed.OrganisationElasticsearchFieldNames.organisationName)).->[Double](3.0)
142 4717 5768 - 5852 Apply scala.Predef.ArrowAssoc.-> org.scalatest.testsuite scala.Predef.ArrowAssoc[Option[String]](org.make.core.user.indexed.OrganisationElasticsearchFieldNames.organisationNameLanguageSubfield(language, org.make.core.user.indexed.OrganisationElasticsearchFieldNames.organisationNameLanguageSubfield$default$2)).->[Double](2.0)
143 3957 5864 - 5966 Apply scala.Predef.ArrowAssoc.-> org.scalatest.testsuite scala.Predef.ArrowAssoc[Option[String]](org.make.core.user.indexed.OrganisationElasticsearchFieldNames.organisationNameLanguageSubfield(language, true)).->[Double](1.5)
144 3089 5677 - 6046 Apply scala.collection.MapOps.collect org.scalatest.testsuite scala.Predef.Map.apply[Option[String], Double](scala.Predef.ArrowAssoc[Some[String]](scala.Some.apply[String](org.make.core.user.indexed.OrganisationElasticsearchFieldNames.organisationName)).->[Double](3.0), scala.Predef.ArrowAssoc[Option[String]](org.make.core.user.indexed.OrganisationElasticsearchFieldNames.organisationNameLanguageSubfield(language, org.make.core.user.indexed.OrganisationElasticsearchFieldNames.organisationNameLanguageSubfield$default$2)).->[Double](2.0), scala.Predef.ArrowAssoc[Option[String]](org.make.core.user.indexed.OrganisationElasticsearchFieldNames.organisationNameLanguageSubfield(language, true)).->[Double](1.5)).collect[String, Double](({ @SerialVersionUID(value = 0) final <synthetic> class $anonfun extends scala.runtime.AbstractPartialFunction[(Option[String], Double),(String, Double)] with java.io.Serializable { def <init>(): <$anon: ((Option[String], Double)) => (String, Double)> = { $anonfun.super.<init>(); () }; final override def applyOrElse[A1 <: (Option[String], Double), B1 >: (String, Double)](x1: A1, default: A1 => B1): B1 = ((x1.asInstanceOf[(Option[String], Double)]: (Option[String], Double)): (Option[String], Double) @unchecked) match { case (_1: Option[String], _2: Double): (Option[String], Double)((value: String): Some[String]((key @ _)), (value @ _)) => scala.Predef.ArrowAssoc[String](key).->[Double](value) case (defaultCase$ @ _) => default.apply(x1) }; final def isDefinedAt(x1: (Option[String], Double)): Boolean = ((x1.asInstanceOf[(Option[String], Double)]: (Option[String], Double)): (Option[String], Double) @unchecked) match { case (_1: Option[String], _2: Double): (Option[String], Double)((value: String): Some[String]((key @ _)), (value @ _)) => true case (defaultCase$ @ _) => false } }; new $anonfun() }: PartialFunction[(Option[String], Double),(String, Double)]))
144 5321 5985 - 5985 Apply org.make.core.user.OrganisationSearchFilters.$anonfun.<init> org.scalatest.testsuite new $anonfun()
145 1972 6024 - 6036 Apply scala.Predef.ArrowAssoc.-> org.scalatest.testsuite scala.Predef.ArrowAssoc[String](key).->[Double](value)
147 5592 6146 - 6158 Select com.sksamuel.elastic4s.requests.common.Operator.AND org.scalatest.testsuite com.sksamuel.elastic4s.requests.common.Operator.AND
147 1317 6125 - 6135 Literal <nosymbol> org.scalatest.testsuite "Auto:4,7"
147 1714 6053 - 6160 Apply com.sksamuel.elastic4s.api.QueryApi.functionScoreQuery org.scalatest.testsuite OrganisationSearchFilters.this.functionScoreQuery(OrganisationSearchFilters.this.multiMatchQuery(text).fields(fieldsBoosts).fuzziness("Auto:4,7").operator(com.sksamuel.elastic4s.requests.common.Operator.AND))
147 3496 6072 - 6159 Apply com.sksamuel.elastic4s.requests.searches.queries.matches.MultiMatchQuery.operator org.scalatest.testsuite OrganisationSearchFilters.this.multiMatchQuery(text).fields(fieldsBoosts).fuzziness("Auto:4,7").operator(com.sksamuel.elastic4s.requests.common.Operator.AND)
151 1981 6205 - 6209 Select scala.None org.scalatest.testsuite scala.None
157 1548 6347 - 6576 Apply scala.Option.flatMap org.scalatest.testsuite organisationSearchQuery.filters.flatMap[com.sksamuel.elastic4s.requests.searches.queries.Query](((x$8: org.make.core.user.OrganisationSearchFilters) => x$8.slug match { case (value: org.make.core.user.SlugSearchFilter): Some[org.make.core.user.SlugSearchFilter]((slug: String): org.make.core.user.SlugSearchFilter((slug @ _))) => scala.Some.apply[com.sksamuel.elastic4s.requests.searches.term.TermQuery](com.sksamuel.elastic4s.ElasticApi.termQuery(org.make.core.user.indexed.OrganisationElasticsearchFieldNames.slug, slug)) case _ => scala.None }))
158 5174 6395 - 6401 Select org.make.core.user.OrganisationSearchFilters.slug org.scalatest.testsuite x$8.slug
160 5535 6465 - 6539 Apply scala.Some.apply org.scalatest.testsuite scala.Some.apply[com.sksamuel.elastic4s.requests.searches.term.TermQuery](com.sksamuel.elastic4s.ElasticApi.termQuery(org.make.core.user.indexed.OrganisationElasticsearchFieldNames.slug, slug))
160 3366 6491 - 6531 Select org.make.core.user.indexed.OrganisationElasticsearchFieldNames.slug org.scalatest.testsuite org.make.core.user.indexed.OrganisationElasticsearchFieldNames.slug
160 1323 6470 - 6538 Apply com.sksamuel.elastic4s.api.QueryApi.termQuery org.scalatest.testsuite com.sksamuel.elastic4s.ElasticApi.termQuery(org.make.core.user.indexed.OrganisationElasticsearchFieldNames.slug, slug)
161 3505 6558 - 6562 Select scala.None org.scalatest.testsuite scala.None
167 1259 6690 - 6955 Apply scala.Option.flatMap org.scalatest.testsuite organisationSearchQuery.filters.flatMap[com.sksamuel.elastic4s.requests.searches.queries.Query](((x$9: org.make.core.user.OrganisationSearchFilters) => x$9.description match { case (value: org.make.core.user.DescriptionSearchFilter): Some[org.make.core.user.DescriptionSearchFilter]((description: String): org.make.core.user.DescriptionSearchFilter((description @ _))) => scala.Some.apply[com.sksamuel.elastic4s.requests.searches.queries.matches.MatchQuery](com.sksamuel.elastic4s.ElasticApi.matchQuery(org.make.core.user.indexed.OrganisationElasticsearchFieldNames.description, description)) case _ => scala.None }))
168 4859 6738 - 6751 Select org.make.core.user.OrganisationSearchFilters.description org.scalatest.testsuite x$9.description
170 2972 6856 - 6903 Select org.make.core.user.indexed.OrganisationElasticsearchFieldNames.description org.make.core.user.indexed.OrganisationElasticsearchFieldNames.description
170 5123 6829 - 6918 Apply scala.Some.apply scala.Some.apply[com.sksamuel.elastic4s.requests.searches.queries.matches.MatchQuery](com.sksamuel.elastic4s.ElasticApi.matchQuery(org.make.core.user.indexed.OrganisationElasticsearchFieldNames.description, description))
170 1869 6834 - 6917 Apply com.sksamuel.elastic4s.api.QueryApi.matchQuery com.sksamuel.elastic4s.ElasticApi.matchQuery(org.make.core.user.indexed.OrganisationElasticsearchFieldNames.description, description)
171 3079 6937 - 6941 Select scala.None org.scalatest.testsuite scala.None
177 5130 7065 - 7316 Apply scala.Option.flatMap org.scalatest.testsuite organisationSearchQuery.filters.flatMap[com.sksamuel.elastic4s.requests.searches.queries.Query](((x$10: org.make.core.user.OrganisationSearchFilters) => x$10.country match { case (value: org.make.core.user.CountrySearchFilter): Some[org.make.core.user.CountrySearchFilter]((country: org.make.core.reference.Country): org.make.core.user.CountrySearchFilter((country @ _))) => scala.Some.apply[com.sksamuel.elastic4s.requests.searches.term.TermsQuery[String]](com.sksamuel.elastic4s.ElasticApi.termsQuery[String](org.make.core.user.indexed.OrganisationElasticsearchFieldNames.country, country.value)) case _ => scala.None }))
178 5544 7113 - 7122 Select org.make.core.user.OrganisationSearchFilters.country org.scalatest.testsuite x$10.country
180 4713 7197 - 7278 Apply com.sksamuel.elastic4s.api.QueryApi.termsQuery com.sksamuel.elastic4s.ElasticApi.termsQuery[String](org.make.core.user.indexed.OrganisationElasticsearchFieldNames.country, country.value)
180 3516 7219 - 7262 Select org.make.core.user.indexed.OrganisationElasticsearchFieldNames.country org.make.core.user.indexed.OrganisationElasticsearchFieldNames.country
180 1494 7264 - 7277 Select org.make.core.reference.Country.value country.value
180 2911 7192 - 7279 Apply scala.Some.apply scala.Some.apply[com.sksamuel.elastic4s.requests.searches.term.TermsQuery[String]](com.sksamuel.elastic4s.ElasticApi.termsQuery[String](org.make.core.user.indexed.OrganisationElasticsearchFieldNames.country, country.value))
181 1793 7298 - 7302 Select scala.None org.scalatest.testsuite scala.None
187 2741 7427 - 7683 Apply scala.Option.flatMap org.scalatest.testsuite organisationSearchQuery.filters.flatMap[com.sksamuel.elastic4s.requests.searches.queries.Query](((x$11: org.make.core.user.OrganisationSearchFilters) => x$11.language match { case (value: org.make.core.user.LanguageSearchFilter): Some[org.make.core.user.LanguageSearchFilter]((language: org.make.core.reference.Language): org.make.core.user.LanguageSearchFilter((language @ _))) => scala.Some.apply[com.sksamuel.elastic4s.requests.searches.term.TermsQuery[String]](com.sksamuel.elastic4s.ElasticApi.termsQuery[String](org.make.core.user.indexed.OrganisationElasticsearchFieldNames.language, language.value)) case _ => scala.None }))
188 3354 7475 - 7485 Select org.make.core.user.OrganisationSearchFilters.language org.scalatest.testsuite x$11.language
190 1088 7584 - 7628 Select org.make.core.user.indexed.OrganisationElasticsearchFieldNames.language org.make.core.user.indexed.OrganisationElasticsearchFieldNames.language
190 1710 7557 - 7646 Apply scala.Some.apply scala.Some.apply[com.sksamuel.elastic4s.requests.searches.term.TermsQuery[String]](com.sksamuel.elastic4s.ElasticApi.termsQuery[String](org.make.core.user.indexed.OrganisationElasticsearchFieldNames.language, language.value))
190 4491 7630 - 7644 Select org.make.core.reference.Language.value language.value
190 3447 7562 - 7645 Apply com.sksamuel.elastic4s.api.QueryApi.termsQuery com.sksamuel.elastic4s.ElasticApi.termsQuery[String](org.make.core.user.indexed.OrganisationElasticsearchFieldNames.language, language.value)
191 4990 7665 - 7669 Select scala.None org.scalatest.testsuite scala.None