You've already forked lazarus-ccr
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:
@ -25,7 +25,7 @@ uses
|
||||
{$ELSE}
|
||||
TestFrameWork,
|
||||
{$ENDIF}
|
||||
rtti_filters;
|
||||
cursor_intf, rtti_filters;
|
||||
|
||||
type
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -17,7 +17,7 @@ interface
|
||||
|
||||
uses
|
||||
Classes, SysUtils,
|
||||
cursor_intf, base_service_intf;
|
||||
wst_types, cursor_intf, base_service_intf;
|
||||
|
||||
type
|
||||
|
||||
|
Reference in New Issue
Block a user