воскресенье, 12 апреля 2026 г.

Я наверное единственный человек,которого Embarcadero выкинула из списка MVP

Я наверное единственный человек,которого Embarcadero выкинула из списка MVP ;)

m3IDListQueryExecutor

{$IfDef FPC}{$CodePage cp1251}{$EndIf FPC}

unit m3IDListQueryExecutor;

// --------------------------------------------------------------------------
// Родители: "Queries" <> MUID: (66FB115B029F) :: "m3" <> MUID: (66FB10950007) :: "Shared Delphi For Archi" <> MUID: (4ABA2360025A)
// --------------------------------------------------------------------------
// Модуль: "w:\common\components\rtl\Garant\m3\m3IDListQueryExecutor.pas" GeneratorVersion: 1.0.0.883901
// Стереотип: "<>"
// Элемент модели: "Tm3IDListQueryExecutor" MUID: (6759537E0284)
// --------------------------------------------------------------------------

//#UC START# *6759537E0284BeforeDefines*
//#UC END# *6759537E0284BeforeDefines*
{$Include daDefine.inc}

interface

uses
 l3IntfUses
 , daIDListQueryParams
 , l3Ranges
 , m3AttrIndexInterfaces
 , daQueryInterfaces
 , m3QueryInterfaces
 , daEnumerableInterfaces
 , l3Interfaces
 , m4SearchResult
 , daQueryParams
 , l3LongintList
 , daTypes
 , evdDATypes
 , daAbstractQueryExecutor
;

type
 {$If not Defined(_ParamsType_Defined_) }
  {Tm3IDListQueryExecutor.}_ParamsType_ = TdaIDListQueryParams;
  {$Define _ParamsType_Defined_ }
  {$Define _ParamsType_IsClass_ }
  {$Define _ParamsType_IsAcceptableForScripts_ }
 {$IfEnd} // not Defined(_ParamsType_Defined_)
 {$Include Mm3QueryExecutor_imp.pas}
 Tm3IDListQueryExecutor = class(_Mm3QueryExecutor_)
  protected
   function FindByParams(const aParams: TdaIDListQueryParams;
    const aSearcher: Im3AttrIndexSearcher): Il3RangeEnumerable; override;
   procedure DoDropResult; override;
   function DoGetIsEmpty: Boolean; override;
  public
   {$If NOT Defined(l3NoSRT)}
   function SetRefTo(var thePlace: Tm3IDListQueryExecutor): Boolean; overload; {$If Defined(l3HasInl)}inline;{$IfEnd}
   {$IfEnd} // NOT Defined(l3NoSRT)
 end;//Tm3IDListQueryExecutor

implementation

uses
 l3ImplUses
 , m3QueryResultSetFromLongintList
 , daQueryExecutorFactory
 , m3AttrIndexSearcher
 , SysUtils
 , l3Enumerators
 , l3InterfacedIntegerList
 , k2Tags
 //#UC START# *6759537E0284impl_uses*
 //#UC END# *6759537E0284impl_uses*
;

{$Include Mm3QueryExecutor_imp.pas}

{$If NOT Defined(l3NoSRT)}
function Tm3IDListQueryExecutor.SetRefTo(var thePlace: Tm3IDListQueryExecutor): Boolean;
begin
 if (thePlace = Self) then
  Result := false
 else
 begin
  Result := true;
  thePlace.Free;
  thePlace := Self.Use;
 end;//thePlace = Self
end;//Tm3IDListQueryExecutor.SetRefTo
{$IfEnd} // NOT Defined(l3NoSRT)

function Tm3IDListQueryExecutor.FindByParams(const aParams: TdaIDListQueryParams;
 const aSearcher: Im3AttrIndexSearcher): Il3RangeEnumerable;
//#UC START# *670660CF0357_6759537E0284_var*
{$IfDef l3Use_Tl3RangeEnumerableIntersect}
var
 l_All : Il3RangeEnumerable;
{$EndIf l3Use_Tl3RangeEnumerableIntersect}
//#UC END# *670660CF0357_6759537E0284_var*
begin
//#UC START# *670660CF0357_6759537E0284_impl*
 Result := Il3RangeEnumerable_FromIntegerEnumerable(aParams.IDList.AsEnumerable);
 {$IfDef l3Use_Tl3RangeEnumerableIntersect}
 l_All := aSearcher.AllDocuments;
 Result := Il3RangeEnumerable_Intersect(Result, l_All);
 // - minus not existent
 {$EndIf l3Use_Tl3RangeEnumerableIntersect}
