Files
TradeBlotter/Helper/FilterEvaluator.cs
2024-02-23 06:58:53 -05:00

118 lines
3.8 KiB
C#

using System;
using System.Collections.Generic;
//using System.Linq;
using System.Text;
using System.Diagnostics;
namespace TradeBlotter.Helper
{
public class FilterEvaluator<T> where T : IConvertible, IComparable
{
public enum Expression { Equal, LessThan, LessThanOrEqual, GreaterThan, GreaterThanOrEqual, Invalid };
private T value;
private bool isValid = false;
private Expression expression = Expression.Invalid;
private String defaultExpression;
private bool isEnabled = false;
private bool debugMode = false;
private String filterName;
public FilterEvaluator(String filterName,String filterExpression)
{
this.filterName = filterName;
defaultExpression = filterExpression;
SetExpression(filterExpression);
}
public bool IsEnabled
{
get { return isEnabled; }
set { isEnabled = value; }
}
public bool DebugMode
{
get { return debugMode; }
set { debugMode = value; }
}
public void UseDefault()
{
SetExpression(defaultExpression);
}
public bool SetExpression(String filterExpression)
{
try
{
if (filterExpression == null)
{
isValid = false;
return false;
}
if (filterExpression.StartsWith("<="))
{
expression = Expression.LessThanOrEqual;
value = (T)Convert.ChangeType(filterExpression.Substring(2), typeof(T));
}
else if (filterExpression.StartsWith(">="))
{
expression = Expression.GreaterThanOrEqual;
value = (T)Convert.ChangeType(filterExpression.Substring(2), typeof(T));
}
else if (filterExpression.StartsWith("="))
{
expression = Expression.Equal;
value = (T)Convert.ChangeType(filterExpression.Substring(1), typeof(T));
}
else if (filterExpression.StartsWith("<"))
{
expression = Expression.LessThan;
value = (T)Convert.ChangeType(filterExpression.Substring(1), typeof(T));
}
else if (filterExpression.StartsWith(">"))
{
expression = Expression.GreaterThan;
value = (T)Convert.ChangeType(filterExpression.Substring(1), typeof(T));
}
else
{
expression = Expression.Equal;
value = (T)Convert.ChangeType(filterExpression, typeof(T));
}
isValid = true;
return true;
}
catch (Exception)
{
isValid = false;
return false;
}
}
public bool IsValid
{
get { return isValid; }
}
public bool Evaluate(T value)
{
if (!IsValid ||!IsEnabled) return true;
switch (expression)
{
case Expression.Equal:
if (debugMode) Debug.WriteLine(value.ToString() + "==" + this.value + ":" + value.Equals(this.value).ToString());
return value.Equals(this.value);
case Expression.LessThan:
if (debugMode) Debug.WriteLine(value.ToString() + "<" + this.value + ":" + (value.CompareTo(this.value)<0).ToString());
return value.CompareTo(this.value) < 0 ? true : false;
case Expression.GreaterThan:
if (debugMode) Debug.WriteLine(value.ToString() + ">" + this.value + ":" + (value.CompareTo(this.value)>0).ToString());
return value.CompareTo(this.value) > 0 ? true : false;
case Expression.LessThanOrEqual:
if (debugMode) Debug.WriteLine(value.ToString() + "<=" + this.value + ":" + (value.CompareTo(this.value)<=0).ToString());
return value.CompareTo(this.value) <= 0 ? true : false;
case Expression.GreaterThanOrEqual:
if (debugMode) Debug.WriteLine(value.ToString() + ">=" + this.value + ":" + (value.CompareTo(this.value)>=0).ToString());
return value.CompareTo(this.value) >= 0 ? true : false;
default:
return false;
}
}
}
}