Skip to content

Commit 470e45d

Browse files
committed
Allow query body to be completely custom
1 parent b123290 commit 470e45d

File tree

2 files changed

+50
-0
lines changed

2 files changed

+50
-0
lines changed

Sources/ElasticsearchNIOClient/ElasticsearchClient+Requests.swift

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,18 @@ extension ElasticsearchClient {
201201
}
202202
}
203203

204+
public func customSearch<Document: Decodable, Query: Encodable>(from indexName: String, query: Query, type: Document.Type = Document.self) -> EventLoopFuture<ESGetMultipleDocumentsResponse<Document>> {
205+
do {
206+
let url = try buildURL(path: "/\(indexName)/_search")
207+
let body = try ByteBuffer(data: self.jsonEncoder.encode(query))
208+
var headers = HTTPHeaders()
209+
headers.add(name: "content-type", value: "application/json")
210+
return sendRequest(url: url, method: .GET, headers: headers, body: body)
211+
} catch {
212+
return self.eventLoop.makeFailedFuture(error)
213+
}
214+
}
215+
204216
public func deleteIndex(_ name: String) -> EventLoopFuture<ESDeleteIndexResponse> {
205217
do {
206218
let url = try buildURL(path: "/\(name)")

Tests/ElasticsearchNIOClientTests/ElasticsearchNIOClientTests.swift

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -385,6 +385,44 @@ class ElasticSearchIntegrationTests: XCTestCase {
385385
XCTAssertTrue(results.hits.hits.contains(where: { $0.source.name == "Some 29 Apples" }))
386386
}
387387

388+
func testCustomSearch() throws {
389+
for index in 1...100 {
390+
let name = "Some \(index) Apples"
391+
let item = SomeItem(id: UUID(), name: name)
392+
_ = try client.createDocument(item, in: self.indexName).wait()
393+
}
394+
395+
// This is required for ES to settle and load the indexes to return the right results
396+
Thread.sleep(forTimeInterval: 1.0)
397+
398+
struct Query: Encodable {
399+
let query: QueryBody
400+
let from: Int
401+
let size: Int
402+
}
403+
404+
struct QueryBody: Encodable {
405+
let queryString: QueryString
406+
407+
enum CodingKeys: String, CodingKey {
408+
case queryString = "query_string"
409+
}
410+
}
411+
412+
struct QueryString: Encodable {
413+
let query: String
414+
}
415+
416+
let queryString = QueryString(query: "Apples")
417+
let queryBody = QueryBody(queryString: queryString)
418+
let query = Query(query: queryBody, from: 10, size: 20)
419+
420+
let results: ESGetMultipleDocumentsResponse<SomeItem> = try client.customSearch(from: indexName, query: query).wait()
421+
XCTAssertEqual(results.hits.hits.count, 20)
422+
XCTAssertTrue(results.hits.hits.contains(where: { $0.source.name == "Some 11 Apples" }))
423+
XCTAssertTrue(results.hits.hits.contains(where: { $0.source.name == "Some 29 Apples" }))
424+
}
425+
388426
// MARK: - Private
389427
private func setupItems() throws {
390428
for index in 1...10 {

0 commit comments

Comments
 (0)