diff --git a/wst/trunk/tests/test_suite/test_rtti_filter.pas b/wst/trunk/tests/test_suite/test_rtti_filter.pas index a4d5a2108..3f829fbb0 100644 --- a/wst/trunk/tests/test_suite/test_rtti_filter.pas +++ b/wst/trunk/tests/test_suite/test_rtti_filter.pas @@ -25,7 +25,7 @@ uses {$ELSE} TestFrameWork, {$ENDIF} - rtti_filters; + cursor_intf, rtti_filters; type diff --git a/wst/trunk/wst_rtti_filter/cursor_intf.pas b/wst/trunk/wst_rtti_filter/cursor_intf.pas index 0a1809f78..941e735ae 100644 --- a/wst/trunk/wst_rtti_filter/cursor_intf.pas +++ b/wst/trunk/wst_rtti_filter/cursor_intf.pas @@ -16,12 +16,12 @@ unit cursor_intf; interface uses - Classes, SysUtils; - -{$INCLUDE wst.inc} -{$INCLUDE wst_delphi.inc} + Classes, SysUtils, wst_types; type + + TFilterConnector = ( fcNone, fcAnd, fcOr ); + IInterfaceCursor = interface; IObjectCursor = interface; IDefaultTypedCursor = {$IFDEF WST_INTF_DOM}IInterfaceCursor{$ELSE}IObjectCursor{$ENDIF}; @@ -60,6 +60,22 @@ type function SetFilter(const AFilter : IObjectFilter) : IObjectFilter; end; + { TAggregatedFilter } + + TAggregatedFilter = class(TInterfacedObject,IObjectFilter) + private + FLeft : IObjectFilter; + FRight : IObjectFilter; + FConnector : TFilterConnector; + protected + function Evaluate(const AObject : TObject) : Boolean; + public + constructor Create( + const ALeft, ARight : IObjectFilter; + const AConnector : TFilterConnector + ); + end; + function CreateCursorOn( AInputCursor : IObjectCursor; AFilter : IObjectFilter @@ -93,6 +109,29 @@ type ); end; +{ TAggregatedFilter } + +function TAggregatedFilter.Evaluate(const AObject: TObject): Boolean; +begin + Result := FLeft.Evaluate(AObject); + case FConnector of + fcAnd : Result := Result and FRight.Evaluate(AObject); + fcOr : Result := Result or FRight.Evaluate(AObject); + end; +end; + +constructor TAggregatedFilter.Create( + const ALeft, ARight: IObjectFilter; + const AConnector: TFilterConnector +); +begin + Assert(ALeft <> nil); + Assert( ( AConnector = fcNone ) or ( ARight <> nil )); + FLeft := ALeft; + FRight := ARight; + FConnector := AConnector; +end; + function CreateCursorOn( AInputCursor : IObjectCursor; AFilter : IObjectFilter diff --git a/wst/trunk/wst_rtti_filter/rtti_filters.pas b/wst/trunk/wst_rtti_filter/rtti_filters.pas index e68a6f3be..84cd4cb19 100644 --- a/wst/trunk/wst_rtti_filter/rtti_filters.pas +++ b/wst/trunk/wst_rtti_filter/rtti_filters.pas @@ -17,18 +17,13 @@ interface uses Classes, SysUtils, Contnrs, TypInfo, - cursor_intf; - -{$INCLUDE wst.inc} -{$INCLUDE wst_delphi.inc} + cursor_intf, wst_types; type ERttiFilterException = class(Exception) end; - TFilterConnector = ( fcNone, fcAnd, fcOr ); - TNumericFilterOperator = ( nfoEqual, nfoGreater, nfoLesser, nfoNotEqual, nfoGreaterOrEqual, nfoLesserOrEqual diff --git a/wst/trunk/wst_rtti_filter/wst_cursors.pas b/wst/trunk/wst_rtti_filter/wst_cursors.pas index 7a58ce8f2..7f9d84bb1 100644 --- a/wst/trunk/wst_rtti_filter/wst_cursors.pas +++ b/wst/trunk/wst_rtti_filter/wst_cursors.pas @@ -17,7 +17,7 @@ interface uses Classes, SysUtils, - cursor_intf, base_service_intf; + wst_types, cursor_intf, base_service_intf; type