Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 26 additions & 30 deletions Sources/MeiliSearch/Documents.swift
Original file line number Diff line number Diff line change
Expand Up @@ -16,18 +16,24 @@ struct Documents {
func get<T>(
_ uid: String,
_ identifier: String,
fields: [String]? = nil,
_ completion: @escaping (Result<T, Swift.Error>) -> Void)
where T: Codable, T: Equatable {
let query: String = "/indexes/\(uid)/documents/\(identifier)"
var query: String = "/indexes/\(uid)/documents/\(identifier)"

if fields != nil {
query.append(fields?.joined(separator: ",") ?? "")
}

self.request.get(api: query) { result in
switch result {
case .success(let data):
guard let data: Data = data else {
completion(.failure(MeiliSearch.Error.dataNotFound))
return
}
Documents.decodeJSON(data, completion: completion)

Documents.decodeJSON(data, completion: completion)
case .failure(let error):
completion(.failure(error))
}
Expand All @@ -36,30 +42,20 @@ struct Documents {

func getAll<T>(
_ uid: String,
_ options: GetParameters? = nil,
_ completion: @escaping (Result<[T], Swift.Error>) -> Void)
params: DocumentsQuery? = nil,
_ completion: @escaping (Result<DocumentsResults<T>, Swift.Error>) -> Void)
where T: Codable, T: Equatable {
do {
var queryParameters = ""
if let parameters: GetParameters = options {
queryParameters = try parameters.toQueryParameters()
}
let query: String = "/indexes/\(uid)/documents\(queryParameters)"
request.get(api: query) { result in
switch result {
case .success(let data):
guard let data: Data = data else {
completion(.failure(MeiliSearch.Error.dataNotFound))
return
}
Documents.decodeJSON(data, completion: completion)

case .failure(let error):
completion(.failure(error))
request.get(api: "/indexes/\(uid)/documents\(params?.toQuery() ?? "")") { result in
switch result {
case .success(let data):
guard let data: Data = data else {
completion(.failure(MeiliSearch.Error.dataNotFound))
return
}
Documents.decodeJSON(data, completion: completion)
case .failure(let error):
completion(.failure(error))
}
} catch let error {
completion(.failure(error))
}
}

Expand All @@ -69,7 +65,7 @@ struct Documents {
_ uid: String,
_ document: Data,
_ primaryKey: String? = nil,
_ completion: @escaping (Result<Task, Swift.Error>) -> Void) {
_ completion: @escaping (Result<TaskInfo, Swift.Error>) -> Void) {

var query: String = "/indexes/\(uid)/documents"
if let primaryKey: String = primaryKey {
Expand All @@ -91,7 +87,7 @@ struct Documents {
_ documents: [T],
_ encoder: JSONEncoder? = nil,
_ primaryKey: String? = nil,
_ completion: @escaping (Result<Task, Swift.Error>) -> Void) where T: Encodable {
_ completion: @escaping (Result<TaskInfo, Swift.Error>) -> Void) where T: Encodable {
var query: String = "/indexes/\(uid)/documents"
if let primaryKey: String = primaryKey {
query += "?primaryKey=\(primaryKey)"
Expand Down Expand Up @@ -120,7 +116,7 @@ struct Documents {
_ uid: String,
_ document: Data,
_ primaryKey: String? = nil,
_ completion: @escaping (Result<Task, Swift.Error>) -> Void) {
_ completion: @escaping (Result<TaskInfo, Swift.Error>) -> Void) {

var query: String = "/indexes/\(uid)/documents"
if let primaryKey: String = primaryKey {
Expand All @@ -142,7 +138,7 @@ struct Documents {
_ documents: [T],
_ encoder: JSONEncoder? = nil,
_ primaryKey: String? = nil,
_ completion: @escaping (Result<Task, Swift.Error>) -> Void) where T: Encodable {
_ completion: @escaping (Result<TaskInfo, Swift.Error>) -> Void) where T: Encodable {

var query: String = "/indexes/\(uid)/documents"
if let primaryKey: String = primaryKey {
Expand Down Expand Up @@ -173,7 +169,7 @@ struct Documents {
func delete(
_ uid: String,
_ identifier: String,
_ completion: @escaping (Result<Task, Swift.Error>) -> Void) {
_ completion: @escaping (Result<TaskInfo, Swift.Error>) -> Void) {

self.request.delete(api: "/indexes/\(uid)/documents/\(identifier)") { result in
switch result {
Expand All @@ -192,7 +188,7 @@ struct Documents {

func deleteAll(
_ uid: String,
_ completion: @escaping (Result<Task, Swift.Error>) -> Void) {
_ completion: @escaping (Result<TaskInfo, Swift.Error>) -> Void) {

self.request.delete(api: "/indexes/\(uid)/documents") { result in
switch result {
Expand All @@ -214,7 +210,7 @@ struct Documents {
func deleteBatch(
_ uid: String,
_ documentsIdentifiers: [Int],
_ completion: @escaping (Result<Task, Swift.Error>) -> Void) {
_ completion: @escaping (Result<TaskInfo, Swift.Error>) -> Void) {

let data: Data

Expand Down
12 changes: 12 additions & 0 deletions Sources/MeiliSearch/Model/DocumentsResults.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import Foundation

/**
`DocumentsResults` is a wrapper used in the indexes routes to handle the returned data.
*/

public struct DocumentsResults<T: Decodable & Encodable & Equatable>: Codable, Equatable {
public let results: [T]
public let offset: Int
public let limit: Int
public let total: Int
}
60 changes: 0 additions & 60 deletions Sources/MeiliSearch/Model/GetParameters.swift

This file was deleted.

21 changes: 21 additions & 0 deletions Sources/MeiliSearch/QueryParameters/DocumentsQuery.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import Foundation

public class DocumentsQuery: Queryable {
private var limit: Int?
private var offset: Int?
private var fields: [String]

init(limit: Int? = nil, offset: Int? = nil, fields: [String]? = nil) {
self.offset = offset
self.limit = limit
self.fields = fields ?? []
}

internal func buildQuery() -> [String: Codable?] {
[
"limit": limit,
"offset": offset,
"fields": fields.isEmpty ? nil : fields.joined(separator: ",")
]
}
}
20 changes: 20 additions & 0 deletions Sources/MeiliSearch/QueryParameters/Queryable.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
internal protocol Queryable {
func buildQuery() -> [String: Codable?]
}

extension Queryable {
func toQuery() -> String {
let query: [String: Codable?] = buildQuery()

let data = query.compactMapValues { $0 }
.sorted { $0.key < $1.key }
.map { "\($0)=\($1)" }
.joined(separator: "&")

if !data.isEmpty {
return "?\(data)"
}

return data
}
}
36 changes: 18 additions & 18 deletions Tests/MeiliSearchIntegrationTests/DocumentsTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ class DocumentsTests: XCTestCase {
self.client.waitForTask(task: task) { result in
switch result {
case .success(let task):
XCTAssertEqual("documentAddition", task.type)
XCTAssertEqual("documentAdditionOrUpdate", task.type)
XCTAssertEqual(Task.Status.succeeded, task.status)
if let details = task.details {
if let indexedDocuments = details.indexedDocuments {
Expand Down Expand Up @@ -108,7 +108,7 @@ class DocumentsTests: XCTestCase {
self.client.waitForTask(task: task) { result in
switch result {
case .success(let task):
XCTAssertEqual("documentAddition", task.type)
XCTAssertEqual("documentAdditionOrUpdate", task.type)
XCTAssertEqual(Task.Status.succeeded, task.status)
expectation.fulfill()
case .failure(let error):
Expand Down Expand Up @@ -140,14 +140,14 @@ class DocumentsTests: XCTestCase {
switch result {
case .success(let task):
XCTAssertEqual(Task.Status.succeeded, task.status)
XCTAssertEqual("documentAddition", task.type)
self.index.getDocuments(
options: GetParameters(offset: 1, limit: 1, attributesToRetrieve: ["id", "title"])
) { (result: Result<[Movie], Swift.Error>) in
XCTAssertEqual("documentAdditionOrUpdate", task.type)

self.index.getDocuments(params: DocumentsQuery(limit: 1, offset: 1, fields: ["id", "title"])) { (result: Result<DocumentsResults<Movie>, Swift.Error>) in
switch result {
case .success(let returnedMovies):
let returnedMovie = returnedMovies[0]
XCTAssertEqual(returnedMovies.count, 1)
case .success(let movies):
let returnedMovie = movies.results[0]

XCTAssertEqual(movies.results.count, 1)
XCTAssertEqual(returnedMovie.id, 456)
XCTAssertEqual(returnedMovie.title, "Le Petit Prince")
XCTAssertEqual(returnedMovie.comment, nil)
Expand Down Expand Up @@ -201,7 +201,7 @@ class DocumentsTests: XCTestCase {
switch result {
case .success(let task):
XCTAssertEqual(Task.Status.succeeded, task.status)
XCTAssertEqual("documentAddition", task.type)
XCTAssertEqual("documentAdditionOrUpdate", task.type)
self.index.getDocument(10
) { (result: Result<Movie, Swift.Error>) in
switch result {
Expand Down Expand Up @@ -244,7 +244,7 @@ class DocumentsTests: XCTestCase {
switch result {
case .success(let task):
XCTAssertEqual(Task.Status.succeeded, task.status)
XCTAssertEqual("documentAddition", task.type)
XCTAssertEqual("documentAdditionOrUpdate", task.type)
self.index.getDocument("10"
) { (result: Result<Movie, Swift.Error>) in
switch result {
Expand Down Expand Up @@ -289,7 +289,7 @@ class DocumentsTests: XCTestCase {
switch result {
case .success(let task):
XCTAssertEqual(Task.Status.succeeded, task.status)
XCTAssertEqual("documentPartial", task.type)
XCTAssertEqual("documentAdditionOrUpdate", task.type)
expectation.fulfill()
case .failure:
XCTFail("Failed to wait for task")
Expand Down Expand Up @@ -325,10 +325,10 @@ class DocumentsTests: XCTestCase {
self.wait(for: [expectation], timeout: TESTS_TIME_OUT)

let deleteExpectation = XCTestExpectation(description: "Delete one Movie")
self.index.deleteDocument("42") { (result: Result<Task, Swift.Error>) in
self.index.deleteDocument("42") { result in
switch result {
case .success(let task):
self.client.waitForTask(task: task) { result in
self.client.waitForTask(taskUid: task.uid) { result in
switch result {
case .success(let task):
XCTAssertEqual(Task.Status.succeeded, task.status)
Expand Down Expand Up @@ -367,17 +367,17 @@ class DocumentsTests: XCTestCase {
self.wait(for: [expectation], timeout: TESTS_TIME_OUT)

let deleteExpectation = XCTestExpectation(description: "Delete all documents")
self.index.deleteAllDocuments { (result: Result<Task, Swift.Error>) in
self.index.deleteAllDocuments { result in
switch result {
case .success(let task):
self.client.waitForTask(task: task) { result in
switch result {
case .success(let task):
XCTAssertEqual(Task.Status.succeeded, task.status)
XCTAssertEqual("clearAll", task.type)
XCTAssertEqual("documentDeletion", task.type)
if let details = task.details {
if let deletedDocuments = details.deletedDocuments {
XCTAssertEqual(9, deletedDocuments)
XCTAssertGreaterThanOrEqual(deletedDocuments, 8)
} else {
XCTFail("deletedDocuments field should not be nil")
deleteExpectation.fulfill()
Expand Down Expand Up @@ -423,7 +423,7 @@ class DocumentsTests: XCTestCase {
let deleteExpectation = XCTestExpectation(description: "Delete batch movies")
let idsToDelete: [Int] = [2, 1, 4]

self.index.deleteBatchDocuments(idsToDelete) { (result: Result<Task, Swift.Error>) in
self.index.deleteBatchDocuments(idsToDelete) { result in
switch result {
case .success(let task):
self.client.waitForTask(task: task) { result in
Expand Down
Loading