Skip to content

Commit 68813e2

Browse files
authored
Merge pull request #5 from rcarver/sort
Sort
2 parents 0707b3a + 6940fdb commit 68813e2

File tree

3 files changed

+81
-28
lines changed

3 files changed

+81
-28
lines changed

Package.resolved

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Sources/ElasticsearchQueryBuilder/Components.swift

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,22 @@ extension esb {
199199
}
200200
}
201201

202+
/// Adds `sort` block to the query syntax.
203+
public struct Sort<Component: ArrayComponent>: DictComponent {
204+
var component: Component
205+
public init(@QueryArrayBuilder component: () -> Component) {
206+
self.component = component()
207+
}
208+
public func makeDict() -> QueryDict {
209+
let values: [QueryDict] = self.component.makeCompactArray()
210+
if values.isEmpty {
211+
return [:]
212+
} else {
213+
return [ "sort" : .array(values.map(QueryValue.dict)) ]
214+
}
215+
}
216+
}
217+
202218
/// Adds `term` block to the query syntax.
203219
///
204220
/// Excludes the component if value is nil.

Tests/ElasticsearchQueryBuilderTests/ComponentTests.swift

Lines changed: 61 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ final class NothingTests: XCTestCase {
88
@ElasticsearchQueryBuilder func build() -> some esb.QueryDSL {
99
esb.Nothing()
1010
}
11-
XCTAssertNoDifference(build().makeQuery(), [:])
11+
expectNoDifference(build().makeQuery(), [:])
1212
}
1313
}
1414

