query_demo/
query_demo.rs

1use bear_query::{BearDb, BearError, NotesQuery};
2
3fn main() -> Result<(), BearError> {
4  let db = BearDb::new()?;
5
6  // Example 1: Using typed API
7  println!("=== Typed API Examples ===\n");
8
9  let tags = db.tags()?;
10  println!("Total tags: {}\n", tags.count());
11
12  // Using the new NotesQuery API - much more readable!
13  db.notes(NotesQuery::default())?
14    .into_iter()
15    .for_each(|note| {
16      println!("Note: {:?}", note.title());
17      db.note_links(note.id())
18        .unwrap()
19        .into_iter()
20        .for_each(|link| println!("  Linked: {:?}", link.title()));
21
22      let note_tags = db.note_tags(note.id()).unwrap();
23      println!("  Tags: {:?}\n", tags.names(&note_tags));
24    });
25
26  // Example 2: Using generic SQL query API with DataFrames
27  println!("\n=== Generic SQL Query API Examples ===\n");
28
29  // Simple query
30  println!("Top 5 most recent notes:");
31  let df = db
32    .query("SELECT title, created FROM notes WHERE is_trashed = 0 ORDER BY created DESC LIMIT 5")?;
33  println!("{}\n", df);
34
35  // Join query
36  println!("Notes with their tags:");
37  let df = db.query(
38    r"
39    SELECT n.title, t.name as tag_name
40    FROM notes n
41    JOIN note_tags nt ON n.id = nt.note_id
42    JOIN tags t ON nt.tag_id = t.id
43    WHERE n.is_trashed = 0
44    ORDER BY n.modified DESC
45    LIMIT 10
46  ",
47  )?;
48  println!("{}\n", df);
49
50  // Aggregation query
51  println!("Tag usage statistics:");
52  let df = db.query(
53    r"
54    SELECT t.name, COUNT(*) as note_count
55    FROM tags t
56    JOIN note_tags nt ON t.id = nt.tag_id
57    GROUP BY t.id, t.name
58    ORDER BY note_count DESC
59    LIMIT 10
60  ",
61  )?;
62  println!("{}\n", df);
63
64  Ok(())
65}