//#UC END# *670660CF0357_6759537E0284_impl*
end;//Tm3IDListQueryExecutor.FindByParams

procedure Tm3IDListQueryExecutor.DoDropResult;
//#UC START# *5F148B0D0239_6759537E0284_var*
//#UC END# *5F148B0D0239_6759537E0284_var*
begin
//#UC START# *5F148B0D0239_6759537E0284_impl*
 f_Found := nil;
 f_ResultSet := nil;
 f_FilteredFoundIDList := nil;
 f_List := nil;
 inherited;
//#UC END# *5F148B0D0239_6759537E0284_impl*
end;//Tm3IDListQueryExecutor.DoDropResult

function Tm3IDListQueryExecutor.DoGetIsEmpty: Boolean;
//#UC START# *675953F10122_6759537E0284_var*
//#UC END# *675953F10122_6759537E0284_var*
begin
//#UC START# *675953F10122_6759537E0284_impl*
 Result := Self.Params.IDList.Empty;
//#UC END# *675953F10122_6759537E0284_impl*
end;//Tm3IDListQueryExecutor.DoGetIsEmpty


//#UC START# *6759537E0284forDiagramm*
(*
*)
//#UC END# *6759537E0284forDiagramm*

end.

Golden Master ;)

Golden Master ;) Вот как оказывается называется моё "тестирование с эталонами".

m3DateNumQueryExecutor

{$IfDef FPC}{$CodePage cp1251}{$EndIf FPC}

unit m3DateNumQueryExecutor;

// --------------------------------------------------------------------------
// Родители: "Queries" <> MUID: (66FB115B029F) :: "m3" <> MUID: (66FB10950007) :: "Shared Delphi For Archi" <> MUID: (4ABA2360025A)
// --------------------------------------------------------------------------
// Модуль: "w:\common\components\rtl\Garant\m3\m3DateNumQueryExecutor.pas" GeneratorVersion: 1.0.0.883901
// Стереотип: "<>"
// Элемент модели: "Tm3DateNumQueryExecutor" MUID: (672C8F6000BE)
// --------------------------------------------------------------------------

//#UC START# *672C8F6000BEBeforeDefines*
//#UC END# *672C8F6000BEBeforeDefines*
{$Include daDefine.inc}

interface

uses
 l3IntfUses
 , daDateNumQueryParams
 , l3Ranges
 , m3AttrIndexInterfaces
 , daQueryInterfaces
 , m3QueryInterfaces
 , daEnumerableInterfaces
 , l3Interfaces
 , m4SearchResult
 , daQueryParams
 , l3LongintList
 , daTypes
 , evdDATypes
 , daAbstractQueryExecutor
;

type
 {$If not Defined(_ParamsType_Defined_) }
  {Tm3DateNumQueryExecutor.}_ParamsType_ = TdaDateNumQueryParams;
  {$Define _ParamsType_Defined_ }
  {$Define _ParamsType_IsClass_ }
  {$Define _ParamsType_IsAcceptableForScripts_ }
 {$IfEnd} // not Defined(_ParamsType_Defined_)
 {$Include Mm3QueryExecutor_imp.pas}
 Tm3DateNumQueryExecutor = class(_Mm3QueryExecutor_)
  protected
   function FindByParams(const aParams: TdaDateNumQueryParams;
    const aSearcher: Im3AttrIndexSearcher): Il3RangeEnumerable; override;
  public
   {$If NOT Defined(l3NoSRT)}
   function SetRefTo(var thePlace: Tm3DateNumQueryExecutor): Boolean; overload; {$If Defined(l3HasInl)}inline;{$IfEnd}
   {$IfEnd} // NOT Defined(l3NoSRT)
 end;//Tm3DateNumQueryExecutor

implementation

uses
 l3ImplUses
 , l3Date
 , m3QueryResultSetFromLongintList
 , daQueryExecutorFactory
 , m3AttrIndexSearcher
 , SysUtils
 , l3Enumerators
 , l3InterfacedIntegerList
 , k2Tags
 //#UC START# *672C8F6000BEimpl_uses*
 //, l3Date
 //, k2Tags
 //#UC END# *672C8F6000BEimpl_uses*
;

{$Include Mm3QueryExecutor_imp.pas}

{$If NOT Defined(l3NoSRT)}
function Tm3DateNumQueryExecutor.SetRefTo(var thePlace: Tm3DateNumQueryExecutor): Boolean;
begin
 if (thePlace = Self) then
  Result := false
 else
 begin
  Result := true;
  thePlace.Free;
  thePlace := Self.Use;
 end;//thePlace = Self
