What the release gates' recording runs ask, shared by tools/record-gates, which records them, and tests/gate_*.rs, which replay them. A replay matches by the exact request bytes, so the rows, the question and the SQL must be the ones recorded; they live here once so the two cannot drift apart.

7use std::path::PathBuf;
9use jev_mock::replay::Fixture;
10
11pub const QUESTION: &str = "Could this person work from home?";

The rows every run draws from, as people holds them.

14pub const ROWS: [&str; 4] = [
15    r#"{"name":"Ana","role":"backend engineer","country":"PT"}"#,
16    r#"{"name":"Rui","role":"nurse","country":"PT"}"#,
17    r#"{"name":"Inês","role":"accountant","country":"PT"}"#,
18    r#"{"name":"João","role":"bus driver","country":"PT"}"#,
19];

A small occupational hierarchy for the label-tree run.

22pub const TREE_PATHS: [&str; 12] = [
23    "Office > Engineering > Backend",
24    "Office > Engineering > Frontend",
25    "Office > Finance > Accounting",
26    "Office > Finance > Audit",
27    "Care > Hospital > Nursing",
28    "Care > Hospital > Surgery",
29    "Care > Community > Home care",
30    "Care > Community > Social work",
31    "Transport > Road > Bus",
32    "Transport > Road > Freight",
33    "Transport > Rail > Driver",
34    "Transport > Rail > Signalling",
35];

The label-tree run: $1 is [QUESTION], $2 is [TREE_PATHS].

38pub const LABEL_TREE_SQL: &str =
39    "SELECT (jev_choice_tree_full(p, $1, $2::text[])).path FROM people p WHERE name = 'Ana'";

The ranking run: $1 is [QUESTION].

42pub const RANKING_SQL: &str =
43    "SELECT name FROM people p WHERE name IN ('Ana', 'Rui') ORDER BY jev_prob(p, $1) DESC, name LIMIT 1";

Creates the extension (unless there) and people, holding [ROWS].

46pub async fn setup_people(client: &tokio_postgres::Client) -> Result<(), tokio_postgres::Error> {
47    let mut setup = String::from(
48        "SET statement_timeout = '120s'; CREATE EXTENSION IF NOT EXISTS postjevsql; \
49         CREATE TABLE people (name text, role text, country text);",
50    );
51    for row in ROWS {
52        let v: serde_json::Value = serde_json::from_str(row).unwrap();
53        let quote = |k: &str| format!("'{}'", v[k].as_str().expect("the rows are text").replace('\'', "''"));
54        setup += &format!("INSERT INTO people VALUES ({}, {}, {});", quote("name"), quote("role"), quote("country"));
55    }
56    client.batch_execute(&setup).await
57}

The committed fixture of one gate, tests/fixtures/<gate>.json, found through POSTJEVSQL_FIXTURES, which tests/BUCK sets.

61pub fn fixture(gate: &str) -> Fixture {
62    let dir = std::env::var_os("POSTJEVSQL_FIXTURES").expect("POSTJEVSQL_FIXTURES is set by tests/BUCK");
63    let path = PathBuf::from(dir).join(format!("{gate}.json"));
64    Fixture::load(&path).unwrap_or_else(|e| panic!("{e}"))
65}