haematite-cli 0.21.9

The haematite command: serve a store, its door and Studio, answer MCP, query with jq, and host the store's assistant seat
Documentation
use std::sync::atomic::Ordering;

use serde_json::{Value, json};

use crate::serve::protocol::Operation;
use crate::serve::query::search_text_tests_support::{Fixture, TestResult, request};

#[test]
fn similar_words_after_rg_scores_only_the_embedded_records_that_reached_it() -> TestResult {
    let fixture = Fixture::new(true)?;
    let answer = fixture.query(request(
        "notes | rg(\"near\") | similar(.body_vec; \"chest pain\"; cosine) | limit(2)",
        10,
    )?)?;
    assert_eq!(answer["rows"].as_array().ok_or("missing rows")?.len(), 1);
    assert_eq!(answer["rows"][0]["origin"]["id"], "b");
    assert_eq!(answer["rows"][0]["value"], json!({"body":"near"}));
    let score = answer["rows"][0]["origin"]["score"]
        .as_f64()
        .ok_or("missing score")?;
    assert!(score > 0.7);
    assert_eq!(answer["unscored"], 0);
    assert_eq!(answer["next"], Value::Null);
    assert_eq!(fixture.worker.asked.load(Ordering::SeqCst), 1);
    Ok(())
}

#[test]
fn similar_words_after_filter_refuses_a_metric_mismatch_by_name() -> TestResult {
    let fixture = Fixture::new(true)?;
    let failure = fixture
        .service
        .dispatch(Operation::QueryRun(request(
            "notes | rg(\"near\") | similar(.body_vec; \"chest pain\"; dot)",
            10,
        )?))
        .err()
        .ok_or("mismatched measure was accepted")?;
    assert_eq!(failure.code, "query_measure_mismatch");
    assert!(failure.message.contains("similar"), "{}", failure.message);
    assert!(failure.message.contains("dot"), "{}", failure.message);
    assert!(failure.message.contains("cosine"), "{}", failure.message);
    assert_eq!(fixture.worker.asked.load(Ordering::SeqCst), 0);
    Ok(())
}