2023-01-11 19:33:56 +08:00
|
|
|
use std::str::FromStr;
|
|
|
|
|
2022-10-21 00:00:07 +08:00
|
|
|
use super::v4_to_v5::{CompatIndexV4ToV5, CompatV4ToV5};
|
2022-10-11 00:57:27 +08:00
|
|
|
use crate::reader::{v5, v6, Document, UpdateFile};
|
2022-10-06 02:11:07 +08:00
|
|
|
use crate::Result;
|
|
|
|
|
2022-10-07 01:44:50 +08:00
|
|
|
pub enum CompatV5ToV6 {
|
|
|
|
V5(v5::V5Reader),
|
|
|
|
Compat(CompatV4ToV5),
|
2022-10-06 20:41:21 +08:00
|
|
|
}
|
2022-10-06 02:11:07 +08:00
|
|
|
|
2022-10-06 20:41:21 +08:00
|
|
|
impl CompatV5ToV6 {
|
2022-10-07 01:44:50 +08:00
|
|
|
pub fn new_v5(v5: v5::V5Reader) -> CompatV5ToV6 {
|
|
|
|
CompatV5ToV6::V5(v5)
|
2022-10-06 02:11:07 +08:00
|
|
|
}
|
|
|
|
|
2022-10-07 01:44:50 +08:00
|
|
|
pub fn version(&self) -> crate::Version {
|
|
|
|
match self {
|
|
|
|
CompatV5ToV6::V5(v5) => v5.version(),
|
|
|
|
CompatV5ToV6::Compat(compat) => compat.version(),
|
|
|
|
}
|
2022-10-06 02:11:07 +08:00
|
|
|
}
|
|
|
|
|
2022-10-07 01:44:50 +08:00
|
|
|
pub fn date(&self) -> Option<time::OffsetDateTime> {
|
|
|
|
match self {
|
|
|
|
CompatV5ToV6::V5(v5) => v5.date(),
|
|
|
|
CompatV5ToV6::Compat(compat) => compat.date(),
|
|
|
|
}
|
2022-10-06 02:11:07 +08:00
|
|
|
}
|
|
|
|
|
2022-10-07 01:44:50 +08:00
|
|
|
pub fn instance_uid(&self) -> Result<Option<uuid::Uuid>> {
|
|
|
|
match self {
|
|
|
|
CompatV5ToV6::V5(v5) => v5.instance_uid(),
|
|
|
|
CompatV5ToV6::Compat(compat) => compat.instance_uid(),
|
|
|
|
}
|
2022-10-06 02:11:07 +08:00
|
|
|
}
|
|
|
|
|
2022-10-07 01:44:50 +08:00
|
|
|
pub fn indexes(&self) -> Result<Box<dyn Iterator<Item = Result<CompatIndexV5ToV6>> + '_>> {
|
|
|
|
let indexes = match self {
|
2022-10-21 00:00:07 +08:00
|
|
|
CompatV5ToV6::V5(v5) => {
|
|
|
|
Box::new(v5.indexes()?.map(|index| index.map(CompatIndexV5ToV6::from)))
|
|
|
|
as Box<dyn Iterator<Item = Result<CompatIndexV5ToV6>> + '_>
|
|
|
|
}
|
|
|
|
|
|
|
|
CompatV5ToV6::Compat(compat) => {
|
|
|
|
Box::new(compat.indexes()?.map(|index| index.map(CompatIndexV5ToV6::from)))
|
|
|
|
as Box<dyn Iterator<Item = Result<CompatIndexV5ToV6>> + '_>
|
|
|
|
}
|
2022-10-07 01:44:50 +08:00
|
|
|
};
|
|
|
|
Ok(indexes)
|
2022-10-06 02:11:07 +08:00
|
|
|
}
|
|
|
|
|
2022-10-07 01:44:50 +08:00
|
|
|
pub fn tasks(
|
2022-10-06 02:11:07 +08:00
|
|
|
&mut self,
|
2022-10-17 23:38:31 +08:00
|
|
|
) -> Result<Box<dyn Iterator<Item = Result<(v6::Task, Option<Box<UpdateFile>>)>> + '_>> {
|
2022-10-22 22:35:42 +08:00
|
|
|
let instance_uid = self.instance_uid().ok().flatten();
|
2022-10-17 23:38:31 +08:00
|
|
|
let keys = self.keys()?.collect::<Result<Vec<_>>>()?;
|
|
|
|
|
2022-10-07 01:44:50 +08:00
|
|
|
let tasks = match self {
|
|
|
|
CompatV5ToV6::V5(v5) => v5.tasks(),
|
2022-10-11 00:57:27 +08:00
|
|
|
CompatV5ToV6::Compat(compat) => compat.tasks(),
|
2022-10-07 01:44:50 +08:00
|
|
|
};
|
2022-10-17 23:38:31 +08:00
|
|
|
Ok(Box::new(tasks.map(move |task| {
|
2022-10-22 22:35:42 +08:00
|
|
|
task.map(|(task, content_file)| {
|
2022-10-22 00:03:10 +08:00
|
|
|
let mut task_view: v5::tasks::TaskView = task.clone().into();
|
|
|
|
|
|
|
|
if task_view.status == v5::Status::Processing {
|
|
|
|
task_view.started_at = None;
|
|
|
|
}
|
2022-10-06 02:11:07 +08:00
|
|
|
|
|
|
|
let task = v6::Task {
|
|
|
|
uid: task_view.uid,
|
|
|
|
index_uid: task_view.index_uid,
|
|
|
|
status: match task_view.status {
|
2022-10-06 22:37:13 +08:00
|
|
|
v5::Status::Enqueued => v6::Status::Enqueued,
|
|
|
|
v5::Status::Processing => v6::Status::Enqueued,
|
|
|
|
v5::Status::Succeeded => v6::Status::Succeeded,
|
|
|
|
v5::Status::Failed => v6::Status::Failed,
|
2022-10-06 02:11:07 +08:00
|
|
|
},
|
2022-10-22 22:35:42 +08:00
|
|
|
kind: match task.content {
|
2022-10-12 09:21:25 +08:00
|
|
|
v5::tasks::TaskContent::IndexCreation { primary_key, .. } => {
|
|
|
|
v6::Kind::IndexCreation { primary_key }
|
|
|
|
}
|
|
|
|
v5::tasks::TaskContent::IndexUpdate { primary_key, .. } => {
|
|
|
|
v6::Kind::IndexUpdate { primary_key }
|
|
|
|
}
|
2022-10-09 23:29:12 +08:00
|
|
|
v5::tasks::TaskContent::IndexDeletion { .. } => v6::Kind::IndexDeletion,
|
|
|
|
v5::tasks::TaskContent::DocumentAddition {
|
|
|
|
merge_strategy,
|
|
|
|
allow_index_creation,
|
2022-10-12 09:21:25 +08:00
|
|
|
primary_key,
|
|
|
|
documents_count,
|
2022-10-09 23:29:12 +08:00
|
|
|
..
|
|
|
|
} => v6::Kind::DocumentImport {
|
2022-10-12 09:21:25 +08:00
|
|
|
primary_key,
|
|
|
|
documents_count: documents_count as u64,
|
2022-10-09 23:29:12 +08:00
|
|
|
method: match merge_strategy {
|
|
|
|
v5::tasks::IndexDocumentsMethod::ReplaceDocuments => {
|
2022-10-12 00:26:49 +08:00
|
|
|
v6::milli::update::IndexDocumentsMethod::ReplaceDocuments
|
2022-10-09 23:29:12 +08:00
|
|
|
}
|
|
|
|
v5::tasks::IndexDocumentsMethod::UpdateDocuments => {
|
2022-10-12 00:26:49 +08:00
|
|
|
v6::milli::update::IndexDocumentsMethod::UpdateDocuments
|
2022-10-09 23:29:12 +08:00
|
|
|
}
|
|
|
|
},
|
2022-10-22 22:35:42 +08:00
|
|
|
allow_index_creation,
|
2022-10-09 23:29:12 +08:00
|
|
|
},
|
2022-10-12 09:21:25 +08:00
|
|
|
v5::tasks::TaskContent::DocumentDeletion { deletion, .. } => match deletion
|
|
|
|
{
|
|
|
|
v5::tasks::DocumentDeletion::Clear => v6::Kind::DocumentClear,
|
|
|
|
v5::tasks::DocumentDeletion::Ids(documents_ids) => {
|
|
|
|
v6::Kind::DocumentDeletion { documents_ids }
|
|
|
|
}
|
|
|
|
},
|
2022-10-09 23:29:12 +08:00
|
|
|
v5::tasks::TaskContent::SettingsUpdate {
|
|
|
|
allow_index_creation,
|
2022-10-12 09:21:25 +08:00
|
|
|
is_deletion,
|
|
|
|
settings,
|
2022-10-09 23:29:12 +08:00
|
|
|
..
|
|
|
|
} => v6::Kind::Settings {
|
2022-10-12 09:21:25 +08:00
|
|
|
is_deletion,
|
|
|
|
allow_index_creation,
|
2022-10-22 22:35:42 +08:00
|
|
|
settings: Box::new(settings.into()),
|
2022-10-17 23:38:31 +08:00
|
|
|
},
|
2022-11-28 23:27:41 +08:00
|
|
|
v5::tasks::TaskContent::Dump { uid: _ } => {
|
|
|
|
// in v6 we compute the dump_uid from the started_at processing time
|
|
|
|
v6::Kind::DumpCreation { keys: keys.clone(), instance_uid }
|
|
|
|
}
|
2022-10-06 02:11:07 +08:00
|
|
|
},
|
2022-10-18 19:57:58 +08:00
|
|
|
canceled_by: None,
|
2022-10-12 06:43:24 +08:00
|
|
|
details: task_view.details.map(|details| match details {
|
2022-10-21 00:00:07 +08:00
|
|
|
v5::Details::DocumentAddition { received_documents, indexed_documents } => {
|
2022-10-22 00:03:10 +08:00
|
|
|
v6::Details::DocumentAdditionOrUpdate {
|
2022-10-21 00:00:07 +08:00
|
|
|
received_documents: received_documents as u64,
|
2022-10-25 16:53:29 +08:00
|
|
|
indexed_documents,
|
2022-10-21 00:00:07 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
v5::Details::Settings { settings } => {
|
2022-10-22 22:35:42 +08:00
|
|
|
v6::Details::SettingsUpdate { settings: Box::new(settings.into()) }
|
2022-10-21 00:00:07 +08:00
|
|
|
}
|
2022-10-06 22:37:13 +08:00
|
|
|
v5::Details::IndexInfo { primary_key } => {
|
2022-10-06 02:11:07 +08:00
|
|
|
v6::Details::IndexInfo { primary_key }
|
|
|
|
}
|
2022-10-06 22:37:13 +08:00
|
|
|
v5::Details::DocumentDeletion {
|
2022-10-06 02:11:07 +08:00
|
|
|
received_document_ids,
|
|
|
|
deleted_documents,
|
|
|
|
} => v6::Details::DocumentDeletion {
|
2022-11-28 23:27:41 +08:00
|
|
|
provided_ids: received_document_ids,
|
2022-10-06 02:11:07 +08:00
|
|
|
deleted_documents,
|
|
|
|
},
|
2022-10-06 22:37:13 +08:00
|
|
|
v5::Details::ClearAll { deleted_documents } => {
|
2022-10-06 02:11:07 +08:00
|
|
|
v6::Details::ClearAll { deleted_documents }
|
|
|
|
}
|
2022-11-28 23:27:41 +08:00
|
|
|
v5::Details::Dump { dump_uid } => {
|
|
|
|
v6::Details::Dump { dump_uid: Some(dump_uid) }
|
|
|
|
}
|
2022-10-06 02:11:07 +08:00
|
|
|
}),
|
|
|
|
error: task_view.error.map(|e| e.into()),
|
|
|
|
enqueued_at: task_view.enqueued_at,
|
|
|
|
started_at: task_view.started_at,
|
|
|
|
finished_at: task_view.finished_at,
|
|
|
|
};
|
|
|
|
|
2022-10-22 22:35:42 +08:00
|
|
|
(task, content_file)
|
2022-10-06 02:11:07 +08:00
|
|
|
})
|
2022-10-17 23:38:31 +08:00
|
|
|
})))
|
2022-10-06 02:11:07 +08:00
|
|
|
}
|
|
|
|
|
2022-10-17 23:38:31 +08:00
|
|
|
pub fn keys(&mut self) -> Result<Box<dyn Iterator<Item = Result<v6::Key>> + '_>> {
|
2022-10-07 01:44:50 +08:00
|
|
|
let keys = match self {
|
2022-10-17 23:38:31 +08:00
|
|
|
CompatV5ToV6::V5(v5) => v5.keys()?,
|
2022-10-07 01:44:50 +08:00
|
|
|
CompatV5ToV6::Compat(compat) => compat.keys(),
|
|
|
|
};
|
2022-10-17 23:38:31 +08:00
|
|
|
|
|
|
|
Ok(Box::new(keys.map(|key| {
|
2022-10-06 02:11:07 +08:00
|
|
|
key.map(|key| v6::Key {
|
|
|
|
description: key.description,
|
|
|
|
name: key.name,
|
|
|
|
uid: key.uid,
|
2022-10-21 00:00:07 +08:00
|
|
|
actions: key.actions.into_iter().map(|action| action.into()).collect(),
|
2022-10-06 02:11:07 +08:00
|
|
|
indexes: key
|
|
|
|
.indexes
|
|
|
|
.into_iter()
|
|
|
|
.map(|index| match index {
|
|
|
|
v5::StarOr::Star => v6::StarOr::Star,
|
|
|
|
v5::StarOr::Other(uid) => {
|
2023-01-25 21:41:36 +08:00
|
|
|
v6::StarOr::Other(v6::IndexUidPattern::new_unchecked(uid.as_str()))
|
2022-10-06 02:11:07 +08:00
|
|
|
}
|
|
|
|
})
|
|
|
|
.collect(),
|
|
|
|
expires_at: key.expires_at,
|
|
|
|
created_at: key.created_at,
|
|
|
|
updated_at: key.updated_at,
|
|
|
|
})
|
2022-10-17 23:38:31 +08:00
|
|
|
})))
|
2022-10-06 02:11:07 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-10-07 01:44:50 +08:00
|
|
|
pub enum CompatIndexV5ToV6 {
|
|
|
|
V5(v5::V5IndexReader),
|
|
|
|
Compat(CompatIndexV4ToV5),
|
2022-10-06 02:11:07 +08:00
|
|
|
}
|
|
|
|
|
2022-10-07 01:44:50 +08:00
|
|
|
impl From<v5::V5IndexReader> for CompatIndexV5ToV6 {
|
|
|
|
fn from(index_reader: v5::V5IndexReader) -> Self {
|
|
|
|
Self::V5(index_reader)
|
2022-10-06 20:41:21 +08:00
|
|
|
}
|
|
|
|
}
|
2022-10-06 02:11:07 +08:00
|
|
|
|
2022-10-07 01:44:50 +08:00
|
|
|
impl From<CompatIndexV4ToV5> for CompatIndexV5ToV6 {
|
|
|
|
fn from(index_reader: CompatIndexV4ToV5) -> Self {
|
|
|
|
Self::Compat(index_reader)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl CompatIndexV5ToV6 {
|
|
|
|
pub fn new_v5(v5: v5::V5IndexReader) -> CompatIndexV5ToV6 {
|
|
|
|
CompatIndexV5ToV6::V5(v5)
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn metadata(&self) -> &crate::IndexMetadata {
|
|
|
|
match self {
|
|
|
|
CompatIndexV5ToV6::V5(v5) => v5.metadata(),
|
|
|
|
CompatIndexV5ToV6::Compat(compat) => compat.metadata(),
|
|
|
|
}
|
2022-10-06 02:11:07 +08:00
|
|
|
}
|
|
|
|
|
2022-10-11 00:57:27 +08:00
|
|
|
pub fn documents(&mut self) -> Result<Box<dyn Iterator<Item = Result<Document>> + '_>> {
|
2022-10-07 01:44:50 +08:00
|
|
|
match self {
|
|
|
|
CompatIndexV5ToV6::V5(v5) => v5
|
|
|
|
.documents()
|
2022-10-11 00:57:27 +08:00
|
|
|
.map(|iter| Box::new(iter) as Box<dyn Iterator<Item = Result<Document>> + '_>),
|
2022-10-07 01:44:50 +08:00
|
|
|
CompatIndexV5ToV6::Compat(compat) => compat
|
|
|
|
.documents()
|
2022-10-11 00:57:27 +08:00
|
|
|
.map(|iter| Box::new(iter) as Box<dyn Iterator<Item = Result<Document>> + '_>),
|
2022-10-07 01:44:50 +08:00
|
|
|
}
|
2022-10-06 02:11:07 +08:00
|
|
|
}
|
|
|
|
|
2022-10-07 01:44:50 +08:00
|
|
|
pub fn settings(&mut self) -> Result<v6::Settings<v6::Checked>> {
|
|
|
|
match self {
|
|
|
|
CompatIndexV5ToV6::V5(v5) => Ok(v6::Settings::from(v5.settings()?).check()),
|
|
|
|
CompatIndexV5ToV6::Compat(compat) => Ok(v6::Settings::from(compat.settings()?).check()),
|
|
|
|
}
|
2022-10-06 02:11:07 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<T> From<v5::Setting<T>> for v6::Setting<T> {
|
|
|
|
fn from(setting: v5::Setting<T>) -> Self {
|
|
|
|
match setting {
|
|
|
|
v5::Setting::Set(t) => v6::Setting::Set(t),
|
|
|
|
v5::Setting::Reset => v6::Setting::Reset,
|
|
|
|
v5::Setting::NotSet => v6::Setting::NotSet,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl From<v5::ResponseError> for v6::ResponseError {
|
|
|
|
fn from(error: v5::ResponseError) -> Self {
|
|
|
|
let code = match error.error_code.as_ref() {
|
2023-01-11 19:33:45 +08:00
|
|
|
"index_creation_failed" => v6::Code::IndexCreationFailed,
|
2022-10-16 09:34:16 +08:00
|
|
|
"index_already_exists" => v6::Code::IndexAlreadyExists,
|
|
|
|
"index_not_found" => v6::Code::IndexNotFound,
|
|
|
|
"invalid_index_uid" => v6::Code::InvalidIndexUid,
|
|
|
|
"invalid_min_word_length_for_typo" => v6::Code::InvalidMinWordLengthForTypo,
|
|
|
|
"invalid_state" => v6::Code::InvalidState,
|
2023-01-11 19:33:45 +08:00
|
|
|
"primary_key_inference_failed" => v6::Code::IndexPrimaryKeyNoCandidateFound,
|
|
|
|
"index_primary_key_already_exists" => v6::Code::IndexPrimaryKeyAlreadyExists,
|
2022-10-16 09:34:16 +08:00
|
|
|
"max_fields_limit_exceeded" => v6::Code::MaxFieldsLimitExceeded,
|
|
|
|
"missing_document_id" => v6::Code::MissingDocumentId,
|
|
|
|
"invalid_document_id" => v6::Code::InvalidDocumentId,
|
2023-01-10 01:59:09 +08:00
|
|
|
"invalid_filter" => v6::Code::InvalidSettingsFilterableAttributes,
|
|
|
|
"invalid_sort" => v6::Code::InvalidSettingsSortableAttributes,
|
2022-10-16 09:34:16 +08:00
|
|
|
"bad_parameter" => v6::Code::BadParameter,
|
|
|
|
"bad_request" => v6::Code::BadRequest,
|
|
|
|
"database_size_limit_reached" => v6::Code::DatabaseSizeLimitReached,
|
|
|
|
"document_not_found" => v6::Code::DocumentNotFound,
|
|
|
|
"internal" => v6::Code::Internal,
|
2023-01-06 04:08:19 +08:00
|
|
|
"invalid_geo_field" => v6::Code::InvalidDocumentGeoField,
|
2023-01-10 01:59:09 +08:00
|
|
|
"invalid_ranking_rule" => v6::Code::InvalidSettingsRankingRules,
|
2023-01-11 19:33:45 +08:00
|
|
|
"invalid_store_file" => v6::Code::InvalidStoreFile,
|
|
|
|
"invalid_api_key" => v6::Code::InvalidApiKey,
|
2022-10-16 09:34:16 +08:00
|
|
|
"missing_authorization_header" => v6::Code::MissingAuthorizationHeader,
|
|
|
|
"no_space_left_on_device" => v6::Code::NoSpaceLeftOnDevice,
|
|
|
|
"dump_not_found" => v6::Code::DumpNotFound,
|
|
|
|
"task_not_found" => v6::Code::TaskNotFound,
|
|
|
|
"payload_too_large" => v6::Code::PayloadTooLarge,
|
2023-01-11 19:33:45 +08:00
|
|
|
"unretrievable_document" => v6::Code::UnretrievableDocument,
|
2022-10-16 09:34:16 +08:00
|
|
|
"unsupported_media_type" => v6::Code::UnsupportedMediaType,
|
2023-01-11 19:33:45 +08:00
|
|
|
"dump_already_processing" => v6::Code::DumpAlreadyProcessing,
|
2022-10-16 09:34:16 +08:00
|
|
|
"dump_process_failed" => v6::Code::DumpProcessFailed,
|
|
|
|
"invalid_content_type" => v6::Code::InvalidContentType,
|
|
|
|
"missing_content_type" => v6::Code::MissingContentType,
|
|
|
|
"malformed_payload" => v6::Code::MalformedPayload,
|
|
|
|
"missing_payload" => v6::Code::MissingPayload,
|
|
|
|
"api_key_not_found" => v6::Code::ApiKeyNotFound,
|
2023-01-12 16:35:56 +08:00
|
|
|
"missing_parameter" => v6::Code::BadRequest,
|
2022-10-16 09:34:16 +08:00
|
|
|
"invalid_api_key_actions" => v6::Code::InvalidApiKeyActions,
|
|
|
|
"invalid_api_key_indexes" => v6::Code::InvalidApiKeyIndexes,
|
|
|
|
"invalid_api_key_expires_at" => v6::Code::InvalidApiKeyExpiresAt,
|
|
|
|
"invalid_api_key_description" => v6::Code::InvalidApiKeyDescription,
|
|
|
|
"invalid_api_key_name" => v6::Code::InvalidApiKeyName,
|
|
|
|
"invalid_api_key_uid" => v6::Code::InvalidApiKeyUid,
|
2023-01-12 16:35:56 +08:00
|
|
|
"immutable_field" => v6::Code::BadRequest,
|
2022-10-16 09:34:16 +08:00
|
|
|
"api_key_already_exists" => v6::Code::ApiKeyAlreadyExists,
|
2022-10-06 02:11:07 +08:00
|
|
|
other => {
|
|
|
|
log::warn!("Unknown error code {}", other);
|
|
|
|
v6::Code::UnretrievableErrorCode
|
|
|
|
}
|
|
|
|
};
|
|
|
|
v6::ResponseError::from_msg(error.message, code)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<T> From<v5::Settings<T>> for v6::Settings<v6::Unchecked> {
|
|
|
|
fn from(settings: v5::Settings<T>) -> Self {
|
|
|
|
v6::Settings {
|
|
|
|
displayed_attributes: settings.displayed_attributes.into(),
|
|
|
|
searchable_attributes: settings.searchable_attributes.into(),
|
|
|
|
filterable_attributes: settings.filterable_attributes.into(),
|
|
|
|
sortable_attributes: settings.sortable_attributes.into(),
|
2023-01-11 19:33:56 +08:00
|
|
|
ranking_rules: {
|
|
|
|
match settings.ranking_rules {
|
|
|
|
v5::settings::Setting::Set(ranking_rules) => {
|
|
|
|
let mut new_ranking_rules = vec![];
|
|
|
|
for rule in ranking_rules {
|
|
|
|
match v6::RankingRuleView::from_str(&rule) {
|
|
|
|
Ok(new_rule) => {
|
|
|
|
new_ranking_rules.push(new_rule);
|
|
|
|
}
|
|
|
|
Err(_) => {
|
|
|
|
log::warn!("Error while importing settings. The ranking rule `{rule}` does not exist anymore.")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
v6::Setting::Set(new_ranking_rules)
|
|
|
|
}
|
|
|
|
v5::settings::Setting::Reset => v6::Setting::Reset,
|
|
|
|
v5::settings::Setting::NotSet => v6::Setting::NotSet,
|
|
|
|
}
|
|
|
|
},
|
2022-10-06 02:11:07 +08:00
|
|
|
stop_words: settings.stop_words.into(),
|
|
|
|
synonyms: settings.synonyms.into(),
|
|
|
|
distinct_attribute: settings.distinct_attribute.into(),
|
|
|
|
typo_tolerance: match settings.typo_tolerance {
|
|
|
|
v5::Setting::Set(typo) => v6::Setting::Set(v6::TypoTolerance {
|
|
|
|
enabled: typo.enabled.into(),
|
|
|
|
min_word_size_for_typos: match typo.min_word_size_for_typos {
|
|
|
|
v5::Setting::Set(t) => v6::Setting::Set(v6::MinWordSizeForTypos {
|
|
|
|
one_typo: t.one_typo.into(),
|
|
|
|
two_typos: t.two_typos.into(),
|
|
|
|
}),
|
|
|
|
v5::Setting::Reset => v6::Setting::Reset,
|
|
|
|
v5::Setting::NotSet => v6::Setting::NotSet,
|
|
|
|
},
|
|
|
|
disable_on_words: typo.disable_on_words.into(),
|
|
|
|
disable_on_attributes: typo.disable_on_attributes.into(),
|
|
|
|
}),
|
|
|
|
v5::Setting::Reset => v6::Setting::Reset,
|
|
|
|
v5::Setting::NotSet => v6::Setting::NotSet,
|
|
|
|
},
|
|
|
|
faceting: match settings.faceting {
|
|
|
|
v5::Setting::Set(faceting) => v6::Setting::Set(v6::FacetingSettings {
|
|
|
|
max_values_per_facet: faceting.max_values_per_facet.into(),
|
|
|
|
}),
|
|
|
|
v5::Setting::Reset => v6::Setting::Reset,
|
|
|
|
v5::Setting::NotSet => v6::Setting::NotSet,
|
|
|
|
},
|
|
|
|
pagination: match settings.pagination {
|
|
|
|
v5::Setting::Set(pagination) => v6::Setting::Set(v6::PaginationSettings {
|
|
|
|
max_total_hits: pagination.max_total_hits.into(),
|
|
|
|
}),
|
|
|
|
v5::Setting::Reset => v6::Setting::Reset,
|
|
|
|
v5::Setting::NotSet => v6::Setting::NotSet,
|
|
|
|
},
|
|
|
|
_kind: std::marker::PhantomData,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl From<v5::Action> for v6::Action {
|
|
|
|
fn from(key: v5::Action) -> Self {
|
|
|
|
match key {
|
|
|
|
v5::Action::All => v6::Action::All,
|
|
|
|
v5::Action::Search => v6::Action::Search,
|
|
|
|
v5::Action::DocumentsAll => v6::Action::DocumentsAll,
|
|
|
|
v5::Action::DocumentsAdd => v6::Action::DocumentsAdd,
|
|
|
|
v5::Action::DocumentsGet => v6::Action::DocumentsGet,
|
|
|
|
v5::Action::DocumentsDelete => v6::Action::DocumentsDelete,
|
|
|
|
v5::Action::IndexesAll => v6::Action::IndexesAll,
|
|
|
|
v5::Action::IndexesAdd => v6::Action::IndexesAdd,
|
|
|
|
v5::Action::IndexesGet => v6::Action::IndexesGet,
|
|
|
|
v5::Action::IndexesUpdate => v6::Action::IndexesUpdate,
|
|
|
|
v5::Action::IndexesDelete => v6::Action::IndexesDelete,
|
|
|
|
v5::Action::TasksAll => v6::Action::TasksAll,
|
|
|
|
v5::Action::TasksGet => v6::Action::TasksGet,
|
|
|
|
v5::Action::SettingsAll => v6::Action::SettingsAll,
|
|
|
|
v5::Action::SettingsGet => v6::Action::SettingsGet,
|
|
|
|
v5::Action::SettingsUpdate => v6::Action::SettingsUpdate,
|
|
|
|
v5::Action::StatsAll => v6::Action::StatsAll,
|
|
|
|
v5::Action::StatsGet => v6::Action::StatsGet,
|
|
|
|
v5::Action::MetricsAll => v6::Action::MetricsAll,
|
|
|
|
v5::Action::MetricsGet => v6::Action::MetricsGet,
|
|
|
|
v5::Action::DumpsAll => v6::Action::DumpsAll,
|
|
|
|
v5::Action::DumpsCreate => v6::Action::DumpsCreate,
|
|
|
|
v5::Action::Version => v6::Action::Version,
|
|
|
|
v5::Action::KeysAdd => v6::Action::KeysAdd,
|
|
|
|
v5::Action::KeysGet => v6::Action::KeysGet,
|
|
|
|
v5::Action::KeysUpdate => v6::Action::KeysUpdate,
|
|
|
|
v5::Action::KeysDelete => v6::Action::KeysDelete,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|
pub(crate) mod test {
|
2022-10-21 00:00:07 +08:00
|
|
|
use std::fs::File;
|
|
|
|
use std::io::BufReader;
|
2022-10-06 02:11:07 +08:00
|
|
|
|
|
|
|
use flate2::bufread::GzDecoder;
|
2022-10-27 00:49:47 +08:00
|
|
|
use meili_snap::insta;
|
2022-10-06 02:11:07 +08:00
|
|
|
use tempfile::TempDir;
|
|
|
|
|
|
|
|
use super::*;
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn compat_v5_v6() {
|
|
|
|
let dump = File::open("tests/assets/v5.dump").unwrap();
|
|
|
|
let dir = TempDir::new().unwrap();
|
|
|
|
let mut dump = BufReader::new(dump);
|
|
|
|
let gz = GzDecoder::new(&mut dump);
|
|
|
|
let mut archive = tar::Archive::new(gz);
|
|
|
|
archive.unpack(dir.path()).unwrap();
|
|
|
|
|
2022-10-06 20:41:21 +08:00
|
|
|
let mut dump = v5::V5Reader::open(dir).unwrap().to_v6();
|
2022-10-06 02:11:07 +08:00
|
|
|
|
|
|
|
// top level infos
|
|
|
|
insta::assert_display_snapshot!(dump.date().unwrap(), @"2022-10-04 15:55:10.344982459 +00:00:00");
|
|
|
|
insta::assert_display_snapshot!(dump.instance_uid().unwrap().unwrap(), @"9e15e977-f2ae-4761-943f-1eaf75fd736d");
|
|
|
|
|
|
|
|
// tasks
|
2022-10-17 23:38:31 +08:00
|
|
|
let tasks = dump.tasks().unwrap().collect::<Result<Vec<_>>>().unwrap();
|
2022-10-06 02:11:07 +08:00
|
|
|
let (tasks, update_files): (Vec<_>, Vec<_>) = tasks.into_iter().unzip();
|
2023-01-02 23:13:44 +08:00
|
|
|
meili_snap::snapshot_hash!(meili_snap::json_string!(tasks), @"10c673c97f053830aa659876d7aa0b53");
|
2022-10-06 02:11:07 +08:00
|
|
|
assert_eq!(update_files.len(), 22);
|
|
|
|
assert!(update_files[0].is_none()); // the dump creation
|
|
|
|
assert!(update_files[1].is_some()); // the enqueued document addition
|
|
|
|
assert!(update_files[2..].iter().all(|u| u.is_none())); // everything already processed
|
|
|
|
|
|
|
|
// keys
|
2022-10-17 23:38:31 +08:00
|
|
|
let keys = dump.keys().unwrap().collect::<Result<Vec<_>>>().unwrap();
|
2022-10-13 22:03:23 +08:00
|
|
|
meili_snap::snapshot_hash!(meili_snap::json_string!(keys), @"c9d2b467fe2fca0b35580d8a999808fb");
|
2022-10-06 02:11:07 +08:00
|
|
|
|
|
|
|
// indexes
|
|
|
|
let mut indexes = dump.indexes().unwrap().collect::<Result<Vec<_>>>().unwrap();
|
|
|
|
// the index are not ordered in any way by default
|
|
|
|
indexes.sort_by_key(|index| index.metadata().uid.to_string());
|
|
|
|
|
|
|
|
let mut products = indexes.pop().unwrap();
|
|
|
|
let mut movies = indexes.pop().unwrap();
|
|
|
|
let mut spells = indexes.pop().unwrap();
|
|
|
|
assert!(indexes.is_empty());
|
|
|
|
|
|
|
|
// products
|
|
|
|
insta::assert_json_snapshot!(products.metadata(), { ".createdAt" => "[now]", ".updatedAt" => "[now]" }, @r###"
|
|
|
|
{
|
|
|
|
"uid": "products",
|
|
|
|
"primaryKey": "sku",
|
|
|
|
"createdAt": "[now]",
|
|
|
|
"updatedAt": "[now]"
|
|
|
|
}
|
|
|
|
"###);
|
|
|
|
|
2022-11-23 23:52:19 +08:00
|
|
|
insta::assert_json_snapshot!(products.settings().unwrap());
|
2022-10-21 00:00:07 +08:00
|
|
|
let documents = products.documents().unwrap().collect::<Result<Vec<_>>>().unwrap();
|
2022-10-06 02:11:07 +08:00
|
|
|
assert_eq!(documents.len(), 10);
|
2022-10-13 22:03:23 +08:00
|
|
|
meili_snap::snapshot_hash!(format!("{:#?}", documents), @"b01c8371aea4c7171af0d4d846a2bdca");
|
2022-10-06 02:11:07 +08:00
|
|
|
|
|
|
|
// movies
|
|
|
|
insta::assert_json_snapshot!(movies.metadata(), { ".createdAt" => "[now]", ".updatedAt" => "[now]" }, @r###"
|
|
|
|
{
|
|
|
|
"uid": "movies",
|
|
|
|
"primaryKey": "id",
|
|
|
|
"createdAt": "[now]",
|
|
|
|
"updatedAt": "[now]"
|
|
|
|
}
|
|
|
|
"###);
|
|
|
|
|
2022-11-23 23:52:19 +08:00
|
|
|
insta::assert_json_snapshot!(movies.settings().unwrap());
|
2022-10-21 00:00:07 +08:00
|
|
|
let documents = movies.documents().unwrap().collect::<Result<Vec<_>>>().unwrap();
|
2022-10-06 02:11:07 +08:00
|
|
|
assert_eq!(documents.len(), 200);
|
2022-10-13 22:03:23 +08:00
|
|
|
meili_snap::snapshot_hash!(format!("{:#?}", documents), @"e962baafd2fbae4cdd14e876053b0c5a");
|
2022-10-06 02:11:07 +08:00
|
|
|
|
|
|
|
// spells
|
|
|
|
insta::assert_json_snapshot!(spells.metadata(), { ".createdAt" => "[now]", ".updatedAt" => "[now]" }, @r###"
|
|
|
|
{
|
|
|
|
"uid": "dnd_spells",
|
|
|
|
"primaryKey": "index",
|
|
|
|
"createdAt": "[now]",
|
|
|
|
"updatedAt": "[now]"
|
|
|
|
}
|
|
|
|
"###);
|
|
|
|
|
2022-11-23 23:52:19 +08:00
|
|
|
insta::assert_json_snapshot!(spells.settings().unwrap());
|
2022-10-21 00:00:07 +08:00
|
|
|
let documents = spells.documents().unwrap().collect::<Result<Vec<_>>>().unwrap();
|
2022-10-06 02:11:07 +08:00
|
|
|
assert_eq!(documents.len(), 10);
|
2022-10-13 22:03:23 +08:00
|
|
|
meili_snap::snapshot_hash!(format!("{:#?}", documents), @"235016433dd04262c7f2da01d1e808ce");
|
2022-10-06 02:11:07 +08:00
|
|
|
}
|
|
|
|
}
|