private StatElement CreateElement( StatElementType type ) { if ( _currentElement.Length > 0 ) { StatElement element = new StatElement (); if ( type == StatElementType.Variable ) { switch ( _currentElement.ToString ().ToLower () ) { case "true": element.Type = StatElementType.Constant; element.Value = true; break; case "false": element.Type = StatElementType.Constant; element.Value = false; break; case "like": element.Type = StatElementType.Operator; element.Value = Operator.Like; break; case "null": element.Type = StatElementType.Constant; element.Value = "null"; break; default: element.Type = StatElementType.Variable; element.Value = _currentElement.ToString (); break; } } else if ( type == StatElementType.Operator ) { element.Type = StatElementType.Operator; element.Value = GetOperatorByString ( _currentElement.ToString () ); } else { if ( _currentElement[0] != '\'' || _currentElement[_currentElement.Length - 1] != '\'' ) { try { double.Parse ( _currentElement.ToString () ); } catch { throw new Exception ( string.Format ( "Invalid Vairable:{0}", _currentElement.ToString () ) ); } } element.Type = StatElementType.Constant; element.Value = _currentElement.ToString (); } _currentElement.Remove ( 0, _currentElement.Length ); return element; } else { return null; } }
private static bool CalculateStringOperator( StatElement x, StatElement y, Operator @operator, object @object ) { string xStr; string yStr; if ( x.Type == StatElementType.Variable ) { PropertyInfo property = GetObjectProperty ( @object, ( string ) x.Value ); if ( property.PropertyType == typeof ( DateTime ) ) { xStr = ( ( DateTime ) property.GetValue ( @object, null ) ).ToString ( "yyyy-MM-dd HH:mm:ss" ); } else { xStr = ( string ) property.GetValue ( @object, null ); } } else { xStr = x.Value.ToString (); } if ( y.Type == StatElementType.Variable ) { PropertyInfo property = GetObjectProperty ( @object, ( string ) y.Value ); if ( property.PropertyType == typeof ( DateTime ) ) { yStr = ( ( DateTime ) property.GetValue ( @object, null ) ).ToString ( "yyyy-MM-dd HH:mm:ss" ); } else { yStr = y.Value.ToString (); } } else { yStr = y.Value.ToString (); } if ( xStr[0] == '\'' && xStr[xStr.Length - 1] == '\'' ) { xStr = xStr.Substring ( 1, xStr.Length - 2 ); } if ( yStr[0] == '\'' && yStr[yStr.Length - 1] == '\'' ) { yStr = yStr.Substring ( 1, yStr.Length - 2 ); } switch ( @operator ) { case Operator.Equals: return xStr == yStr; case Operator.UnEquals: return xStr != yStr; case Operator.Like: return CalculateLikeOperator ( xStr, yStr, x.Type, y.Type ); default: throw new Exception ( "Invalid Statement" ); } }
private void ProcessOperatorStack( StatElement element, Stack<StatElement> operatorStack ) { if ( element.Type != StatElementType.Operator ) { throw new Exception ( "element.Type must be StatElement.Operator" ); } StatElement top; if ( operatorStack.Count == 0 ) { if ( ( Operator ) element.Value == Operator.RightParenthesis ) { throw new Exception ( "( is expected" ); } else { operatorStack.Push ( element ); } } else if ( ( Operator ) element.Value == Operator.LeftParenthesis ) { operatorStack.Push ( element ); } else if ( ( Operator ) element.Value == Operator.RightParenthesis ) { top = operatorStack.Pop (); while ( ( Operator ) top.Value != Operator.LeftParenthesis ) { if ( operatorStack.Count == 0 ) { throw new Exception ( "( is expected" ); } _suffixExpression.Add ( top ); top = operatorStack.Pop (); } } else { while ( operatorStack.Count > 0 ) { top = operatorStack.Peek (); if ( ( Operator ) top.Value == Operator.LeftParenthesis ) { break; } if ( _priorityTable[( int ) element.Value, ( int ) top.Value] == 1 ) { break; } _suffixExpression.Add ( operatorStack.Pop () ); } operatorStack.Push ( element ); } }
private static void ProcessVariable( object @object, StatElement element, Stack<StatElement> resultStack ) { if ( @object.GetType ().GetProperty ( ( string ) element.Value ) != null ) { resultStack.Push ( element ); } else { throw new Exception ( string.Format ( "{0} do not contain the property:{1}", @object.GetType (), element.Value ) ); } }
private static void ProcessNotOperator( Stack<StatElement> resultStack, object @object ) { if ( resultStack.Count == 0 ) { throw new Exception ( "Invalid Statement" ); } StatElement element = resultStack.Pop (); if ( element.Type == StatElementType.Result ) { element.Value = !( ( bool ) element.Value ); } else if ( element.Type == StatElementType.Variable ) { PropertyInfo property = GetObjectProperty ( @object, ( string ) element.Value ); if ( property.PropertyType == typeof ( bool ) ) { element = new StatElement (); element.Type = StatElementType.Result; element.Value = !( ( bool ) property.GetValue ( @object, null ) ); } else { throw new Exception ( string.Format ( "{0}.{1} is not a boolean property", @object.GetType (), property.Name ) ); } } else { if ( element.Value is bool ) { element = new StatElement (); element.Type = StatElementType.Result; element.Value = !( ( bool ) element.Value ); } else { throw new Exception ( string.Format ( "{0} is not boolean", element.Value ) ); } } resultStack.Push ( element ); }
private static void ProcessNotBooleanOperator( Stack<StatElement> resultStack, Operator @operator, object @object ) { if ( resultStack.Count < 2 ) { throw new Exception ( "Invalid Statement" ); } StatElement y = resultStack.Pop (); StatElement x = resultStack.Pop (); StatElement element = new StatElement (); object xValue; object yValue; element.Type = StatElementType.Result; if ( x.Type == StatElementType.Variable ) { xValue = GetObjectProperty ( @object, ( string ) x.Value ).GetValue ( @object, null ); } else { xValue = x.Value; } if ( y.Type == StatElementType.Variable ) { yValue = GetObjectProperty ( @object, ( string ) y.Value ).GetValue ( @object, null ); } else { yValue = y.Value; } if ( IsString ( x, @object ) && IsString ( y, @object ) ) { element.Value = CalculateStringOperator ( x, y, @operator, @object ); } else if ( !( IsString ( x, @object ) || IsString ( y, @object ) ) ) { element.Value = CalculateNotBooleanOperator ( Convert.ToDouble ( xValue ), Convert.ToDouble ( yValue ), @operator ); } else { throw new Exception ( "Invalid Statment" ); } resultStack.Push ( element ); }
private static void ProcessBooleanOperator( Stack<StatElement> resultStack, Operator @operator, object @object ) { if ( resultStack.Count < 2 ) { throw new Exception ( "Invalid Statement" ); } StatElement y = resultStack.Pop (); StatElement x = resultStack.Pop (); if ( x.Type == StatElementType.Variable ) { GetObjectProperty ( @object, ( string ) x.Value ); } if ( y.Type == StatElementType.Variable ) { GetObjectProperty ( @object, ( string ) y.Value ); } if ( x.Value is bool && y.Value is bool ) { StatElement element = new StatElement (); element.Type = StatElementType.Result; element.Value = CalculateBooleanOperator ( ( bool ) x.Value, ( bool ) y.Value, @operator ); resultStack.Push ( element ); } else { throw new Exception ( "Invalid Statement" ); } }
private static bool IsString( StatElement element, object @object ) { if ( element.Type == StatElementType.Variable ) { Type type = @object.GetType ().GetProperty ( ( string ) element.Value ).PropertyType; if ( type == typeof ( string ) || type == typeof ( DateTime ) || type == typeof ( char ) ) { return true; } else { return false; } } else if ( element.Type == StatElementType.Constant ) { string value = ( string ) element.Value; if ( value.Length > 1 && value[0] == '\'' && value[value.Length - 1] == '\'' ) { return true; } else { return false; } } else { throw new Exception ( "'element' must a variable or constant" ); } }