Skip to content

Commit 9e684e4

Browse files
committed
handle determination of the aggregation context (root versus scoped)
1 parent 5a4b544 commit 9e684e4

File tree

6 files changed

+818
-768
lines changed

6 files changed

+818
-768
lines changed

es6/sql-bridge/src/main/scala/app/softnetwork/elastic/sql/bridge/package.scala

Lines changed: 54 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)