Skip to content

Commit afa33fd

Browse files
committed
fix nested sources and size
1 parent a30c200 commit afa33fd

File tree

4 files changed

+89
-28
lines changed

4 files changed

+89
-28
lines changed

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

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,10 +73,6 @@ case class ElasticQuery(filter: ElasticFilter) {
7373

7474
val nestedParents = getNestedParents(nestedElements.last, Seq.empty)
7575

76-
nestedParentsPath.foreach { case (path, (element, children)) =>
77-
println(s"parent: $path, children: ${children.map(_.path).mkString(", ")}")
78-
}
79-
8076
def buildNestedQuery(n: NestedElement): Query = {
8177
val children = nestedParentsPath.get(n.path).map(_._2).getOrElse(Seq.empty)
8278
if (children.nonEmpty) {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import com.sksamuel.elastic4s.http.search.SearchBodyBuilderFn
1313
import com.sksamuel.elastic4s.script.Script
1414
import com.sksamuel.elastic4s.script.ScriptType.Source
1515
import com.sksamuel.elastic4s.searches.aggs.{Aggregation, FilterAggregation}
16-
import com.sksamuel.elastic4s.searches.queries.{Query, RawQuery}
16+
import com.sksamuel.elastic4s.searches.queries.Query
1717
import com.sksamuel.elastic4s.searches.{MultiSearchRequest, SearchRequest}
1818
import com.sksamuel.elastic4s.searches.sort.FieldSort
1919

sql/bridge/src/main/scala/app/softnetwork/elastic/sql/bridge/ElasticQuery.scala

Lines changed: 78 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,27 @@
11
package app.softnetwork.elastic.sql.bridge
22

33
import app.softnetwork.elastic.sql.query.{
4+
BetweenExpr,
45
ElasticBoolQuery,
56
ElasticChild,
67
ElasticFilter,
7-
DistanceCriteria,
88
ElasticMatch,
99
ElasticNested,
1010
ElasticParent,
11-
BetweenExpr,
1211
GenericExpression,
1312
InExpr,
14-
IsNotNullExpr,
1513
IsNotNullCriteria,
14+
IsNotNullExpr,
15+
IsNullCriteria,
1616
IsNullExpr,
17-
IsNullCriteria
17+
NestedElement
1818
}
1919
import com.sksamuel.elastic4s.ElasticApi._
20+
import com.sksamuel.elastic4s.requests.common.FetchSourceContext
2021
import com.sksamuel.elastic4s.requests.searches.queries.Query
2122

23+
import scala.annotation.tailrec
24+
2225
case class ElasticQuery(filter: ElasticFilter) {
2326
def query(
2427
innerHitsNames: Set[String] = Set.empty,
@@ -39,15 +42,77 @@ case class ElasticQuery(filter: ElasticFilter) {
3942
criteria.asFilter(currentQuery).query(innerHitsNames, currentQuery)
4043
} else {
4144
val boolQuery = Option(ElasticBoolQuery(group = true))
42-
nestedQuery(
43-
relationType.getOrElse(""),
44-
criteria
45-
.asFilter(boolQuery)
46-
.query(innerHitsNames + innerHitsName.getOrElse(""), boolQuery)
47-
) /*.scoreMode(ScoreMode.None)*/
48-
.inner(
49-
innerHits(innerHitsName.getOrElse("")).from(0).size(limit.map(_.limit).getOrElse(3))
50-
)
45+
val q = criteria
46+
.asFilter(boolQuery)
47+
.query(innerHitsNames + innerHitsName.getOrElse(""), boolQuery)
48+
49+
val nestedElements: Seq[NestedElement] = criteria.nestedElements.sortBy(_.level)
50+
nestedElements.foreach(n => println(s"nestedElement: ${n.path}, level: ${n.level}"))
51+
52+
val nestedParentsPath
53+
: collection.mutable.Map[String, (NestedElement, Seq[NestedElement])] =
54+
collection.mutable.Map.empty
55+
56+
@tailrec
57+
def getNestedParents(
58+
n: NestedElement,
59+
parents: Seq[NestedElement]
60+
): Seq[NestedElement] = {
61+
n.parent match {
62+
case Some(p) =>
63+
if (!nestedParentsPath.contains(p.path)) {
64+
nestedParentsPath += p.path -> (p, Seq(n))
65+
getNestedParents(p, p +: parents)
66+
} else {
67+
nestedParentsPath += p.path -> (p, nestedParentsPath(p.path)._2 :+ n)
68+
parents
69+
}
70+
case _ => parents
71+
}
72+
}
73+
74+
val nestedParents = getNestedParents(nestedElements.last, Seq.empty)
75+
76+
def buildNestedQuery(n: NestedElement): Query = {
77+
val children = nestedParentsPath.get(n.path).map(_._2).getOrElse(Seq.empty)
78+
if (children.nonEmpty) {
79+
val innerQueries = children.map(buildNestedQuery)
80+
val combinedQuery = if (innerQueries.size == 1) {
81+
innerQueries.head
82+
} else {
83+
must(innerQueries)
84+
}
85+
nestedQuery(
86+
n.path,
87+
combinedQuery
88+
) /*.scoreMode(ScoreMode.None)*/
89+
.inner(
90+
innerHits(n.innerHitsName)
91+
.from(0)
92+
.size(n.size.getOrElse(3))
93+
.fetchSource(
94+
FetchSourceContext(fetchSource = true, includes = n.sources.toArray)
95+
)
96+
)
97+
} else {
98+
nestedQuery(
99+
n.path,
100+
q
101+
) /*.scoreMode(ScoreMode.None)*/
102+
.inner(
103+
innerHits(n.innerHitsName)
104+
.from(0)
105+
.size(n.size.getOrElse(3))
106+
.fetchSource(
107+
FetchSourceContext(fetchSource = true, includes = n.sources.toArray)
108+
)
109+
)
110+
}
111+
}
112+
if (nestedParents.nonEmpty)
113+
buildNestedQuery(nestedParents.head)
114+
else
115+
buildNestedQuery(nestedElements.last)
51116
}
52117
case child: ElasticChild =>
53118
import child._

sql/src/main/scala/app/softnetwork/elastic/sql/query/SQLSearchRequest.scala

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package app.softnetwork.elastic.sql.query
22

33
import app.softnetwork.elastic.sql.function.aggregate.TopHitsAggregation
4-
import app.softnetwork.elastic.sql.{asString, Identifier, Token}
4+
import app.softnetwork.elastic.sql.{asString, Token}
55

66
case class SQLSearchRequest(
77
select: Select = Select(),
@@ -39,7 +39,7 @@ case class SQLSearchRequest(
3939
NestedElement(
4040
path = u.path,
4141
innerHitsName = u.innerHitsName,
42-
size = u.limit.map(_.limit),
42+
size = limit.map(_.limit),
4343
children = Nil,
4444
sources = nestedFields
4545
.get(u.innerHitsName)
@@ -53,14 +53,14 @@ case class SQLSearchRequest(
5353
orderBy.map { _.sorts.map(s => s.name -> s.direction) }.getOrElse(Map.empty).toMap
5454

5555
def update(): SQLSearchRequest = {
56-
val updated = this.copy(from = from.update(this))
57-
updated.copy(
58-
select = select.update(updated),
59-
where = where.map(_.update(updated)),
60-
groupBy = groupBy.map(_.update(updated)),
61-
having = having.map(_.update(updated)),
62-
orderBy = orderBy.map(_.update(updated))
63-
)
56+
(for {
57+
from <- Option(this.copy(from = from.update(this)))
58+
select <- Option(from.copy(select = select.update(from)))
59+
where <- Option(select.copy(where = where.map(_.update(select))))
60+
groupBy <- Option(where.copy(groupBy = groupBy.map(_.update(where))))
61+
having <- Option(groupBy.copy(having = having.map(_.update(groupBy))))
62+
updated <- Option(having.copy(orderBy = orderBy.map(_.update(having))))
63+
} yield updated).get
6464
}
6565

6666
lazy val scriptFields: Seq[Field] = select.fields.filter(_.isScriptField)

0 commit comments

Comments
 (0)