tsink 0.10.2

A lightweight embedded time-series database with a straightforward API
Documentation
use tempfile::TempDir;
use tsink::{DataPoint, Row, StorageBuilder, TimestampPrecision};

#[test]
fn test_simple_insert() {
    let temp_dir = TempDir::new().unwrap();
    let storage = StorageBuilder::new()
        .with_data_path(temp_dir.path())
        .build()
        .unwrap();

    let rows = vec![Row::new("test_metric", DataPoint::new(1000, 1.0))];
    storage.insert_rows(&rows).unwrap();

    let points = storage.select("test_metric", &[], 500, 1500).unwrap();
    println!("Found {} points", points.len());
    assert_eq!(points.len(), 1);
    assert_eq!(points[0].timestamp, 1000);
    assert_eq!(points[0].value_as_f64().unwrap_or(f64::NAN), 1.0);
}

#[test]
fn test_persistent_build_with_millisecond_precision() {
    let temp_dir = TempDir::new().unwrap();
    let storage = StorageBuilder::new()
        .with_data_path(temp_dir.path())
        .with_timestamp_precision(TimestampPrecision::Milliseconds)
        .build()
        .unwrap();

    storage
        .insert_rows(&[Row::new(
            "cpu_usage",
            DataPoint::new(1_700_000_000_000_i64, 42.0),
        )])
        .unwrap();

    let points = storage
        .select("cpu_usage", &[], 1_700_000_000_000, 1_700_000_000_001)
        .unwrap();
    assert_eq!(points.len(), 1);
    assert_eq!(points[0].timestamp, 1_700_000_000_000);
    assert_eq!(points[0].value_as_f64().unwrap_or(f64::NAN), 42.0);

    storage.close().unwrap();
}

#[test]
fn test_multiple_inserts() {
    let temp_dir = TempDir::new().unwrap();
    let storage = StorageBuilder::new()
        .with_data_path(temp_dir.path())
        .build()
        .unwrap();

    for i in 0..10 {
        let rows = vec![Row::new(
            "test_metric",
            DataPoint::new((i + 1) * 1000, i as f64),
        )];
        storage.insert_rows(&rows).unwrap();
    }

    match storage.select("test_metric", &[], 500, 11000) {
        Ok(points) => {
            println!("Found {} points", points.len());
            assert_eq!(points.len(), 10);
        }
        Err(e) => {
            panic!("Select failed: {:?}", e);
        }
    }
}