Files
wehub-resource-sync 70cb81e982
CI / Test (macos-latest, stable) (push) Waiting to run
CI / Test (ubuntu-latest, stable) (push) Waiting to run
CI / Test (windows-latest, stable) (push) Waiting to run
CI / Lint (push) Waiting to run
chore: import upstream snapshot with attribution
2026-07-13 12:45:24 +08:00

180 lines
6.0 KiB
Rust

//! Basic usage example demonstrating create, put, find, and timeline operations.
//!
//! Run with: cargo run --example basic_usage
use std::path::PathBuf;
use tempfile::tempdir;
use memvid_core::{Memvid, PutOptions, Result, SearchRequest, TimelineQuery};
fn main() -> Result<()> {
// Create a temporary directory for our example
let dir = tempdir().expect("failed to create temp dir");
let path: PathBuf = dir.path().join("example.mv2");
println!("=== Memvid Core Basic Usage Example ===\n");
// ========================================
// 1. CREATE a new memory file
// ========================================
println!("1. Creating memory file at {:?}", path);
let mut mem = Memvid::create(&path)?;
println!(" Memory created successfully!\n");
// ========================================
// 2. PUT documents into the memory
// ========================================
println!("2. Adding documents to memory...");
// Simple put with just bytes
let seq1 = mem.put_bytes(b"Hello, Memvid! This is a simple text document.")?;
println!(" Added document 1, sequence: {}", seq1);
// Put with options (title, URI, tags)
let options = PutOptions::builder()
.title("Getting Started Guide")
.uri("mv2://docs/getting-started.md")
.tag("category", "documentation")
.tag("version", "2.0")
.build();
let seq2 = mem.put_bytes_with_options(
b"This guide covers the basics of using Memvid for AI memory storage.",
options,
)?;
println!(" Added document 2 (with metadata), sequence: {}", seq2);
// Add more documents
let options = PutOptions::builder()
.title("API Reference")
.uri("mv2://docs/api-reference.md")
.tag("category", "documentation")
.build();
mem.put_bytes_with_options(
b"The Memvid API provides methods for create, put, find, and timeline operations.",
options,
)?;
let options = PutOptions::builder()
.title("FAQ")
.uri("mv2://docs/faq.md")
.tag("category", "support")
.build();
mem.put_bytes_with_options(
b"Frequently asked questions about Memvid memory files and search.",
options,
)?;
// Commit changes to persist them
mem.commit()?;
println!(" Committed all changes\n");
// ========================================
// 3. STATS - Check memory statistics
// ========================================
println!("3. Memory statistics:");
let stats = mem.stats()?;
println!(" Frame count: {}", stats.frame_count);
println!(" Has lexical index: {}", stats.has_lex_index);
println!(" Has vector index: {}", stats.has_vec_index);
println!(" Has time index: {}", stats.has_time_index);
println!();
// ========================================
// 4. FIND - Search for documents
// ========================================
println!("4. Searching for documents...");
// Search for "memvid"
let request = SearchRequest {
query: "memvid".to_string(),
top_k: 10,
snippet_chars: 200,
uri: None,
scope: None,
cursor: None,
#[cfg(feature = "temporal_track")]
temporal: None,
as_of_frame: None,
as_of_ts: None,
no_sketch: false,
acl_context: None,
acl_enforcement_mode: memvid_core::types::AclEnforcementMode::Audit,
};
let response = mem.search(request)?;
println!(" Query: 'memvid'");
println!(" Total hits: {}", response.total_hits);
println!(" Elapsed: {}ms", response.elapsed_ms);
for hit in &response.hits {
let title = hit.title.as_deref().unwrap_or("Untitled");
let score = hit.score.unwrap_or(0.0);
println!(" - [{}] {} (score: {:.3})", hit.frame_id, title, score);
println!(
" Snippet: {}...",
&hit.text.chars().take(60).collect::<String>()
);
}
println!();
// Search within a scope
let request = SearchRequest {
query: "documentation".to_string(),
top_k: 10,
snippet_chars: 100,
uri: None,
scope: Some("mv2://docs/".to_string()),
cursor: None,
#[cfg(feature = "temporal_track")]
temporal: None,
as_of_frame: None,
as_of_ts: None,
no_sketch: false,
acl_context: None,
acl_enforcement_mode: memvid_core::types::AclEnforcementMode::Audit,
};
let response = mem.search(request)?;
println!(" Query: 'documentation' (scope: mv2://docs/)");
println!(" Total hits: {}", response.total_hits);
println!();
// ========================================
// 5. TIMELINE - Browse documents chronologically
// ========================================
println!("5. Timeline (chronological view):");
let timeline = mem.timeline(TimelineQuery::default())?;
for entry in &timeline {
let uri = entry.uri.as_deref().unwrap_or("(no uri)");
println!(
" [{}] {} - {}",
entry.frame_id,
uri,
entry.preview.chars().take(40).collect::<String>()
);
}
println!();
// ========================================
// 6. REOPEN - Close and reopen the memory
// ========================================
println!("6. Closing and reopening memory...");
drop(mem);
let reopened = Memvid::open(&path)?;
let stats = reopened.stats()?;
println!(" Reopened successfully!");
println!(" Frame count after reopen: {}", stats.frame_count);
println!();
// ========================================
// 7. VERIFY - Check file integrity
// ========================================
println!("7. Verifying file integrity...");
drop(reopened); // Close the memory before verifying
let report = Memvid::verify(&path, false)?;
println!(" Verification status: {:?}", report.overall_status);
println!();
println!("=== Example completed successfully! ===");
Ok(())
}