use std::sync::Arc;
use crate::evaluation::variable_value::integer::Integer;
use crate::evaluation::variable_value::VariableValue;
use crate::evaluation::context::QueryVariables;
use crate::evaluation::functions::FunctionRegistry;
use crate::evaluation::{ExpressionEvaluationContext, ExpressionEvaluator, InstantQueryClock};
use crate::in_memory_index::in_memory_result_index::InMemoryResultIndex;
#[tokio::test]
async fn evaluate_in() {
let expr = "$param1 IN ['a', 'b']";
let expr = drasi_query_cypher::parse_expression(expr).unwrap();
let function_registry = Arc::new(FunctionRegistry::new());
let ari = Arc::new(InMemoryResultIndex::new());
let evaluator = ExpressionEvaluator::new(function_registry.clone(), ari.clone());
let mut variables = QueryVariables::new();
variables.insert("param1".into(), VariableValue::String("a".to_string()));
{
let context =
ExpressionEvaluationContext::new(&variables, Arc::new(InstantQueryClock::new(0, 0)));
assert_eq!(
evaluator
.evaluate_expression(&context, &expr)
.await
.unwrap(),
VariableValue::Bool(true)
);
}
variables.insert("param1".into(), VariableValue::String("b".to_string()));
{
let context =
ExpressionEvaluationContext::new(&variables, Arc::new(InstantQueryClock::new(0, 0)));
assert_eq!(
evaluator
.evaluate_expression(&context, &expr)
.await
.unwrap(),
VariableValue::Bool(true)
);
}
variables.insert("param1".into(), VariableValue::String("c".to_string()));
{
let context =
ExpressionEvaluationContext::new(&variables, Arc::new(InstantQueryClock::new(0, 0)));
assert_eq!(
evaluator
.evaluate_expression(&context, &expr)
.await
.unwrap(),
VariableValue::Bool(false)
);
}
}
#[tokio::test]
async fn evaluate_is_null() {
let expr = "$param1 IS NULL";
let expr = drasi_query_cypher::parse_expression(expr).unwrap();
let function_registry = Arc::new(FunctionRegistry::new());
let ari = Arc::new(InMemoryResultIndex::new());
let evaluator = ExpressionEvaluator::new(function_registry.clone(), ari.clone());
let mut variables = QueryVariables::new();
variables.insert("param1".into(), VariableValue::Null);
{
let context =
ExpressionEvaluationContext::new(&variables, Arc::new(InstantQueryClock::new(0, 0)));
assert_eq!(
evaluator
.evaluate_expression(&context, &expr)
.await
.unwrap(),
VariableValue::Bool(true)
);
}
variables.insert("param1".into(), VariableValue::String("b".to_string()));
{
let context =
ExpressionEvaluationContext::new(&variables, Arc::new(InstantQueryClock::new(0, 0)));
assert_eq!(
evaluator
.evaluate_expression(&context, &expr)
.await
.unwrap(),
VariableValue::Bool(false)
);
}
}
#[tokio::test]
async fn evaluate_is_not_null() {
let expr = "$param1 IS NOT NULL";
let expr = drasi_query_cypher::parse_expression(expr).unwrap();
let function_registry = Arc::new(FunctionRegistry::new());
let ari = Arc::new(InMemoryResultIndex::new());
let evaluator = ExpressionEvaluator::new(function_registry.clone(), ari.clone());
let mut variables = QueryVariables::new();
variables.insert("param1".into(), VariableValue::Null);
{
let context =
ExpressionEvaluationContext::new(&variables, Arc::new(InstantQueryClock::new(0, 0)));
assert_eq!(
evaluator
.evaluate_expression(&context, &expr)
.await
.unwrap(),
VariableValue::Bool(false)
);
}
variables.insert("param1".into(), VariableValue::String("b".to_string()));
{
let context =
ExpressionEvaluationContext::new(&variables, Arc::new(InstantQueryClock::new(0, 0)));
assert_eq!(
evaluator
.evaluate_expression(&context, &expr)
.await
.unwrap(),
VariableValue::Bool(true)
);
}
}
#[tokio::test]
async fn evaluate_string_eq() {
let expr = "$param1 = $param2";
let expr = drasi_query_cypher::parse_expression(expr).unwrap();
let function_registry = Arc::new(FunctionRegistry::new());
let ari = Arc::new(InMemoryResultIndex::new());
let evaluator = ExpressionEvaluator::new(function_registry.clone(), ari.clone());
let mut variables = QueryVariables::new();
variables.insert("param1".into(), VariableValue::String("a".to_string()));
variables.insert("param2".into(), VariableValue::String("a".to_string()));
{
let context =
ExpressionEvaluationContext::new(&variables, Arc::new(InstantQueryClock::new(0, 0)));
assert_eq!(
evaluator
.evaluate_expression(&context, &expr)
.await
.unwrap(),
VariableValue::Bool(true)
);
}
variables.insert("param1".into(), VariableValue::String("b".to_string()));
{
let context =
ExpressionEvaluationContext::new(&variables, Arc::new(InstantQueryClock::new(0, 0)));
assert_eq!(
evaluator
.evaluate_expression(&context, &expr)
.await
.unwrap(),
VariableValue::Bool(false)
);
}
}
#[tokio::test]
async fn evaluate_number_eq() {
let expr = "$param1 = $param2";
let expr = drasi_query_cypher::parse_expression(expr).unwrap();
let function_registry = Arc::new(FunctionRegistry::new());
let ari = Arc::new(InMemoryResultIndex::new());
let evaluator = ExpressionEvaluator::new(function_registry.clone(), ari.clone());
let mut variables = QueryVariables::new();
variables.insert("param1".into(), VariableValue::Integer(Integer::from(1)));
variables.insert("param2".into(), VariableValue::Integer(Integer::from(1)));
{
let context =
ExpressionEvaluationContext::new(&variables, Arc::new(InstantQueryClock::new(0, 0)));
assert_eq!(
evaluator
.evaluate_expression(&context, &expr)
.await
.unwrap(),
VariableValue::Bool(true)
);
}
variables.insert("param1".into(), VariableValue::Integer(Integer::from(2)));
{
let context =
ExpressionEvaluationContext::new(&variables, Arc::new(InstantQueryClock::new(0, 0)));
assert_eq!(
evaluator
.evaluate_expression(&context, &expr)
.await
.unwrap(),
VariableValue::Bool(false)
);
}
}
#[tokio::test]
async fn evaluate_number_gt() {
let expr = "$param1 > $param2";
let expr = drasi_query_cypher::parse_expression(expr).unwrap();
let function_registry = Arc::new(FunctionRegistry::new());
let ari = Arc::new(InMemoryResultIndex::new());
let evaluator = ExpressionEvaluator::new(function_registry.clone(), ari.clone());
let mut variables = QueryVariables::new();
variables.insert("param1".into(), VariableValue::Integer(Integer::from(3)));
variables.insert("param2".into(), VariableValue::Integer(Integer::from(2)));
{
let context =
ExpressionEvaluationContext::new(&variables, Arc::new(InstantQueryClock::new(0, 0)));
assert_eq!(
evaluator
.evaluate_expression(&context, &expr)
.await
.unwrap(),
VariableValue::Bool(true)
);
}
variables.insert("param1".into(), VariableValue::Integer(Integer::from(2)));
{
let context =
ExpressionEvaluationContext::new(&variables, Arc::new(InstantQueryClock::new(0, 0)));
assert_eq!(
evaluator
.evaluate_expression(&context, &expr)
.await
.unwrap(),
VariableValue::Bool(false)
);
}
}
#[tokio::test]
async fn evaluate_number_gte() {
let expr = "$param1 >= $param2";
let expr = drasi_query_cypher::parse_expression(expr).unwrap();
let function_registry = Arc::new(FunctionRegistry::new());
let ari = Arc::new(InMemoryResultIndex::new());
let evaluator = ExpressionEvaluator::new(function_registry.clone(), ari.clone());
let mut variables = QueryVariables::new();
variables.insert("param1".into(), VariableValue::Integer(Integer::from(3)));
variables.insert("param2".into(), VariableValue::Integer(Integer::from(2)));
{
let context =
ExpressionEvaluationContext::new(&variables, Arc::new(InstantQueryClock::new(0, 0)));
assert_eq!(
evaluator
.evaluate_expression(&context, &expr)
.await
.unwrap(),
VariableValue::Bool(true)
);
}
variables.insert("param1".into(), VariableValue::Integer(Integer::from(2)));
{
let context =
ExpressionEvaluationContext::new(&variables, Arc::new(InstantQueryClock::new(0, 0)));
assert_eq!(
evaluator
.evaluate_expression(&context, &expr)
.await
.unwrap(),
VariableValue::Bool(true)
);
}
variables.insert("param1".into(), VariableValue::Integer(Integer::from(1)));
{
let context =
ExpressionEvaluationContext::new(&variables, Arc::new(InstantQueryClock::new(0, 0)));
assert_eq!(
evaluator
.evaluate_expression(&context, &expr)
.await
.unwrap(),
VariableValue::Bool(false)
);
}
}
#[tokio::test]
async fn evaluate_number_lt() {
let expr = "$param2 < $param1";
let expr = drasi_query_cypher::parse_expression(expr).unwrap();
let function_registry = Arc::new(FunctionRegistry::new());
let ari = Arc::new(InMemoryResultIndex::new());
let evaluator = ExpressionEvaluator::new(function_registry.clone(), ari.clone());
let mut variables = QueryVariables::new();
variables.insert("param1".into(), VariableValue::Integer(Integer::from(3)));
variables.insert("param2".into(), VariableValue::Integer(Integer::from(2)));
{
let context =
ExpressionEvaluationContext::new(&variables, Arc::new(InstantQueryClock::new(0, 0)));
assert_eq!(
evaluator
.evaluate_expression(&context, &expr)
.await
.unwrap(),
VariableValue::Bool(true)
);
}
variables.insert("param1".into(), VariableValue::Integer(Integer::from(2)));
{
let context =
ExpressionEvaluationContext::new(&variables, Arc::new(InstantQueryClock::new(0, 0)));
assert_eq!(
evaluator
.evaluate_expression(&context, &expr)
.await
.unwrap(),
VariableValue::Bool(false)
);
}
}
#[tokio::test]
async fn evaluate_number_lte() {
let expr = "$param2 <= $param1";
let expr = drasi_query_cypher::parse_expression(expr).unwrap();
let function_registry = Arc::new(FunctionRegistry::new());
let ari = Arc::new(InMemoryResultIndex::new());
let evaluator = ExpressionEvaluator::new(function_registry.clone(), ari.clone());
let mut variables = QueryVariables::new();
variables.insert("param1".into(), VariableValue::Integer(Integer::from(3)));
variables.insert("param2".into(), VariableValue::Integer(Integer::from(2)));
{
let context =
ExpressionEvaluationContext::new(&variables, Arc::new(InstantQueryClock::new(0, 0)));
assert_eq!(
evaluator
.evaluate_expression(&context, &expr)
.await
.unwrap(),
VariableValue::Bool(true)
);
}
variables.insert("param1".into(), VariableValue::Integer(Integer::from(2)));
{
let context =
ExpressionEvaluationContext::new(&variables, Arc::new(InstantQueryClock::new(0, 0)));
assert_eq!(
evaluator
.evaluate_expression(&context, &expr)
.await
.unwrap(),
VariableValue::Bool(true)
);
}
variables.insert("param1".into(), VariableValue::Integer(Integer::from(1)));
{
let context =
ExpressionEvaluationContext::new(&variables, Arc::new(InstantQueryClock::new(0, 0)));
assert_eq!(
evaluator
.evaluate_expression(&context, &expr)
.await
.unwrap(),
VariableValue::Bool(false)
);
}
}