@@ -37,7 +37,9 @@ package object bridge {
3737 implicit def requestToSearchRequest (request : SQLSearchRequest ): SearchRequest = {
3838 import request ._
3939 val notNestedBuckets = buckets.filterNot(_.nested)
40+
4041 val nestedBuckets = buckets.filter(_.nested).groupBy(_.nestedBucket.getOrElse(" " ))
42+
4143 val filteredAgg : Option [FilterAggregation ] =
4244 request.having.flatMap(_.criteria) match {
4345 case Some (f) =>
@@ -52,14 +54,61 @@ package object bridge {
5254 case _ =>
5355 None
5456 }
57+
5558 val aggregations =
5659 aggregates.map(
5760 ElasticAggregation (_, request.having.flatMap(_.criteria), request.sorts)
5861 .copy(filteredAgg = filteredAgg)
5962 )
60- val notNestedAggregations = aggregations.filterNot(_.nested)
61- val nestedAggregations =
62- aggregations.filter(_.nested).groupBy(_.nestedAgg.map(_.name).getOrElse(" " ))
63+
64+ val rootAggregations = aggregations.filterNot(_.nested) match {
65+ case Nil => Nil
66+ case aggs =>
67+ val aggregationDirections : Map [String , SortOrder ] = aggs
68+ .filter(_.direction.isDefined)
69+ .map(agg => agg.agg.name -> agg.direction.get)
70+ .toMap
71+ val aggregations = aggs.map(_.agg)
72+ val buckets = ElasticAggregation .buildBuckets(
73+ notNestedBuckets,
74+ request.sorts -- aggregationDirections.keys,
75+ aggregations,
76+ aggregationDirections,
77+ request.having.flatMap(_.criteria)
78+ ) match {
79+ case Some (b) => Seq (b)
80+ case _ => aggregations
81+ }
82+ val filtered : Option [Aggregation ] =
83+ filteredAgg.map(filtered => filtered.subAggregations(buckets))
84+ filtered.map(Seq (_)).getOrElse(buckets)
85+ }
86+
87+ val scopedAggregations =
88+ aggregations.filter(_.nested).groupBy(_.nestedAgg.map(_.name).getOrElse(" " )).map {
89+ case (nested, aggs) =>
90+ val first = aggs.head
91+ val aggregations = aggs.map(_.agg)
92+ val aggregationDirections : Map [String , SortOrder ] =
93+ aggs
94+ .filter(_.direction.isDefined)
95+ .map(agg => agg.agg.name -> agg.direction.getOrElse(Asc ))
96+ .toMap
97+ val buckets =
98+ ElasticAggregation .buildBuckets(
99+ nestedBuckets.getOrElse(nested, Seq .empty),
100+ request.sorts -- aggregationDirections.keys,
101+ aggregations,
102+ aggregationDirections,
103+ request.having.flatMap(_.criteria)
104+ ) match {
105+ case Some (b) => Seq (b)
106+ case _ => aggregations
107+ }
108+ val filtered : Option [Aggregation ] =
109+ filteredAgg.map(filtered => filtered.subAggregations(buckets))
110+ first.nestedAgg.get.subAggregations(filtered.map(Seq (_)).getOrElse(buckets))
111+ }
63112
64113 val nestedWithoutCriteriaQuery : Option [Query ] =
65114 NestedElements .buildNestedTrees(request.nestedElementsWithoutCriteria) match {
@@ -131,62 +180,14 @@ package object bridge {
131180 }
132181 } sourceFiltering (fields, excludes)
133182
134- _search = if (nestedAggregations .nonEmpty) {
183+ _search = if (scopedAggregations.nonEmpty || rootAggregations .nonEmpty) {
135184 _search aggregations {
136- nestedAggregations.map { case (nested, aggs) =>
137- val first = aggs.head
138- val aggregations = aggs.map(_.agg)
139- val aggregationDirections : Map [String , SortOrder ] =
140- aggs
141- .filter(_.direction.isDefined)
142- .map(agg => agg.agg.name -> agg.direction.getOrElse(Asc ))
143- .toMap
144- val buckets =
145- ElasticAggregation .buildBuckets(
146- nestedBuckets.getOrElse(nested, Seq .empty),
147- request.sorts -- aggregationDirections.keys,
148- aggregations,
149- aggregationDirections,
150- request.having.flatMap(_.criteria)
151- ) match {
152- case Some (b) => Seq (b)
153- case _ => aggregations
154- }
155- val filtered : Option [Aggregation ] =
156- filteredAgg.map(filtered => filtered.subAggregations(buckets))
157- first.nestedAgg.get.subAggregations(filtered.map(Seq (_)).getOrElse(buckets))
158- }
185+ rootAggregations ++ scopedAggregations
159186 }
160187 } else {
161188 _search
162189 }
163190
164- _search = notNestedAggregations match {
165- case Nil => _search
166- case _ =>
167- _search aggregations {
168- val first = notNestedAggregations.head
169- val aggregationDirections : Map [String , SortOrder ] = notNestedAggregations
170- .filter(_.direction.isDefined)
171- .map(agg => agg.agg.name -> agg.direction.get)
172- .toMap
173- val aggregations = notNestedAggregations.map(_.agg)
174- val buckets = ElasticAggregation .buildBuckets(
175- notNestedBuckets,
176- request.sorts -- aggregationDirections.keys,
177- aggregations,
178- aggregationDirections,
179- request.having.flatMap(_.criteria)
180- ) match {
181- case Some (b) => Seq (b)
182- case _ => aggregations
183- }
184- val filtered : Option [Aggregation ] =
185- filteredAgg.map(filtered => filtered.subAggregations(buckets))
186- filtered.map(Seq (_)).getOrElse(buckets)
187- }
188- }
189-
190191 _search = scriptFields.filterNot(_.aggregation) match {
191192 case Nil => _search
192193 case _ =>
0 commit comments