end;//Tm3DateNumQueryExecutor.SetRefTo
{$IfEnd} // NOT Defined(l3NoSRT)

function Tm3DateNumQueryExecutor.FindByParams(const aParams: TdaDateNumQueryParams;
 const aSearcher: Im3AttrIndexSearcher): Il3RangeEnumerable;
//#UC START# *670660CF0357_672C8F6000BE_var*
var
 l_DateResult : Il3RangeEnumerable;
 l_MaskResult : Il3RangeEnumerable;
 l_NumberTypeResult : Il3RangeEnumerable;
 l_dnAddNumResult : Il3RangeEnumerable;
 l_HasDate : Boolean;
 l_HasNumber : Boolean;
 l_HasNumberType : Boolean;
 l_FromDate: TStDate;
 l_ToDate: TStDate;
//#UC END# *670660CF0357_672C8F6000BE_var*
begin
//#UC START# *670660CF0357_672C8F6000BE_impl*
 Result := nil;
 l_DateResult := nil;
 l_MaskResult := nil;
 l_NumberTypeResult := nil;
 l_HasDate := false;
 l_HasNumber := false;
 l_HasNumberType := false;

 l_FromDate := aParams.FromDate;
 l_ToDate := aParams.ToDate;
 if (l_FromDate <> 0) or (l_ToDate <> 0) then
 begin
  l_HasDate := true;
  //lSabDate := MakeSab(GlobalDataProvider.DictServer(CurrentFamily).Dict[da_dlDateNums].HackGroupTbl as TParamGroupTbl);
  if (l_ToDate <> 0) then
  begin
   if aParams.FromDate = 0 then // не ищем записи с пустой датой
   begin
    aParams.FromDate := 1;
    l_FromDate := 1;
   end;//aParams.FromDate = 0
   l_DateResult := aSearcher.SearchByDates(l_FromDate, l_ToDate);
   //lSabDate.Select(dnDateFld, l_FromDate, l_ToDate);
  end//l_ToDate <> 0
  else
   l_DateResult := aSearcher.SearchByDates(l_FromDate, High(TStDate));
  //if (fFromDate <> 0) then // это следует из предыдущих if
   //lSabDate.Select(dnDateFld, l_FromDate, GREAT_EQUAL)
   ;
 end;//(l_FromDate <> 0) or (l_ToDate <> 0)

 if (aParams.NumberMask <> '') then
 begin
  l_HasNumber := true;
  l_MaskResult := aSearcher.SearchByNumber(aParams.NumberMask);
  Result := l_MaskResult;
  // - пока так
 end;//aParams.NumberMask <> ''

 if (aParams.DNType <> dnDoc) then
 begin
  l_HasNumberType := true;
  l_NumberTypeResult := aSearcher.SearchByNumberType(aParams.DNType);
  if (aParams.DNType = dnPublish) then
  begin
   l_dnAddNumResult := aSearcher.SearchByNumberType(dnAddNum);
   // - при поиске по dnPublish, dnAddNum тоже годится
   l_NumberTypeResult := Il3RangeEnumerable_JoinWithOther(l_NumberTypeResult, l_dnAddNumResult);
  end//aParams.DNType = dnPublish
  else
  begin
   // - пока оставим эту ветку
  end;//aParams.DNType = dnPublish
 end;//aParams.DNType <> dnDoc

 if l_HasDate
    AND l_HasNumber
    AND l_HasNumberType then
 begin
  Result := Il3RangeEnumerable_Intersect(l_DateResult, l_MaskResult);
  Result := Il3RangeEnumerable_Intersect(Result, l_NumberTypeResult);
 end//l_HasDate
 else
 if l_HasDate
    AND l_HasNumber then
  Result := Il3RangeEnumerable_Intersect(l_DateResult, l_MaskResult)
 else
 if l_HasDate
    AND l_HasNumberType then
  Result := Il3RangeEnumerable_Intersect(l_DateResult, l_NumberTypeResult)
 else
 if l_HasNumber
    AND l_HasNumberType then
  Result := Il3RangeEnumerable_Intersect(l_MaskResult, l_NumberTypeResult)
 else
 if l_HasNumber then
  Result := l_MaskResult
 else
 if l_HasNumberType then
  Result := l_NumberTypeResult
 else
 if l_HasDate then
  Result := l_DateResult
 else
  Assert(false);

 if (Result <> nil) then
  Result := Il3RangeEnumerable_Diff(Result, aSearcher.AllRelated);
  // - тут вычитаем справки
