From 1283139571cb8886eed3208fedf86e2b0866a06d Mon Sep 17 00:00:00 2001 From: Jeff Baskin Date: Sat, 28 Feb 2026 18:27:23 -0500 Subject: [PATCH] Moved multi-field query tests to lib. --- src/action.rs | 2 +- src/document.rs | 2 +- src/document/create.rs | 2 +- tests/query_test.rs | 91 +++++++++++++++++++++++++++++++++++++++++- 4 files changed, 93 insertions(+), 4 deletions(-) diff --git a/src/action.rs b/src/action.rs index 3db029c..d8c2268 100644 --- a/src/action.rs +++ b/src/action.rs @@ -10,7 +10,7 @@ mod show; mod update; mod user; -pub use crate::document::{DocDef, Field, FieldType, Record, Records}; +pub use crate::document::{DocDef, Field, FieldType, IndexType, Record, Records}; pub use action_type::Action; pub use addition::Addition; pub use calculation::{CalcValue, Calculation, Operand}; diff --git a/src/document.rs b/src/document.rs index b76d882..f99ab97 100644 --- a/src/document.rs +++ b/src/document.rs @@ -8,7 +8,7 @@ mod session; use record::{InternalRecord, InternalRecords, Oid}; pub use clock::Clock; -pub use create::CreateDoc; +pub use create::{CreateDoc, IndexType}; pub use definition::DocDef; pub use field::{Field, FieldType}; pub use record::{Record, Records}; diff --git a/src/document/create.rs b/src/document/create.rs index 672ffcb..b142e4a 100644 --- a/src/document/create.rs +++ b/src/document/create.rs @@ -1312,7 +1312,6 @@ mod document_files { _ => unreachable!("got {:?}: should have been a reply", action), } } - */ #[test] fn query_should_work_with_multiple_fields() { @@ -1450,6 +1449,7 @@ mod document_files { _ => unreachable!("got {:?}: should have been a reply", action), } } + */ #[test] fn errors_on_bad_field_name() { diff --git a/tests/query_test.rs b/tests/query_test.rs index e720b94..04a928b 100644 --- a/tests/query_test.rs +++ b/tests/query_test.rs @@ -1,6 +1,6 @@ mod support; -use morethantext::{CalcValue, Calculation, Field, FieldType, MoreThanText, Operand, Query}; +use morethantext::{CalcValue, Calculation, Field, FieldType, IndexType, MoreThanText, Operand, Query}; use std::collections::HashSet; use support::TestDocument; @@ -149,3 +149,92 @@ fn does_query_work_with_greater_than_equal() { } assert_eq!(holder.len(), 0, "got {:?}", holder); } + +#[test] +fn can_query_use_multiple_fields() { + let mut mtt = MoreThanText::new(); + let test_doc = TestDocument::new(vec![FieldType::StaticString, FieldType::StaticString]); + mtt.create_document(test_doc.get_docdef()).unwrap(); + let input = vec![ + vec!["a", "a"], + vec!["a", "b"], + vec!["b", "a"], + vec!["b", "b"], + ]; + test_doc.populate_multiple(&mut mtt, input); + let mut calc1 = Calculation::new(Operand::Equal); + calc1.add_value("a").unwrap(); + calc1.add_value(CalcValue::Existing(FieldType::StaticString)).unwrap(); + let mut calc2 = Calculation::new(Operand::Equal); + calc2.add_value("b").unwrap(); + calc2.add_value(CalcValue::Existing(FieldType::StaticString)).unwrap(); + let mut query = Query::new(test_doc.get_doc_name()); + query.add(test_doc.get_field_name(0), calc1); + query.add(test_doc.get_field_name(1), calc2); + let results = mtt.records(query).unwrap(); + assert_eq!(results.len(), 1, "got {:?}", results); + let rec = results.iter().last().unwrap(); + assert_eq!(rec.get(test_doc.get_field_name(0)).unwrap(), "a".into()); + assert_eq!(rec.get(test_doc.get_field_name(1)).unwrap(), "b".into()); +} + +#[test] +fn can_query_use_multiple_indexed_fields() { + let mut mtt = MoreThanText::new(); + let test_doc = TestDocument::new(vec![FieldType::StaticString, FieldType::StaticString]); + let mut docdef = test_doc.get_docdef(); + docdef.add_index(&test_doc.get_field_name(0), IndexType::Index).unwrap(); + docdef.add_index(&test_doc.get_field_name(1), IndexType::Index).unwrap(); + mtt.create_document(docdef).unwrap(); + let input = vec![ + vec!["a", "a"], + vec!["a", "b"], + vec!["b", "a"], + vec!["b", "b"], + ]; + test_doc.populate_multiple(&mut mtt, input); + let mut calc1 = Calculation::new(Operand::Equal); + calc1.add_value("a").unwrap(); + calc1.add_value(CalcValue::Existing(FieldType::StaticString)).unwrap(); + let mut calc2 = Calculation::new(Operand::Equal); + calc2.add_value("b").unwrap(); + calc2.add_value(CalcValue::Existing(FieldType::StaticString)).unwrap(); + let mut query = Query::new(test_doc.get_doc_name()); + query.add(test_doc.get_field_name(0), calc1); + query.add(test_doc.get_field_name(1), calc2); + let results = mtt.records(query).unwrap(); + assert_eq!(results.len(), 1, "got {:?}", results); + let rec = results.iter().last().unwrap(); + assert_eq!(rec.get(test_doc.get_field_name(0)).unwrap(), "a".into()); + assert_eq!(rec.get(test_doc.get_field_name(1)).unwrap(), "b".into()); +} + +#[test] +fn can_query_use_multiple_mixed_index_fields() { + let mut mtt = MoreThanText::new(); + let test_doc = TestDocument::new(vec![FieldType::StaticString, FieldType::StaticString]); + let mut docdef = test_doc.get_docdef(); + docdef.add_index(&test_doc.get_field_name(0), IndexType::Index).unwrap(); + mtt.create_document(docdef).unwrap(); + let input = vec![ + vec!["a", "a"], + vec!["a", "b"], + vec!["b", "a"], + vec!["b", "b"], + ]; + test_doc.populate_multiple(&mut mtt, input); + let mut calc1 = Calculation::new(Operand::Equal); + calc1.add_value("a").unwrap(); + calc1.add_value(CalcValue::Existing(FieldType::StaticString)).unwrap(); + let mut calc2 = Calculation::new(Operand::Equal); + calc2.add_value("b").unwrap(); + calc2.add_value(CalcValue::Existing(FieldType::StaticString)).unwrap(); + let mut query = Query::new(test_doc.get_doc_name()); + query.add(test_doc.get_field_name(0), calc1); + query.add(test_doc.get_field_name(1), calc2); + let results = mtt.records(query).unwrap(); + assert_eq!(results.len(), 1, "got {:?}", results); + let rec = results.iter().last().unwrap(); + assert_eq!(rec.get(test_doc.get_field_name(0)).unwrap(), "a".into()); + assert_eq!(rec.get(test_doc.get_field_name(1)).unwrap(), "b".into()); +}