mirror of
https://github.com/meilisearch/meilisearch.git
synced 2024-11-26 03:55:07 +08:00
write the dump v2 import
This commit is contained in:
parent
43496b97bd
commit
7e18f92635
@ -1,7 +1,3 @@
|
||||
|
||||
|
||||
|
||||
|
||||
use crate::reader::{v3, v4, DumpReader, IndexReader};
|
||||
use crate::Result;
|
||||
|
||||
|
@ -1,5 +1,3 @@
|
||||
|
||||
|
||||
use crate::reader::{v4, v5, DumpReader, IndexReader};
|
||||
use crate::Result;
|
||||
|
||||
|
@ -3,7 +3,6 @@ use std::{fs::File, io::BufReader};
|
||||
|
||||
use flate2::bufread::GzDecoder;
|
||||
|
||||
|
||||
use serde::Deserialize;
|
||||
|
||||
use tempfile::TempDir;
|
||||
@ -21,6 +20,7 @@ use self::compat::Compat;
|
||||
mod compat;
|
||||
// mod loaders;
|
||||
// mod v1;
|
||||
pub(self) mod v2;
|
||||
pub(self) mod v3;
|
||||
pub(self) mod v4;
|
||||
pub(self) mod v5;
|
||||
|
14
dump/src/reader/v2/errors.rs
Normal file
14
dump/src/reader/v2/errors.rs
Normal file
@ -0,0 +1,14 @@
|
||||
use http::StatusCode;
|
||||
use serde::Deserialize;
|
||||
|
||||
#[derive(Debug, Deserialize, Clone)]
|
||||
#[cfg_attr(test, derive(serde::Serialize))]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
pub struct ResponseError {
|
||||
#[serde(skip)]
|
||||
code: StatusCode,
|
||||
message: String,
|
||||
error_code: String,
|
||||
error_type: String,
|
||||
error_link: String,
|
||||
}
|
18
dump/src/reader/v2/meta.rs
Normal file
18
dump/src/reader/v2/meta.rs
Normal file
@ -0,0 +1,18 @@
|
||||
use serde::Deserialize;
|
||||
use uuid::Uuid;
|
||||
|
||||
use super::Settings;
|
||||
|
||||
#[derive(Deserialize, Debug, Clone)]
|
||||
#[cfg_attr(test, derive(serde::Serialize))]
|
||||
pub struct IndexUuid {
|
||||
pub uid: String,
|
||||
pub uuid: Uuid,
|
||||
}
|
||||
|
||||
#[derive(Deserialize)]
|
||||
#[cfg_attr(test, derive(serde::Serialize))]
|
||||
pub struct DumpMeta {
|
||||
pub settings: Settings<super::Unchecked>,
|
||||
pub primary_key: Option<String>,
|
||||
}
|
313
dump/src/reader/v2/mod.rs
Normal file
313
dump/src/reader/v2/mod.rs
Normal file
@ -0,0 +1,313 @@
|
||||
//! ```text
|
||||
//! .
|
||||
//! ├── indexes
|
||||
//! │ ├── index-40d14c5f-37ae-4873-9d51-b69e014a0d30
|
||||
//! │ │ ├── documents.jsonl
|
||||
//! │ │ └── meta.json
|
||||
//! │ ├── index-88202369-4524-4410-9b3d-3e924c867fec
|
||||
//! │ │ ├── documents.jsonl
|
||||
//! │ │ └── meta.json
|
||||
//! │ ├── index-b7f2d03b-bf9b-40d9-a25b-94dc5ec60c32
|
||||
//! │ │ ├── documents.jsonl
|
||||
//! │ │ └── meta.json
|
||||
//! │ └── index-dc9070b3-572d-4f30-ab45-d4903ab71708
|
||||
//! │ ├── documents.jsonl
|
||||
//! │ └── meta.json
|
||||
//! ├── index_uuids
|
||||
//! │ └── data.jsonl
|
||||
//! ├── metadata.json
|
||||
//! └── updates
|
||||
//! ├── data.jsonl
|
||||
//! └── update_files
|
||||
//! └── update_202573df-718b-4d80-9a65-2ee397c23dc3
|
||||
//! ```
|
||||
|
||||
use std::{
|
||||
fs::{self, File},
|
||||
io::{BufRead, BufReader},
|
||||
path::Path,
|
||||
};
|
||||
|
||||
use serde::{Deserialize, Serialize};
|
||||
use tempfile::TempDir;
|
||||
use time::OffsetDateTime;
|
||||
|
||||
pub mod errors;
|
||||
pub mod meta;
|
||||
pub mod settings;
|
||||
pub mod updates;
|
||||
|
||||
use crate::{IndexMetadata, Result, Version};
|
||||
|
||||
use self::meta::{DumpMeta, IndexUuid};
|
||||
|
||||
use super::IndexReader;
|
||||
|
||||
pub type Document = serde_json::Map<String, serde_json::Value>;
|
||||
pub type Settings<T> = settings::Settings<T>;
|
||||
pub type Checked = settings::Checked;
|
||||
pub type Unchecked = settings::Unchecked;
|
||||
|
||||
pub type Task = updates::UpdateEntry;
|
||||
pub type UpdateFile = File;
|
||||
|
||||
// ===== Other types to clarify the code of the compat module
|
||||
// everything related to the tasks
|
||||
pub type Status = updates::UpdateStatus;
|
||||
// pub type Kind = updates::Update;
|
||||
pub type Details = updates::UpdateResult;
|
||||
|
||||
// everything related to the errors
|
||||
pub type ResponseError = errors::ResponseError;
|
||||
// pub type Code = errors::Code;
|
||||
|
||||
#[derive(Serialize, Deserialize, Debug)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
pub struct Metadata {
|
||||
db_version: String,
|
||||
index_db_size: usize,
|
||||
update_db_size: usize,
|
||||
#[serde(with = "time::serde::rfc3339")]
|
||||
dump_date: OffsetDateTime,
|
||||
}
|
||||
|
||||
pub struct V2Reader {
|
||||
dump: TempDir,
|
||||
metadata: Metadata,
|
||||
tasks: BufReader<File>,
|
||||
pub index_uuid: Vec<IndexUuid>,
|
||||
}
|
||||
|
||||
impl V2Reader {
|
||||
pub fn open(dump: TempDir) -> Result<Self> {
|
||||
let meta_file = fs::read(dump.path().join("metadata.json"))?;
|
||||
let metadata = serde_json::from_reader(&*meta_file)?;
|
||||
let index_uuid = File::open(dump.path().join("index_uuids/data.jsonl"))?;
|
||||
let index_uuid = BufReader::new(index_uuid);
|
||||
let index_uuid = index_uuid
|
||||
.lines()
|
||||
.map(|line| -> Result<_> { Ok(serde_json::from_str(&line?)?) })
|
||||
.collect::<Result<Vec<_>>>()?;
|
||||
|
||||
Ok(V2Reader {
|
||||
metadata,
|
||||
tasks: BufReader::new(
|
||||
File::open(dump.path().join("updates").join("data.jsonl")).unwrap(),
|
||||
),
|
||||
index_uuid,
|
||||
dump,
|
||||
})
|
||||
}
|
||||
|
||||
/*
|
||||
pub fn to_v3(self) -> CompatV2ToV3 {
|
||||
CompatV2ToV3::new(self)
|
||||
}
|
||||
*/
|
||||
|
||||
pub fn version(&self) -> Version {
|
||||
Version::V2
|
||||
}
|
||||
|
||||
pub fn date(&self) -> Option<OffsetDateTime> {
|
||||
Some(self.metadata.dump_date)
|
||||
}
|
||||
|
||||
pub fn indexes(&self) -> Result<impl Iterator<Item = Result<V2IndexReader>> + '_> {
|
||||
Ok(self.index_uuid.iter().map(|index| -> Result<_> {
|
||||
Ok(V2IndexReader::new(
|
||||
index.uid.clone(),
|
||||
&self
|
||||
.dump
|
||||
.path()
|
||||
.join("indexes")
|
||||
.join(format!("index-{}", index.uuid.to_string())),
|
||||
)?)
|
||||
}))
|
||||
}
|
||||
|
||||
pub fn tasks(&mut self) -> Box<dyn Iterator<Item = Result<(Task, Option<UpdateFile>)>> + '_> {
|
||||
Box::new((&mut self.tasks).lines().map(|line| -> Result<_> {
|
||||
let task: Task = serde_json::from_str(&line?)?;
|
||||
if !task.is_finished() {
|
||||
if let Some(uuid) = task.get_content_uuid() {
|
||||
let update_file_path = self
|
||||
.dump
|
||||
.path()
|
||||
.join("updates")
|
||||
.join("update_files")
|
||||
.join(format!("update_{}", uuid.to_string()));
|
||||
Ok((task, Some(File::open(update_file_path).unwrap())))
|
||||
} else {
|
||||
Ok((task, None))
|
||||
}
|
||||
} else {
|
||||
Ok((task, None))
|
||||
}
|
||||
}))
|
||||
}
|
||||
}
|
||||
|
||||
pub struct V2IndexReader {
|
||||
metadata: IndexMetadata,
|
||||
settings: Settings<Checked>,
|
||||
|
||||
documents: BufReader<File>,
|
||||
}
|
||||
|
||||
impl V2IndexReader {
|
||||
pub fn new(name: String, path: &Path) -> Result<Self> {
|
||||
let meta = File::open(path.join("meta.json"))?;
|
||||
let meta: DumpMeta = serde_json::from_reader(meta)?;
|
||||
|
||||
let metadata = IndexMetadata {
|
||||
uid: name,
|
||||
primary_key: meta.primary_key,
|
||||
// FIXME: Iterate over the whole task queue to find the creation and last update date.
|
||||
created_at: OffsetDateTime::now_utc(),
|
||||
updated_at: OffsetDateTime::now_utc(),
|
||||
};
|
||||
|
||||
let ret = V2IndexReader {
|
||||
metadata,
|
||||
settings: meta.settings.check(),
|
||||
documents: BufReader::new(File::open(path.join("documents.jsonl"))?),
|
||||
};
|
||||
|
||||
Ok(ret)
|
||||
}
|
||||
|
||||
pub fn metadata(&self) -> &IndexMetadata {
|
||||
&self.metadata
|
||||
}
|
||||
|
||||
pub fn documents(&mut self) -> Result<impl Iterator<Item = Result<Document>> + '_> {
|
||||
Ok((&mut self.documents)
|
||||
.lines()
|
||||
.map(|line| -> Result<_> { Ok(serde_json::from_str(&line?)?) }))
|
||||
}
|
||||
|
||||
pub fn settings(&mut self) -> Result<Settings<Checked>> {
|
||||
Ok(self.settings.clone())
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
pub(crate) mod test {
|
||||
use std::{fs::File, io::BufReader};
|
||||
|
||||
use flate2::bufread::GzDecoder;
|
||||
use tempfile::TempDir;
|
||||
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn read_dump_v2() {
|
||||
let dump = File::open("tests/assets/v2.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();
|
||||
|
||||
let mut dump = V2Reader::open(dir).unwrap();
|
||||
|
||||
// top level infos
|
||||
insta::assert_display_snapshot!(dump.date().unwrap(), @"2022-10-09 20:27:59.904096267 +00:00:00");
|
||||
|
||||
// tasks
|
||||
let tasks = dump.tasks().collect::<Result<Vec<_>>>().unwrap();
|
||||
let (tasks, update_files): (Vec<_>, Vec<_>) = tasks.into_iter().unzip();
|
||||
insta::assert_json_snapshot!(tasks);
|
||||
assert_eq!(update_files.len(), 9);
|
||||
assert!(update_files[0].is_some()); // the enqueued document addition
|
||||
assert!(update_files[1..].iter().all(|u| u.is_none())); // everything already processed
|
||||
|
||||
// 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 movies2 = 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]"
|
||||
}
|
||||
"###);
|
||||
|
||||
insta::assert_debug_snapshot!(products.settings());
|
||||
let documents = products
|
||||
.documents()
|
||||
.unwrap()
|
||||
.collect::<Result<Vec<_>>>()
|
||||
.unwrap();
|
||||
assert_eq!(documents.len(), 10);
|
||||
insta::assert_json_snapshot!(documents);
|
||||
|
||||
// movies
|
||||
insta::assert_json_snapshot!(movies.metadata(), { ".createdAt" => "[now]", ".updatedAt" => "[now]" }, @r###"
|
||||
{
|
||||
"uid": "movies",
|
||||
"primaryKey": "id",
|
||||
"createdAt": "[now]",
|
||||
"updatedAt": "[now]"
|
||||
}
|
||||
"###);
|
||||
|
||||
insta::assert_debug_snapshot!(movies.settings());
|
||||
let documents = movies
|
||||
.documents()
|
||||
.unwrap()
|
||||
.collect::<Result<Vec<_>>>()
|
||||
.unwrap();
|
||||
assert_eq!(documents.len(), 110);
|
||||
insta::assert_debug_snapshot!(documents);
|
||||
|
||||
// movies2
|
||||
insta::assert_json_snapshot!(movies2.metadata(), { ".createdAt" => "[now]", ".updatedAt" => "[now]" }, @r###"
|
||||
{
|
||||
"uid": "movies_2",
|
||||
"primaryKey": null,
|
||||
"createdAt": "[now]",
|
||||
"updatedAt": "[now]"
|
||||
}
|
||||
"###);
|
||||
|
||||
insta::assert_debug_snapshot!(movies2.settings());
|
||||
let documents = movies2
|
||||
.documents()
|
||||
.unwrap()
|
||||
.collect::<Result<Vec<_>>>()
|
||||
.unwrap();
|
||||
assert_eq!(documents.len(), 0);
|
||||
insta::assert_debug_snapshot!(documents);
|
||||
|
||||
// spells
|
||||
insta::assert_json_snapshot!(spells.metadata(), { ".createdAt" => "[now]", ".updatedAt" => "[now]" }, @r###"
|
||||
{
|
||||
"uid": "dnd_spells",
|
||||
"primaryKey": "index",
|
||||
"createdAt": "[now]",
|
||||
"updatedAt": "[now]"
|
||||
}
|
||||
"###);
|
||||
|
||||
insta::assert_debug_snapshot!(spells.settings());
|
||||
let documents = spells
|
||||
.documents()
|
||||
.unwrap()
|
||||
.collect::<Result<Vec<_>>>()
|
||||
.unwrap();
|
||||
assert_eq!(documents.len(), 10);
|
||||
insta::assert_json_snapshot!(documents);
|
||||
}
|
||||
}
|
131
dump/src/reader/v2/settings.rs
Normal file
131
dump/src/reader/v2/settings.rs
Normal file
@ -0,0 +1,131 @@
|
||||
use std::{
|
||||
collections::{BTreeMap, BTreeSet, HashSet},
|
||||
marker::PhantomData,
|
||||
};
|
||||
|
||||
use serde::{Deserialize, Deserializer};
|
||||
|
||||
#[cfg(test)]
|
||||
fn serialize_with_wildcard<S>(
|
||||
field: &Option<Option<Vec<String>>>,
|
||||
s: S,
|
||||
) -> std::result::Result<S::Ok, S::Error>
|
||||
where
|
||||
S: serde::Serializer,
|
||||
{
|
||||
let wildcard = vec!["*".to_string()];
|
||||
s.serialize_some(&field.as_ref().map(|o| o.as_ref().unwrap_or(&wildcard)))
|
||||
}
|
||||
|
||||
fn deserialize_some<'de, T, D>(deserializer: D) -> std::result::Result<Option<T>, D::Error>
|
||||
where
|
||||
T: Deserialize<'de>,
|
||||
D: Deserializer<'de>,
|
||||
{
|
||||
Deserialize::deserialize(deserializer).map(Some)
|
||||
}
|
||||
|
||||
#[derive(Clone, Default, Debug)]
|
||||
#[cfg_attr(test, derive(serde::Serialize))]
|
||||
pub struct Checked;
|
||||
#[derive(Clone, Default, Debug, Deserialize)]
|
||||
#[cfg_attr(test, derive(serde::Serialize))]
|
||||
pub struct Unchecked;
|
||||
|
||||
#[derive(Debug, Clone, Default, Deserialize)]
|
||||
#[cfg_attr(test, derive(serde::Serialize))]
|
||||
#[serde(deny_unknown_fields)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
#[serde(bound(
|
||||
serialize = "T: serde::Serialize",
|
||||
deserialize = "T: Deserialize<'static>"
|
||||
))]
|
||||
pub struct Settings<T> {
|
||||
#[serde(
|
||||
default,
|
||||
deserialize_with = "deserialize_some",
|
||||
serialize_with = "serialize_with_wildcard",
|
||||
skip_serializing_if = "Option::is_none"
|
||||
)]
|
||||
pub displayed_attributes: Option<Option<Vec<String>>>,
|
||||
|
||||
#[serde(
|
||||
default,
|
||||
deserialize_with = "deserialize_some",
|
||||
serialize_with = "serialize_with_wildcard",
|
||||
skip_serializing_if = "Option::is_none"
|
||||
)]
|
||||
pub searchable_attributes: Option<Option<Vec<String>>>,
|
||||
|
||||
#[serde(
|
||||
default,
|
||||
deserialize_with = "deserialize_some",
|
||||
skip_serializing_if = "Option::is_none"
|
||||
)]
|
||||
pub filterable_attributes: Option<Option<HashSet<String>>>,
|
||||
|
||||
#[serde(
|
||||
default,
|
||||
deserialize_with = "deserialize_some",
|
||||
skip_serializing_if = "Option::is_none"
|
||||
)]
|
||||
pub ranking_rules: Option<Option<Vec<String>>>,
|
||||
#[serde(
|
||||
default,
|
||||
deserialize_with = "deserialize_some",
|
||||
skip_serializing_if = "Option::is_none"
|
||||
)]
|
||||
pub stop_words: Option<Option<BTreeSet<String>>>,
|
||||
#[serde(
|
||||
default,
|
||||
deserialize_with = "deserialize_some",
|
||||
skip_serializing_if = "Option::is_none"
|
||||
)]
|
||||
pub synonyms: Option<Option<BTreeMap<String, Vec<String>>>>,
|
||||
#[serde(
|
||||
default,
|
||||
deserialize_with = "deserialize_some",
|
||||
skip_serializing_if = "Option::is_none"
|
||||
)]
|
||||
pub distinct_attribute: Option<Option<String>>,
|
||||
|
||||
#[serde(skip)]
|
||||
pub _kind: PhantomData<T>,
|
||||
}
|
||||
|
||||
impl Settings<Unchecked> {
|
||||
pub fn check(mut self) -> Settings<Checked> {
|
||||
let displayed_attributes = match self.displayed_attributes.take() {
|
||||
Some(Some(fields)) => {
|
||||
if fields.iter().any(|f| f == "*") {
|
||||
Some(None)
|
||||
} else {
|
||||
Some(Some(fields))
|
||||
}
|
||||
}
|
||||
otherwise => otherwise,
|
||||
};
|
||||
|
||||
let searchable_attributes = match self.searchable_attributes.take() {
|
||||
Some(Some(fields)) => {
|
||||
if fields.iter().any(|f| f == "*") {
|
||||
Some(None)
|
||||
} else {
|
||||
Some(Some(fields))
|
||||
}
|
||||
}
|
||||
otherwise => otherwise,
|
||||
};
|
||||
|
||||
Settings {
|
||||
displayed_attributes,
|
||||
searchable_attributes,
|
||||
filterable_attributes: self.filterable_attributes,
|
||||
ranking_rules: self.ranking_rules,
|
||||
stop_words: self.stop_words,
|
||||
synonyms: self.synonyms,
|
||||
distinct_attribute: self.distinct_attribute,
|
||||
_kind: PhantomData,
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,44 @@
|
||||
---
|
||||
source: dump/src/reader/v2/mod.rs
|
||||
expression: movies2.settings()
|
||||
---
|
||||
Ok(
|
||||
Settings {
|
||||
displayed_attributes: Some(
|
||||
None,
|
||||
),
|
||||
searchable_attributes: Some(
|
||||
None,
|
||||
),
|
||||
filterable_attributes: Some(
|
||||
Some(
|
||||
{},
|
||||
),
|
||||
),
|
||||
ranking_rules: Some(
|
||||
Some(
|
||||
[
|
||||
"words",
|
||||
"typo",
|
||||
"proximity",
|
||||
"attribute",
|
||||
"exactness",
|
||||
],
|
||||
),
|
||||
),
|
||||
stop_words: Some(
|
||||
Some(
|
||||
{},
|
||||
),
|
||||
),
|
||||
synonyms: Some(
|
||||
Some(
|
||||
{},
|
||||
),
|
||||
),
|
||||
distinct_attribute: Some(
|
||||
None,
|
||||
),
|
||||
_kind: PhantomData<dump::reader::v2::settings::Checked>,
|
||||
},
|
||||
)
|
@ -0,0 +1,5 @@
|
||||
---
|
||||
source: dump/src/reader/v2/mod.rs
|
||||
expression: documents
|
||||
---
|
||||
[]
|
@ -0,0 +1,44 @@
|
||||
---
|
||||
source: dump/src/reader/v2/mod.rs
|
||||
expression: spells.settings()
|
||||
---
|
||||
Ok(
|
||||
Settings {
|
||||
displayed_attributes: Some(
|
||||
None,
|
||||
),
|
||||
searchable_attributes: Some(
|
||||
None,
|
||||
),
|
||||
filterable_attributes: Some(
|
||||
Some(
|
||||
{},
|
||||
),
|
||||
),
|
||||
ranking_rules: Some(
|
||||
Some(
|
||||
[
|
||||
"words",
|
||||
"typo",
|
||||
"proximity",
|
||||
"attribute",
|
||||
"exactness",
|
||||
],
|
||||
),
|
||||
),
|
||||
stop_words: Some(
|
||||
Some(
|
||||
{},
|
||||
),
|
||||
),
|
||||
synonyms: Some(
|
||||
Some(
|
||||
{},
|
||||
),
|
||||
),
|
||||
distinct_attribute: Some(
|
||||
None,
|
||||
),
|
||||
_kind: PhantomData<dump::reader::v2::settings::Checked>,
|
||||
},
|
||||
)
|
@ -0,0 +1,533 @@
|
||||
---
|
||||
source: dump/src/reader/v2/mod.rs
|
||||
expression: documents
|
||||
---
|
||||
[
|
||||
{
|
||||
"index": "acid-arrow",
|
||||
"name": "Acid Arrow",
|
||||
"desc": [
|
||||
"A shimmering green arrow streaks toward a target within range and bursts in a spray of acid. Make a ranged spell attack against the target. On a hit, the target takes 4d4 acid damage immediately and 2d4 acid damage at the end of its next turn. On a miss, the arrow splashes the target with acid for half as much of the initial damage and no damage at the end of its next turn."
|
||||
],
|
||||
"higher_level": [
|
||||
"When you cast this spell using a spell slot of 3rd level or higher, the damage (both initial and later) increases by 1d4 for each slot level above 2nd."
|
||||
],
|
||||
"range": "90 feet",
|
||||
"components": [
|
||||
"V",
|
||||
"S",
|
||||
"M"
|
||||
],
|
||||
"material": "Powdered rhubarb leaf and an adder's stomach.",
|
||||
"ritual": false,
|
||||
"duration": "Instantaneous",
|
||||
"concentration": false,
|
||||
"casting_time": "1 action",
|
||||
"level": 2,
|
||||
"attack_type": "ranged",
|
||||
"damage": {
|
||||
"damage_type": {
|
||||
"index": "acid",
|
||||
"name": "Acid",
|
||||
"url": "/api/damage-types/acid"
|
||||
},
|
||||
"damage_at_slot_level": {
|
||||
"2": "4d4",
|
||||
"3": "5d4",
|
||||
"4": "6d4",
|
||||
"5": "7d4",
|
||||
"6": "8d4",
|
||||
"7": "9d4",
|
||||
"8": "10d4",
|
||||
"9": "11d4"
|
||||
}
|
||||
},
|
||||
"school": {
|
||||
"index": "evocation",
|
||||
"name": "Evocation",
|
||||
"url": "/api/magic-schools/evocation"
|
||||
},
|
||||
"classes": [
|
||||
{
|
||||
"index": "wizard",
|
||||
"name": "Wizard",
|
||||
"url": "/api/classes/wizard"
|
||||
}
|
||||
],
|
||||
"subclasses": [
|
||||
{
|
||||
"index": "lore",
|
||||
"name": "Lore",
|
||||
"url": "/api/subclasses/lore"
|
||||
},
|
||||
{
|
||||
"index": "land",
|
||||
"name": "Land",
|
||||
"url": "/api/subclasses/land"
|
||||
}
|
||||
],
|
||||
"url": "/api/spells/acid-arrow"
|
||||
},
|
||||
{
|
||||
"index": "acid-splash",
|
||||
"name": "Acid Splash",
|
||||
"desc": [
|
||||
"You hurl a bubble of acid. Choose one creature within range, or choose two creatures within range that are within 5 feet of each other. A target must succeed on a dexterity saving throw or take 1d6 acid damage.",
|
||||
"This spell's damage increases by 1d6 when you reach 5th level (2d6), 11th level (3d6), and 17th level (4d6)."
|
||||
],
|
||||
"range": "60 feet",
|
||||
"components": [
|
||||
"V",
|
||||
"S"
|
||||
],
|
||||
"ritual": false,
|
||||
"duration": "Instantaneous",
|
||||
"concentration": false,
|
||||
"casting_time": "1 action",
|
||||
"level": 0,
|
||||
"damage": {
|
||||
"damage_type": {
|
||||
"index": "acid",
|
||||
"name": "Acid",
|
||||
"url": "/api/damage-types/acid"
|
||||
},
|
||||
"damage_at_character_level": {
|
||||
"1": "1d6",
|
||||
"5": "2d6",
|
||||
"11": "3d6",
|
||||
"17": "4d6"
|
||||
}
|
||||
},
|
||||
"school": {
|
||||
"index": "conjuration",
|
||||
"name": "Conjuration",
|
||||
"url": "/api/magic-schools/conjuration"
|
||||
},
|
||||
"classes": [
|
||||
{
|
||||
"index": "sorcerer",
|
||||
"name": "Sorcerer",
|
||||
"url": "/api/classes/sorcerer"
|
||||
},
|
||||
{
|
||||
"index": "wizard",
|
||||
"name": "Wizard",
|
||||
"url": "/api/classes/wizard"
|
||||
}
|
||||
],
|
||||
"subclasses": [
|
||||
{
|
||||
"index": "lore",
|
||||
"name": "Lore",
|
||||
"url": "/api/subclasses/lore"
|
||||
}
|
||||
],
|
||||
"url": "/api/spells/acid-splash",
|
||||
"dc": {
|
||||
"dc_type": {
|
||||
"index": "dex",
|
||||
"name": "DEX",
|
||||
"url": "/api/ability-scores/dex"
|
||||
},
|
||||
"dc_success": "none"
|
||||
}
|
||||
},
|
||||
{
|
||||
"index": "aid",
|
||||
"name": "Aid",
|
||||
"desc": [
|
||||
"Your spell bolsters your allies with toughness and resolve. Choose up to three creatures within range. Each target's hit point maximum and current hit points increase by 5 for the duration."
|
||||
],
|
||||
"higher_level": [
|
||||
"When you cast this spell using a spell slot of 3rd level or higher, a target's hit points increase by an additional 5 for each slot level above 2nd."
|
||||
],
|
||||
"range": "30 feet",
|
||||
"components": [
|
||||
"V",
|
||||
"S",
|
||||
"M"
|
||||
],
|
||||
"material": "A tiny strip of white cloth.",
|
||||
"ritual": false,
|
||||
"duration": "8 hours",
|
||||
"concentration": false,
|
||||
"casting_time": "1 action",
|
||||
"level": 2,
|
||||
"school": {
|
||||
"index": "abjuration",
|
||||
"name": "Abjuration",
|
||||
"url": "/api/magic-schools/abjuration"
|
||||
},
|
||||
"classes": [
|
||||
{
|
||||
"index": "cleric",
|
||||
"name": "Cleric",
|
||||
"url": "/api/classes/cleric"
|
||||
},
|
||||
{
|
||||
"index": "paladin",
|
||||
"name": "Paladin",
|
||||
"url": "/api/classes/paladin"
|
||||
}
|
||||
],
|
||||
"subclasses": [
|
||||
{
|
||||
"index": "lore",
|
||||
"name": "Lore",
|
||||
"url": "/api/subclasses/lore"
|
||||
}
|
||||
],
|
||||
"url": "/api/spells/aid",
|
||||
"heal_at_slot_level": {
|
||||
"2": "5",
|
||||
"3": "10",
|
||||
"4": "15",
|
||||
"5": "20",
|
||||
"6": "25",
|
||||
"7": "30",
|
||||
"8": "35",
|
||||
"9": "40"
|
||||
}
|
||||
},
|
||||
{
|
||||
"index": "alarm",
|
||||
"name": "Alarm",
|
||||
"desc": [
|
||||
"You set an alarm against unwanted intrusion. Choose a door, a window, or an area within range that is no larger than a 20-foot cube. Until the spell ends, an alarm alerts you whenever a Tiny or larger creature touches or enters the warded area. When you cast the spell, you can designate creatures that won't set off the alarm. You also choose whether the alarm is mental or audible.",
|
||||
"A mental alarm alerts you with a ping in your mind if you are within 1 mile of the warded area. This ping awakens you if you are sleeping.",
|
||||
"An audible alarm produces the sound of a hand bell for 10 seconds within 60 feet."
|
||||
],
|
||||
"range": "30 feet",
|
||||
"components": [
|
||||
"V",
|
||||
"S",
|
||||
"M"
|
||||
],
|
||||
"material": "A tiny bell and a piece of fine silver wire.",
|
||||
"ritual": true,
|
||||
"duration": "8 hours",
|
||||
"concentration": false,
|
||||
"casting_time": "1 minute",
|
||||
"level": 1,
|
||||
"school": {
|
||||
"index": "abjuration",
|
||||
"name": "Abjuration",
|
||||
"url": "/api/magic-schools/abjuration"
|
||||
},
|
||||
"classes": [
|
||||
{
|
||||
"index": "ranger",
|
||||
"name": "Ranger",
|
||||
"url": "/api/classes/ranger"
|
||||
},
|
||||
{
|
||||
"index": "wizard",
|
||||
"name": "Wizard",
|
||||
"url": "/api/classes/wizard"
|
||||
}
|
||||
],
|
||||
"subclasses": [
|
||||
{
|
||||
"index": "lore",
|
||||
"name": "Lore",
|
||||
"url": "/api/subclasses/lore"
|
||||
}
|
||||
],
|
||||
"url": "/api/spells/alarm",
|
||||
"area_of_effect": {
|
||||
"type": "cube",
|
||||
"size": 20
|
||||
}
|
||||
},
|
||||
{
|
||||
"index": "alter-self",
|
||||
"name": "Alter Self",
|
||||
"desc": [
|
||||
"You assume a different form. When you cast the spell, choose one of the following options, the effects of which last for the duration of the spell. While the spell lasts, you can end one option as an action to gain the benefits of a different one.",
|
||||
"***Aquatic Adaptation.*** You adapt your body to an aquatic environment, sprouting gills and growing webbing between your fingers. You can breathe underwater and gain a swimming speed equal to your walking speed.",
|
||||
"***Change Appearance.*** You transform your appearance. You decide what you look like, including your height, weight, facial features, sound of your voice, hair length, coloration, and distinguishing characteristics, if any. You can make yourself appear as a member of another race, though none of your statistics change. You also can't appear as a creature of a different size than you, and your basic shape stays the same; if you're bipedal, you can't use this spell to become quadrupedal, for instance. At any time for the duration of the spell, you can use your action to change your appearance in this way again.",
|
||||
"***Natural Weapons.*** You grow claws, fangs, spines, horns, or a different natural weapon of your choice. Your unarmed strikes deal 1d6 bludgeoning, piercing, or slashing damage, as appropriate to the natural weapon you chose, and you are proficient with your unarmed strikes. Finally, the natural weapon is magic and you have a +1 bonus to the attack and damage rolls you make using it."
|
||||
],
|
||||
"range": "Self",
|
||||
"components": [
|
||||
"V",
|
||||
"S"
|
||||
],
|
||||
"ritual": false,
|
||||
"duration": "Up to 1 hour",
|
||||
"concentration": true,
|
||||
"casting_time": "1 action",
|
||||
"level": 2,
|
||||
"school": {
|
||||
"index": "transmutation",
|
||||
"name": "Transmutation",
|
||||
"url": "/api/magic-schools/transmutation"
|
||||
},
|
||||
"classes": [
|
||||
{
|
||||
"index": "sorcerer",
|
||||
"name": "Sorcerer",
|
||||
"url": "/api/classes/sorcerer"
|
||||
},
|
||||
{
|
||||
"index": "wizard",
|
||||
"name": "Wizard",
|
||||
"url": "/api/classes/wizard"
|
||||
}
|
||||
],
|
||||
"subclasses": [
|
||||
{
|
||||
"index": "lore",
|
||||
"name": "Lore",
|
||||
"url": "/api/subclasses/lore"
|
||||
}
|
||||
],
|
||||
"url": "/api/spells/alter-self"
|
||||
},
|
||||
{
|
||||
"index": "animal-friendship",
|
||||
"name": "Animal Friendship",
|
||||
"desc": [
|
||||
"This spell lets you convince a beast that you mean it no harm. Choose a beast that you can see within range. It must see and hear you. If the beast's Intelligence is 4 or higher, the spell fails. Otherwise, the beast must succeed on a wisdom saving throw or be charmed by you for the spell's duration. If you or one of your companions harms the target, the spells ends."
|
||||
],
|
||||
"range": "30 feet",
|
||||
"components": [
|
||||
"V",
|
||||
"S",
|
||||
"M"
|
||||
],
|
||||
"material": "A morsel of food.",
|
||||
"ritual": false,
|
||||
"duration": "24 hours",
|
||||
"concentration": false,
|
||||
"casting_time": "1 action",
|
||||
"level": 1,
|
||||
"school": {
|
||||
"index": "enchantment",
|
||||
"name": "Enchantment",
|
||||
"url": "/api/magic-schools/enchantment"
|
||||
},
|
||||
"classes": [
|
||||
{
|
||||
"index": "bard",
|
||||
"name": "Bard",
|
||||
"url": "/api/classes/bard"
|
||||
},
|
||||
{
|
||||
"index": "cleric",
|
||||
"name": "Cleric",
|
||||
"url": "/api/classes/cleric"
|
||||
},
|
||||
{
|
||||
"index": "druid",
|
||||
"name": "Druid",
|
||||
"url": "/api/classes/druid"
|
||||
},
|
||||
{
|
||||
"index": "ranger",
|
||||
"name": "Ranger",
|
||||
"url": "/api/classes/ranger"
|
||||
}
|
||||
],
|
||||
"subclasses": [],
|
||||
"url": "/api/spells/animal-friendship",
|
||||
"dc": {
|
||||
"dc_type": {
|
||||
"index": "wis",
|
||||
"name": "WIS",
|
||||
"url": "/api/ability-scores/wis"
|
||||
},
|
||||
"dc_success": "none"
|
||||
}
|
||||
},
|
||||
{
|
||||
"index": "animal-messenger",
|
||||
"name": "Animal Messenger",
|
||||
"desc": [
|
||||
"By means of this spell, you use an animal to deliver a message. Choose a Tiny beast you can see within range, such as a squirrel, a blue jay, or a bat. You specify a location, which you must have visited, and a recipient who matches a general description, such as \"a man or woman dressed in the uniform of the town guard\" or \"a red-haired dwarf wearing a pointed hat.\" You also speak a message of up to twenty-five words. The target beast travels for the duration of the spell toward the specified location, covering about 50 miles per 24 hours for a flying messenger, or 25 miles for other animals.",
|
||||
"When the messenger arrives, it delivers your message to the creature that you described, replicating the sound of your voice. The messenger speaks only to a creature matching the description you gave. If the messenger doesn't reach its destination before the spell ends, the message is lost, and the beast makes its way back to where you cast this spell."
|
||||
],
|
||||
"higher_level": [
|
||||
"If you cast this spell using a spell slot of 3nd level or higher, the duration of the spell increases by 48 hours for each slot level above 2nd."
|
||||
],
|
||||
"range": "30 feet",
|
||||
"components": [
|
||||
"V",
|
||||
"S",
|
||||
"M"
|
||||
],
|
||||
"material": "A morsel of food.",
|
||||
"ritual": true,
|
||||
"duration": "24 hours",
|
||||
"concentration": false,
|
||||
"casting_time": "1 action",
|
||||
"level": 2,
|
||||
"school": {
|
||||
"index": "enchantment",
|
||||
"name": "Enchantment",
|
||||
"url": "/api/magic-schools/enchantment"
|
||||
},
|
||||
"classes": [
|
||||
{
|
||||
"index": "bard",
|
||||
"name": "Bard",
|
||||
"url": "/api/classes/bard"
|
||||
},
|
||||
{
|
||||
"index": "druid",
|
||||
"name": "Druid",
|
||||
"url": "/api/classes/druid"
|
||||
},
|
||||
{
|
||||
"index": "ranger",
|
||||
"name": "Ranger",
|
||||
"url": "/api/classes/ranger"
|
||||
}
|
||||
],
|
||||
"subclasses": [
|
||||
{
|
||||
"index": "lore",
|
||||
"name": "Lore",
|
||||
"url": "/api/subclasses/lore"
|
||||
}
|
||||
],
|
||||
"url": "/api/spells/animal-messenger"
|
||||
},
|
||||
{
|
||||
"index": "animal-shapes",
|
||||
"name": "Animal Shapes",
|
||||
"desc": [
|
||||
"Your magic turns others into beasts. Choose any number of willing creatures that you can see within range. You transform each target into the form of a Large or smaller beast with a challenge rating of 4 or lower. On subsequent turns, you can use your action to transform affected creatures into new forms.",
|
||||
"The transformation lasts for the duration for each target, or until the target drops to 0 hit points or dies. You can choose a different form for each target. A target's game statistics are replaced by the statistics of the chosen beast, though the target retains its alignment and Intelligence, Wisdom, and Charisma scores. The target assumes the hit points of its new form, and when it reverts to its normal form, it returns to the number of hit points it had before it transformed. If it reverts as a result of dropping to 0 hit points, any excess damage carries over to its normal form. As long as the excess damage doesn't reduce the creature's normal form to 0 hit points, it isn't knocked unconscious. The creature is limited in the actions it can perform by the nature of its new form, and it can't speak or cast spells.",
|
||||
"The target's gear melds into the new form. The target can't activate, wield, or otherwise benefit from any of its equipment."
|
||||
],
|
||||
"range": "30 feet",
|
||||
"components": [
|
||||
"V",
|
||||
"S"
|
||||
],
|
||||
"ritual": false,
|
||||
"duration": "Up to 24 hours",
|
||||
"concentration": true,
|
||||
"casting_time": "1 action",
|
||||
"level": 8,
|
||||
"school": {
|
||||
"index": "transmutation",
|
||||
"name": "Transmutation",
|
||||
"url": "/api/magic-schools/transmutation"
|
||||
},
|
||||
"classes": [
|
||||
{
|
||||
"index": "druid",
|
||||
"name": "Druid",
|
||||
"url": "/api/classes/druid"
|
||||
}
|
||||
],
|
||||
"subclasses": [],
|
||||
"url": "/api/spells/animal-shapes"
|
||||
},
|
||||
{
|
||||
"index": "animate-dead",
|
||||
"name": "Animate Dead",
|
||||
"desc": [
|
||||
"This spell creates an undead servant. Choose a pile of bones or a corpse of a Medium or Small humanoid within range. Your spell imbues the target with a foul mimicry of life, raising it as an undead creature. The target becomes a skeleton if you chose bones or a zombie if you chose a corpse (the DM has the creature's game statistics).",
|
||||
"On each of your turns, you can use a bonus action to mentally command any creature you made with this spell if the creature is within 60 feet of you (if you control multiple creatures, you can command any or all of them at the same time, issuing the same command to each one). You decide what action the creature will take and where it will move during its next turn, or you can issue a general command, such as to guard a particular chamber or corridor. If you issue no commands, the creature only defends itself against hostile creatures. Once given an order, the creature continues to follow it until its task is complete.",
|
||||
"The creature is under your control for 24 hours, after which it stops obeying any command you've given it. To maintain control of the creature for another 24 hours, you must cast this spell on the creature again before the current 24-hour period ends. This use of the spell reasserts your control over up to four creatures you have animated with this spell, rather than animating a new one."
|
||||
],
|
||||
"higher_level": [
|
||||
"When you cast this spell using a spell slot of 4th level or higher, you animate or reassert control over two additional undead creatures for each slot level above 3rd. Each of the creatures must come from a different corpse or pile of bones."
|
||||
],
|
||||
"range": "10 feet",
|
||||
"components": [
|
||||
"V",
|
||||
"S",
|
||||
"M"
|
||||
],
|
||||
"material": "A drop of blood, a piece of flesh, and a pinch of bone dust.",
|
||||
"ritual": false,
|
||||
"duration": "Instantaneous",
|
||||
"concentration": false,
|
||||
"casting_time": "1 minute",
|
||||
"level": 3,
|
||||
"school": {
|
||||
"index": "necromancy",
|
||||
"name": "Necromancy",
|
||||
"url": "/api/magic-schools/necromancy"
|
||||
},
|
||||
"classes": [
|
||||
{
|
||||
"index": "cleric",
|
||||
"name": "Cleric",
|
||||
"url": "/api/classes/cleric"
|
||||
},
|
||||
{
|
||||
"index": "wizard",
|
||||
"name": "Wizard",
|
||||
"url": "/api/classes/wizard"
|
||||
}
|
||||
],
|
||||
"subclasses": [
|
||||
{
|
||||
"index": "lore",
|
||||
"name": "Lore",
|
||||
"url": "/api/subclasses/lore"
|
||||
}
|
||||
],
|
||||
"url": "/api/spells/animate-dead"
|
||||
},
|
||||
{
|
||||
"index": "animate-objects",
|
||||
"name": "Animate Objects",
|
||||
"desc": [
|
||||
"Objects come to life at your command. Choose up to ten nonmagical objects within range that are not being worn or carried. Medium targets count as two objects, Large targets count as four objects, Huge targets count as eight objects. You can't animate any object larger than Huge. Each target animates and becomes a creature under your control until the spell ends or until reduced to 0 hit points.",
|
||||
"As a bonus action, you can mentally command any creature you made with this spell if the creature is within 500 feet of you (if you control multiple creatures, you can command any or all of them at the same time, issuing the same command to each one). You decide what action the creature will take and where it will move during its next turn, or you can issue a general command, such as to guard a particular chamber or corridor. If you issue no commands, the creature only defends itself against hostile creatures. Once given an order, the creature continues to follow it until its task is complete.",
|
||||
"##### Animated Object Statistics",
|
||||
"| Size | HP | AC | Attack | Str | Dex |",
|
||||
"|---|---|---|---|---|---|",
|
||||
"| Tiny | 20 | 18 | +8 to hit, 1d4 + 4 damage | 4 | 18 |",
|
||||
"| Small | 25 | 16 | +6 to hit, 1d8 + 2 damage | 6 | 14 |",
|
||||
"| Medium | 40 | 13 | +5 to hit, 2d6 + 1 damage | 10 | 12 |",
|
||||
"| Large | 50 | 10 | +6 to hit, 2d10 + 2 damage | 14 | 10 |",
|
||||
"| Huge | 80 | 10 | +8 to hit, 2d12 + 4 damage | 18 | 6 |",
|
||||
"An animated object is a construct with AC, hit points, attacks, Strength, and Dexterity determined by its size. Its Constitution is 10 and its Intelligence and Wisdom are 3, and its Charisma is 1. Its speed is 30 feet; if the object lacks legs or other appendages it can use for locomotion, it instead has a flying speed of 30 feet and can hover. If the object is securely attached to a surface or a larger object, such as a chain bolted to a wall, its speed is 0. It has blindsight with a radius of 30 feet and is blind beyond that distance. When the animated object drops to 0 hit points, it reverts to its original object form, and any remaining damage carries over to its original object form.",
|
||||
"If you command an object to attack, it can make a single melee attack against a creature within 5 feet of it. It makes a slam attack with an attack bonus and bludgeoning damage determined by its size. The DM might rule that a specific object inflicts slashing or piercing damage based on its form."
|
||||
],
|
||||
"higher_level": [
|
||||
"If you cast this spell using a spell slot of 6th level or higher, you can animate two additional objects for each slot level above 5th."
|
||||
],
|
||||
"range": "120 feet",
|
||||
"components": [
|
||||
"V",
|
||||
"S"
|
||||
],
|
||||
"ritual": false,
|
||||
"duration": "Up to 1 minute",
|
||||
"concentration": true,
|
||||
"casting_time": "1 action",
|
||||
"level": 5,
|
||||
"school": {
|
||||
"index": "transmutation",
|
||||
"name": "Transmutation",
|
||||
"url": "/api/magic-schools/transmutation"
|
||||
},
|
||||
"classes": [
|
||||
{
|
||||
"index": "bard",
|
||||
"name": "Bard",
|
||||
"url": "/api/classes/bard"
|
||||
},
|
||||
{
|
||||
"index": "sorcerer",
|
||||
"name": "Sorcerer",
|
||||
"url": "/api/classes/sorcerer"
|
||||
},
|
||||
{
|
||||
"index": "wizard",
|
||||
"name": "Wizard",
|
||||
"url": "/api/classes/wizard"
|
||||
}
|
||||
],
|
||||
"subclasses": [],
|
||||
"url": "/api/spells/animate-objects"
|
||||
}
|
||||
]
|
@ -0,0 +1,208 @@
|
||||
---
|
||||
source: dump/src/reader/v2/mod.rs
|
||||
expression: tasks
|
||||
---
|
||||
[
|
||||
{
|
||||
"uuid": "5867e9f1-1ebb-4145-b0ec-b61b29da43e9",
|
||||
"update": {
|
||||
"status": "enqueued",
|
||||
"updateId": 0,
|
||||
"meta": {
|
||||
"type": "DocumentsAddition",
|
||||
"method": "ReplaceDocuments",
|
||||
"format": "Json",
|
||||
"primary_key": null
|
||||
},
|
||||
"enqueuedAt": "2022-10-09T20:27:59.828915609Z",
|
||||
"content": "1d0832b1-02f7-4c56-849e-d150d266ab46"
|
||||
}
|
||||
},
|
||||
{
|
||||
"uuid": "5661371a-21ab-4363-b2e5-5ca66126e5e0",
|
||||
"update": {
|
||||
"status": "processed",
|
||||
"success": "Other",
|
||||
"processedAt": "2022-10-09T20:27:22.688964637Z",
|
||||
"updateId": 0,
|
||||
"meta": {
|
||||
"type": "Settings",
|
||||
"synonyms": {
|
||||
"android": [
|
||||
"phone",
|
||||
"smartphone"
|
||||
],
|
||||
"iphone": [
|
||||
"phone",
|
||||
"smartphone"
|
||||
],
|
||||
"phone": [
|
||||
"smartphone",
|
||||
"iphone",
|
||||
"android"
|
||||
]
|
||||
}
|
||||
},
|
||||
"enqueuedAt": "2022-10-09T20:27:22.597296237Z",
|
||||
"content": null,
|
||||
"startedProcessingAt": "2022-10-09T20:27:22.610066114Z"
|
||||
}
|
||||
},
|
||||
{
|
||||
"uuid": "5661371a-21ab-4363-b2e5-5ca66126e5e0",
|
||||
"update": {
|
||||
"status": "failed",
|
||||
"updateId": 1,
|
||||
"meta": {
|
||||
"type": "DocumentsAddition",
|
||||
"method": "ReplaceDocuments",
|
||||
"format": "Json",
|
||||
"primary_key": null
|
||||
},
|
||||
"enqueuedAt": "2022-10-09T20:27:23.305963122Z",
|
||||
"content": null,
|
||||
"startedProcessingAt": "2022-10-09T20:27:23.312497053Z",
|
||||
"error": {
|
||||
"message": "missing primary key",
|
||||
"errorCode": "missing_primary_key",
|
||||
"errorType": "invalid_request_error",
|
||||
"errorLink": "https://docs.meilisearch.com/errors#missing_primary_key"
|
||||
},
|
||||
"failedAt": "2022-10-09T20:27:23.31297828Z"
|
||||
}
|
||||
},
|
||||
{
|
||||
"uuid": "5661371a-21ab-4363-b2e5-5ca66126e5e0",
|
||||
"update": {
|
||||
"status": "processed",
|
||||
"success": {
|
||||
"DocumentsAddition": {
|
||||
"nb_documents": 10
|
||||
}
|
||||
},
|
||||
"processedAt": "2022-10-09T20:27:23.951017769Z",
|
||||
"updateId": 2,
|
||||
"meta": {
|
||||
"type": "DocumentsAddition",
|
||||
"method": "ReplaceDocuments",
|
||||
"format": "Json",
|
||||
"primary_key": "sku"
|
||||
},
|
||||
"enqueuedAt": "2022-10-09T20:27:23.91528854Z",
|
||||
"content": null,
|
||||
"startedProcessingAt": "2022-10-09T20:27:23.921493715Z"
|
||||
}
|
||||
},
|
||||
{
|
||||
"uuid": "bb33e237-be17-453c-83a2-4fef67d03220",
|
||||
"update": {
|
||||
"status": "processed",
|
||||
"success": {
|
||||
"DocumentsAddition": {
|
||||
"nb_documents": 10
|
||||
}
|
||||
},
|
||||
"processedAt": "2022-10-09T20:27:22.197788495Z",
|
||||
"updateId": 0,
|
||||
"meta": {
|
||||
"type": "DocumentsAddition",
|
||||
"method": "ReplaceDocuments",
|
||||
"format": "Json",
|
||||
"primary_key": null
|
||||
},
|
||||
"enqueuedAt": "2022-10-09T20:27:22.075264451Z",
|
||||
"content": null,
|
||||
"startedProcessingAt": "2022-10-09T20:27:22.085751162Z"
|
||||
}
|
||||
},
|
||||
{
|
||||
"uuid": "bb33e237-be17-453c-83a2-4fef67d03220",
|
||||
"update": {
|
||||
"status": "processed",
|
||||
"success": "Other",
|
||||
"processedAt": "2022-10-09T20:27:22.411761344Z",
|
||||
"updateId": 1,
|
||||
"meta": {
|
||||
"type": "Settings",
|
||||
"rankingRules": [
|
||||
"words",
|
||||
"typo",
|
||||
"proximity",
|
||||
"attribute",
|
||||
"exactness",
|
||||
"asc(release_date)"
|
||||
]
|
||||
},
|
||||
"enqueuedAt": "2022-10-09T20:27:22.380218549Z",
|
||||
"content": null,
|
||||
"startedProcessingAt": "2022-10-09T20:27:22.393023806Z"
|
||||
}
|
||||
},
|
||||
{
|
||||
"uuid": "bb33e237-be17-453c-83a2-4fef67d03220",
|
||||
"update": {
|
||||
"status": "processed",
|
||||
"success": {
|
||||
"DocumentsAddition": {
|
||||
"nb_documents": 100
|
||||
}
|
||||
},
|
||||
"processedAt": "2022-10-09T20:28:01.93111053Z",
|
||||
"updateId": 2,
|
||||
"meta": {
|
||||
"type": "DocumentsAddition",
|
||||
"method": "ReplaceDocuments",
|
||||
"format": "Json",
|
||||
"primary_key": null
|
||||
},
|
||||
"enqueuedAt": "2022-10-09T20:27:59.817923645Z",
|
||||
"content": null,
|
||||
"startedProcessingAt": "2022-10-09T20:27:59.829038211Z"
|
||||
}
|
||||
},
|
||||
{
|
||||
"uuid": "f20c9936-a26e-4960-8a1f-3bdb390608f2",
|
||||
"update": {
|
||||
"status": "failed",
|
||||
"updateId": 0,
|
||||
"meta": {
|
||||
"type": "DocumentsAddition",
|
||||
"method": "ReplaceDocuments",
|
||||
"format": "Json",
|
||||
"primary_key": null
|
||||
},
|
||||
"enqueuedAt": "2022-10-09T20:27:24.157663206Z",
|
||||
"content": null,
|
||||
"startedProcessingAt": "2022-10-09T20:27:24.162839906Z",
|
||||
"error": {
|
||||
"message": "missing primary key",
|
||||
"errorCode": "missing_primary_key",
|
||||
"errorType": "invalid_request_error",
|
||||
"errorLink": "https://docs.meilisearch.com/errors#missing_primary_key"
|
||||
},
|
||||
"failedAt": "2022-10-09T20:27:24.242683494Z"
|
||||
}
|
||||
},
|
||||
{
|
||||
"uuid": "f20c9936-a26e-4960-8a1f-3bdb390608f2",
|
||||
"update": {
|
||||
"status": "processed",
|
||||
"success": {
|
||||
"DocumentsAddition": {
|
||||
"nb_documents": 10
|
||||
}
|
||||
},
|
||||
"processedAt": "2022-10-09T20:27:24.312809641Z",
|
||||
"updateId": 1,
|
||||
"meta": {
|
||||
"type": "DocumentsAddition",
|
||||
"method": "ReplaceDocuments",
|
||||
"format": "Json",
|
||||
"primary_key": "index"
|
||||
},
|
||||
"enqueuedAt": "2022-10-09T20:27:24.283289037Z",
|
||||
"content": null,
|
||||
"startedProcessingAt": "2022-10-09T20:27:24.285985108Z"
|
||||
}
|
||||
}
|
||||
]
|
@ -0,0 +1,58 @@
|
||||
---
|
||||
source: dump/src/reader/v2/mod.rs
|
||||
expression: products.settings()
|
||||
---
|
||||
Ok(
|
||||
Settings {
|
||||
displayed_attributes: Some(
|
||||
None,
|
||||
),
|
||||
searchable_attributes: Some(
|
||||
None,
|
||||
),
|
||||
filterable_attributes: Some(
|
||||
Some(
|
||||
{},
|
||||
),
|
||||
),
|
||||
ranking_rules: Some(
|
||||
Some(
|
||||
[
|
||||
"words",
|
||||
"typo",
|
||||
"proximity",
|
||||
"attribute",
|
||||
"exactness",
|
||||
],
|
||||
),
|
||||
),
|
||||
stop_words: Some(
|
||||
Some(
|
||||
{},
|
||||
),
|
||||
),
|
||||
synonyms: Some(
|
||||
Some(
|
||||
{
|
||||
"android": [
|
||||
"phone",
|
||||
"smartphone",
|
||||
],
|
||||
"iphone": [
|
||||
"phone",
|
||||
"smartphone",
|
||||
],
|
||||
"phone": [
|
||||
"android",
|
||||
"iphone",
|
||||
"smartphone",
|
||||
],
|
||||
},
|
||||
),
|
||||
),
|
||||
distinct_attribute: Some(
|
||||
None,
|
||||
),
|
||||
_kind: PhantomData<dump::reader::v2::settings::Checked>,
|
||||
},
|
||||
)
|
@ -0,0 +1,308 @@
|
||||
---
|
||||
source: dump/src/reader/v2/mod.rs
|
||||
expression: documents
|
||||
---
|
||||
[
|
||||
{
|
||||
"sku": 127687,
|
||||
"name": "Duracell - AA Batteries (8-Pack)",
|
||||
"type": "HardGood",
|
||||
"price": 7.49,
|
||||
"upc": "041333825014",
|
||||
"category": [
|
||||
{
|
||||
"id": "pcmcat312300050015",
|
||||
"name": "Connected Home & Housewares"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat248700050021",
|
||||
"name": "Housewares"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat303600050001",
|
||||
"name": "Household Batteries"
|
||||
},
|
||||
{
|
||||
"id": "abcat0208002",
|
||||
"name": "Alkaline Batteries"
|
||||
}
|
||||
],
|
||||
"shipping": 5.49,
|
||||
"description": "Compatible with select electronic devices; AA size; DURALOCK Power Preserve technology; 8-pack",
|
||||
"manufacturer": "Duracell",
|
||||
"model": "MN1500B8Z",
|
||||
"url": "http://www.bestbuy.com/site/duracell-aa-batteries-8-pack/127687.p?id=1051384045676&skuId=127687&cmp=RMXCC",
|
||||
"image": "http://img.bbystatic.com/BestBuy_US/images/products/1276/127687_sa.jpg"
|
||||
},
|
||||
{
|
||||
"sku": 150115,
|
||||
"name": "Energizer - MAX Batteries AA (4-Pack)",
|
||||
"type": "HardGood",
|
||||
"price": 4.99,
|
||||
"upc": "039800011329",
|
||||
"category": [
|
||||
{
|
||||
"id": "pcmcat312300050015",
|
||||
"name": "Connected Home & Housewares"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat248700050021",
|
||||
"name": "Housewares"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat303600050001",
|
||||
"name": "Household Batteries"
|
||||
},
|
||||
{
|
||||
"id": "abcat0208002",
|
||||
"name": "Alkaline Batteries"
|
||||
}
|
||||
],
|
||||
"shipping": 5.49,
|
||||
"description": "4-pack AA alkaline batteries; battery tester included",
|
||||
"manufacturer": "Energizer",
|
||||
"model": "E91BP-4",
|
||||
"url": "http://www.bestbuy.com/site/energizer-max-batteries-aa-4-pack/150115.p?id=1051384046217&skuId=150115&cmp=RMXCC",
|
||||
"image": "http://img.bbystatic.com/BestBuy_US/images/products/1501/150115_sa.jpg"
|
||||
},
|
||||
{
|
||||
"sku": 185230,
|
||||
"name": "Duracell - C Batteries (4-Pack)",
|
||||
"type": "HardGood",
|
||||
"price": 8.99,
|
||||
"upc": "041333440019",
|
||||
"category": [
|
||||
{
|
||||
"id": "pcmcat312300050015",
|
||||
"name": "Connected Home & Housewares"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat248700050021",
|
||||
"name": "Housewares"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat303600050001",
|
||||
"name": "Household Batteries"
|
||||
},
|
||||
{
|
||||
"id": "abcat0208002",
|
||||
"name": "Alkaline Batteries"
|
||||
}
|
||||
],
|
||||
"shipping": 5.49,
|
||||
"description": "Compatible with select electronic devices; C size; DURALOCK Power Preserve technology; 4-pack",
|
||||
"manufacturer": "Duracell",
|
||||
"model": "MN1400R4Z",
|
||||
"url": "http://www.bestbuy.com/site/duracell-c-batteries-4-pack/185230.p?id=1051384046486&skuId=185230&cmp=RMXCC",
|
||||
"image": "http://img.bbystatic.com/BestBuy_US/images/products/1852/185230_sa.jpg"
|
||||
},
|
||||
{
|
||||
"sku": 185267,
|
||||
"name": "Duracell - D Batteries (4-Pack)",
|
||||
"type": "HardGood",
|
||||
"price": 9.99,
|
||||
"upc": "041333430010",
|
||||
"category": [
|
||||
{
|
||||
"id": "pcmcat312300050015",
|
||||
"name": "Connected Home & Housewares"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat248700050021",
|
||||
"name": "Housewares"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat303600050001",
|
||||
"name": "Household Batteries"
|
||||
},
|
||||
{
|
||||
"id": "abcat0208002",
|
||||
"name": "Alkaline Batteries"
|
||||
}
|
||||
],
|
||||
"shipping": 5.99,
|
||||
"description": "Compatible with select electronic devices; D size; DURALOCK Power Preserve technology; 4-pack",
|
||||
"manufacturer": "Duracell",
|
||||
"model": "MN1300R4Z",
|
||||
"url": "http://www.bestbuy.com/site/duracell-d-batteries-4-pack/185267.p?id=1051384046551&skuId=185267&cmp=RMXCC",
|
||||
"image": "http://img.bbystatic.com/BestBuy_US/images/products/1852/185267_sa.jpg"
|
||||
},
|
||||
{
|
||||
"sku": 312290,
|
||||
"name": "Duracell - 9V Batteries (2-Pack)",
|
||||
"type": "HardGood",
|
||||
"price": 7.99,
|
||||
"upc": "041333216010",
|
||||
"category": [
|
||||
{
|
||||
"id": "pcmcat312300050015",
|
||||
"name": "Connected Home & Housewares"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat248700050021",
|
||||
"name": "Housewares"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat303600050001",
|
||||
"name": "Household Batteries"
|
||||
},
|
||||
{
|
||||
"id": "abcat0208002",
|
||||
"name": "Alkaline Batteries"
|
||||
}
|
||||
],
|
||||
"shipping": 5.49,
|
||||
"description": "Compatible with select electronic devices; alkaline chemistry; 9V size; DURALOCK Power Preserve technology; 2-pack",
|
||||
"manufacturer": "Duracell",
|
||||
"model": "MN1604B2Z",
|
||||
"url": "http://www.bestbuy.com/site/duracell-9v-batteries-2-pack/312290.p?id=1051384050321&skuId=312290&cmp=RMXCC",
|
||||
"image": "http://img.bbystatic.com/BestBuy_US/images/products/3122/312290_sa.jpg"
|
||||
},
|
||||
{
|
||||
"sku": 324884,
|
||||
"name": "Directed Electronics - Viper Audio Glass Break Sensor",
|
||||
"type": "HardGood",
|
||||
"price": 39.99,
|
||||
"upc": "093207005060",
|
||||
"category": [
|
||||
{
|
||||
"id": "pcmcat113100050015",
|
||||
"name": "Carfi Instore Only"
|
||||
}
|
||||
],
|
||||
"shipping": 0,
|
||||
"description": "From our expanded online assortment; compatible with Directed Electronics alarm systems; microphone and microprocessor detect and analyze intrusions; detects quiet glass breaks",
|
||||
"manufacturer": "Directed Electronics",
|
||||
"model": "506T",
|
||||
"url": "http://www.bestbuy.com/site/directed-electronics-viper-audio-glass-break-sensor/324884.p?id=1112808077651&skuId=324884&cmp=RMXCC",
|
||||
"image": "http://img.bbystatic.com/BestBuy_US/images/products/3248/324884_rc.jpg"
|
||||
},
|
||||
{
|
||||
"sku": 333179,
|
||||
"name": "Energizer - N Cell E90 Batteries (2-Pack)",
|
||||
"type": "HardGood",
|
||||
"price": 5.99,
|
||||
"upc": "039800013200",
|
||||
"category": [
|
||||
{
|
||||
"id": "pcmcat312300050015",
|
||||
"name": "Connected Home & Housewares"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat248700050021",
|
||||
"name": "Housewares"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat303600050001",
|
||||
"name": "Household Batteries"
|
||||
},
|
||||
{
|
||||
"id": "abcat0208006",
|
||||
"name": "Specialty Batteries"
|
||||
}
|
||||
],
|
||||
"shipping": 5.49,
|
||||
"description": "Alkaline batteries; 1.5V",
|
||||
"manufacturer": "Energizer",
|
||||
"model": "E90BP-2",
|
||||
"url": "http://www.bestbuy.com/site/energizer-n-cell-e90-batteries-2-pack/333179.p?id=1185268509951&skuId=333179&cmp=RMXCC",
|
||||
"image": "http://img.bbystatic.com/BestBuy_US/images/products/3331/333179_sa.jpg"
|
||||
},
|
||||
{
|
||||
"sku": 346575,
|
||||
"name": "Metra - Radio Installation Dash Kit for Most 1989-2000 Ford, Lincoln & Mercury Vehicles - Black",
|
||||
"type": "HardGood",
|
||||
"price": 16.99,
|
||||
"upc": "086429002757",
|
||||
"category": [
|
||||
{
|
||||
"id": "abcat0300000",
|
||||
"name": "Car Electronics & GPS"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat165900050023",
|
||||
"name": "Car Installation Parts & Accessories"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat331600050007",
|
||||
"name": "Car Audio Installation Parts"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat165900050031",
|
||||
"name": "Deck Installation Parts"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat165900050033",
|
||||
"name": "Dash Installation Kits"
|
||||
}
|
||||
],
|
||||
"shipping": 0,
|
||||
"description": "From our expanded online assortment; compatible with most 1989-2000 Ford, Lincoln and Mercury vehicles; snap-in TurboKit offers fast installation; spacer/trim ring; rear support bracket",
|
||||
"manufacturer": "Metra",
|
||||
"model": "99-5512",
|
||||
"url": "http://www.bestbuy.com/site/metra-radio-installation-dash-kit-for-most-1989-2000-ford-lincoln-mercury-vehicles-black/346575.p?id=1218118704590&skuId=346575&cmp=RMXCC",
|
||||
"image": "http://img.bbystatic.com/BestBuy_US/images/products/3465/346575_rc.jpg"
|
||||
},
|
||||
{
|
||||
"sku": 43900,
|
||||
"name": "Duracell - AAA Batteries (4-Pack)",
|
||||
"type": "HardGood",
|
||||
"price": 5.49,
|
||||
"upc": "041333424019",
|
||||
"category": [
|
||||
{
|
||||
"id": "pcmcat312300050015",
|
||||
"name": "Connected Home & Housewares"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat248700050021",
|
||||
"name": "Housewares"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat303600050001",
|
||||
"name": "Household Batteries"
|
||||
},
|
||||
{
|
||||
"id": "abcat0208002",
|
||||
"name": "Alkaline Batteries"
|
||||
}
|
||||
],
|
||||
"shipping": 5.49,
|
||||
"description": "Compatible with select electronic devices; AAA size; DURALOCK Power Preserve technology; 4-pack",
|
||||
"manufacturer": "Duracell",
|
||||
"model": "MN2400B4Z",
|
||||
"url": "http://www.bestbuy.com/site/duracell-aaa-batteries-4-pack/43900.p?id=1051384074145&skuId=43900&cmp=RMXCC",
|
||||
"image": "http://img.bbystatic.com/BestBuy_US/images/products/4390/43900_sa.jpg"
|
||||
},
|
||||
{
|
||||
"sku": 48530,
|
||||
"name": "Duracell - AA 1.5V CopperTop Batteries (4-Pack)",
|
||||
"type": "HardGood",
|
||||
"price": 5.49,
|
||||
"upc": "041333415017",
|
||||
"category": [
|
||||
{
|
||||
"id": "pcmcat312300050015",
|
||||
"name": "Connected Home & Housewares"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat248700050021",
|
||||
"name": "Housewares"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat303600050001",
|
||||
"name": "Household Batteries"
|
||||
},
|
||||
{
|
||||
"id": "abcat0208002",
|
||||
"name": "Alkaline Batteries"
|
||||
}
|
||||
],
|
||||
"shipping": 5.49,
|
||||
"description": "Long-lasting energy; DURALOCK Power Preserve technology; for toys, clocks, radios, games, remotes, PDAs and more",
|
||||
"manufacturer": "Duracell",
|
||||
"model": "MN1500B4Z",
|
||||
"url": "http://www.bestbuy.com/site/duracell-aa-1-5v-coppertop-batteries-4-pack/48530.p?id=1099385268988&skuId=48530&cmp=RMXCC",
|
||||
"image": "http://img.bbystatic.com/BestBuy_US/images/products/4853/48530_sa.jpg"
|
||||
}
|
||||
]
|
@ -0,0 +1,45 @@
|
||||
---
|
||||
source: dump/src/reader/v2/mod.rs
|
||||
expression: movies.settings()
|
||||
---
|
||||
Ok(
|
||||
Settings {
|
||||
displayed_attributes: Some(
|
||||
None,
|
||||
),
|
||||
searchable_attributes: Some(
|
||||
None,
|
||||
),
|
||||
filterable_attributes: Some(
|
||||
Some(
|
||||
{},
|
||||
),
|
||||
),
|
||||
ranking_rules: Some(
|
||||
Some(
|
||||
[
|
||||
"words",
|
||||
"typo",
|
||||
"proximity",
|
||||
"attribute",
|
||||
"exactness",
|
||||
"asc(release_date)",
|
||||
],
|
||||
),
|
||||
),
|
||||
stop_words: Some(
|
||||
Some(
|
||||
{},
|
||||
),
|
||||
),
|
||||
synonyms: Some(
|
||||
Some(
|
||||
{},
|
||||
),
|
||||
),
|
||||
distinct_attribute: Some(
|
||||
None,
|
||||
),
|
||||
_kind: PhantomData<dump::reader::v2::settings::Checked>,
|
||||
},
|
||||
)
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,34 @@
|
||||
---
|
||||
source: dump/src/reader/v3/mod.rs
|
||||
expression: movies2.settings()
|
||||
---
|
||||
Ok(
|
||||
Settings {
|
||||
displayed_attributes: Reset,
|
||||
searchable_attributes: Reset,
|
||||
filterable_attributes: Set(
|
||||
{},
|
||||
),
|
||||
sortable_attributes: Set(
|
||||
{},
|
||||
),
|
||||
ranking_rules: Set(
|
||||
[
|
||||
"words",
|
||||
"typo",
|
||||
"proximity",
|
||||
"attribute",
|
||||
"sort",
|
||||
"exactness",
|
||||
],
|
||||
),
|
||||
stop_words: Set(
|
||||
{},
|
||||
),
|
||||
synonyms: Set(
|
||||
{},
|
||||
),
|
||||
distinct_attribute: Reset,
|
||||
_kind: PhantomData<dump::reader::v3::settings::Checked>,
|
||||
},
|
||||
)
|
@ -0,0 +1,5 @@
|
||||
---
|
||||
source: dump/src/reader/v3/mod.rs
|
||||
expression: documents
|
||||
---
|
||||
[]
|
@ -0,0 +1,34 @@
|
||||
---
|
||||
source: dump/src/reader/v3/mod.rs
|
||||
expression: spells.settings()
|
||||
---
|
||||
Ok(
|
||||
Settings {
|
||||
displayed_attributes: Reset,
|
||||
searchable_attributes: Reset,
|
||||
filterable_attributes: Set(
|
||||
{},
|
||||
),
|
||||
sortable_attributes: Set(
|
||||
{},
|
||||
),
|
||||
ranking_rules: Set(
|
||||
[
|
||||
"words",
|
||||
"typo",
|
||||
"proximity",
|
||||
"attribute",
|
||||
"sort",
|
||||
"exactness",
|
||||
],
|
||||
),
|
||||
stop_words: Set(
|
||||
{},
|
||||
),
|
||||
synonyms: Set(
|
||||
{},
|
||||
),
|
||||
distinct_attribute: Reset,
|
||||
_kind: PhantomData<dump::reader::v3::settings::Checked>,
|
||||
},
|
||||
)
|
@ -0,0 +1,533 @@
|
||||
---
|
||||
source: dump/src/reader/v3/mod.rs
|
||||
expression: documents
|
||||
---
|
||||
[
|
||||
{
|
||||
"index": "acid-arrow",
|
||||
"name": "Acid Arrow",
|
||||
"desc": [
|
||||
"A shimmering green arrow streaks toward a target within range and bursts in a spray of acid. Make a ranged spell attack against the target. On a hit, the target takes 4d4 acid damage immediately and 2d4 acid damage at the end of its next turn. On a miss, the arrow splashes the target with acid for half as much of the initial damage and no damage at the end of its next turn."
|
||||
],
|
||||
"higher_level": [
|
||||
"When you cast this spell using a spell slot of 3rd level or higher, the damage (both initial and later) increases by 1d4 for each slot level above 2nd."
|
||||
],
|
||||
"range": "90 feet",
|
||||
"components": [
|
||||
"V",
|
||||
"S",
|
||||
"M"
|
||||
],
|
||||
"material": "Powdered rhubarb leaf and an adder's stomach.",
|
||||
"ritual": false,
|
||||
"duration": "Instantaneous",
|
||||
"concentration": false,
|
||||
"casting_time": "1 action",
|
||||
"level": 2,
|
||||
"attack_type": "ranged",
|
||||
"damage": {
|
||||
"damage_type": {
|
||||
"index": "acid",
|
||||
"name": "Acid",
|
||||
"url": "/api/damage-types/acid"
|
||||
},
|
||||
"damage_at_slot_level": {
|
||||
"2": "4d4",
|
||||
"3": "5d4",
|
||||
"4": "6d4",
|
||||
"5": "7d4",
|
||||
"6": "8d4",
|
||||
"7": "9d4",
|
||||
"8": "10d4",
|
||||
"9": "11d4"
|
||||
}
|
||||
},
|
||||
"school": {
|
||||
"index": "evocation",
|
||||
"name": "Evocation",
|
||||
"url": "/api/magic-schools/evocation"
|
||||
},
|
||||
"classes": [
|
||||
{
|
||||
"index": "wizard",
|
||||
"name": "Wizard",
|
||||
"url": "/api/classes/wizard"
|
||||
}
|
||||
],
|
||||
"subclasses": [
|
||||
{
|
||||
"index": "lore",
|
||||
"name": "Lore",
|
||||
"url": "/api/subclasses/lore"
|
||||
},
|
||||
{
|
||||
"index": "land",
|
||||
"name": "Land",
|
||||
"url": "/api/subclasses/land"
|
||||
}
|
||||
],
|
||||
"url": "/api/spells/acid-arrow"
|
||||
},
|
||||
{
|
||||
"index": "acid-splash",
|
||||
"name": "Acid Splash",
|
||||
"desc": [
|
||||
"You hurl a bubble of acid. Choose one creature within range, or choose two creatures within range that are within 5 feet of each other. A target must succeed on a dexterity saving throw or take 1d6 acid damage.",
|
||||
"This spell's damage increases by 1d6 when you reach 5th level (2d6), 11th level (3d6), and 17th level (4d6)."
|
||||
],
|
||||
"range": "60 feet",
|
||||
"components": [
|
||||
"V",
|
||||
"S"
|
||||
],
|
||||
"ritual": false,
|
||||
"duration": "Instantaneous",
|
||||
"concentration": false,
|
||||
"casting_time": "1 action",
|
||||
"level": 0,
|
||||
"damage": {
|
||||
"damage_type": {
|
||||
"index": "acid",
|
||||
"name": "Acid",
|
||||
"url": "/api/damage-types/acid"
|
||||
},
|
||||
"damage_at_character_level": {
|
||||
"1": "1d6",
|
||||
"5": "2d6",
|
||||
"11": "3d6",
|
||||
"17": "4d6"
|
||||
}
|
||||
},
|
||||
"school": {
|
||||
"index": "conjuration",
|
||||
"name": "Conjuration",
|
||||
"url": "/api/magic-schools/conjuration"
|
||||
},
|
||||
"classes": [
|
||||
{
|
||||
"index": "sorcerer",
|
||||
"name": "Sorcerer",
|
||||
"url": "/api/classes/sorcerer"
|
||||
},
|
||||
{
|
||||
"index": "wizard",
|
||||
"name": "Wizard",
|
||||
"url": "/api/classes/wizard"
|
||||
}
|
||||
],
|
||||
"subclasses": [
|
||||
{
|
||||
"index": "lore",
|
||||
"name": "Lore",
|
||||
"url": "/api/subclasses/lore"
|
||||
}
|
||||
],
|
||||
"url": "/api/spells/acid-splash",
|
||||
"dc": {
|
||||
"dc_type": {
|
||||
"index": "dex",
|
||||
"name": "DEX",
|
||||
"url": "/api/ability-scores/dex"
|
||||
},
|
||||
"dc_success": "none"
|
||||
}
|
||||
},
|
||||
{
|
||||
"index": "aid",
|
||||
"name": "Aid",
|
||||
"desc": [
|
||||
"Your spell bolsters your allies with toughness and resolve. Choose up to three creatures within range. Each target's hit point maximum and current hit points increase by 5 for the duration."
|
||||
],
|
||||
"higher_level": [
|
||||
"When you cast this spell using a spell slot of 3rd level or higher, a target's hit points increase by an additional 5 for each slot level above 2nd."
|
||||
],
|
||||
"range": "30 feet",
|
||||
"components": [
|
||||
"V",
|
||||
"S",
|
||||
"M"
|
||||
],
|
||||
"material": "A tiny strip of white cloth.",
|
||||
"ritual": false,
|
||||
"duration": "8 hours",
|
||||
"concentration": false,
|
||||
"casting_time": "1 action",
|
||||
"level": 2,
|
||||
"school": {
|
||||
"index": "abjuration",
|
||||
"name": "Abjuration",
|
||||
"url": "/api/magic-schools/abjuration"
|
||||
},
|
||||
"classes": [
|
||||
{
|
||||
"index": "cleric",
|
||||
"name": "Cleric",
|
||||
"url": "/api/classes/cleric"
|
||||
},
|
||||
{
|
||||
"index": "paladin",
|
||||
"name": "Paladin",
|
||||
"url": "/api/classes/paladin"
|
||||
}
|
||||
],
|
||||
"subclasses": [
|
||||
{
|
||||
"index": "lore",
|
||||
"name": "Lore",
|
||||
"url": "/api/subclasses/lore"
|
||||
}
|
||||
],
|
||||
"url": "/api/spells/aid",
|
||||
"heal_at_slot_level": {
|
||||
"2": "5",
|
||||
"3": "10",
|
||||
"4": "15",
|
||||
"5": "20",
|
||||
"6": "25",
|
||||
"7": "30",
|
||||
"8": "35",
|
||||
"9": "40"
|
||||
}
|
||||
},
|
||||
{
|
||||
"index": "alarm",
|
||||
"name": "Alarm",
|
||||
"desc": [
|
||||
"You set an alarm against unwanted intrusion. Choose a door, a window, or an area within range that is no larger than a 20-foot cube. Until the spell ends, an alarm alerts you whenever a Tiny or larger creature touches or enters the warded area. When you cast the spell, you can designate creatures that won't set off the alarm. You also choose whether the alarm is mental or audible.",
|
||||
"A mental alarm alerts you with a ping in your mind if you are within 1 mile of the warded area. This ping awakens you if you are sleeping.",
|
||||
"An audible alarm produces the sound of a hand bell for 10 seconds within 60 feet."
|
||||
],
|
||||
"range": "30 feet",
|
||||
"components": [
|
||||
"V",
|
||||
"S",
|
||||
"M"
|
||||
],
|
||||
"material": "A tiny bell and a piece of fine silver wire.",
|
||||
"ritual": true,
|
||||
"duration": "8 hours",
|
||||
"concentration": false,
|
||||
"casting_time": "1 minute",
|
||||
"level": 1,
|
||||
"school": {
|
||||
"index": "abjuration",
|
||||
"name": "Abjuration",
|
||||
"url": "/api/magic-schools/abjuration"
|
||||
},
|
||||
"classes": [
|
||||
{
|
||||
"index": "ranger",
|
||||
"name": "Ranger",
|
||||
"url": "/api/classes/ranger"
|
||||
},
|
||||
{
|
||||
"index": "wizard",
|
||||
"name": "Wizard",
|
||||
"url": "/api/classes/wizard"
|
||||
}
|
||||
],
|
||||
"subclasses": [
|
||||
{
|
||||
"index": "lore",
|
||||
"name": "Lore",
|
||||
"url": "/api/subclasses/lore"
|
||||
}
|
||||
],
|
||||
"url": "/api/spells/alarm",
|
||||
"area_of_effect": {
|
||||
"type": "cube",
|
||||
"size": 20
|
||||
}
|
||||
},
|
||||
{
|
||||
"index": "alter-self",
|
||||
"name": "Alter Self",
|
||||
"desc": [
|
||||
"You assume a different form. When you cast the spell, choose one of the following options, the effects of which last for the duration of the spell. While the spell lasts, you can end one option as an action to gain the benefits of a different one.",
|
||||
"***Aquatic Adaptation.*** You adapt your body to an aquatic environment, sprouting gills and growing webbing between your fingers. You can breathe underwater and gain a swimming speed equal to your walking speed.",
|
||||
"***Change Appearance.*** You transform your appearance. You decide what you look like, including your height, weight, facial features, sound of your voice, hair length, coloration, and distinguishing characteristics, if any. You can make yourself appear as a member of another race, though none of your statistics change. You also can't appear as a creature of a different size than you, and your basic shape stays the same; if you're bipedal, you can't use this spell to become quadrupedal, for instance. At any time for the duration of the spell, you can use your action to change your appearance in this way again.",
|
||||
"***Natural Weapons.*** You grow claws, fangs, spines, horns, or a different natural weapon of your choice. Your unarmed strikes deal 1d6 bludgeoning, piercing, or slashing damage, as appropriate to the natural weapon you chose, and you are proficient with your unarmed strikes. Finally, the natural weapon is magic and you have a +1 bonus to the attack and damage rolls you make using it."
|
||||
],
|
||||
"range": "Self",
|
||||
"components": [
|
||||
"V",
|
||||
"S"
|
||||
],
|
||||
"ritual": false,
|
||||
"duration": "Up to 1 hour",
|
||||
"concentration": true,
|
||||
"casting_time": "1 action",
|
||||
"level": 2,
|
||||
"school": {
|
||||
"index": "transmutation",
|
||||
"name": "Transmutation",
|
||||
"url": "/api/magic-schools/transmutation"
|
||||
},
|
||||
"classes": [
|
||||
{
|
||||
"index": "sorcerer",
|
||||
"name": "Sorcerer",
|
||||
"url": "/api/classes/sorcerer"
|
||||
},
|
||||
{
|
||||
"index": "wizard",
|
||||
"name": "Wizard",
|
||||
"url": "/api/classes/wizard"
|
||||
}
|
||||
],
|
||||
"subclasses": [
|
||||
{
|
||||
"index": "lore",
|
||||
"name": "Lore",
|
||||
"url": "/api/subclasses/lore"
|
||||
}
|
||||
],
|
||||
"url": "/api/spells/alter-self"
|
||||
},
|
||||
{
|
||||
"index": "animal-friendship",
|
||||
"name": "Animal Friendship",
|
||||
"desc": [
|
||||
"This spell lets you convince a beast that you mean it no harm. Choose a beast that you can see within range. It must see and hear you. If the beast's Intelligence is 4 or higher, the spell fails. Otherwise, the beast must succeed on a wisdom saving throw or be charmed by you for the spell's duration. If you or one of your companions harms the target, the spells ends."
|
||||
],
|
||||
"range": "30 feet",
|
||||
"components": [
|
||||
"V",
|
||||
"S",
|
||||
"M"
|
||||
],
|
||||
"material": "A morsel of food.",
|
||||
"ritual": false,
|
||||
"duration": "24 hours",
|
||||
"concentration": false,
|
||||
"casting_time": "1 action",
|
||||
"level": 1,
|
||||
"school": {
|
||||
"index": "enchantment",
|
||||
"name": "Enchantment",
|
||||
"url": "/api/magic-schools/enchantment"
|
||||
},
|
||||
"classes": [
|
||||
{
|
||||
"index": "bard",
|
||||
"name": "Bard",
|
||||
"url": "/api/classes/bard"
|
||||
},
|
||||
{
|
||||
"index": "cleric",
|
||||
"name": "Cleric",
|
||||
"url": "/api/classes/cleric"
|
||||
},
|
||||
{
|
||||
"index": "druid",
|
||||
"name": "Druid",
|
||||
"url": "/api/classes/druid"
|
||||
},
|
||||
{
|
||||
"index": "ranger",
|
||||
"name": "Ranger",
|
||||
"url": "/api/classes/ranger"
|
||||
}
|
||||
],
|
||||
"subclasses": [],
|
||||
"url": "/api/spells/animal-friendship",
|
||||
"dc": {
|
||||
"dc_type": {
|
||||
"index": "wis",
|
||||
"name": "WIS",
|
||||
"url": "/api/ability-scores/wis"
|
||||
},
|
||||
"dc_success": "none"
|
||||
}
|
||||
},
|
||||
{
|
||||
"index": "animal-messenger",
|
||||
"name": "Animal Messenger",
|
||||
"desc": [
|
||||
"By means of this spell, you use an animal to deliver a message. Choose a Tiny beast you can see within range, such as a squirrel, a blue jay, or a bat. You specify a location, which you must have visited, and a recipient who matches a general description, such as \"a man or woman dressed in the uniform of the town guard\" or \"a red-haired dwarf wearing a pointed hat.\" You also speak a message of up to twenty-five words. The target beast travels for the duration of the spell toward the specified location, covering about 50 miles per 24 hours for a flying messenger, or 25 miles for other animals.",
|
||||
"When the messenger arrives, it delivers your message to the creature that you described, replicating the sound of your voice. The messenger speaks only to a creature matching the description you gave. If the messenger doesn't reach its destination before the spell ends, the message is lost, and the beast makes its way back to where you cast this spell."
|
||||
],
|
||||
"higher_level": [
|
||||
"If you cast this spell using a spell slot of 3nd level or higher, the duration of the spell increases by 48 hours for each slot level above 2nd."
|
||||
],
|
||||
"range": "30 feet",
|
||||
"components": [
|
||||
"V",
|
||||
"S",
|
||||
"M"
|
||||
],
|
||||
"material": "A morsel of food.",
|
||||
"ritual": true,
|
||||
"duration": "24 hours",
|
||||
"concentration": false,
|
||||
"casting_time": "1 action",
|
||||
"level": 2,
|
||||
"school": {
|
||||
"index": "enchantment",
|
||||
"name": "Enchantment",
|
||||
"url": "/api/magic-schools/enchantment"
|
||||
},
|
||||
"classes": [
|
||||
{
|
||||
"index": "bard",
|
||||
"name": "Bard",
|
||||
"url": "/api/classes/bard"
|
||||
},
|
||||
{
|
||||
"index": "druid",
|
||||
"name": "Druid",
|
||||
"url": "/api/classes/druid"
|
||||
},
|
||||
{
|
||||
"index": "ranger",
|
||||
"name": "Ranger",
|
||||
"url": "/api/classes/ranger"
|
||||
}
|
||||
],
|
||||
"subclasses": [
|
||||
{
|
||||
"index": "lore",
|
||||
"name": "Lore",
|
||||
"url": "/api/subclasses/lore"
|
||||
}
|
||||
],
|
||||
"url": "/api/spells/animal-messenger"
|
||||
},
|
||||
{
|
||||
"index": "animal-shapes",
|
||||
"name": "Animal Shapes",
|
||||
"desc": [
|
||||
"Your magic turns others into beasts. Choose any number of willing creatures that you can see within range. You transform each target into the form of a Large or smaller beast with a challenge rating of 4 or lower. On subsequent turns, you can use your action to transform affected creatures into new forms.",
|
||||
"The transformation lasts for the duration for each target, or until the target drops to 0 hit points or dies. You can choose a different form for each target. A target's game statistics are replaced by the statistics of the chosen beast, though the target retains its alignment and Intelligence, Wisdom, and Charisma scores. The target assumes the hit points of its new form, and when it reverts to its normal form, it returns to the number of hit points it had before it transformed. If it reverts as a result of dropping to 0 hit points, any excess damage carries over to its normal form. As long as the excess damage doesn't reduce the creature's normal form to 0 hit points, it isn't knocked unconscious. The creature is limited in the actions it can perform by the nature of its new form, and it can't speak or cast spells.",
|
||||
"The target's gear melds into the new form. The target can't activate, wield, or otherwise benefit from any of its equipment."
|
||||
],
|
||||
"range": "30 feet",
|
||||
"components": [
|
||||
"V",
|
||||
"S"
|
||||
],
|
||||
"ritual": false,
|
||||
"duration": "Up to 24 hours",
|
||||
"concentration": true,
|
||||
"casting_time": "1 action",
|
||||
"level": 8,
|
||||
"school": {
|
||||
"index": "transmutation",
|
||||
"name": "Transmutation",
|
||||
"url": "/api/magic-schools/transmutation"
|
||||
},
|
||||
"classes": [
|
||||
{
|
||||
"index": "druid",
|
||||
"name": "Druid",
|
||||
"url": "/api/classes/druid"
|
||||
}
|
||||
],
|
||||
"subclasses": [],
|
||||
"url": "/api/spells/animal-shapes"
|
||||
},
|
||||
{
|
||||
"index": "animate-dead",
|
||||
"name": "Animate Dead",
|
||||
"desc": [
|
||||
"This spell creates an undead servant. Choose a pile of bones or a corpse of a Medium or Small humanoid within range. Your spell imbues the target with a foul mimicry of life, raising it as an undead creature. The target becomes a skeleton if you chose bones or a zombie if you chose a corpse (the DM has the creature's game statistics).",
|
||||
"On each of your turns, you can use a bonus action to mentally command any creature you made with this spell if the creature is within 60 feet of you (if you control multiple creatures, you can command any or all of them at the same time, issuing the same command to each one). You decide what action the creature will take and where it will move during its next turn, or you can issue a general command, such as to guard a particular chamber or corridor. If you issue no commands, the creature only defends itself against hostile creatures. Once given an order, the creature continues to follow it until its task is complete.",
|
||||
"The creature is under your control for 24 hours, after which it stops obeying any command you've given it. To maintain control of the creature for another 24 hours, you must cast this spell on the creature again before the current 24-hour period ends. This use of the spell reasserts your control over up to four creatures you have animated with this spell, rather than animating a new one."
|
||||
],
|
||||
"higher_level": [
|
||||
"When you cast this spell using a spell slot of 4th level or higher, you animate or reassert control over two additional undead creatures for each slot level above 3rd. Each of the creatures must come from a different corpse or pile of bones."
|
||||
],
|
||||
"range": "10 feet",
|
||||
"components": [
|
||||
"V",
|
||||
"S",
|
||||
"M"
|
||||
],
|
||||
"material": "A drop of blood, a piece of flesh, and a pinch of bone dust.",
|
||||
"ritual": false,
|
||||
"duration": "Instantaneous",
|
||||
"concentration": false,
|
||||
"casting_time": "1 minute",
|
||||
"level": 3,
|
||||
"school": {
|
||||
"index": "necromancy",
|
||||
"name": "Necromancy",
|
||||
"url": "/api/magic-schools/necromancy"
|
||||
},
|
||||
"classes": [
|
||||
{
|
||||
"index": "cleric",
|
||||
"name": "Cleric",
|
||||
"url": "/api/classes/cleric"
|
||||
},
|
||||
{
|
||||
"index": "wizard",
|
||||
"name": "Wizard",
|
||||
"url": "/api/classes/wizard"
|
||||
}
|
||||
],
|
||||
"subclasses": [
|
||||
{
|
||||
"index": "lore",
|
||||
"name": "Lore",
|
||||
"url": "/api/subclasses/lore"
|
||||
}
|
||||
],
|
||||
"url": "/api/spells/animate-dead"
|
||||
},
|
||||
{
|
||||
"index": "animate-objects",
|
||||
"name": "Animate Objects",
|
||||
"desc": [
|
||||
"Objects come to life at your command. Choose up to ten nonmagical objects within range that are not being worn or carried. Medium targets count as two objects, Large targets count as four objects, Huge targets count as eight objects. You can't animate any object larger than Huge. Each target animates and becomes a creature under your control until the spell ends or until reduced to 0 hit points.",
|
||||
"As a bonus action, you can mentally command any creature you made with this spell if the creature is within 500 feet of you (if you control multiple creatures, you can command any or all of them at the same time, issuing the same command to each one). You decide what action the creature will take and where it will move during its next turn, or you can issue a general command, such as to guard a particular chamber or corridor. If you issue no commands, the creature only defends itself against hostile creatures. Once given an order, the creature continues to follow it until its task is complete.",
|
||||
"##### Animated Object Statistics",
|
||||
"| Size | HP | AC | Attack | Str | Dex |",
|
||||
"|---|---|---|---|---|---|",
|
||||
"| Tiny | 20 | 18 | +8 to hit, 1d4 + 4 damage | 4 | 18 |",
|
||||
"| Small | 25 | 16 | +6 to hit, 1d8 + 2 damage | 6 | 14 |",
|
||||
"| Medium | 40 | 13 | +5 to hit, 2d6 + 1 damage | 10 | 12 |",
|
||||
"| Large | 50 | 10 | +6 to hit, 2d10 + 2 damage | 14 | 10 |",
|
||||
"| Huge | 80 | 10 | +8 to hit, 2d12 + 4 damage | 18 | 6 |",
|
||||
"An animated object is a construct with AC, hit points, attacks, Strength, and Dexterity determined by its size. Its Constitution is 10 and its Intelligence and Wisdom are 3, and its Charisma is 1. Its speed is 30 feet; if the object lacks legs or other appendages it can use for locomotion, it instead has a flying speed of 30 feet and can hover. If the object is securely attached to a surface or a larger object, such as a chain bolted to a wall, its speed is 0. It has blindsight with a radius of 30 feet and is blind beyond that distance. When the animated object drops to 0 hit points, it reverts to its original object form, and any remaining damage carries over to its original object form.",
|
||||
"If you command an object to attack, it can make a single melee attack against a creature within 5 feet of it. It makes a slam attack with an attack bonus and bludgeoning damage determined by its size. The DM might rule that a specific object inflicts slashing or piercing damage based on its form."
|
||||
],
|
||||
"higher_level": [
|
||||
"If you cast this spell using a spell slot of 6th level or higher, you can animate two additional objects for each slot level above 5th."
|
||||
],
|
||||
"range": "120 feet",
|
||||
"components": [
|
||||
"V",
|
||||
"S"
|
||||
],
|
||||
"ritual": false,
|
||||
"duration": "Up to 1 minute",
|
||||
"concentration": true,
|
||||
"casting_time": "1 action",
|
||||
"level": 5,
|
||||
"school": {
|
||||
"index": "transmutation",
|
||||
"name": "Transmutation",
|
||||
"url": "/api/magic-schools/transmutation"
|
||||
},
|
||||
"classes": [
|
||||
{
|
||||
"index": "bard",
|
||||
"name": "Bard",
|
||||
"url": "/api/classes/bard"
|
||||
},
|
||||
{
|
||||
"index": "sorcerer",
|
||||
"name": "Sorcerer",
|
||||
"url": "/api/classes/sorcerer"
|
||||
},
|
||||
{
|
||||
"index": "wizard",
|
||||
"name": "Wizard",
|
||||
"url": "/api/classes/wizard"
|
||||
}
|
||||
],
|
||||
"subclasses": [],
|
||||
"url": "/api/spells/animate-objects"
|
||||
}
|
||||
]
|
@ -0,0 +1,223 @@
|
||||
---
|
||||
source: dump/src/reader/v3/mod.rs
|
||||
expression: tasks
|
||||
---
|
||||
[
|
||||
{
|
||||
"uuid": "01d7dd17-8241-4f1f-a7d1-2d1cb255f5b0",
|
||||
"update": {
|
||||
"status": "enqueued",
|
||||
"updateId": 0,
|
||||
"meta": {
|
||||
"DocumentAddition": {
|
||||
"primary_key": null,
|
||||
"method": "ReplaceDocuments",
|
||||
"content_uuid": "66d3f12d-fcf3-4b53-88cb-407017373de7"
|
||||
}
|
||||
},
|
||||
"enqueuedAt": "2022-10-07T11:39:03.703667164Z"
|
||||
}
|
||||
},
|
||||
{
|
||||
"uuid": "78be64a3-cae1-449e-b7ed-13e77c9a8a0c",
|
||||
"update": {
|
||||
"status": "processed",
|
||||
"success": {
|
||||
"DocumentsAddition": {
|
||||
"nb_documents": 10
|
||||
}
|
||||
},
|
||||
"processedAt": "2022-10-07T11:38:54.026649575Z",
|
||||
"updateId": 0,
|
||||
"meta": {
|
||||
"DocumentAddition": {
|
||||
"primary_key": null,
|
||||
"method": "ReplaceDocuments",
|
||||
"content_uuid": "378e1055-84e1-40e6-9328-176b1781850e"
|
||||
}
|
||||
},
|
||||
"enqueuedAt": "2022-10-07T11:38:54.004402239Z",
|
||||
"startedProcessingAt": "2022-10-07T11:38:54.011081233Z"
|
||||
}
|
||||
},
|
||||
{
|
||||
"uuid": "78be64a3-cae1-449e-b7ed-13e77c9a8a0c",
|
||||
"update": {
|
||||
"status": "processed",
|
||||
"success": "Other",
|
||||
"processedAt": "2022-10-07T11:38:54.245649334Z",
|
||||
"updateId": 1,
|
||||
"meta": {
|
||||
"Settings": {
|
||||
"filterableAttributes": [
|
||||
"genres",
|
||||
"id"
|
||||
],
|
||||
"sortableAttributes": [
|
||||
"release_date"
|
||||
]
|
||||
}
|
||||
},
|
||||
"enqueuedAt": "2022-10-07T11:38:54.217852146Z",
|
||||
"startedProcessingAt": "2022-10-07T11:38:54.23264073Z"
|
||||
}
|
||||
},
|
||||
{
|
||||
"uuid": "78be64a3-cae1-449e-b7ed-13e77c9a8a0c",
|
||||
"update": {
|
||||
"status": "processed",
|
||||
"success": "Other",
|
||||
"processedAt": "2022-10-07T11:38:54.456346121Z",
|
||||
"updateId": 2,
|
||||
"meta": {
|
||||
"Settings": {
|
||||
"rankingRules": [
|
||||
"words",
|
||||
"typo",
|
||||
"proximity",
|
||||
"attribute",
|
||||
"sort",
|
||||
"exactness",
|
||||
"release_date:asc"
|
||||
]
|
||||
}
|
||||
},
|
||||
"enqueuedAt": "2022-10-07T11:38:54.438833927Z",
|
||||
"startedProcessingAt": "2022-10-07T11:38:54.453596791Z"
|
||||
}
|
||||
},
|
||||
{
|
||||
"uuid": "78be64a3-cae1-449e-b7ed-13e77c9a8a0c",
|
||||
"update": {
|
||||
"status": "processed",
|
||||
"success": {
|
||||
"DocumentsAddition": {
|
||||
"nb_documents": 100
|
||||
}
|
||||
},
|
||||
"processedAt": "2022-10-07T11:39:04.188852537Z",
|
||||
"updateId": 3,
|
||||
"meta": {
|
||||
"DocumentAddition": {
|
||||
"primary_key": null,
|
||||
"method": "ReplaceDocuments",
|
||||
"content_uuid": "48997745-7615-4349-9a50-4324cc3745c0"
|
||||
}
|
||||
},
|
||||
"enqueuedAt": "2022-10-07T11:39:03.695252071Z",
|
||||
"startedProcessingAt": "2022-10-07T11:39:03.698139272Z"
|
||||
}
|
||||
},
|
||||
{
|
||||
"uuid": "ba553439-18fe-4733-ba53-44eed898280c",
|
||||
"update": {
|
||||
"status": "processed",
|
||||
"success": "Other",
|
||||
"processedAt": "2022-10-07T11:38:54.74389899Z",
|
||||
"updateId": 0,
|
||||
"meta": {
|
||||
"Settings": {
|
||||
"synonyms": {
|
||||
"android": [
|
||||
"phone",
|
||||
"smartphone"
|
||||
],
|
||||
"iphone": [
|
||||
"phone",
|
||||
"smartphone"
|
||||
],
|
||||
"phone": [
|
||||
"smartphone",
|
||||
"iphone",
|
||||
"android"
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
"enqueuedAt": "2022-10-07T11:38:54.734594617Z",
|
||||
"startedProcessingAt": "2022-10-07T11:38:54.737274016Z"
|
||||
}
|
||||
},
|
||||
{
|
||||
"uuid": "ba553439-18fe-4733-ba53-44eed898280c",
|
||||
"update": {
|
||||
"status": "failed",
|
||||
"updateId": 1,
|
||||
"meta": {
|
||||
"DocumentAddition": {
|
||||
"primary_key": null,
|
||||
"method": "ReplaceDocuments",
|
||||
"content_uuid": "94b720e4-d6ad-49e1-ba02-34773eecab2a"
|
||||
}
|
||||
},
|
||||
"enqueuedAt": "2022-10-07T11:38:55.350510177Z",
|
||||
"startedProcessingAt": "2022-10-07T11:38:55.353402439Z",
|
||||
"msg": "The primary key inference process failed because the engine did not find any fields containing `id` substring in their name. If your document identifier does not contain any `id` substring, you can set the primary key of the index.",
|
||||
"code": "MissingPrimaryKey",
|
||||
"failedAt": "2022-10-07T11:38:55.35349514Z"
|
||||
}
|
||||
},
|
||||
{
|
||||
"uuid": "ba553439-18fe-4733-ba53-44eed898280c",
|
||||
"update": {
|
||||
"status": "processed",
|
||||
"success": {
|
||||
"DocumentsAddition": {
|
||||
"nb_documents": 10
|
||||
}
|
||||
},
|
||||
"processedAt": "2022-10-07T11:38:55.963185778Z",
|
||||
"updateId": 2,
|
||||
"meta": {
|
||||
"DocumentAddition": {
|
||||
"primary_key": "sku",
|
||||
"method": "ReplaceDocuments",
|
||||
"content_uuid": "0b65a2d5-04e2-4529-b123-df01831ca2c0"
|
||||
}
|
||||
},
|
||||
"enqueuedAt": "2022-10-07T11:38:55.940610428Z",
|
||||
"startedProcessingAt": "2022-10-07T11:38:55.951485379Z"
|
||||
}
|
||||
},
|
||||
{
|
||||
"uuid": "c408bc22-5859-49d1-8e9f-c88e2fa95cb0",
|
||||
"update": {
|
||||
"status": "failed",
|
||||
"updateId": 0,
|
||||
"meta": {
|
||||
"DocumentAddition": {
|
||||
"primary_key": null,
|
||||
"method": "ReplaceDocuments",
|
||||
"content_uuid": "d95dc3d2-30be-40d1-b3b3-057083499f71"
|
||||
}
|
||||
},
|
||||
"enqueuedAt": "2022-10-07T11:38:56.263041061Z",
|
||||
"startedProcessingAt": "2022-10-07T11:38:56.265837882Z",
|
||||
"msg": "The primary key inference process failed because the engine did not find any fields containing `id` substring in their name. If your document identifier does not contain any `id` substring, you can set the primary key of the index.",
|
||||
"code": "MissingPrimaryKey",
|
||||
"failedAt": "2022-10-07T11:38:56.265951133Z"
|
||||
}
|
||||
},
|
||||
{
|
||||
"uuid": "c408bc22-5859-49d1-8e9f-c88e2fa95cb0",
|
||||
"update": {
|
||||
"status": "processed",
|
||||
"success": {
|
||||
"DocumentsAddition": {
|
||||
"nb_documents": 10
|
||||
}
|
||||
},
|
||||
"processedAt": "2022-10-07T11:38:56.521004328Z",
|
||||
"updateId": 1,
|
||||
"meta": {
|
||||
"DocumentAddition": {
|
||||
"primary_key": "index",
|
||||
"method": "ReplaceDocuments",
|
||||
"content_uuid": "39aa01c5-c4e1-42af-8063-b6f6afbf5b98"
|
||||
}
|
||||
},
|
||||
"enqueuedAt": "2022-10-07T11:38:56.501949087Z",
|
||||
"startedProcessingAt": "2022-10-07T11:38:56.504677498Z"
|
||||
}
|
||||
}
|
||||
]
|
@ -0,0 +1,48 @@
|
||||
---
|
||||
source: dump/src/reader/v3/mod.rs
|
||||
expression: products.settings()
|
||||
---
|
||||
Ok(
|
||||
Settings {
|
||||
displayed_attributes: Reset,
|
||||
searchable_attributes: Reset,
|
||||
filterable_attributes: Set(
|
||||
{},
|
||||
),
|
||||
sortable_attributes: Set(
|
||||
{},
|
||||
),
|
||||
ranking_rules: Set(
|
||||
[
|
||||
"words",
|
||||
"typo",
|
||||
"proximity",
|
||||
"attribute",
|
||||
"sort",
|
||||
"exactness",
|
||||
],
|
||||
),
|
||||
stop_words: Set(
|
||||
{},
|
||||
),
|
||||
synonyms: Set(
|
||||
{
|
||||
"android": [
|
||||
"phone",
|
||||
"smartphone",
|
||||
],
|
||||
"iphone": [
|
||||
"phone",
|
||||
"smartphone",
|
||||
],
|
||||
"phone": [
|
||||
"android",
|
||||
"iphone",
|
||||
"smartphone",
|
||||
],
|
||||
},
|
||||
),
|
||||
distinct_attribute: Reset,
|
||||
_kind: PhantomData<dump::reader::v3::settings::Checked>,
|
||||
},
|
||||
)
|
@ -0,0 +1,308 @@
|
||||
---
|
||||
source: dump/src/reader/v3/mod.rs
|
||||
expression: documents
|
||||
---
|
||||
[
|
||||
{
|
||||
"sku": 127687,
|
||||
"name": "Duracell - AA Batteries (8-Pack)",
|
||||
"type": "HardGood",
|
||||
"price": 7.49,
|
||||
"upc": "041333825014",
|
||||
"category": [
|
||||
{
|
||||
"id": "pcmcat312300050015",
|
||||
"name": "Connected Home & Housewares"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat248700050021",
|
||||
"name": "Housewares"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat303600050001",
|
||||
"name": "Household Batteries"
|
||||
},
|
||||
{
|
||||
"id": "abcat0208002",
|
||||
"name": "Alkaline Batteries"
|
||||
}
|
||||
],
|
||||
"shipping": 5.49,
|
||||
"description": "Compatible with select electronic devices; AA size; DURALOCK Power Preserve technology; 8-pack",
|
||||
"manufacturer": "Duracell",
|
||||
"model": "MN1500B8Z",
|
||||
"url": "http://www.bestbuy.com/site/duracell-aa-batteries-8-pack/127687.p?id=1051384045676&skuId=127687&cmp=RMXCC",
|
||||
"image": "http://img.bbystatic.com/BestBuy_US/images/products/1276/127687_sa.jpg"
|
||||
},
|
||||
{
|
||||
"sku": 150115,
|
||||
"name": "Energizer - MAX Batteries AA (4-Pack)",
|
||||
"type": "HardGood",
|
||||
"price": 4.99,
|
||||
"upc": "039800011329",
|
||||
"category": [
|
||||
{
|
||||
"id": "pcmcat312300050015",
|
||||
"name": "Connected Home & Housewares"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat248700050021",
|
||||
"name": "Housewares"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat303600050001",
|
||||
"name": "Household Batteries"
|
||||
},
|
||||
{
|
||||
"id": "abcat0208002",
|
||||
"name": "Alkaline Batteries"
|
||||
}
|
||||
],
|
||||
"shipping": 5.49,
|
||||
"description": "4-pack AA alkaline batteries; battery tester included",
|
||||
"manufacturer": "Energizer",
|
||||
"model": "E91BP-4",
|
||||
"url": "http://www.bestbuy.com/site/energizer-max-batteries-aa-4-pack/150115.p?id=1051384046217&skuId=150115&cmp=RMXCC",
|
||||
"image": "http://img.bbystatic.com/BestBuy_US/images/products/1501/150115_sa.jpg"
|
||||
},
|
||||
{
|
||||
"sku": 185230,
|
||||
"name": "Duracell - C Batteries (4-Pack)",
|
||||
"type": "HardGood",
|
||||
"price": 8.99,
|
||||
"upc": "041333440019",
|
||||
"category": [
|
||||
{
|
||||
"id": "pcmcat312300050015",
|
||||
"name": "Connected Home & Housewares"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat248700050021",
|
||||
"name": "Housewares"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat303600050001",
|
||||
"name": "Household Batteries"
|
||||
},
|
||||
{
|
||||
"id": "abcat0208002",
|
||||
"name": "Alkaline Batteries"
|
||||
}
|
||||
],
|
||||
"shipping": 5.49,
|
||||
"description": "Compatible with select electronic devices; C size; DURALOCK Power Preserve technology; 4-pack",
|
||||
"manufacturer": "Duracell",
|
||||
"model": "MN1400R4Z",
|
||||
"url": "http://www.bestbuy.com/site/duracell-c-batteries-4-pack/185230.p?id=1051384046486&skuId=185230&cmp=RMXCC",
|
||||
"image": "http://img.bbystatic.com/BestBuy_US/images/products/1852/185230_sa.jpg"
|
||||
},
|
||||
{
|
||||
"sku": 185267,
|
||||
"name": "Duracell - D Batteries (4-Pack)",
|
||||
"type": "HardGood",
|
||||
"price": 9.99,
|
||||
"upc": "041333430010",
|
||||
"category": [
|
||||
{
|
||||
"id": "pcmcat312300050015",
|
||||
"name": "Connected Home & Housewares"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat248700050021",
|
||||
"name": "Housewares"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat303600050001",
|
||||
"name": "Household Batteries"
|
||||
},
|
||||
{
|
||||
"id": "abcat0208002",
|
||||
"name": "Alkaline Batteries"
|
||||
}
|
||||
],
|
||||
"shipping": 5.99,
|
||||
"description": "Compatible with select electronic devices; D size; DURALOCK Power Preserve technology; 4-pack",
|
||||
"manufacturer": "Duracell",
|
||||
"model": "MN1300R4Z",
|
||||
"url": "http://www.bestbuy.com/site/duracell-d-batteries-4-pack/185267.p?id=1051384046551&skuId=185267&cmp=RMXCC",
|
||||
"image": "http://img.bbystatic.com/BestBuy_US/images/products/1852/185267_sa.jpg"
|
||||
},
|
||||
{
|
||||
"sku": 312290,
|
||||
"name": "Duracell - 9V Batteries (2-Pack)",
|
||||
"type": "HardGood",
|
||||
"price": 7.99,
|
||||
"upc": "041333216010",
|
||||
"category": [
|
||||
{
|
||||
"id": "pcmcat312300050015",
|
||||
"name": "Connected Home & Housewares"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat248700050021",
|
||||
"name": "Housewares"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat303600050001",
|
||||
"name": "Household Batteries"
|
||||
},
|
||||
{
|
||||
"id": "abcat0208002",
|
||||
"name": "Alkaline Batteries"
|
||||
}
|
||||
],
|
||||
"shipping": 5.49,
|
||||
"description": "Compatible with select electronic devices; alkaline chemistry; 9V size; DURALOCK Power Preserve technology; 2-pack",
|
||||
"manufacturer": "Duracell",
|
||||
"model": "MN1604B2Z",
|
||||
"url": "http://www.bestbuy.com/site/duracell-9v-batteries-2-pack/312290.p?id=1051384050321&skuId=312290&cmp=RMXCC",
|
||||
"image": "http://img.bbystatic.com/BestBuy_US/images/products/3122/312290_sa.jpg"
|
||||
},
|
||||
{
|
||||
"sku": 324884,
|
||||
"name": "Directed Electronics - Viper Audio Glass Break Sensor",
|
||||
"type": "HardGood",
|
||||
"price": 39.99,
|
||||
"upc": "093207005060",
|
||||
"category": [
|
||||
{
|
||||
"id": "pcmcat113100050015",
|
||||
"name": "Carfi Instore Only"
|
||||
}
|
||||
],
|
||||
"shipping": 0,
|
||||
"description": "From our expanded online assortment; compatible with Directed Electronics alarm systems; microphone and microprocessor detect and analyze intrusions; detects quiet glass breaks",
|
||||
"manufacturer": "Directed Electronics",
|
||||
"model": "506T",
|
||||
"url": "http://www.bestbuy.com/site/directed-electronics-viper-audio-glass-break-sensor/324884.p?id=1112808077651&skuId=324884&cmp=RMXCC",
|
||||
"image": "http://img.bbystatic.com/BestBuy_US/images/products/3248/324884_rc.jpg"
|
||||
},
|
||||
{
|
||||
"sku": 333179,
|
||||
"name": "Energizer - N Cell E90 Batteries (2-Pack)",
|
||||
"type": "HardGood",
|
||||
"price": 5.99,
|
||||
"upc": "039800013200",
|
||||
"category": [
|
||||
{
|
||||
"id": "pcmcat312300050015",
|
||||
"name": "Connected Home & Housewares"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat248700050021",
|
||||
"name": "Housewares"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat303600050001",
|
||||
"name": "Household Batteries"
|
||||
},
|
||||
{
|
||||
"id": "abcat0208006",
|
||||
"name": "Specialty Batteries"
|
||||
}
|
||||
],
|
||||
"shipping": 5.49,
|
||||
"description": "Alkaline batteries; 1.5V",
|
||||
"manufacturer": "Energizer",
|
||||
"model": "E90BP-2",
|
||||
"url": "http://www.bestbuy.com/site/energizer-n-cell-e90-batteries-2-pack/333179.p?id=1185268509951&skuId=333179&cmp=RMXCC",
|
||||
"image": "http://img.bbystatic.com/BestBuy_US/images/products/3331/333179_sa.jpg"
|
||||
},
|
||||
{
|
||||
"sku": 346575,
|
||||
"name": "Metra - Radio Installation Dash Kit for Most 1989-2000 Ford, Lincoln & Mercury Vehicles - Black",
|
||||
"type": "HardGood",
|
||||
"price": 16.99,
|
||||
"upc": "086429002757",
|
||||
"category": [
|
||||
{
|
||||
"id": "abcat0300000",
|
||||
"name": "Car Electronics & GPS"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat165900050023",
|
||||
"name": "Car Installation Parts & Accessories"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat331600050007",
|
||||
"name": "Car Audio Installation Parts"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat165900050031",
|
||||
"name": "Deck Installation Parts"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat165900050033",
|
||||
"name": "Dash Installation Kits"
|
||||
}
|
||||
],
|
||||
"shipping": 0,
|
||||
"description": "From our expanded online assortment; compatible with most 1989-2000 Ford, Lincoln and Mercury vehicles; snap-in TurboKit offers fast installation; spacer/trim ring; rear support bracket",
|
||||
"manufacturer": "Metra",
|
||||
"model": "99-5512",
|
||||
"url": "http://www.bestbuy.com/site/metra-radio-installation-dash-kit-for-most-1989-2000-ford-lincoln-mercury-vehicles-black/346575.p?id=1218118704590&skuId=346575&cmp=RMXCC",
|
||||
"image": "http://img.bbystatic.com/BestBuy_US/images/products/3465/346575_rc.jpg"
|
||||
},
|
||||
{
|
||||
"sku": 43900,
|
||||
"name": "Duracell - AAA Batteries (4-Pack)",
|
||||
"type": "HardGood",
|
||||
"price": 5.49,
|
||||
"upc": "041333424019",
|
||||
"category": [
|
||||
{
|
||||
"id": "pcmcat312300050015",
|
||||
"name": "Connected Home & Housewares"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat248700050021",
|
||||
"name": "Housewares"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat303600050001",
|
||||
"name": "Household Batteries"
|
||||
},
|
||||
{
|
||||
"id": "abcat0208002",
|
||||
"name": "Alkaline Batteries"
|
||||
}
|
||||
],
|
||||
"shipping": 5.49,
|
||||
"description": "Compatible with select electronic devices; AAA size; DURALOCK Power Preserve technology; 4-pack",
|
||||
"manufacturer": "Duracell",
|
||||
"model": "MN2400B4Z",
|
||||
"url": "http://www.bestbuy.com/site/duracell-aaa-batteries-4-pack/43900.p?id=1051384074145&skuId=43900&cmp=RMXCC",
|
||||
"image": "http://img.bbystatic.com/BestBuy_US/images/products/4390/43900_sa.jpg"
|
||||
},
|
||||
{
|
||||
"sku": 48530,
|
||||
"name": "Duracell - AA 1.5V CopperTop Batteries (4-Pack)",
|
||||
"type": "HardGood",
|
||||
"price": 5.49,
|
||||
"upc": "041333415017",
|
||||
"category": [
|
||||
{
|
||||
"id": "pcmcat312300050015",
|
||||
"name": "Connected Home & Housewares"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat248700050021",
|
||||
"name": "Housewares"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat303600050001",
|
||||
"name": "Household Batteries"
|
||||
},
|
||||
{
|
||||
"id": "abcat0208002",
|
||||
"name": "Alkaline Batteries"
|
||||
}
|
||||
],
|
||||
"shipping": 5.49,
|
||||
"description": "Long-lasting energy; DURALOCK Power Preserve technology; for toys, clocks, radios, games, remotes, PDAs and more",
|
||||
"manufacturer": "Duracell",
|
||||
"model": "MN1500B4Z",
|
||||
"url": "http://www.bestbuy.com/site/duracell-aa-1-5v-coppertop-batteries-4-pack/48530.p?id=1099385268988&skuId=48530&cmp=RMXCC",
|
||||
"image": "http://img.bbystatic.com/BestBuy_US/images/products/4853/48530_sa.jpg"
|
||||
}
|
||||
]
|
@ -0,0 +1,40 @@
|
||||
---
|
||||
source: dump/src/reader/v3/mod.rs
|
||||
expression: movies.settings()
|
||||
---
|
||||
Ok(
|
||||
Settings {
|
||||
displayed_attributes: Reset,
|
||||
searchable_attributes: Reset,
|
||||
filterable_attributes: Set(
|
||||
{
|
||||
"genres",
|
||||
"id",
|
||||
},
|
||||
),
|
||||
sortable_attributes: Set(
|
||||
{
|
||||
"release_date",
|
||||
},
|
||||
),
|
||||
ranking_rules: Set(
|
||||
[
|
||||
"words",
|
||||
"typo",
|
||||
"proximity",
|
||||
"attribute",
|
||||
"sort",
|
||||
"exactness",
|
||||
"release_date:asc",
|
||||
],
|
||||
),
|
||||
stop_words: Set(
|
||||
{},
|
||||
),
|
||||
synonyms: Set(
|
||||
{},
|
||||
),
|
||||
distinct_attribute: Reset,
|
||||
_kind: PhantomData<dump::reader::v3::settings::Checked>,
|
||||
},
|
||||
)
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,57 @@
|
||||
---
|
||||
source: dump/src/reader/v4/mod.rs
|
||||
expression: spells.settings()
|
||||
---
|
||||
Ok(
|
||||
Settings {
|
||||
displayed_attributes: Reset,
|
||||
searchable_attributes: Reset,
|
||||
filterable_attributes: Set(
|
||||
{},
|
||||
),
|
||||
sortable_attributes: Set(
|
||||
{},
|
||||
),
|
||||
ranking_rules: Set(
|
||||
[
|
||||
"words",
|
||||
"typo",
|
||||
"proximity",
|
||||
"attribute",
|
||||
"sort",
|
||||
"exactness",
|
||||
],
|
||||
),
|
||||
stop_words: Set(
|
||||
{},
|
||||
),
|
||||
synonyms: Set(
|
||||
{},
|
||||
),
|
||||
distinct_attribute: Reset,
|
||||
typo_tolerance: Set(
|
||||
TypoSettings {
|
||||
enabled: Set(
|
||||
true,
|
||||
),
|
||||
min_word_size_for_typos: Set(
|
||||
MinWordSizeTyposSetting {
|
||||
one_typo: Set(
|
||||
5,
|
||||
),
|
||||
two_typos: Set(
|
||||
9,
|
||||
),
|
||||
},
|
||||
),
|
||||
disable_on_words: Set(
|
||||
{},
|
||||
),
|
||||
disable_on_attributes: Set(
|
||||
{},
|
||||
),
|
||||
},
|
||||
),
|
||||
_kind: PhantomData<dump::reader::v4::settings::Checked>,
|
||||
},
|
||||
)
|
@ -0,0 +1,533 @@
|
||||
---
|
||||
source: dump/src/reader/v4/mod.rs
|
||||
expression: documents
|
||||
---
|
||||
[
|
||||
{
|
||||
"index": "acid-arrow",
|
||||
"name": "Acid Arrow",
|
||||
"desc": [
|
||||
"A shimmering green arrow streaks toward a target within range and bursts in a spray of acid. Make a ranged spell attack against the target. On a hit, the target takes 4d4 acid damage immediately and 2d4 acid damage at the end of its next turn. On a miss, the arrow splashes the target with acid for half as much of the initial damage and no damage at the end of its next turn."
|
||||
],
|
||||
"higher_level": [
|
||||
"When you cast this spell using a spell slot of 3rd level or higher, the damage (both initial and later) increases by 1d4 for each slot level above 2nd."
|
||||
],
|
||||
"range": "90 feet",
|
||||
"components": [
|
||||
"V",
|
||||
"S",
|
||||
"M"
|
||||
],
|
||||
"material": "Powdered rhubarb leaf and an adder's stomach.",
|
||||
"ritual": false,
|
||||
"duration": "Instantaneous",
|
||||
"concentration": false,
|
||||
"casting_time": "1 action",
|
||||
"level": 2,
|
||||
"attack_type": "ranged",
|
||||
"damage": {
|
||||
"damage_type": {
|
||||
"index": "acid",
|
||||
"name": "Acid",
|
||||
"url": "/api/damage-types/acid"
|
||||
},
|
||||
"damage_at_slot_level": {
|
||||
"2": "4d4",
|
||||
"3": "5d4",
|
||||
"4": "6d4",
|
||||
"5": "7d4",
|
||||
"6": "8d4",
|
||||
"7": "9d4",
|
||||
"8": "10d4",
|
||||
"9": "11d4"
|
||||
}
|
||||
},
|
||||
"school": {
|
||||
"index": "evocation",
|
||||
"name": "Evocation",
|
||||
"url": "/api/magic-schools/evocation"
|
||||
},
|
||||
"classes": [
|
||||
{
|
||||
"index": "wizard",
|
||||
"name": "Wizard",
|
||||
"url": "/api/classes/wizard"
|
||||
}
|
||||
],
|
||||
"subclasses": [
|
||||
{
|
||||
"index": "lore",
|
||||
"name": "Lore",
|
||||
"url": "/api/subclasses/lore"
|
||||
},
|
||||
{
|
||||
"index": "land",
|
||||
"name": "Land",
|
||||
"url": "/api/subclasses/land"
|
||||
}
|
||||
],
|
||||
"url": "/api/spells/acid-arrow"
|
||||
},
|
||||
{
|
||||
"index": "acid-splash",
|
||||
"name": "Acid Splash",
|
||||
"desc": [
|
||||
"You hurl a bubble of acid. Choose one creature within range, or choose two creatures within range that are within 5 feet of each other. A target must succeed on a dexterity saving throw or take 1d6 acid damage.",
|
||||
"This spell's damage increases by 1d6 when you reach 5th level (2d6), 11th level (3d6), and 17th level (4d6)."
|
||||
],
|
||||
"range": "60 feet",
|
||||
"components": [
|
||||
"V",
|
||||
"S"
|
||||
],
|
||||
"ritual": false,
|
||||
"duration": "Instantaneous",
|
||||
"concentration": false,
|
||||
"casting_time": "1 action",
|
||||
"level": 0,
|
||||
"damage": {
|
||||
"damage_type": {
|
||||
"index": "acid",
|
||||
"name": "Acid",
|
||||
"url": "/api/damage-types/acid"
|
||||
},
|
||||
"damage_at_character_level": {
|
||||
"1": "1d6",
|
||||
"5": "2d6",
|
||||
"11": "3d6",
|
||||
"17": "4d6"
|
||||
}
|
||||
},
|
||||
"school": {
|
||||
"index": "conjuration",
|
||||
"name": "Conjuration",
|
||||
"url": "/api/magic-schools/conjuration"
|
||||
},
|
||||
"classes": [
|
||||
{
|
||||
"index": "sorcerer",
|
||||
"name": "Sorcerer",
|
||||
"url": "/api/classes/sorcerer"
|
||||
},
|
||||
{
|
||||
"index": "wizard",
|
||||
"name": "Wizard",
|
||||
"url": "/api/classes/wizard"
|
||||
}
|
||||
],
|
||||
"subclasses": [
|
||||
{
|
||||
"index": "lore",
|
||||
"name": "Lore",
|
||||
"url": "/api/subclasses/lore"
|
||||
}
|
||||
],
|
||||
"url": "/api/spells/acid-splash",
|
||||
"dc": {
|
||||
"dc_type": {
|
||||
"index": "dex",
|
||||
"name": "DEX",
|
||||
"url": "/api/ability-scores/dex"
|
||||
},
|
||||
"dc_success": "none"
|
||||
}
|
||||
},
|
||||
{
|
||||
"index": "aid",
|
||||
"name": "Aid",
|
||||
"desc": [
|
||||
"Your spell bolsters your allies with toughness and resolve. Choose up to three creatures within range. Each target's hit point maximum and current hit points increase by 5 for the duration."
|
||||
],
|
||||
"higher_level": [
|
||||
"When you cast this spell using a spell slot of 3rd level or higher, a target's hit points increase by an additional 5 for each slot level above 2nd."
|
||||
],
|
||||
"range": "30 feet",
|
||||
"components": [
|
||||
"V",
|
||||
"S",
|
||||
"M"
|
||||
],
|
||||
"material": "A tiny strip of white cloth.",
|
||||
"ritual": false,
|
||||
"duration": "8 hours",
|
||||
"concentration": false,
|
||||
"casting_time": "1 action",
|
||||
"level": 2,
|
||||
"school": {
|
||||
"index": "abjuration",
|
||||
"name": "Abjuration",
|
||||
"url": "/api/magic-schools/abjuration"
|
||||
},
|
||||
"classes": [
|
||||
{
|
||||
"index": "cleric",
|
||||
"name": "Cleric",
|
||||
"url": "/api/classes/cleric"
|
||||
},
|
||||
{
|
||||
"index": "paladin",
|
||||
"name": "Paladin",
|
||||
"url": "/api/classes/paladin"
|
||||
}
|
||||
],
|
||||
"subclasses": [
|
||||
{
|
||||
"index": "lore",
|
||||
"name": "Lore",
|
||||
"url": "/api/subclasses/lore"
|
||||
}
|
||||
],
|
||||
"url": "/api/spells/aid",
|
||||
"heal_at_slot_level": {
|
||||
"2": "5",
|
||||
"3": "10",
|
||||
"4": "15",
|
||||
"5": "20",
|
||||
"6": "25",
|
||||
"7": "30",
|
||||
"8": "35",
|
||||
"9": "40"
|
||||
}
|
||||
},
|
||||
{
|
||||
"index": "alarm",
|
||||
"name": "Alarm",
|
||||
"desc": [
|
||||
"You set an alarm against unwanted intrusion. Choose a door, a window, or an area within range that is no larger than a 20-foot cube. Until the spell ends, an alarm alerts you whenever a Tiny or larger creature touches or enters the warded area. When you cast the spell, you can designate creatures that won't set off the alarm. You also choose whether the alarm is mental or audible.",
|
||||
"A mental alarm alerts you with a ping in your mind if you are within 1 mile of the warded area. This ping awakens you if you are sleeping.",
|
||||
"An audible alarm produces the sound of a hand bell for 10 seconds within 60 feet."
|
||||
],
|
||||
"range": "30 feet",
|
||||
"components": [
|
||||
"V",
|
||||
"S",
|
||||
"M"
|
||||
],
|
||||
"material": "A tiny bell and a piece of fine silver wire.",
|
||||
"ritual": true,
|
||||
"duration": "8 hours",
|
||||
"concentration": false,
|
||||
"casting_time": "1 minute",
|
||||
"level": 1,
|
||||
"school": {
|
||||
"index": "abjuration",
|
||||
"name": "Abjuration",
|
||||
"url": "/api/magic-schools/abjuration"
|
||||
},
|
||||
"classes": [
|
||||
{
|
||||
"index": "ranger",
|
||||
"name": "Ranger",
|
||||
"url": "/api/classes/ranger"
|
||||
},
|
||||
{
|
||||
"index": "wizard",
|
||||
"name": "Wizard",
|
||||
"url": "/api/classes/wizard"
|
||||
}
|
||||
],
|
||||
"subclasses": [
|
||||
{
|
||||
"index": "lore",
|
||||
"name": "Lore",
|
||||
"url": "/api/subclasses/lore"
|
||||
}
|
||||
],
|
||||
"url": "/api/spells/alarm",
|
||||
"area_of_effect": {
|
||||
"type": "cube",
|
||||
"size": 20
|
||||
}
|
||||
},
|
||||
{
|
||||
"index": "alter-self",
|
||||
"name": "Alter Self",
|
||||
"desc": [
|
||||
"You assume a different form. When you cast the spell, choose one of the following options, the effects of which last for the duration of the spell. While the spell lasts, you can end one option as an action to gain the benefits of a different one.",
|
||||
"***Aquatic Adaptation.*** You adapt your body to an aquatic environment, sprouting gills and growing webbing between your fingers. You can breathe underwater and gain a swimming speed equal to your walking speed.",
|
||||
"***Change Appearance.*** You transform your appearance. You decide what you look like, including your height, weight, facial features, sound of your voice, hair length, coloration, and distinguishing characteristics, if any. You can make yourself appear as a member of another race, though none of your statistics change. You also can't appear as a creature of a different size than you, and your basic shape stays the same; if you're bipedal, you can't use this spell to become quadrupedal, for instance. At any time for the duration of the spell, you can use your action to change your appearance in this way again.",
|
||||
"***Natural Weapons.*** You grow claws, fangs, spines, horns, or a different natural weapon of your choice. Your unarmed strikes deal 1d6 bludgeoning, piercing, or slashing damage, as appropriate to the natural weapon you chose, and you are proficient with your unarmed strikes. Finally, the natural weapon is magic and you have a +1 bonus to the attack and damage rolls you make using it."
|
||||
],
|
||||
"range": "Self",
|
||||
"components": [
|
||||
"V",
|
||||
"S"
|
||||
],
|
||||
"ritual": false,
|
||||
"duration": "Up to 1 hour",
|
||||
"concentration": true,
|
||||
"casting_time": "1 action",
|
||||
"level": 2,
|
||||
"school": {
|
||||
"index": "transmutation",
|
||||
"name": "Transmutation",
|
||||
"url": "/api/magic-schools/transmutation"
|
||||
},
|
||||
"classes": [
|
||||
{
|
||||
"index": "sorcerer",
|
||||
"name": "Sorcerer",
|
||||
"url": "/api/classes/sorcerer"
|
||||
},
|
||||
{
|
||||
"index": "wizard",
|
||||
"name": "Wizard",
|
||||
"url": "/api/classes/wizard"
|
||||
}
|
||||
],
|
||||
"subclasses": [
|
||||
{
|
||||
"index": "lore",
|
||||
"name": "Lore",
|
||||
"url": "/api/subclasses/lore"
|
||||
}
|
||||
],
|
||||
"url": "/api/spells/alter-self"
|
||||
},
|
||||
{
|
||||
"index": "animal-friendship",
|
||||
"name": "Animal Friendship",
|
||||
"desc": [
|
||||
"This spell lets you convince a beast that you mean it no harm. Choose a beast that you can see within range. It must see and hear you. If the beast's Intelligence is 4 or higher, the spell fails. Otherwise, the beast must succeed on a wisdom saving throw or be charmed by you for the spell's duration. If you or one of your companions harms the target, the spells ends."
|
||||
],
|
||||
"range": "30 feet",
|
||||
"components": [
|
||||
"V",
|
||||
"S",
|
||||
"M"
|
||||
],
|
||||
"material": "A morsel of food.",
|
||||
"ritual": false,
|
||||
"duration": "24 hours",
|
||||
"concentration": false,
|
||||
"casting_time": "1 action",
|
||||
"level": 1,
|
||||
"school": {
|
||||
"index": "enchantment",
|
||||
"name": "Enchantment",
|
||||
"url": "/api/magic-schools/enchantment"
|
||||
},
|
||||
"classes": [
|
||||
{
|
||||
"index": "bard",
|
||||
"name": "Bard",
|
||||
"url": "/api/classes/bard"
|
||||
},
|
||||
{
|
||||
"index": "cleric",
|
||||
"name": "Cleric",
|
||||
"url": "/api/classes/cleric"
|
||||
},
|
||||
{
|
||||
"index": "druid",
|
||||
"name": "Druid",
|
||||
"url": "/api/classes/druid"
|
||||
},
|
||||
{
|
||||
"index": "ranger",
|
||||
"name": "Ranger",
|
||||
"url": "/api/classes/ranger"
|
||||
}
|
||||
],
|
||||
"subclasses": [],
|
||||
"url": "/api/spells/animal-friendship",
|
||||
"dc": {
|
||||
"dc_type": {
|
||||
"index": "wis",
|
||||
"name": "WIS",
|
||||
"url": "/api/ability-scores/wis"
|
||||
},
|
||||
"dc_success": "none"
|
||||
}
|
||||
},
|
||||
{
|
||||
"index": "animal-messenger",
|
||||
"name": "Animal Messenger",
|
||||
"desc": [
|
||||
"By means of this spell, you use an animal to deliver a message. Choose a Tiny beast you can see within range, such as a squirrel, a blue jay, or a bat. You specify a location, which you must have visited, and a recipient who matches a general description, such as \"a man or woman dressed in the uniform of the town guard\" or \"a red-haired dwarf wearing a pointed hat.\" You also speak a message of up to twenty-five words. The target beast travels for the duration of the spell toward the specified location, covering about 50 miles per 24 hours for a flying messenger, or 25 miles for other animals.",
|
||||
"When the messenger arrives, it delivers your message to the creature that you described, replicating the sound of your voice. The messenger speaks only to a creature matching the description you gave. If the messenger doesn't reach its destination before the spell ends, the message is lost, and the beast makes its way back to where you cast this spell."
|
||||
],
|
||||
"higher_level": [
|
||||
"If you cast this spell using a spell slot of 3nd level or higher, the duration of the spell increases by 48 hours for each slot level above 2nd."
|
||||
],
|
||||
"range": "30 feet",
|
||||
"components": [
|
||||
"V",
|
||||
"S",
|
||||
"M"
|
||||
],
|
||||
"material": "A morsel of food.",
|
||||
"ritual": true,
|
||||
"duration": "24 hours",
|
||||
"concentration": false,
|
||||
"casting_time": "1 action",
|
||||
"level": 2,
|
||||
"school": {
|
||||
"index": "enchantment",
|
||||
"name": "Enchantment",
|
||||
"url": "/api/magic-schools/enchantment"
|
||||
},
|
||||
"classes": [
|
||||
{
|
||||
"index": "bard",
|
||||
"name": "Bard",
|
||||
"url": "/api/classes/bard"
|
||||
},
|
||||
{
|
||||
"index": "druid",
|
||||
"name": "Druid",
|
||||
"url": "/api/classes/druid"
|
||||
},
|
||||
{
|
||||
"index": "ranger",
|
||||
"name": "Ranger",
|
||||
"url": "/api/classes/ranger"
|
||||
}
|
||||
],
|
||||
"subclasses": [
|
||||
{
|
||||
"index": "lore",
|
||||
"name": "Lore",
|
||||
"url": "/api/subclasses/lore"
|
||||
}
|
||||
],
|
||||
"url": "/api/spells/animal-messenger"
|
||||
},
|
||||
{
|
||||
"index": "animal-shapes",
|
||||
"name": "Animal Shapes",
|
||||
"desc": [
|
||||
"Your magic turns others into beasts. Choose any number of willing creatures that you can see within range. You transform each target into the form of a Large or smaller beast with a challenge rating of 4 or lower. On subsequent turns, you can use your action to transform affected creatures into new forms.",
|
||||
"The transformation lasts for the duration for each target, or until the target drops to 0 hit points or dies. You can choose a different form for each target. A target's game statistics are replaced by the statistics of the chosen beast, though the target retains its alignment and Intelligence, Wisdom, and Charisma scores. The target assumes the hit points of its new form, and when it reverts to its normal form, it returns to the number of hit points it had before it transformed. If it reverts as a result of dropping to 0 hit points, any excess damage carries over to its normal form. As long as the excess damage doesn't reduce the creature's normal form to 0 hit points, it isn't knocked unconscious. The creature is limited in the actions it can perform by the nature of its new form, and it can't speak or cast spells.",
|
||||
"The target's gear melds into the new form. The target can't activate, wield, or otherwise benefit from any of its equipment."
|
||||
],
|
||||
"range": "30 feet",
|
||||
"components": [
|
||||
"V",
|
||||
"S"
|
||||
],
|
||||
"ritual": false,
|
||||
"duration": "Up to 24 hours",
|
||||
"concentration": true,
|
||||
"casting_time": "1 action",
|
||||
"level": 8,
|
||||
"school": {
|
||||
"index": "transmutation",
|
||||
"name": "Transmutation",
|
||||
"url": "/api/magic-schools/transmutation"
|
||||
},
|
||||
"classes": [
|
||||
{
|
||||
"index": "druid",
|
||||
"name": "Druid",
|
||||
"url": "/api/classes/druid"
|
||||
}
|
||||
],
|
||||
"subclasses": [],
|
||||
"url": "/api/spells/animal-shapes"
|
||||
},
|
||||
{
|
||||
"index": "animate-dead",
|
||||
"name": "Animate Dead",
|
||||
"desc": [
|
||||
"This spell creates an undead servant. Choose a pile of bones or a corpse of a Medium or Small humanoid within range. Your spell imbues the target with a foul mimicry of life, raising it as an undead creature. The target becomes a skeleton if you chose bones or a zombie if you chose a corpse (the DM has the creature's game statistics).",
|
||||
"On each of your turns, you can use a bonus action to mentally command any creature you made with this spell if the creature is within 60 feet of you (if you control multiple creatures, you can command any or all of them at the same time, issuing the same command to each one). You decide what action the creature will take and where it will move during its next turn, or you can issue a general command, such as to guard a particular chamber or corridor. If you issue no commands, the creature only defends itself against hostile creatures. Once given an order, the creature continues to follow it until its task is complete.",
|
||||
"The creature is under your control for 24 hours, after which it stops obeying any command you've given it. To maintain control of the creature for another 24 hours, you must cast this spell on the creature again before the current 24-hour period ends. This use of the spell reasserts your control over up to four creatures you have animated with this spell, rather than animating a new one."
|
||||
],
|
||||
"higher_level": [
|
||||
"When you cast this spell using a spell slot of 4th level or higher, you animate or reassert control over two additional undead creatures for each slot level above 3rd. Each of the creatures must come from a different corpse or pile of bones."
|
||||
],
|
||||
"range": "10 feet",
|
||||
"components": [
|
||||
"V",
|
||||
"S",
|
||||
"M"
|
||||
],
|
||||
"material": "A drop of blood, a piece of flesh, and a pinch of bone dust.",
|
||||
"ritual": false,
|
||||
"duration": "Instantaneous",
|
||||
"concentration": false,
|
||||
"casting_time": "1 minute",
|
||||
"level": 3,
|
||||
"school": {
|
||||
"index": "necromancy",
|
||||
"name": "Necromancy",
|
||||
"url": "/api/magic-schools/necromancy"
|
||||
},
|
||||
"classes": [
|
||||
{
|
||||
"index": "cleric",
|
||||
"name": "Cleric",
|
||||
"url": "/api/classes/cleric"
|
||||
},
|
||||
{
|
||||
"index": "wizard",
|
||||
"name": "Wizard",
|
||||
"url": "/api/classes/wizard"
|
||||
}
|
||||
],
|
||||
"subclasses": [
|
||||
{
|
||||
"index": "lore",
|
||||
"name": "Lore",
|
||||
"url": "/api/subclasses/lore"
|
||||
}
|
||||
],
|
||||
"url": "/api/spells/animate-dead"
|
||||
},
|
||||
{
|
||||
"index": "animate-objects",
|
||||
"name": "Animate Objects",
|
||||
"desc": [
|
||||
"Objects come to life at your command. Choose up to ten nonmagical objects within range that are not being worn or carried. Medium targets count as two objects, Large targets count as four objects, Huge targets count as eight objects. You can't animate any object larger than Huge. Each target animates and becomes a creature under your control until the spell ends or until reduced to 0 hit points.",
|
||||
"As a bonus action, you can mentally command any creature you made with this spell if the creature is within 500 feet of you (if you control multiple creatures, you can command any or all of them at the same time, issuing the same command to each one). You decide what action the creature will take and where it will move during its next turn, or you can issue a general command, such as to guard a particular chamber or corridor. If you issue no commands, the creature only defends itself against hostile creatures. Once given an order, the creature continues to follow it until its task is complete.",
|
||||
"##### Animated Object Statistics",
|
||||
"| Size | HP | AC | Attack | Str | Dex |",
|
||||
"|---|---|---|---|---|---|",
|
||||
"| Tiny | 20 | 18 | +8 to hit, 1d4 + 4 damage | 4 | 18 |",
|
||||
"| Small | 25 | 16 | +6 to hit, 1d8 + 2 damage | 6 | 14 |",
|
||||
"| Medium | 40 | 13 | +5 to hit, 2d6 + 1 damage | 10 | 12 |",
|
||||
"| Large | 50 | 10 | +6 to hit, 2d10 + 2 damage | 14 | 10 |",
|
||||
"| Huge | 80 | 10 | +8 to hit, 2d12 + 4 damage | 18 | 6 |",
|
||||
"An animated object is a construct with AC, hit points, attacks, Strength, and Dexterity determined by its size. Its Constitution is 10 and its Intelligence and Wisdom are 3, and its Charisma is 1. Its speed is 30 feet; if the object lacks legs or other appendages it can use for locomotion, it instead has a flying speed of 30 feet and can hover. If the object is securely attached to a surface or a larger object, such as a chain bolted to a wall, its speed is 0. It has blindsight with a radius of 30 feet and is blind beyond that distance. When the animated object drops to 0 hit points, it reverts to its original object form, and any remaining damage carries over to its original object form.",
|
||||
"If you command an object to attack, it can make a single melee attack against a creature within 5 feet of it. It makes a slam attack with an attack bonus and bludgeoning damage determined by its size. The DM might rule that a specific object inflicts slashing or piercing damage based on its form."
|
||||
],
|
||||
"higher_level": [
|
||||
"If you cast this spell using a spell slot of 6th level or higher, you can animate two additional objects for each slot level above 5th."
|
||||
],
|
||||
"range": "120 feet",
|
||||
"components": [
|
||||
"V",
|
||||
"S"
|
||||
],
|
||||
"ritual": false,
|
||||
"duration": "Up to 1 minute",
|
||||
"concentration": true,
|
||||
"casting_time": "1 action",
|
||||
"level": 5,
|
||||
"school": {
|
||||
"index": "transmutation",
|
||||
"name": "Transmutation",
|
||||
"url": "/api/magic-schools/transmutation"
|
||||
},
|
||||
"classes": [
|
||||
{
|
||||
"index": "bard",
|
||||
"name": "Bard",
|
||||
"url": "/api/classes/bard"
|
||||
},
|
||||
{
|
||||
"index": "sorcerer",
|
||||
"name": "Sorcerer",
|
||||
"url": "/api/classes/sorcerer"
|
||||
},
|
||||
{
|
||||
"index": "wizard",
|
||||
"name": "Wizard",
|
||||
"url": "/api/classes/wizard"
|
||||
}
|
||||
],
|
||||
"subclasses": [],
|
||||
"url": "/api/spells/animate-objects"
|
||||
}
|
||||
]
|
@ -0,0 +1,384 @@
|
||||
---
|
||||
source: dump/src/reader/v4/mod.rs
|
||||
expression: tasks
|
||||
---
|
||||
[
|
||||
{
|
||||
"id": 9,
|
||||
"index_uid": "movies_2",
|
||||
"content": {
|
||||
"DocumentAddition": {
|
||||
"content_uuid": "3b12a971-bca2-4716-9889-36ffb715ae1d",
|
||||
"merge_strategy": "ReplaceDocuments",
|
||||
"primary_key": null,
|
||||
"documents_count": 200,
|
||||
"allow_index_creation": true
|
||||
}
|
||||
},
|
||||
"events": [
|
||||
{
|
||||
"Created": "2022-10-06T12:53:49.125132233Z"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": 8,
|
||||
"index_uid": "movies",
|
||||
"content": {
|
||||
"DocumentAddition": {
|
||||
"content_uuid": "cae3205a-6016-471b-81de-081a195f098c",
|
||||
"merge_strategy": "ReplaceDocuments",
|
||||
"primary_key": null,
|
||||
"documents_count": 100,
|
||||
"allow_index_creation": true
|
||||
}
|
||||
},
|
||||
"events": [
|
||||
{
|
||||
"Created": "2022-10-06T12:53:49.114226973Z"
|
||||
},
|
||||
{
|
||||
"Batched": {
|
||||
"timestamp": "2022-10-06T12:53:49.125918825Z",
|
||||
"batch_id": 8
|
||||
}
|
||||
},
|
||||
{
|
||||
"Processing": "2022-10-06T12:53:49.125930546Z"
|
||||
},
|
||||
{
|
||||
"Succeded": {
|
||||
"result": {
|
||||
"DocumentAddition": {
|
||||
"indexed_documents": 100
|
||||
}
|
||||
},
|
||||
"timestamp": "2022-10-06T12:53:49.785862546Z"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": 7,
|
||||
"index_uid": "dnd_spells",
|
||||
"content": {
|
||||
"DocumentAddition": {
|
||||
"content_uuid": "7ba1eaa0-d2fb-4852-8d00-f35ed166728f",
|
||||
"merge_strategy": "ReplaceDocuments",
|
||||
"primary_key": "index",
|
||||
"documents_count": 10,
|
||||
"allow_index_creation": true
|
||||
}
|
||||
},
|
||||
"events": [
|
||||
{
|
||||
"Created": "2022-10-06T12:53:41.070732179Z"
|
||||
},
|
||||
{
|
||||
"Batched": {
|
||||
"timestamp": "2022-10-06T12:53:41.085563291Z",
|
||||
"batch_id": 7
|
||||
}
|
||||
},
|
||||
{
|
||||
"Processing": "2022-10-06T12:53:41.085563961Z"
|
||||
},
|
||||
{
|
||||
"Succeded": {
|
||||
"result": {
|
||||
"DocumentAddition": {
|
||||
"indexed_documents": 10
|
||||
}
|
||||
},
|
||||
"timestamp": "2022-10-06T12:53:41.116036186Z"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"index_uid": "dnd_spells",
|
||||
"content": {
|
||||
"DocumentAddition": {
|
||||
"content_uuid": "f2fb7d6e-11b6-45d9-aa7a-9495a567a275",
|
||||
"merge_strategy": "ReplaceDocuments",
|
||||
"primary_key": null,
|
||||
"documents_count": 10,
|
||||
"allow_index_creation": true
|
||||
}
|
||||
},
|
||||
"events": [
|
||||
{
|
||||
"Created": "2022-10-06T12:53:40.831649057Z"
|
||||
},
|
||||
{
|
||||
"Batched": {
|
||||
"timestamp": "2022-10-06T12:53:40.834515892Z",
|
||||
"batch_id": 6
|
||||
}
|
||||
},
|
||||
{
|
||||
"Processing": "2022-10-06T12:53:40.834516572Z"
|
||||
},
|
||||
{
|
||||
"Failed": {
|
||||
"error": {
|
||||
"message": "The primary key inference process failed because the engine did not find any fields containing `id` substring in their name. If your document identifier does not contain any `id` substring, you can set the primary key of the index.",
|
||||
"code": "primary_key_inference_failed",
|
||||
"type": "invalid_request",
|
||||
"link": "https://docs.meilisearch.com/errors#primary_key_inference_failed"
|
||||
},
|
||||
"timestamp": "2022-10-06T12:53:40.905384918Z"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"index_uid": "products",
|
||||
"content": {
|
||||
"DocumentAddition": {
|
||||
"content_uuid": "f269fe46-36fe-4fe7-8c4e-2054f1b23594",
|
||||
"merge_strategy": "ReplaceDocuments",
|
||||
"primary_key": "sku",
|
||||
"documents_count": 10,
|
||||
"allow_index_creation": true
|
||||
}
|
||||
},
|
||||
"events": [
|
||||
{
|
||||
"Created": "2022-10-06T12:53:40.576727649Z"
|
||||
},
|
||||
{
|
||||
"Batched": {
|
||||
"timestamp": "2022-10-06T12:53:40.587595408Z",
|
||||
"batch_id": 5
|
||||
}
|
||||
},
|
||||
{
|
||||
"Processing": "2022-10-06T12:53:40.587596158Z"
|
||||
},
|
||||
{
|
||||
"Succeded": {
|
||||
"result": {
|
||||
"DocumentAddition": {
|
||||
"indexed_documents": 10
|
||||
}
|
||||
},
|
||||
"timestamp": "2022-10-06T12:53:40.603035979Z"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"index_uid": "products",
|
||||
"content": {
|
||||
"DocumentAddition": {
|
||||
"content_uuid": "7d1ea292-cdb6-4f47-8b25-c2ddde89035c",
|
||||
"merge_strategy": "ReplaceDocuments",
|
||||
"primary_key": null,
|
||||
"documents_count": 10,
|
||||
"allow_index_creation": true
|
||||
}
|
||||
},
|
||||
"events": [
|
||||
{
|
||||
"Created": "2022-10-06T12:53:39.979427178Z"
|
||||
},
|
||||
{
|
||||
"Batched": {
|
||||
"timestamp": "2022-10-06T12:53:39.986159313Z",
|
||||
"batch_id": 4
|
||||
}
|
||||
},
|
||||
{
|
||||
"Processing": "2022-10-06T12:53:39.986160113Z"
|
||||
},
|
||||
{
|
||||
"Failed": {
|
||||
"error": {
|
||||
"message": "The primary key inference process failed because the engine did not find any fields containing `id` substring in their name. If your document identifier does not contain any `id` substring, you can set the primary key of the index.",
|
||||
"code": "primary_key_inference_failed",
|
||||
"type": "invalid_request",
|
||||
"link": "https://docs.meilisearch.com/errors#primary_key_inference_failed"
|
||||
},
|
||||
"timestamp": "2022-10-06T12:53:39.98921592Z"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"index_uid": "products",
|
||||
"content": {
|
||||
"SettingsUpdate": {
|
||||
"settings": {
|
||||
"synonyms": {
|
||||
"android": [
|
||||
"phone",
|
||||
"smartphone"
|
||||
],
|
||||
"iphone": [
|
||||
"phone",
|
||||
"smartphone"
|
||||
],
|
||||
"phone": [
|
||||
"smartphone",
|
||||
"iphone",
|
||||
"android"
|
||||
]
|
||||
}
|
||||
},
|
||||
"is_deletion": false,
|
||||
"allow_index_creation": true
|
||||
}
|
||||
},
|
||||
"events": [
|
||||
{
|
||||
"Created": "2022-10-06T12:53:39.360187055Z"
|
||||
},
|
||||
{
|
||||
"Batched": {
|
||||
"timestamp": "2022-10-06T12:53:39.371250258Z",
|
||||
"batch_id": 3
|
||||
}
|
||||
},
|
||||
{
|
||||
"Processing": "2022-10-06T12:53:39.371250918Z"
|
||||
},
|
||||
{
|
||||
"Processing": "2022-10-06T12:53:39.373988491Z"
|
||||
},
|
||||
{
|
||||
"Succeded": {
|
||||
"result": "Other",
|
||||
"timestamp": "2022-10-06T12:53:39.449840865Z"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"index_uid": "movies",
|
||||
"content": {
|
||||
"SettingsUpdate": {
|
||||
"settings": {
|
||||
"rankingRules": [
|
||||
"words",
|
||||
"typo",
|
||||
"proximity",
|
||||
"attribute",
|
||||
"sort",
|
||||
"exactness",
|
||||
"release_date:asc"
|
||||
]
|
||||
},
|
||||
"is_deletion": false,
|
||||
"allow_index_creation": true
|
||||
}
|
||||
},
|
||||
"events": [
|
||||
{
|
||||
"Created": "2022-10-06T12:53:39.143829637Z"
|
||||
},
|
||||
{
|
||||
"Batched": {
|
||||
"timestamp": "2022-10-06T12:53:39.154803808Z",
|
||||
"batch_id": 2
|
||||
}
|
||||
},
|
||||
{
|
||||
"Processing": "2022-10-06T12:53:39.154804558Z"
|
||||
},
|
||||
{
|
||||
"Processing": "2022-10-06T12:53:39.157501241Z"
|
||||
},
|
||||
{
|
||||
"Succeded": {
|
||||
"result": "Other",
|
||||
"timestamp": "2022-10-06T12:53:39.160263154Z"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": 1,
|
||||
"index_uid": "movies",
|
||||
"content": {
|
||||
"SettingsUpdate": {
|
||||
"settings": {
|
||||
"filterableAttributes": [
|
||||
"genres",
|
||||
"id"
|
||||
],
|
||||
"sortableAttributes": [
|
||||
"release_date"
|
||||
]
|
||||
},
|
||||
"is_deletion": false,
|
||||
"allow_index_creation": true
|
||||
}
|
||||
},
|
||||
"events": [
|
||||
{
|
||||
"Created": "2022-10-06T12:53:38.922837679Z"
|
||||
},
|
||||
{
|
||||
"Batched": {
|
||||
"timestamp": "2022-10-06T12:53:38.937712641Z",
|
||||
"batch_id": 1
|
||||
}
|
||||
},
|
||||
{
|
||||
"Processing": "2022-10-06T12:53:38.937713141Z"
|
||||
},
|
||||
{
|
||||
"Processing": "2022-10-06T12:53:38.940482335Z"
|
||||
},
|
||||
{
|
||||
"Succeded": {
|
||||
"result": "Other",
|
||||
"timestamp": "2022-10-06T12:53:38.953566059Z"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": 0,
|
||||
"index_uid": "movies",
|
||||
"content": {
|
||||
"DocumentAddition": {
|
||||
"content_uuid": "cee1eef7-fadd-4970-93dc-25518655175f",
|
||||
"merge_strategy": "ReplaceDocuments",
|
||||
"primary_key": null,
|
||||
"documents_count": 10,
|
||||
"allow_index_creation": true
|
||||
}
|
||||
},
|
||||
"events": [
|
||||
{
|
||||
"Created": "2022-10-06T12:53:38.710611568Z"
|
||||
},
|
||||
{
|
||||
"Batched": {
|
||||
"timestamp": "2022-10-06T12:53:38.717455314Z",
|
||||
"batch_id": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"Processing": "2022-10-06T12:53:38.717456194Z"
|
||||
},
|
||||
{
|
||||
"Succeded": {
|
||||
"result": {
|
||||
"DocumentAddition": {
|
||||
"indexed_documents": 10
|
||||
}
|
||||
},
|
||||
"timestamp": "2022-10-06T12:53:38.811687295Z"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
@ -0,0 +1,50 @@
|
||||
---
|
||||
source: dump/src/reader/v4/mod.rs
|
||||
expression: keys
|
||||
---
|
||||
[
|
||||
{
|
||||
"description": "Default Search API Key (Use it to search from the frontend)",
|
||||
"id": [
|
||||
110,
|
||||
113,
|
||||
57,
|
||||
52,
|
||||
113,
|
||||
97,
|
||||
71,
|
||||
106
|
||||
],
|
||||
"actions": [
|
||||
"search"
|
||||
],
|
||||
"indexes": [
|
||||
"*"
|
||||
],
|
||||
"expires_at": null,
|
||||
"created_at": "2022-10-06T12:53:33.424274047Z",
|
||||
"updated_at": "2022-10-06T12:53:33.424274047Z"
|
||||
},
|
||||
{
|
||||
"description": "Default Admin API Key (Use it for all other operations. Caution! Do not use it on a public frontend)",
|
||||
"id": [
|
||||
105,
|
||||
121,
|
||||
109,
|
||||
83,
|
||||
109,
|
||||
111,
|
||||
53,
|
||||
83
|
||||
],
|
||||
"actions": [
|
||||
"*"
|
||||
],
|
||||
"indexes": [
|
||||
"*"
|
||||
],
|
||||
"expires_at": null,
|
||||
"created_at": "2022-10-06T12:53:33.417707446Z",
|
||||
"updated_at": "2022-10-06T12:53:33.417707446Z"
|
||||
}
|
||||
]
|
@ -0,0 +1,71 @@
|
||||
---
|
||||
source: dump/src/reader/v4/mod.rs
|
||||
expression: products.settings()
|
||||
---
|
||||
Ok(
|
||||
Settings {
|
||||
displayed_attributes: Reset,
|
||||
searchable_attributes: Reset,
|
||||
filterable_attributes: Set(
|
||||
{},
|
||||
),
|
||||
sortable_attributes: Set(
|
||||
{},
|
||||
),
|
||||
ranking_rules: Set(
|
||||
[
|
||||
"words",
|
||||
"typo",
|
||||
"proximity",
|
||||
"attribute",
|
||||
"sort",
|
||||
"exactness",
|
||||
],
|
||||
),
|
||||
stop_words: Set(
|
||||
{},
|
||||
),
|
||||
synonyms: Set(
|
||||
{
|
||||
"android": [
|
||||
"phone",
|
||||
"smartphone",
|
||||
],
|
||||
"iphone": [
|
||||
"phone",
|
||||
"smartphone",
|
||||
],
|
||||
"phone": [
|
||||
"android",
|
||||
"iphone",
|
||||
"smartphone",
|
||||
],
|
||||
},
|
||||
),
|
||||
distinct_attribute: Reset,
|
||||
typo_tolerance: Set(
|
||||
TypoSettings {
|
||||
enabled: Set(
|
||||
true,
|
||||
),
|
||||
min_word_size_for_typos: Set(
|
||||
MinWordSizeTyposSetting {
|
||||
one_typo: Set(
|
||||
5,
|
||||
),
|
||||
two_typos: Set(
|
||||
9,
|
||||
),
|
||||
},
|
||||
),
|
||||
disable_on_words: Set(
|
||||
{},
|
||||
),
|
||||
disable_on_attributes: Set(
|
||||
{},
|
||||
),
|
||||
},
|
||||
),
|
||||
_kind: PhantomData<dump::reader::v4::settings::Checked>,
|
||||
},
|
||||
)
|
@ -0,0 +1,308 @@
|
||||
---
|
||||
source: dump/src/reader/v4/mod.rs
|
||||
expression: documents
|
||||
---
|
||||
[
|
||||
{
|
||||
"sku": 43900,
|
||||
"name": "Duracell - AAA Batteries (4-Pack)",
|
||||
"type": "HardGood",
|
||||
"price": 5.49,
|
||||
"upc": "041333424019",
|
||||
"category": [
|
||||
{
|
||||
"id": "pcmcat312300050015",
|
||||
"name": "Connected Home & Housewares"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat248700050021",
|
||||
"name": "Housewares"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat303600050001",
|
||||
"name": "Household Batteries"
|
||||
},
|
||||
{
|
||||
"id": "abcat0208002",
|
||||
"name": "Alkaline Batteries"
|
||||
}
|
||||
],
|
||||
"shipping": 5.49,
|
||||
"description": "Compatible with select electronic devices; AAA size; DURALOCK Power Preserve technology; 4-pack",
|
||||
"manufacturer": "Duracell",
|
||||
"model": "MN2400B4Z",
|
||||
"url": "http://www.bestbuy.com/site/duracell-aaa-batteries-4-pack/43900.p?id=1051384074145&skuId=43900&cmp=RMXCC",
|
||||
"image": "http://img.bbystatic.com/BestBuy_US/images/products/4390/43900_sa.jpg"
|
||||
},
|
||||
{
|
||||
"sku": 48530,
|
||||
"name": "Duracell - AA 1.5V CopperTop Batteries (4-Pack)",
|
||||
"type": "HardGood",
|
||||
"price": 5.49,
|
||||
"upc": "041333415017",
|
||||
"category": [
|
||||
{
|
||||
"id": "pcmcat312300050015",
|
||||
"name": "Connected Home & Housewares"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat248700050021",
|
||||
"name": "Housewares"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat303600050001",
|
||||
"name": "Household Batteries"
|
||||
},
|
||||
{
|
||||
"id": "abcat0208002",
|
||||
"name": "Alkaline Batteries"
|
||||
}
|
||||
],
|
||||
"shipping": 5.49,
|
||||
"description": "Long-lasting energy; DURALOCK Power Preserve technology; for toys, clocks, radios, games, remotes, PDAs and more",
|
||||
"manufacturer": "Duracell",
|
||||
"model": "MN1500B4Z",
|
||||
"url": "http://www.bestbuy.com/site/duracell-aa-1-5v-coppertop-batteries-4-pack/48530.p?id=1099385268988&skuId=48530&cmp=RMXCC",
|
||||
"image": "http://img.bbystatic.com/BestBuy_US/images/products/4853/48530_sa.jpg"
|
||||
},
|
||||
{
|
||||
"sku": 127687,
|
||||
"name": "Duracell - AA Batteries (8-Pack)",
|
||||
"type": "HardGood",
|
||||
"price": 7.49,
|
||||
"upc": "041333825014",
|
||||
"category": [
|
||||
{
|
||||
"id": "pcmcat312300050015",
|
||||
"name": "Connected Home & Housewares"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat248700050021",
|
||||
"name": "Housewares"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat303600050001",
|
||||
"name": "Household Batteries"
|
||||
},
|
||||
{
|
||||
"id": "abcat0208002",
|
||||
"name": "Alkaline Batteries"
|
||||
}
|
||||
],
|
||||
"shipping": 5.49,
|
||||
"description": "Compatible with select electronic devices; AA size; DURALOCK Power Preserve technology; 8-pack",
|
||||
"manufacturer": "Duracell",
|
||||
"model": "MN1500B8Z",
|
||||
"url": "http://www.bestbuy.com/site/duracell-aa-batteries-8-pack/127687.p?id=1051384045676&skuId=127687&cmp=RMXCC",
|
||||
"image": "http://img.bbystatic.com/BestBuy_US/images/products/1276/127687_sa.jpg"
|
||||
},
|
||||
{
|
||||
"sku": 150115,
|
||||
"name": "Energizer - MAX Batteries AA (4-Pack)",
|
||||
"type": "HardGood",
|
||||
"price": 4.99,
|
||||
"upc": "039800011329",
|
||||
"category": [
|
||||
{
|
||||
"id": "pcmcat312300050015",
|
||||
"name": "Connected Home & Housewares"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat248700050021",
|
||||
"name": "Housewares"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat303600050001",
|
||||
"name": "Household Batteries"
|
||||
},
|
||||
{
|
||||
"id": "abcat0208002",
|
||||
"name": "Alkaline Batteries"
|
||||
}
|
||||
],
|
||||
"shipping": 5.49,
|
||||
"description": "4-pack AA alkaline batteries; battery tester included",
|
||||
"manufacturer": "Energizer",
|
||||
"model": "E91BP-4",
|
||||
"url": "http://www.bestbuy.com/site/energizer-max-batteries-aa-4-pack/150115.p?id=1051384046217&skuId=150115&cmp=RMXCC",
|
||||
"image": "http://img.bbystatic.com/BestBuy_US/images/products/1501/150115_sa.jpg"
|
||||
},
|
||||
{
|
||||
"sku": 185230,
|
||||
"name": "Duracell - C Batteries (4-Pack)",
|
||||
"type": "HardGood",
|
||||
"price": 8.99,
|
||||
"upc": "041333440019",
|
||||
"category": [
|
||||
{
|
||||
"id": "pcmcat312300050015",
|
||||
"name": "Connected Home & Housewares"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat248700050021",
|
||||
"name": "Housewares"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat303600050001",
|
||||
"name": "Household Batteries"
|
||||
},
|
||||
{
|
||||
"id": "abcat0208002",
|
||||
"name": "Alkaline Batteries"
|
||||
}
|
||||
],
|
||||
"shipping": 5.49,
|
||||
"description": "Compatible with select electronic devices; C size; DURALOCK Power Preserve technology; 4-pack",
|
||||
"manufacturer": "Duracell",
|
||||
"model": "MN1400R4Z",
|
||||
"url": "http://www.bestbuy.com/site/duracell-c-batteries-4-pack/185230.p?id=1051384046486&skuId=185230&cmp=RMXCC",
|
||||
"image": "http://img.bbystatic.com/BestBuy_US/images/products/1852/185230_sa.jpg"
|
||||
},
|
||||
{
|
||||
"sku": 185267,
|
||||
"name": "Duracell - D Batteries (4-Pack)",
|
||||
"type": "HardGood",
|
||||
"price": 9.99,
|
||||
"upc": "041333430010",
|
||||
"category": [
|
||||
{
|
||||
"id": "pcmcat312300050015",
|
||||
"name": "Connected Home & Housewares"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat248700050021",
|
||||
"name": "Housewares"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat303600050001",
|
||||
"name": "Household Batteries"
|
||||
},
|
||||
{
|
||||
"id": "abcat0208002",
|
||||
"name": "Alkaline Batteries"
|
||||
}
|
||||
],
|
||||
"shipping": 5.99,
|
||||
"description": "Compatible with select electronic devices; D size; DURALOCK Power Preserve technology; 4-pack",
|
||||
"manufacturer": "Duracell",
|
||||
"model": "MN1300R4Z",
|
||||
"url": "http://www.bestbuy.com/site/duracell-d-batteries-4-pack/185267.p?id=1051384046551&skuId=185267&cmp=RMXCC",
|
||||
"image": "http://img.bbystatic.com/BestBuy_US/images/products/1852/185267_sa.jpg"
|
||||
},
|
||||
{
|
||||
"sku": 312290,
|
||||
"name": "Duracell - 9V Batteries (2-Pack)",
|
||||
"type": "HardGood",
|
||||
"price": 7.99,
|
||||
"upc": "041333216010",
|
||||
"category": [
|
||||
{
|
||||
"id": "pcmcat312300050015",
|
||||
"name": "Connected Home & Housewares"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat248700050021",
|
||||
"name": "Housewares"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat303600050001",
|
||||
"name": "Household Batteries"
|
||||
},
|
||||
{
|
||||
"id": "abcat0208002",
|
||||
"name": "Alkaline Batteries"
|
||||
}
|
||||
],
|
||||
"shipping": 5.49,
|
||||
"description": "Compatible with select electronic devices; alkaline chemistry; 9V size; DURALOCK Power Preserve technology; 2-pack",
|
||||
"manufacturer": "Duracell",
|
||||
"model": "MN1604B2Z",
|
||||
"url": "http://www.bestbuy.com/site/duracell-9v-batteries-2-pack/312290.p?id=1051384050321&skuId=312290&cmp=RMXCC",
|
||||
"image": "http://img.bbystatic.com/BestBuy_US/images/products/3122/312290_sa.jpg"
|
||||
},
|
||||
{
|
||||
"sku": 324884,
|
||||
"name": "Directed Electronics - Viper Audio Glass Break Sensor",
|
||||
"type": "HardGood",
|
||||
"price": 39.99,
|
||||
"upc": "093207005060",
|
||||
"category": [
|
||||
{
|
||||
"id": "pcmcat113100050015",
|
||||
"name": "Carfi Instore Only"
|
||||
}
|
||||
],
|
||||
"shipping": 0,
|
||||
"description": "From our expanded online assortment; compatible with Directed Electronics alarm systems; microphone and microprocessor detect and analyze intrusions; detects quiet glass breaks",
|
||||
"manufacturer": "Directed Electronics",
|
||||
"model": "506T",
|
||||
"url": "http://www.bestbuy.com/site/directed-electronics-viper-audio-glass-break-sensor/324884.p?id=1112808077651&skuId=324884&cmp=RMXCC",
|
||||
"image": "http://img.bbystatic.com/BestBuy_US/images/products/3248/324884_rc.jpg"
|
||||
},
|
||||
{
|
||||
"sku": 333179,
|
||||
"name": "Energizer - N Cell E90 Batteries (2-Pack)",
|
||||
"type": "HardGood",
|
||||
"price": 5.99,
|
||||
"upc": "039800013200",
|
||||
"category": [
|
||||
{
|
||||
"id": "pcmcat312300050015",
|
||||
"name": "Connected Home & Housewares"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat248700050021",
|
||||
"name": "Housewares"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat303600050001",
|
||||
"name": "Household Batteries"
|
||||
},
|
||||
{
|
||||
"id": "abcat0208006",
|
||||
"name": "Specialty Batteries"
|
||||
}
|
||||
],
|
||||
"shipping": 5.49,
|
||||
"description": "Alkaline batteries; 1.5V",
|
||||
"manufacturer": "Energizer",
|
||||
"model": "E90BP-2",
|
||||
"url": "http://www.bestbuy.com/site/energizer-n-cell-e90-batteries-2-pack/333179.p?id=1185268509951&skuId=333179&cmp=RMXCC",
|
||||
"image": "http://img.bbystatic.com/BestBuy_US/images/products/3331/333179_sa.jpg"
|
||||
},
|
||||
{
|
||||
"sku": 346575,
|
||||
"name": "Metra - Radio Installation Dash Kit for Most 1989-2000 Ford, Lincoln & Mercury Vehicles - Black",
|
||||
"type": "HardGood",
|
||||
"price": 16.99,
|
||||
"upc": "086429002757",
|
||||
"category": [
|
||||
{
|
||||
"id": "abcat0300000",
|
||||
"name": "Car Electronics & GPS"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat165900050023",
|
||||
"name": "Car Installation Parts & Accessories"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat331600050007",
|
||||
"name": "Car Audio Installation Parts"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat165900050031",
|
||||
"name": "Deck Installation Parts"
|
||||
},
|
||||
{
|
||||
"id": "pcmcat165900050033",
|
||||
"name": "Dash Installation Kits"
|
||||
}
|
||||
],
|
||||
"shipping": 0,
|
||||
"description": "From our expanded online assortment; compatible with most 1989-2000 Ford, Lincoln and Mercury vehicles; snap-in TurboKit offers fast installation; spacer/trim ring; rear support bracket",
|
||||
"manufacturer": "Metra",
|
||||
"model": "99-5512",
|
||||
"url": "http://www.bestbuy.com/site/metra-radio-installation-dash-kit-for-most-1989-2000-ford-lincoln-mercury-vehicles-black/346575.p?id=1218118704590&skuId=346575&cmp=RMXCC",
|
||||
"image": "http://img.bbystatic.com/BestBuy_US/images/products/3465/346575_rc.jpg"
|
||||
}
|
||||
]
|
@ -0,0 +1,63 @@
|
||||
---
|
||||
source: dump/src/reader/v4/mod.rs
|
||||
expression: movies.settings()
|
||||
---
|
||||
Ok(
|
||||
Settings {
|
||||
displayed_attributes: Reset,
|
||||
searchable_attributes: Reset,
|
||||
filterable_attributes: Set(
|
||||
{
|
||||
"genres",
|
||||
"id",
|
||||
},
|
||||
),
|
||||
sortable_attributes: Set(
|
||||
{
|
||||
"release_date",
|
||||
},
|
||||
),
|
||||
ranking_rules: Set(
|
||||
[
|
||||
"words",
|
||||
"typo",
|
||||
"proximity",
|
||||
"attribute",
|
||||
"sort",
|
||||
"exactness",
|
||||
"release_date:asc",
|
||||
],
|
||||
),
|
||||
stop_words: Set(
|
||||
{},
|
||||
),
|
||||
synonyms: Set(
|
||||
{},
|
||||
),
|
||||
distinct_attribute: Reset,
|
||||
typo_tolerance: Set(
|
||||
TypoSettings {
|
||||
enabled: Set(
|
||||
true,
|
||||
),
|
||||
min_word_size_for_typos: Set(
|
||||
MinWordSizeTyposSetting {
|
||||
one_typo: Set(
|
||||
5,
|
||||
),
|
||||
two_typos: Set(
|
||||
9,
|
||||
),
|
||||
},
|
||||
),
|
||||
disable_on_words: Set(
|
||||
{},
|
||||
),
|
||||
disable_on_attributes: Set(
|
||||
{},
|
||||
),
|
||||
},
|
||||
),
|
||||
_kind: PhantomData<dump::reader::v4::settings::Checked>,
|
||||
},
|
||||
)
|
230
dump/src/reader/v2/updates.rs
Normal file
230
dump/src/reader/v2/updates.rs
Normal file
@ -0,0 +1,230 @@
|
||||
use serde::Deserialize;
|
||||
use time::OffsetDateTime;
|
||||
use uuid::Uuid;
|
||||
|
||||
use super::{ResponseError, Settings, Unchecked};
|
||||
|
||||
#[derive(Deserialize)]
|
||||
#[cfg_attr(test, derive(serde::Serialize))]
|
||||
pub struct UpdateEntry {
|
||||
uuid: Uuid,
|
||||
update: UpdateStatus,
|
||||
}
|
||||
|
||||
impl UpdateEntry {
|
||||
pub fn is_finished(&self) -> bool {
|
||||
match self.update {
|
||||
UpdateStatus::Processing(_) | UpdateStatus::Enqueued(_) => false,
|
||||
UpdateStatus::Processed(_) | UpdateStatus::Aborted(_) | UpdateStatus::Failed(_) => true,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_content_uuid(&self) -> Option<&Uuid> {
|
||||
match &self.update {
|
||||
UpdateStatus::Enqueued(enqueued) => enqueued.content.as_ref(),
|
||||
UpdateStatus::Processing(processing) => processing.from.content.as_ref(),
|
||||
UpdateStatus::Processed(processed) => processed.from.from.content.as_ref(),
|
||||
UpdateStatus::Aborted(aborted) => aborted.from.content.as_ref(),
|
||||
UpdateStatus::Failed(failed) => failed.from.from.content.as_ref(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
#[cfg_attr(test, derive(serde::Serialize))]
|
||||
pub enum UpdateResult {
|
||||
DocumentsAddition(DocumentAdditionResult),
|
||||
DocumentDeletion { deleted: u64 },
|
||||
Other,
|
||||
}
|
||||
|
||||
#[derive(Debug, Deserialize, Clone)]
|
||||
#[cfg_attr(test, derive(serde::Serialize))]
|
||||
pub struct DocumentAdditionResult {
|
||||
pub nb_documents: usize,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Deserialize)]
|
||||
#[cfg_attr(test, derive(serde::Serialize))]
|
||||
#[non_exhaustive]
|
||||
pub enum IndexDocumentsMethod {
|
||||
/// Replace the previous document with the new one,
|
||||
/// removing all the already known attributes.
|
||||
ReplaceDocuments,
|
||||
|
||||
/// Merge the previous version of the document with the new version,
|
||||
/// replacing old attributes values with the new ones and add the new attributes.
|
||||
UpdateDocuments,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Deserialize)]
|
||||
#[cfg_attr(test, derive(serde::Serialize))]
|
||||
#[non_exhaustive]
|
||||
pub enum UpdateFormat {
|
||||
/// The given update is a real **comma seperated** CSV with headers on the first line.
|
||||
Csv,
|
||||
/// The given update is a JSON array with documents inside.
|
||||
Json,
|
||||
/// The given update is a JSON stream with a document on each line.
|
||||
JsonStream,
|
||||
}
|
||||
|
||||
#[allow(clippy::large_enum_variant)]
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
#[cfg_attr(test, derive(serde::Serialize))]
|
||||
#[serde(tag = "type")]
|
||||
pub enum UpdateMeta {
|
||||
DocumentsAddition {
|
||||
method: IndexDocumentsMethod,
|
||||
format: UpdateFormat,
|
||||
primary_key: Option<String>,
|
||||
},
|
||||
ClearDocuments,
|
||||
DeleteDocuments {
|
||||
ids: Vec<String>,
|
||||
},
|
||||
Settings(Settings<Unchecked>),
|
||||
}
|
||||
|
||||
#[derive(Debug, Deserialize, Clone)]
|
||||
#[cfg_attr(test, derive(serde::Serialize))]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
pub struct Enqueued {
|
||||
pub update_id: u64,
|
||||
pub meta: UpdateMeta,
|
||||
#[serde(with = "time::serde::rfc3339")]
|
||||
pub enqueued_at: OffsetDateTime,
|
||||
pub content: Option<Uuid>,
|
||||
}
|
||||
|
||||
impl Enqueued {
|
||||
pub fn meta(&self) -> &UpdateMeta {
|
||||
&self.meta
|
||||
}
|
||||
|
||||
pub fn id(&self) -> u64 {
|
||||
self.update_id
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Deserialize, Clone)]
|
||||
#[cfg_attr(test, derive(serde::Serialize))]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
pub struct Processed {
|
||||
pub success: UpdateResult,
|
||||
#[serde(with = "time::serde::rfc3339")]
|
||||
pub processed_at: OffsetDateTime,
|
||||
#[serde(flatten)]
|
||||
pub from: Processing,
|
||||
}
|
||||
|
||||
impl Processed {
|
||||
pub fn id(&self) -> u64 {
|
||||
self.from.id()
|
||||
}
|
||||
|
||||
pub fn meta(&self) -> &UpdateMeta {
|
||||
self.from.meta()
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Deserialize, Clone)]
|
||||
#[cfg_attr(test, derive(serde::Serialize))]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
pub struct Processing {
|
||||
#[serde(flatten)]
|
||||
pub from: Enqueued,
|
||||
#[serde(with = "time::serde::rfc3339")]
|
||||
pub started_processing_at: OffsetDateTime,
|
||||
}
|
||||
|
||||
impl Processing {
|
||||
pub fn id(&self) -> u64 {
|
||||
self.from.id()
|
||||
}
|
||||
|
||||
pub fn meta(&self) -> &UpdateMeta {
|
||||
self.from.meta()
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Deserialize, Clone)]
|
||||
#[cfg_attr(test, derive(serde::Serialize))]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
pub struct Aborted {
|
||||
#[serde(flatten)]
|
||||
from: Enqueued,
|
||||
#[serde(with = "time::serde::rfc3339")]
|
||||
pub aborted_at: OffsetDateTime,
|
||||
}
|
||||
|
||||
impl Aborted {
|
||||
pub fn id(&self) -> u64 {
|
||||
self.from.id()
|
||||
}
|
||||
|
||||
pub fn meta(&self) -> &UpdateMeta {
|
||||
self.from.meta()
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Deserialize)]
|
||||
#[cfg_attr(test, derive(serde::Serialize))]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
pub struct Failed {
|
||||
#[serde(flatten)]
|
||||
pub from: Processing,
|
||||
pub error: ResponseError,
|
||||
#[serde(with = "time::serde::rfc3339")]
|
||||
pub failed_at: OffsetDateTime,
|
||||
}
|
||||
|
||||
impl Failed {
|
||||
pub fn id(&self) -> u64 {
|
||||
self.from.id()
|
||||
}
|
||||
|
||||
pub fn meta(&self) -> &UpdateMeta {
|
||||
self.from.meta()
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Deserialize)]
|
||||
#[cfg_attr(test, derive(serde::Serialize))]
|
||||
#[serde(tag = "status", rename_all = "camelCase")]
|
||||
pub enum UpdateStatus {
|
||||
Processing(Processing),
|
||||
Enqueued(Enqueued),
|
||||
Processed(Processed),
|
||||
Aborted(Aborted),
|
||||
Failed(Failed),
|
||||
}
|
||||
|
||||
impl UpdateStatus {
|
||||
pub fn id(&self) -> u64 {
|
||||
match self {
|
||||
UpdateStatus::Processing(u) => u.id(),
|
||||
UpdateStatus::Enqueued(u) => u.id(),
|
||||
UpdateStatus::Processed(u) => u.id(),
|
||||
UpdateStatus::Aborted(u) => u.id(),
|
||||
UpdateStatus::Failed(u) => u.id(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn meta(&self) -> &UpdateMeta {
|
||||
match self {
|
||||
UpdateStatus::Processing(u) => u.meta(),
|
||||
UpdateStatus::Enqueued(u) => u.meta(),
|
||||
UpdateStatus::Processed(u) => u.meta(),
|
||||
UpdateStatus::Aborted(u) => u.meta(),
|
||||
UpdateStatus::Failed(u) => u.meta(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn processed(&self) -> Option<&Processed> {
|
||||
match self {
|
||||
UpdateStatus::Processed(p) => Some(p),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
}
|
@ -32,7 +32,6 @@ use serde::{Deserialize, Serialize};
|
||||
use tempfile::TempDir;
|
||||
use time::OffsetDateTime;
|
||||
|
||||
|
||||
pub mod errors;
|
||||
pub mod meta;
|
||||
pub mod settings;
|
||||
@ -95,9 +94,7 @@ impl V3Reader {
|
||||
|
||||
Ok(V3Reader {
|
||||
metadata,
|
||||
tasks: BufReader::new(
|
||||
File::open(dump.path().join("updates").join("data.jsonl")).unwrap(),
|
||||
),
|
||||
tasks: BufReader::new(File::open(dump.path().join("updates").join("data.jsonl"))?),
|
||||
index_uuid,
|
||||
dump,
|
||||
})
|
||||
|
Loading…
Reference in New Issue
Block a user