use sql_cli::data::recursive_where_evaluator::RecursiveWhereEvaluator;
use sql_cli::datatable::{DataColumn, DataRow, DataTable, DataValue};
use sql_cli::recursive_parser::{Parser, WhereClause};
fn create_test_table() -> DataTable {
let mut table = DataTable::new("test");
table.add_column(DataColumn::new("id"));
table.add_column(DataColumn::new("name"));
table.add_column(DataColumn::new("description"));
table.add_column(DataColumn::new("price"));
table.add_column(DataColumn::new("category"));
table
.add_row(DataRow::new(vec![
DataValue::Integer(1),
DataValue::String("Widget".to_string()),
DataValue::String("A useful widget for various tasks".to_string()),
DataValue::Float(19.99),
DataValue::String("Tools".to_string()),
]))
.unwrap();
table
.add_row(DataRow::new(vec![
DataValue::Integer(2),
DataValue::String("Gadget".to_string()),
DataValue::String("An innovative gadget device".to_string()),
DataValue::Float(29.99),
DataValue::String("Electronics".to_string()),
]))
.unwrap();
table
.add_row(DataRow::new(vec![
DataValue::Integer(3),
DataValue::String("Gizmo".to_string()),
DataValue::String("A clever gizmo for entertainment".to_string()),
DataValue::Float(9.99),
DataValue::String("Toys".to_string()),
]))
.unwrap();
table
.add_row(DataRow::new(vec![
DataValue::Integer(4),
DataValue::String("Device".to_string()),
DataValue::String("Professional device for work".to_string()),
DataValue::Float(99.99),
DataValue::String("Electronics".to_string()),
]))
.unwrap();
table
.add_row(DataRow::new(vec![
DataValue::Integer(5),
DataValue::String("Tool".to_string()),
DataValue::String("Essential tool for projects".to_string()),
DataValue::Float(49.99),
DataValue::String("Tools".to_string()),
]))
.unwrap();
table
}
fn extract_where_clause(query: &str) -> WhereClause {
let mut parser = Parser::new(query);
let statement = parser.parse().expect("Failed to parse query");
statement.where_clause.expect("Expected WHERE clause")
}
#[test]
fn test_contains_method() {
let table = create_test_table();
let mut evaluator = RecursiveWhereEvaluator::new(&table);
let where_clause = extract_where_clause("SELECT * FROM test WHERE name.Contains('get')");
assert!(evaluator.evaluate(&where_clause, 0).unwrap()); assert!(evaluator.evaluate(&where_clause, 1).unwrap()); assert!(!evaluator.evaluate(&where_clause, 2).unwrap()); assert!(!evaluator.evaluate(&where_clause, 3).unwrap()); assert!(!evaluator.evaluate(&where_clause, 4).unwrap()); }
#[test]
fn test_startswith_method() {
let table = create_test_table();
let mut evaluator = RecursiveWhereEvaluator::new(&table);
let where_clause = extract_where_clause("SELECT * FROM test WHERE name.StartsWith('G')");
assert!(!evaluator.evaluate(&where_clause, 0).unwrap()); assert!(evaluator.evaluate(&where_clause, 1).unwrap()); assert!(evaluator.evaluate(&where_clause, 2).unwrap()); assert!(!evaluator.evaluate(&where_clause, 3).unwrap()); assert!(!evaluator.evaluate(&where_clause, 4).unwrap()); }
#[test]
fn test_endswith_method() {
let table = create_test_table();
let mut evaluator = RecursiveWhereEvaluator::new(&table);
let where_clause = extract_where_clause("SELECT * FROM test WHERE name.EndsWith('et')");
assert!(evaluator.evaluate(&where_clause, 0).unwrap()); assert!(evaluator.evaluate(&where_clause, 1).unwrap()); assert!(!evaluator.evaluate(&where_clause, 2).unwrap()); assert!(!evaluator.evaluate(&where_clause, 3).unwrap()); assert!(!evaluator.evaluate(&where_clause, 4).unwrap()); }
#[test]
fn test_length_method() {
let table = create_test_table();
let mut evaluator = RecursiveWhereEvaluator::new(&table);
let where_clause = extract_where_clause("SELECT * FROM test WHERE name.Length() > 5");
assert!(evaluator.evaluate(&where_clause, 0).unwrap()); assert!(evaluator.evaluate(&where_clause, 1).unwrap()); assert!(!evaluator.evaluate(&where_clause, 2).unwrap()); assert!(evaluator.evaluate(&where_clause, 3).unwrap()); assert!(!evaluator.evaluate(&where_clause, 4).unwrap()); }
#[test]
fn test_indexof_method_found() {
let table = create_test_table();
let mut evaluator = RecursiveWhereEvaluator::new(&table);
let where_clause =
extract_where_clause("SELECT * FROM test WHERE description.IndexOf('device') > 0");
assert!(!evaluator.evaluate(&where_clause, 0).unwrap()); assert!(evaluator.evaluate(&where_clause, 1).unwrap()); assert!(!evaluator.evaluate(&where_clause, 2).unwrap()); assert!(evaluator.evaluate(&where_clause, 3).unwrap()); assert!(!evaluator.evaluate(&where_clause, 4).unwrap()); }
#[test]
fn test_indexof_method_not_found() {
let table = create_test_table();
let mut evaluator = RecursiveWhereEvaluator::new(&table);
let where_clause = extract_where_clause("SELECT * FROM test WHERE name.IndexOf('xyz') = -1");
assert!(evaluator.evaluate(&where_clause, 0).unwrap()); assert!(evaluator.evaluate(&where_clause, 1).unwrap()); assert!(evaluator.evaluate(&where_clause, 2).unwrap()); assert!(evaluator.evaluate(&where_clause, 3).unwrap()); assert!(evaluator.evaluate(&where_clause, 4).unwrap()); }
#[test]
fn test_indexof_at_beginning() {
let table = create_test_table();
let mut evaluator = RecursiveWhereEvaluator::new(&table);
let where_clause = extract_where_clause("SELECT * FROM test WHERE name.IndexOf('Wid') = 0");
assert!(evaluator.evaluate(&where_clause, 0).unwrap()); assert!(!evaluator.evaluate(&where_clause, 1).unwrap()); assert!(!evaluator.evaluate(&where_clause, 2).unwrap()); assert!(!evaluator.evaluate(&where_clause, 3).unwrap()); assert!(!evaluator.evaluate(&where_clause, 4).unwrap()); }
#[test]
fn test_numeric_column_with_string_methods() {
let table = create_test_table();
let mut evaluator = RecursiveWhereEvaluator::new(&table);
let where_clause = extract_where_clause("SELECT * FROM test WHERE price.Contains('9.99')");
assert!(evaluator.evaluate(&where_clause, 0).unwrap()); assert!(evaluator.evaluate(&where_clause, 1).unwrap()); assert!(evaluator.evaluate(&where_clause, 2).unwrap()); assert!(evaluator.evaluate(&where_clause, 3).unwrap()); assert!(evaluator.evaluate(&where_clause, 4).unwrap()); }
#[test]
fn test_complex_expressions_with_methods() {
let table = create_test_table();
let mut evaluator = RecursiveWhereEvaluator::new(&table);
let where_clause = extract_where_clause(
"SELECT * FROM test WHERE name.Length() > 4 AND category.Contains('tron')",
);
assert!(!evaluator.evaluate(&where_clause, 0).unwrap()); assert!(evaluator.evaluate(&where_clause, 1).unwrap()); assert!(!evaluator.evaluate(&where_clause, 2).unwrap()); assert!(evaluator.evaluate(&where_clause, 3).unwrap()); assert!(!evaluator.evaluate(&where_clause, 4).unwrap()); }
#[test]
fn test_indexof_with_greater_than() {
let table = create_test_table();
let mut evaluator = RecursiveWhereEvaluator::new(&table);
let where_clause =
extract_where_clause("SELECT * FROM test WHERE description.IndexOf('ful') > 2");
assert!(evaluator.evaluate(&where_clause, 0).unwrap()); assert!(!evaluator.evaluate(&where_clause, 1).unwrap()); assert!(!evaluator.evaluate(&where_clause, 2).unwrap()); assert!(!evaluator.evaluate(&where_clause, 3).unwrap()); assert!(!evaluator.evaluate(&where_clause, 4).unwrap()); }
#[test]
fn test_case_sensitivity() {
let table = create_test_table();
let mut evaluator = RecursiveWhereEvaluator::new(&table);
let where_clause1 = extract_where_clause("SELECT * FROM test WHERE name.Contains('WIDGET')");
let where_clause2 = extract_where_clause("SELECT * FROM test WHERE name.Contains('widget')");
let where_clause3 = extract_where_clause("SELECT * FROM test WHERE name.Contains('WiDgEt')");
assert!(evaluator.evaluate(&where_clause1, 0).unwrap());
assert!(evaluator.evaluate(&where_clause2, 0).unwrap());
assert!(evaluator.evaluate(&where_clause3, 0).unwrap());
}