//#UC END# *670660CF0357_672C8F6000BE_impl*
end;//Tm3DateNumQueryExecutor.FindByParams


//#UC START# *672C8F6000BEforDiagramm*
(*
*)
//#UC END# *672C8F6000BEforDiagramm*

end.

m3LogByActionQueryExecutor

{$IfDef FPC}{$CodePage cp1251}{$EndIf FPC}

unit m3LogByActionQueryExecutor;

// --------------------------------------------------------------------------
// Родители: "Queries" <> MUID: (66FB115B029F) :: "m3" <> MUID: (66FB10950007) :: "Shared Delphi For Archi" <> MUID: (4ABA2360025A)
// --------------------------------------------------------------------------
// Модуль: "w:\common\components\rtl\Garant\m3\m3LogByActionQueryExecutor.pas" GeneratorVersion: 1.0.0.883901
// Стереотип: "<>"
// Элемент модели: "Tm3LogByActionQueryExecutor" MUID: (6745BF7A0131)
// --------------------------------------------------------------------------

//#UC START# *6745BF7A0131BeforeDefines*
//#UC END# *6745BF7A0131BeforeDefines*
{$Include daDefine.inc}

interface

uses
 l3IntfUses
 , daLogByActionQueryParams
 , l3Ranges
 , m3AttrIndexInterfaces
 , daQueryInterfaces
 , m3QueryInterfaces
 , daEnumerableInterfaces
 , l3Interfaces
 , m4SearchResult
 , daQueryParams
 , l3LongintList
 , daTypes
 , evdDATypes
 , daAbstractQueryExecutor
;

type
 {$If not Defined(_ParamsType_Defined_) }
  {Tm3LogByActionQueryExecutor.}_ParamsType_ = TdaLogByActionQueryParams;
  {$Define _ParamsType_Defined_ }
  {$Define _ParamsType_IsClass_ }
  {$Define _ParamsType_IsAcceptableForScripts_ }
 {$IfEnd} // not Defined(_ParamsType_Defined_)
 {$Include Mm3QueryExecutor_imp.pas}
 Tm3LogByActionQueryExecutor = class(_Mm3QueryExecutor_)
  protected
   function FindByParams(const aParams: TdaLogByActionQueryParams;
    const aSearcher: Im3AttrIndexSearcher): Il3RangeEnumerable; override;
  public
   {$If NOT Defined(l3NoSRT)}
   function SetRefTo(var thePlace: Tm3LogByActionQueryExecutor): Boolean; overload; {$If Defined(l3HasInl)}inline;{$IfEnd}
   {$IfEnd} // NOT Defined(l3NoSRT)
 end;//Tm3LogByActionQueryExecutor

implementation

uses
 l3ImplUses
 , l3Date
 , m3QueryResultSetFromLongintList
 , daQueryExecutorFactory
 , m3AttrIndexSearcher
 , SysUtils
 , l3Enumerators
 , l3InterfacedIntegerList
 , k2Tags
 //#UC START# *6745BF7A0131impl_uses*
 , DT_CONST
 , daDataProvider
 //#UC END# *6745BF7A0131impl_uses*
;

{$Include Mm3QueryExecutor_imp.pas}

{$If NOT Defined(l3NoSRT)}
function Tm3LogByActionQueryExecutor.SetRefTo(var thePlace: Tm3LogByActionQueryExecutor): Boolean;
begin
 if (thePlace = Self) then
  Result := false
 else
 begin
  Result := true;
  thePlace.Free;
  thePlace := Self.Use;
 end;//thePlace = Self
end;//Tm3LogByActionQueryExecutor.SetRefTo
{$IfEnd} // NOT Defined(l3NoSRT)

function Tm3LogByActionQueryExecutor.FindByParams(const aParams: TdaLogByActionQueryParams;
 const aSearcher: Im3AttrIndexSearcher): Il3RangeEnumerable;
//#UC START# *670660CF0357_6745BF7A0131_var*
var
 l_FromDate : TStDate;
 l_ToDate : TStDate;
 l_HasDate : Boolean;
 l_HasUser : Boolean;
 l_DateResult : Il3RangeEnumerable;
 l_UserResult : Il3RangeEnumerable;
 l_OneUserResult : Il3RangeEnumerable;
 l_ActionResult : Il3RangeEnumerable;
 //l_UserSab : ISab;
 l_UserID: TdaUserID;
 //l_LogRecType: TdaLogActionFlags;
 l_JournalType : Integer;
 l_UsersList: Tl3LongintList;
 l_IDX: Integer;
var
 l_Action: TdaLogActionType;