@@ -17,7 +17,7 @@ final class KeyTests: XCTestCase {
1717
@ElasticsearchQueryBuilder func build() -> some esb.QueryDSL {
1818
esb.Key("boost", .float(1.2))
1919
}
20-
XCTAssertNoDifference(build().makeQuery(), [
20+
expectNoDifference(build().makeQuery(), [
2121
"boost": 1.2
2222
])
2323
}
@@ -29,7 +29,7 @@ final class KeyTests: XCTestCase {
2929
]
3030
}
3131
}
32-
XCTAssertNoDifference(build().makeQuery(), [
32+
expectNoDifference(build().makeQuery(), [
3333
"match_bool_prefix": [
3434
"message": "quick brown f"
3535
]
@@ -39,7 +39,7 @@ final class KeyTests: XCTestCase {
3939
@ElasticsearchQueryBuilder func build() -> some esb.QueryDSL {
4040
esb.Key("match", .dict([:]))
4141
}
42-
XCTAssertNoDifference(build().makeQuery(), [:])
42+
expectNoDifference(build().makeQuery(), [:])
4343
}
4444
}
4545

@@ -57,7 +57,7 @@ final class ComposableBuilderTests: XCTestCase {
5757
makeKey()
5858
}
5959
}
60-
XCTAssertNoDifference(build().makeQuery(), [
60+
expectNoDifference(build().makeQuery(), [
6161
"query": [
6262
"match_bool_prefix": [
6363
"message": "quick brown f"
@@ -80,7 +80,7 @@ final class ComposableBuilderTests: XCTestCase {
8080
makeKey(true)
8181
}
8282
}
83-
XCTAssertNoDifference(build().makeQuery(), [
83+
expectNoDifference(build().makeQuery(), [
8484
"filter": [
8585
[
8686
"match_bool_prefix": [
@@ -107,7 +107,7 @@ final class ComposableBuilderTests: XCTestCase {
107107
makeKey(true, 3)
108108
}
109109
}
110-
XCTAssertNoDifference(build().makeQuery(), [
110+
expectNoDifference(build().makeQuery(), [
111111
"filter": [
112112
[
113113
"match_bool_prefix": [
@@ -135,7 +135,7 @@ final class QueryTests: XCTestCase {
135135
}
136136
}
137137
}
138-
XCTAssertNoDifference(build().makeQuery(), [
138+
expectNoDifference(build().makeQuery(), [
139139
"query": [
140140
"match_bool_prefix": [
141141
"message": "quick brown f"
@@ -149,7 +149,7 @@ final class QueryTests: XCTestCase {
149149
esb.Key("match", .dict([:]))
150150
}
151151
}
152-
XCTAssertNoDifference(build().makeQuery(), [:])
152+
expectNoDifference(build().makeQuery(), [:])
153153
}
154154
}
155155

@@ -196,7 +196,7 @@ final class BoolTests: XCTestCase {
196196
}
197197
}
198198
}
199-
XCTAssertNoDifference(build(true).makeQuery(), [
199+
expectNoDifference(build(true).makeQuery(), [
200200
"bool": [
201201
"minimum_should_match": 1,
202202
"should": [
@@ -229,7 +229,7 @@ final class BoolTests: XCTestCase {
229229
]
230230
]
231231
])
232-
XCTAssertNoDifference(build(false).makeQuery(), [
232+
expectNoDifference(build(false).makeQuery(), [
233233
"bool": [
234234
"minimum_should_match": 1
235235
]
@@ -252,7 +252,44 @@ final class BoolTests: XCTestCase {
252252
}
253253
}
254254
}
255-
XCTAssertNoDifference(build().makeQuery(), [:])
255+
expectNoDifference(build().makeQuery(), [:])
256+
}
257+
}
258+
259+
final class SortTests: XCTestCase {
260+
func testBuild() throws {
261+
@ElasticsearchQueryBuilder func build() -> some esb.QueryDSL {
262+
esb.Sort {
263+
esb.Key("_score") {
264+
[ "order": "desc" ]
265+
}
266+
esb.Key("name") {
267+
[ "order": "asc" ]
268+
}
269+
}
270+
}
271+
expectNoDifference(build().makeQuery(), [
272+
"sort": [
273+
[
274+
"_score": [ "order": "desc" ]
275+
],
276+
[
277+
"name": [ "order": "asc" ]
278+
]
279+
]
280+
])
281+
}
282+
func testBuildEmpty() throws {
283+
@ElasticsearchQueryBuilder func build() -> some esb.QueryDSL {
284+
esb.Sort {
285+
if false {
286+
esb.Key("_score") {
287+
[ "order": "desc" ]
288+
}
289+
}
290+
}
291+
}
292+
expectNoDifference(build().makeQuery(), [:])
256293
}
257294
}
258295

@@ -261,15 +298,15 @@ final class TermTests: XCTestCase {
261298
@ElasticsearchQueryBuilder func build() -> some esb.QueryDSL {
262299
esb.Term("name", "joe")
263300
}
264-
XCTAssertNoDifference(build().makeQuery(), [
301+
expectNoDifference(build().makeQuery(), [
265302
"term": [ "name": "joe" ]
266303
])
267304
}
268305
func testBuildEmpty() throws {
269306
@ElasticsearchQueryBuilder func build() -> some esb.QueryDSL {
270307
esb.Term("name", nil)
271308
}
272-
XCTAssertNoDifference(build().makeQuery(), [:])
309+
expectNoDifference(build().makeQuery(), [:])
273310
}
274311
}
275312

@@ -278,15 +315,15 @@ final class TermsORTests: XCTestCase {
278315
@ElasticsearchQueryBuilder func build() -> some esb.QueryDSL {
279316
esb.TermsOR("name", ["joe", "mary"])
280317
}
281-
XCTAssertNoDifference(build().makeQuery(), [
318+
expectNoDifference(build().makeQuery(), [
282319
"terms": [ "name": ["joe", "mary"] ]
283320
])
284321
}
285322
func testBuildEmpty() throws {
286323
@ElasticsearchQueryBuilder func build() -> some esb.QueryDSL {
287324
esb.TermsOR("name", [])
288325
}
289-
XCTAssertNoDifference(build().makeQuery(), [:])
326+
expectNoDifference(build().makeQuery(), [:])
290327
}
291328
}
292329

@@ -297,7 +334,7 @@ final class TermsANDTests: XCTestCase {
297334
esb.TermsAND("name", ["joe", "mary"])
298335
}
299336
}
300-
XCTAssertNoDifference(build().makeQuery(), [
337+
expectNoDifference(build().makeQuery(), [
301338
"filter": [
302339
[ "term": [ "name": "joe" ] ],
303340
[ "term": [ "name": "mary" ] ],
@@ -310,7 +347,7 @@ final class TermsANDTests: XCTestCase {
310347
esb.TermsAND("name", [])
311348
}
312349
}
313-
XCTAssertNoDifference(build().makeQuery(), [:])
350+
expectNoDifference(build().makeQuery(), [:])
314351
}
315352
}
316353

@@ -319,7 +356,7 @@ final class KNearestNeighborTests: XCTestCase {
319356
@ElasticsearchQueryBuilder func build() -> some esb.QueryDSL {
320357
esb.kNearestNeighbor("vector_field", [1,2,3])
321358
}
322-
XCTAssertNoDifference(build().makeQuery(), [
359+
expectNoDifference(build().makeQuery(), [
323360
"knn": [
324361
"field": "vector_field",
325362
"query_vector": [1.0, 2.0, 3.0],
@@ -341,7 +378,7 @@ final class KNearestNeighborTests: XCTestCase {
341378
}
342379
}
343380
}
344-
XCTAssertNoDifference(build().makeQuery(), [
381+
expectNoDifference(build().makeQuery(), [
345382
"knn": [
346383
"field": "vector_field",
347384
"query_vector": [1.0, 2.0, 3.0],
@@ -385,7 +422,7 @@ final class FunctionScoreTests: XCTestCase {
385422
}
386423
}
387424
}
388-
XCTAssertNoDifference(build().makeQuery(), [
425+
expectNoDifference(build().makeQuery(), [
389426
"function_score": [
390427
"bool": [
391428
"should": [
@@ -415,21 +452,21 @@ final class SearchPaginationTests: XCTestCase {
415452
@ElasticsearchQueryBuilder func build() -> some esb.QueryDSL {
416453
esb.Pagination()
417454
}
418-
XCTAssertNoDifference(build().makeQuery(), [:])
455+
expectNoDifference(build().makeQuery(), [:])
419456
}
420457
func testBuildFirst() throws {
421458
@ElasticsearchQueryBuilder func build() -> some esb.QueryDSL {
422459
esb.Pagination(from: 10)
423460
}
424-
XCTAssertNoDifference(build().makeQuery(), [
461+
expectNoDifference(build().makeQuery(), [
425462
"from": 10
426463
])
427464
}
428465
func testBuildFirstSize() throws {
429466
@ElasticsearchQueryBuilder func build() -> some esb.QueryDSL {
430467
esb.Pagination(from: 10, size: 20)
431468
}
432-
XCTAssertNoDifference(build().makeQuery(), [
469+
expectNoDifference(build().makeQuery(), [
433470
"from": 10,
434471
"size": 20,
435472
])

0 commit comments

Comments
 (0)