Skip to content

Commit ed44995

Browse files
authored
Merge pull request #23 from ydataai/feat/make_total_hits_optional
Make total hits optional
2 parents 75154cc + 10afc01 commit ed44995

File tree

2 files changed

+52
-3
lines changed

2 files changed

+52
-3
lines changed

Sources/ElasticsearchNIOClient/Models/ESMultipleDocumentResponse.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public struct ESGetMultipleDocumentsResponse<Document: Decodable>: Decodable {
1111
}
1212
}
1313

14-
public let total: Total
14+
public let total: Total?
1515
public let hits: [ESGetSingleDocumentResponse<Document>]
1616
}
1717

Tests/ElasticsearchNIOClientTests/ElasticsearchNIOClientTests.swift

Lines changed: 51 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,8 @@ class ElasticSearchIntegrationTests: XCTestCase {
9696
Thread.sleep(forTimeInterval: 1.0)
9797

9898
let results = try client.searchDocuments(from: indexName, searchTerm: "Apples", type: SomeItem.self).wait()
99-
XCTAssertEqual(results.hits.total.value, 100)
100-
XCTAssertEqual(results.hits.total.relation, .eq)
99+
XCTAssertEqual(results.hits.total!.value, 100)
100+
XCTAssertEqual(results.hits.total!.relation, .eq)
101101
}
102102

103103
func testCreateDocument() throws {
@@ -464,6 +464,7 @@ class ElasticSearchIntegrationTests: XCTestCase {
464464

465465
let results: ESGetMultipleDocumentsResponse<SomeItem> = try client.searchDocumentsPaginated(from: indexName, queryBody: queryBody, size: 20, offset: 10).wait()
466466
XCTAssertEqual(results.hits.hits.count, 20)
467+
XCTAssertEqual(results.hits.total!.value, 100)
467468
XCTAssertTrue(results.hits.hits.contains(where: { $0.source.name == "Some 11 Apples" }))
468469
XCTAssertTrue(results.hits.hits.contains(where: { $0.source.name == "Some 29 Apples" }))
469470
}
@@ -502,6 +503,54 @@ class ElasticSearchIntegrationTests: XCTestCase {
502503

503504
let results: ESGetMultipleDocumentsResponse<SomeItem> = try client.customSearch(from: indexName, query: query).wait()
504505
XCTAssertEqual(results.hits.hits.count, 20)
506+
XCTAssertEqual(results.hits.total!.value, 100)
507+
XCTAssertTrue(results.hits.hits.contains(where: { $0.source.name == "Some 11 Apples" }))
508+
XCTAssertTrue(results.hits.hits.contains(where: { $0.source.name == "Some 29 Apples" }))
509+
}
510+
511+
func testCustomSearchWithTrackTotalHitsFalse() throws {
512+
for index in 1...100 {
513+
let name = "Some \(index) Apples"
514+
let item = SomeItem(id: UUID(), name: name)
515+
_ = try client.createDocument(item, in: self.indexName).wait()
516+
}
517+
518+
// This is required for ES to settle and load the indexes to return the right results
519+
Thread.sleep(forTimeInterval: 2.0)
520+
521+
struct Query: Encodable {
522+
let query: QueryBody
523+
let from: Int
524+
let size: Int
525+
let trackTotalHits: Bool
526+
527+
enum CodingKeys: String, CodingKey {
528+
case query
529+
case from
530+
case size
531+
case trackTotalHits = "track_total_hits"
532+
}
533+
}
534+
535+
struct QueryBody: Encodable {
536+
let queryString: QueryString
537+
538+
enum CodingKeys: String, CodingKey {
539+
case queryString = "query_string"
540+
}
541+
}
542+
543+
struct QueryString: Encodable {
544+
let query: String
545+
}
546+
547+
let queryString = QueryString(query: "Apples")
548+
let queryBody = QueryBody(queryString: queryString)
549+
let query = Query(query: queryBody, from: 10, size: 20, trackTotalHits: false)
550+
551+
let results: ESGetMultipleDocumentsResponse<SomeItem> = try client.customSearch(from: indexName, query: query).wait()
552+
XCTAssertNil(results.hits.total)
553+
XCTAssertEqual(results.hits.hits.count, 20)
505554
XCTAssertTrue(results.hits.hits.contains(where: { $0.source.name == "Some 11 Apples" }))
506555
XCTAssertTrue(results.hits.hits.contains(where: { $0.source.name == "Some 29 Apples" }))
507556
}

0 commit comments

Comments
 (0)