use sql_cli::data::recursive_where_evaluator::RecursiveWhereEvaluator;
use sql_cli::datatable::{DataColumn, DataRow, DataTable, DataValue};
use sql_cli::recursive_parser::Parser;
fn create_test_table() -> DataTable {
let mut table = DataTable::new("test");
table.add_column(DataColumn::new("id"));
table.add_column(DataColumn::new("book"));
table
.add_row(DataRow::new(vec![
DataValue::Integer(1),
DataValue::String("derivatives".to_string()),
]))
.unwrap();
table
.add_row(DataRow::new(vec![
DataValue::Integer(2),
DataValue::String("equity trading".to_string()),
]))
.unwrap();
table
.add_row(DataRow::new(vec![
DataValue::Integer(3),
DataValue::String(" leading".to_string()),
]))
.unwrap();
table
.add_row(DataRow::new(vec![
DataValue::Integer(4),
DataValue::String("trailing ".to_string()),
]))
.unwrap();
table
.add_row(DataRow::new(vec![
DataValue::Integer(5),
DataValue::String("FX".to_string()),
]))
.unwrap();
table
}
#[test]
fn test_indexof_space_at_zero() {
let table = create_test_table();
let mut evaluator = RecursiveWhereEvaluator::new(&table);
let mut parser = Parser::new("SELECT * FROM test WHERE book.IndexOf(' ') = 0");
let statement = parser.parse().expect("Failed to parse");
let where_clause = statement.where_clause.expect("Expected WHERE clause");
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_space_not_found() {
let table = create_test_table();
let mut evaluator = RecursiveWhereEvaluator::new(&table);
let mut parser = Parser::new("SELECT * FROM test WHERE book.IndexOf(' ') = -1");
let statement = parser.parse().expect("Failed to parse");
let where_clause = statement.where_clause.expect("Expected WHERE clause");
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_space_greater_than_zero() {
let table = create_test_table();
let mut evaluator = RecursiveWhereEvaluator::new(&table);
let mut parser = Parser::new("SELECT * FROM test WHERE book.IndexOf(' ') > 0");
let statement = parser.parse().expect("Failed to parse");
let where_clause = statement.where_clause.expect("Expected WHERE clause");
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_greater_or_equal_zero() {
let table = create_test_table();
let mut evaluator = RecursiveWhereEvaluator::new(&table);
let mut parser = Parser::new("SELECT * FROM test WHERE book.IndexOf(' ') >= 0");
let statement = parser.parse().expect("Failed to parse");
let where_clause = statement.where_clause.expect("Expected WHERE clause");
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_specific_positions() {
let table = create_test_table();
let mut evaluator = RecursiveWhereEvaluator::new(&table);
let mut parser = Parser::new("SELECT * FROM test WHERE book.IndexOf(' ') = 6");
let statement = parser.parse().expect("Failed to parse");
let where_clause = statement.where_clause.expect("Expected WHERE clause");
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()); }