dittolive_ditto/dql/
mod.rs

1//! Use DQL [`Query`]s to [subscribe to], [observe], and [edit] documents.
2//!
3//! # Example: Write and Read with DQL
4//!
5//! Let's look at how to execute an immediate query on the data in the `Store`
6//! using [`ditto.store().execute(...)`]:
7//!
8//! ```
9//! use dittolive_ditto::prelude::*;
10//! use dittolive_ditto::dql::QueryResult;
11//! # #[tokio::main]
12//! # async fn main() -> anyhow::Result<()> {
13//! # let (_root, ditto) = dittolive_ditto::doctest_helpers::doctest_ditto();
14//!
15//! // Insert a document into a collection
16//! let insert_result: QueryResult = ditto
17//!     .store()
18//!     .execute((
19//!          "INSERT INTO cars DOCUMENTS (:newCar)",
20//!          serde_json::json!({
21//!              "newCar": {
22//!                  "make": "ford",
23//!                  "color": "blue"
24//!              }
25//!          })
26//!     ))
27//!     .await?;
28//!
29//! // Select all documents from a collection
30//! let select_result: QueryResult = ditto.store().execute("SELECT * FROM cars").await?;
31//!
32//! // Extract documents as `serde_json::Value`s
33//! let documents: Vec<serde_json::Value> = select_result
34//!     .iter()
35//!     .flat_map(|item| item.deserialize_value().ok())
36//!     .collect();
37//!
38//! # Ok(())
39//! # }
40//! ```
41//!
42//! # Example: Observe document updates with DQL
43//!
44//! If instead we want to be notified when documents are changed, we can use
45//! [`ditto.store().register_observer(...)`] to receive callbacks for documents
46//! matching a given DQL query.
47//!
48//! ```
49//! use dittolive_ditto::{
50//!     dql::{QueryResult, QueryResultItem},
51//!     prelude::*,
52//! };
53//! # fn main() -> anyhow::Result<()> {
54//! # let (_root, ditto) = dittolive_ditto::doctest_helpers::doctest_ditto();
55//!
56//! let _observer =
57//!     ditto
58//!         .store()
59//!         .register_observer("SELECT * FROM cars", |query_result: QueryResult| {
60//!             let changed_documents = query_result
61//!                 .iter()
62//!                 .flat_map(|item: QueryResultItem| {
63//!                     item.deserialize_value::<serde_json::Value>().ok()
64//!                 })
65//!                 .collect::<Vec<_>>();
66//!
67//!             for doc in &changed_documents {
68//!                 println!("Observed change to document: {doc}");
69//!             }
70//!         })?;
71//! # Ok(())
72//! # }
73//! ```
74//!
75//! [subscribe to]: crate::sync::Sync::register_subscription
76//! [observe]: crate::store::Store::register_observer
77//! [edit]: crate::store::Store::execute
78//! [`ditto.store().execute(...)`]: crate::store::Store::execute
79//! [`ditto.store().register_observer(...)`]: crate::store::Store::register_observer
80
81/// Query
82pub(crate) mod query;
83pub use query::{IntoQuery, Query};
84
85/// Dql Result
86pub(crate) mod query_result;
87pub use query_result::{QueryResult, QueryResultItem};
88
89/// Differ
90pub(crate) mod differ;
91pub use differ::{Diff, DiffMove, Differ};