//#UC END# *670660CF0357_6745BF7A0131_var*
begin
//#UC START# *670660CF0357_6745BF7A0131_impl*
 Result := nil;

 //f_Sab := MakeSab(LinkServer(CurrentFamily)[atOrdLogRecords]);

 l_FromDate := aParams.FromDate;
 l_ToDate   := aParams.ToDate;
 l_HasUser := false;
 l_HasDate := false;
 l_DateResult := nil;
 l_UserResult := nil;

 l_Action := aParams.Action;
 if (l_Action in cOrdLogActions) then
  l_JournalType := k2_tiSysLogRecords
 else
  l_JournalType := k2_tiLogRecords;

 if (l_FromDate <> 0) or (l_ToDate <> 0) then
 begin
  l_HasDate := true;
  if (l_FromDate = l_ToDate) then
   l_DateResult := aSearcher.SearchBetweenKeys([l_JournalType, k2_tiStart], l_FromDate, l_ToDate, false)
   ///f_Sab.Select(lgDate_Key, l_FromDate)
  else
  begin
   if l_FromDate = 0 then
    l_FromDate := 1;
   if l_ToDate = 0 then
    l_ToDate := MaxDate;

   l_DateResult := aSearcher.SearchBetweenKeys([l_JournalType, k2_tiStart], l_FromDate, l_ToDate, false);
   //f_Sab.Select(lgDate_Key, l_FromDate, l_ToDate);
  end;//l_FromDate = l_ToDate
 end//(l_FromDate <> 0) or (l_ToDate <> 0)
 else
  //f_Sab.SelectAll
  ;

 if (aParams.UserID <> 0) then
 begin
  if aParams.IsUserGroup then
  begin
   l_UsersList := Tl3LongintList.Create;
   try
    l_UserResult := nil;
    GlobalDataProvider.UserManager.GetUserListOnGroup(aParams.UserID, l_UsersList);
    for l_IDX := 0 to l_UsersList.Count - 1 do
    begin
     l_UserID := l_UsersList[l_IDX];
     l_HasUser := true;
     l_OneUserResult := aSearcher.SearchByKeyEx([l_JournalType, k2_tiUser], l_UserID, false);
     if l_UserResult = nil then
      l_UserResult := l_OneUserResult
     else
      l_UserResult := Il3RangeEnumerable_JoinWithOther(l_UserResult, l_OneUserResult);
    end;
   finally
    FreeAndNil(l_UsersList);
   end;
(*   l_UserSab := xxxUserManager.xxxGetGroupMembers(aParams.UserID);
   try
    l_UserSab.TransferToPhoto(lgAuthor_Key, f_Sab);
    l_UserSab.RecordsByKey;
    f_Sab.AndSab(l_UserSab);
   finally
    l_UserSab := nil;
   end;*)
  end//aParams.IsUserGroup
  else
  begin
   l_UserID := aParams.UserID;
   l_HasUser := true;
   l_UserResult := aSearcher.SearchByKeyEx([l_JournalType, k2_tiUser], l_UserID, false);
(*   f_Sab.SubSelect(lgAuthor_Key, l_UserID);*)
  end;//aParams.IsUserGroup
 end;//aParams.UserID <> 0

