diff --git a/.github/workflows/ruvector-postgres-ci.yml b/.github/workflows/ruvector-postgres-ci.yml index aa26b538..619fbb91 100644 --- a/.github/workflows/ruvector-postgres-ci.yml +++ b/.github/workflows/ruvector-postgres-ci.yml @@ -179,9 +179,9 @@ jobs: run: cargo build --no-default-features --features pg${{ matrix.pg_version }} --release working-directory: crates/ruvector-postgres - - name: Run unit tests - run: cargo test --no-default-features --features pg${{ matrix.pg_version }} --lib -- --nocapture - working-directory: crates/ruvector-postgres + # Note: cargo test --lib is skipped because #[pg_test] tests require PostgreSQL runtime + # and cause linker errors (undefined symbols) when compiled outside pgrx test harness. + # All tests are run via cargo pgrx test instead. - name: Run pgrx tests run: cargo pgrx test pg${{ matrix.pg_version }} --no-default-features diff --git a/crates/ruvector-postgres/src/attention/operators.rs b/crates/ruvector-postgres/src/attention/operators.rs index 2b01078b..da3533b0 100644 --- a/crates/ruvector-postgres/src/attention/operators.rs +++ b/crates/ruvector-postgres/src/attention/operators.rs @@ -332,6 +332,11 @@ pub fn ruvector_attention_scores( mod tests { use super::*; + // Helper to convert Vec> to JsonB for tests + fn to_json(data: Vec>) -> JsonB { + JsonB(serde_json::json!(data)) + } + #[pg_test] fn test_ruvector_attention_score() { let query = vec![1.0, 0.0, 0.0]; @@ -362,8 +367,8 @@ mod tests { #[pg_test] fn test_ruvector_multi_head_attention() { let query = vec![1.0, 0.0, 0.0, 0.0]; - let keys = vec![vec![1.0, 0.0, 0.0, 0.0], vec![0.0, 1.0, 0.0, 0.0]]; - let values = vec![vec![1.0, 2.0], vec![3.0, 4.0]]; + let keys = to_json(vec![vec![1.0, 0.0, 0.0, 0.0], vec![0.0, 1.0, 0.0, 0.0]]); + let values = to_json(vec![vec![1.0, 2.0], vec![3.0, 4.0]]); let result = ruvector_multi_head_attention(query, keys, values, 2); @@ -375,8 +380,8 @@ mod tests { #[pg_test] fn test_ruvector_flash_attention() { let query = vec![1.0, 0.0, 0.0, 0.0]; - let keys = vec![vec![1.0, 0.0, 0.0, 0.0]]; - let values = vec![vec![5.0, 10.0]]; + let keys = to_json(vec![vec![1.0, 0.0, 0.0, 0.0]]); + let values = to_json(vec![vec![5.0, 10.0]]); let result = ruvector_flash_attention(query, keys, values, 64); @@ -388,11 +393,11 @@ mod tests { #[pg_test] fn test_ruvector_attention_scores() { let query = vec![1.0, 0.0, 0.0]; - let keys = vec![ + let keys = to_json(vec![ vec![1.0, 0.0, 0.0], vec![0.0, 1.0, 0.0], vec![0.0, 0.0, 1.0], - ]; + ]); let scores = ruvector_attention_scores(query, keys, "scaled_dot"); diff --git a/crates/ruvector-postgres/src/learning/operators.rs b/crates/ruvector-postgres/src/learning/operators.rs index fbbe0f89..0e36bef2 100644 --- a/crates/ruvector-postgres/src/learning/operators.rs +++ b/crates/ruvector-postgres/src/learning/operators.rs @@ -433,7 +433,7 @@ mod tests { #[pg_test] fn test_auto_tune() { - ruvector_enable_learning("test_autotune", 1000).unwrap(); + ruvector_enable_learning("test_autotune", None).unwrap(); // Record some trajectories for i in 0..10 { @@ -448,14 +448,14 @@ mod tests { .unwrap(); } - let result = ruvector_auto_tune("test_autotune", "balanced", 1.0); + let result = ruvector_auto_tune("test_autotune", "balanced", None); assert!(result.is_ok()); } #[pg_test] fn test_get_search_params() { - ruvector_enable_learning("test_search_params", 1000).unwrap(); + ruvector_enable_learning("test_search_params", None).unwrap(); // Record and extract patterns first for i in 0..20 { @@ -494,7 +494,7 @@ mod tests { .unwrap(); } - ruvector_extract_patterns("test_consolidate", Some(10)).unwrap(); + ruvector_extract_patterns("test_consolidate", 10).unwrap(); let result = ruvector_consolidate_patterns("test_consolidate", Some(0.95)); assert!(result.is_ok());