Aggregated filters

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@594 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
inoussa
2008-10-17 20:12:15 +00:00
parent 24627399e9
commit 8a190b28da
4 changed files with 46 additions and 12 deletions

View File

@ -25,7 +25,7 @@ uses
{$ELSE}
TestFrameWork,
{$ENDIF}
rtti_filters;
cursor_intf, rtti_filters;
type

View File

@ -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

View File

@ -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

View File

@ -17,7 +17,7 @@ interface
uses
Classes, SysUtils,
cursor_intf, base_service_intf;
wst_types, cursor_intf, base_service_intf;
type