(* if (aParams.LogRecType <> acfNone) then
 begin
  l_LogRecType := aParams.LogRecType;
  f_Sab.SubSelect(lgActionFlag_Key, l_LogRecType);
 end;//aParams.LogRecType <> acfNone*)
 // - это как мы выяснили - нам нахер не нужно

 //l_Action := aParams.Action;
(* f_Sab.SubSelect(lgAction_key,l_Action);
 f_Sab.ValuesOfKey(lgDocID_Key);
 f_Sab.TransferToPhoto(fID_Fld, Get_MainTblPhoto);
 f_Sab.RecordsByKey;*)

 l_ActionResult := aSearcher.SearchByKeyEx([l_JournalType, k2_tiType], Ord(l_Action), false);

 if l_HasUser
    AND l_HasDate then
 begin
  Result := Il3RangeEnumerable_Intersect(l_ActionResult, l_UserResult);
  Result := Il3RangeEnumerable_Intersect(Result, l_DateResult);
 end//l_HasUser .. l_HasDate
 else
 if l_HasUser then
  Result := Il3RangeEnumerable_Intersect(l_ActionResult, l_UserResult)
 else
 if l_HasDate then
  Result := Il3RangeEnumerable_Intersect(l_ActionResult, l_DateResult)
 else
  Result := l_ActionResult;

 if (Result <> nil) then
  Result := Il3RangeEnumerable_Diff(Result, aSearcher.AllRelated);
  // - тут вычитаем справки
//#UC END# *670660CF0357_6745BF7A0131_impl*
end;//Tm3LogByActionQueryExecutor.FindByParams


//#UC START# *6745BF7A0131forDiagramm*
(*
*)
//#UC END# *6745BF7A0131forDiagramm*

end.

m3AndQueryExecutor

{$IfDef FPC}{$CodePage cp1251}{$EndIf FPC}

unit m3AndQueryExecutor;

// --------------------------------------------------------------------------
// Родители: "Queries" <> MUID: (66FB115B029F) :: "m3" <> MUID: (66FB10950007) :: "Shared Delphi For Archi" <> MUID: (4ABA2360025A)
// --------------------------------------------------------------------------
// Модуль: "w:\common\components\rtl\Garant\m3\m3AndQueryExecutor.pas" GeneratorVersion: 1.0.0.883901
// Стереотип: "<>"
// Элемент модели: "Tm3AndQueryExecutor" MUID: (670641300230)
// --------------------------------------------------------------------------

//#UC START# *670641300230BeforeDefines*
//#UC END# *670641300230BeforeDefines*
{$Include daDefine.inc}

interface

uses
 l3IntfUses
 , daAndQueryParams
 , m3QueryInterfaces
 , daQueryParams
 , l3Ranges
 , m4SearchResult
 , m3AttrIndexInterfaces
 , daQueryInterfaces
 , daEnumerableInterfaces
 , l3Interfaces
 , l3LongintList
 , daTypes
 , evdDATypes
 , daAbstractQueryExecutor
;

type
 {$If not Defined(_ParamsType_Defined_) }
  {Tm3AndQueryExecutor.}_ParamsType_ = TdaAndQueryParams;
  {$Define _ParamsType_Defined_ }
  {$Define _ParamsType_IsClass_ }
  {$Define _ParamsType_IsAcceptableForScripts_ }
 {$IfEnd} // not Defined(_ParamsType_Defined_)
 {$Include Mm3QueryExecutor_imp.pas}
 Tm3AndQueryExecutor = class(_Mm3QueryExecutor_)
  private
   f_TextExecutor: Im3QueryExecutor;
  protected
   function FindByParams(const aParams: TdaAndQueryParams;
    const aSearcher: Im3AttrIndexSearcher): Il3RangeEnumerable; override;
   procedure DoDropResult; override;
   function DoGetAddressList: Tm4SearchResult; override;
   procedure ClearFields; override;
  public
   {$If NOT Defined(l3NoSRT)}
   function SetRefTo(var thePlace: Tm3AndQueryExecutor): Boolean; overload; {$If Defined(l3HasInl)}inline;{$IfEnd}
   {$IfEnd} // NOT Defined(l3NoSRT)
   class function ParamClass: TdaQueryParamsClass; override;
 end;//Tm3AndQueryExecutor

implementation

uses
 l3ImplUses
 , daTextQueryParams
 , m3QueryResultSetFromLongintList
 , daQueryExecutorFactory
 , m3AttrIndexSearcher
 , SysUtils
 , l3Enumerators
 , l3InterfacedIntegerList
 , k2Tags
 //#UC START# *670641300230impl_uses*
 //#UC END# *670641300230impl_uses*
;

{$Include Mm3QueryExecutor_imp.pas}

{$If NOT Defined(l3NoSRT)}
function Tm3AndQueryExecutor.SetRefTo(var thePlace: Tm3AndQueryExecutor): Boolean;
begin
 if (thePlace = Self) then
  Result := false
 else
 begin
  Result := true;
  thePlace.Free;
  thePlace := Self.Use;
 end;//thePlace = Self
end;//Tm3AndQueryExecutor.SetRefTo
{$IfEnd} // NOT Defined(l3NoSRT)

function Tm3AndQueryExecutor.FindByParams(const aParams: TdaAndQueryParams;
 const aSearcher: Im3AttrIndexSearcher): Il3RangeEnumerable;
//#UC START# *670660CF0357_670641300230_var*
(*var
 I : Integer;
 l_Executor: IdtQueryExecutor;*)
var
 l_Executor : Im3QueryExecutor;
 l_Found : Il3RangeEnumerable;
 l_Index : Integer;
//#UC END# *670660CF0357_670641300230_var*
begin
//#UC START# *670660CF0357_670641300230_impl*
 Result := nil;
 f_TextExecutor := nil;
 if (aParams.QueryList.Count = 0) then
  Result := aSearcher.AllDocuments
  //f_Sab := MakeEmptySab(Get_MainTblPhoto)
 else
 begin
  l_Executor := Self.MakeIntExecutor(aParams.QueryList.Items[0].Query);

  if aParams.QueryList.Items[0].Query is TdaTextQueryParams then
   f_TextExecutor := l_Executor;

  Result := l_Executor.Find;
  if (aParams.QueryList.Count = 1) then
  begin
   Exit;
  end;//aParams.QueryList.Count = 1

  for l_Index := 1 to Pred(aParams.QueryList.Count) do
  begin
   l_Executor := Self.MakeIntExecutor(aParams.QueryList.Items[l_Index].Query);
   if (f_TextExecutor = nil) and (aParams.QueryList.Items[l_Index].Query is TdaTextQueryParams) then
    f_TextExecutor := l_Executor;
   l_Found := l_Executor.Find;
   if (l_Found = nil)
      OR l_Found.Empty then
   begin
    //Assert(false);
    // - пересечение с пустым множеством это что?
    Result := nil;
    break;
    // пересечение это общие элементы обоих множеств = пусто
   end//l_Found = nil
   else
   begin
    Result := Il3RangeEnumerable_Intersect(Result, l_Found);
    if (Result = nil)
       OR Result.Empty then
     break;
     // - нет смысла дальше искать
   end;//l_Found = nil
  end;//for l_Index

(*  l_Executor := TdtQueryExecutorFactory.Instance.MakeIntExecutor(aParams.QueryList.Items[0].Query);
  if aParams.QueryList.Items[0].Query is TdaTextQueryParams then
   f_TextExecutor := l_Executor;
  l_Executor.MainTblPhoto := Get_MainTblPhoto;
  f_Sab := MakeSabCopy(l_Executor.FoundListSab);
  l_Executor.DropResult;
  for I := 1 to Pred(aParams.QueryList.Count) do
  begin
   if not f_Sab.IsEmpty then // если у нас пустой результат,
   begin
    l_Executor := TdtQueryExecutorFactory.Instance.MakeIntExecutor(aParams.QueryList.Items[I].Query);
    if (f_TextExecutor = nil) and (aParams.QueryList.Items[I].Query is TdaTextQueryParams) then
     f_TextExecutor := l_Executor;
    l_Executor.MainTblPhoto := Get_MainTblPhoto;
    f_Sab.AndSab(l_Executor.FoundListSab);
    l_Executor.DropResult;
   end
   else
    if (f_TextExecutor = nil) and (aParams.QueryList.Items[I].Query is TdaTextQueryParams) then
     f_TextExecutor := TdtQueryExecutorFactory.Instance.MakeIntExecutor(aParams.QueryList.Items[I].Query);
  end;*)
  //Assert(false);
 end;//aParams.QueryList.Count = 0
//#UC END# *670660CF0357_670641300230_impl*
end;//Tm3AndQueryExecutor.FindByParams

class function Tm3AndQueryExecutor.ParamClass: TdaQueryParamsClass;
//#UC START# *5EEB473B012C_670641300230_var*
//#UC END# *5EEB473B012C_670641300230_var*
begin
//#UC START# *5EEB473B012C_670641300230_impl*
 Result := inherited ParamClass;
//#UC END# *5EEB473B012C_670641300230_impl*
end;//Tm3AndQueryExecutor.ParamClass

procedure Tm3AndQueryExecutor.DoDropResult;
//#UC START# *5F148B0D0239_670641300230_var*
//#UC END# *5F148B0D0239_670641300230_var*
begin
//#UC START# *5F148B0D0239_670641300230_impl*
 inherited;
 f_TextExecutor := nil;
//#UC END# *5F148B0D0239_670641300230_impl*
end;//Tm3AndQueryExecutor.DoDropResult

function Tm3AndQueryExecutor.DoGetAddressList: Tm4SearchResult;
//#UC START# *670F8AF6026D_670641300230_var*
//#UC END# *670F8AF6026D_670641300230_var*
begin
//#UC START# *670F8AF6026D_670641300230_impl*
 if (f_TextExecutor = nil) then
  Result := nil
 else
  Result := f_TextExecutor.AddressList;
//#UC END# *670F8AF6026D_670641300230_impl*
end;//Tm3AndQueryExecutor.DoGetAddressList

procedure Tm3AndQueryExecutor.ClearFields;
begin
 f_TextExecutor := nil;
 inherited;
end;//Tm3AndQueryExecutor.ClearFields


//#UC START# *670641300230forDiagramm*
(*
*)
//#UC END# *670641300230forDiagramm*

end.

m3OrQueryExecutor

{$IfDef FPC}{$CodePage cp1251}{$EndIf FPC}

unit m3OrQueryExecutor;

// --------------------------------------------------------------------------
// Родители: "Queries" <> MUID: (66FB115B029F) :: "m3" <> MUID: (66FB10950007) :: "Shared Delphi For Archi" <> MUID: (4ABA2360025A)
// --------------------------------------------------------------------------
// Модуль: "w:\common\components\rtl\Garant\m3\m3OrQueryExecutor.pas" GeneratorVersion: 1.0.0.883901
// Стереотип: "<>"
// Элемент модели: "Tm3OrQueryExecutor" MUID: (67A4A81D029F)
// --------------------------------------------------------------------------

//#UC START# *67A4A81D029FBeforeDefines*
//#UC END# *67A4A81D029FBeforeDefines*
{$Include daDefine.inc}

interface

uses
 l3IntfUses
 , daOrQueryParams
 , l3Ranges
 , m3AttrIndexInterfaces
 , daQueryInterfaces
 , m3QueryInterfaces
 , daEnumerableInterfaces
 , l3Interfaces
 , m4SearchResult
 , daQueryParams
 , l3LongintList
 , daTypes
 , evdDATypes
 , daAbstractQueryExecutor
;

type
 {$If not Defined(_ParamsType_Defined_) }
  {Tm3OrQueryExecutor.}_ParamsType_ = TdaOrQueryParams;
  {$Define _ParamsType_Defined_ }
  {$Define _ParamsType_IsClass_ }
  {$Define _ParamsType_IsAcceptableForScripts_ }
 {$IfEnd} // not Defined(_ParamsType_Defined_)
 {$Include Mm3QueryExecutor_imp.pas}
 Tm3OrQueryExecutor = class(_Mm3QueryExecutor_)
  protected
   function FindByParams(const aParams: TdaOrQueryParams;
    const aSearcher: Im3AttrIndexSearcher): Il3RangeEnumerable; override;
  public
   {$If NOT Defined(l3NoSRT)}
   function SetRefTo(var thePlace: Tm3OrQueryExecutor): Boolean; overload; {$If Defined(l3HasInl)}inline;{$IfEnd}
   {$IfEnd} // NOT Defined(l3NoSRT)
 end;//Tm3OrQueryExecutor

implementation

uses
 l3ImplUses
 , m3QueryResultSetFromLongintList
 , daQueryExecutorFactory
 , m3AttrIndexSearcher
 , SysUtils
 , l3Enumerators
 , l3InterfacedIntegerList
 , k2Tags
 //#UC START# *67A4A81D029Fimpl_uses*
 //#UC END# *67A4A81D029Fimpl_uses*
;

{$Include Mm3QueryExecutor_imp.pas}

{$If NOT Defined(l3NoSRT)}
function Tm3OrQueryExecutor.SetRefTo(var thePlace: Tm3OrQueryExecutor): Boolean;
begin
 if (thePlace = Self) then
  Result := false
 else
 begin
  Result := true;
  thePlace.Free;
  thePlace := Self.Use;
 end;//thePlace = Self
end;//Tm3OrQueryExecutor.SetRefTo
{$IfEnd} // NOT Defined(l3NoSRT)

function Tm3OrQueryExecutor.FindByParams(const aParams: TdaOrQueryParams;
 const aSearcher: Im3AttrIndexSearcher): Il3RangeEnumerable;
//#UC START# *670660CF0357_67A4A81D029F_var*
var
 l_Executor : Im3QueryExecutor;
 l_Found : Il3RangeEnumerable;
 l_Index : Integer;
//#UC END# *670660CF0357_67A4A81D029F_var*
begin
//#UC START# *670660CF0357_67A4A81D029F_impl*
 Result := nil;
 for l_Index := 0 to Pred(aParams.QueryList.Count) do
 begin
  l_Executor := Self.MakeIntExecutor(aParams.QueryList.Items[l_Index].Query);
//  if (f_TextExecutor = nil) and (aParams.QueryList.Items[l_Index].Query is TdaTextQueryParams) then
//   f_TextExecutor := l_Executor;
  l_Found := l_Executor.Find;
  Result := Il3RangeEnumerable_JoinWithOther(Result, l_Found);
 end;//for l_Index
//#UC END# *670660CF0357_67A4A81D029F_impl*
end;//Tm3OrQueryExecutor.FindByParams


//#UC START# *67A4A81D029FforDiagramm*
(*
*)
//#UC END# *67A4A81D029FforDiagramm*

end.