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

m3TextQueryExecutor

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

unit m3TextQueryExecutor;

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

//#UC START# *670F87D90387BeforeDefines*
//#UC END# *670F87D90387BeforeDefines*
{$Include daDefine.inc}

interface

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

type
 {$If not Defined(_ParamsType_Defined_) }
  {Tm3TextQueryExecutor.}_ParamsType_ = TdaTextQueryParams;
  {$Define _ParamsType_Defined_ }
  {$Define _ParamsType_IsClass_ }
  {$Define _ParamsType_IsAcceptableForScripts_ }
 {$IfEnd} // not Defined(_ParamsType_Defined_)
 {$Include Mm3QueryExecutor_imp.pas}
 Tm3TextQueryExecutor = class(_Mm3QueryExecutor_)
  private
   f_Addresses: Tm4SearchResult;
  protected
   function FindByParams(const aParams: TdaTextQueryParams;
    const aSearcher: Im3AttrIndexSearcher): Il3RangeEnumerable; override;
   procedure Cleanup; override;
    {* Функция очистки полей объекта. }
   function DoGetAddressList: Tm4SearchResult; override;
  public
   {$If NOT Defined(l3NoSRT)}
   function SetRefTo(var thePlace: Tm3TextQueryExecutor): Boolean; overload; {$If Defined(l3HasInl)}inline;{$IfEnd}
   {$IfEnd} // NOT Defined(l3NoSRT)
 end;//Tm3TextQueryExecutor

implementation

uses
 l3ImplUses
 , m4SearchExEx
 , m3QueryResultSetFromLongintList
 , daQueryExecutorFactory
 , m3AttrIndexSearcher
 , SysUtils
 , l3Enumerators
 , l3InterfacedIntegerList
 , k2Tags
 //#UC START# *670F87D90387impl_uses*
 , l3CoreInterfaces
 , l3String
 , m3SearcherInterfaces
 , m3DBHelper
 , m4SearchEx
 //#UC END# *670F87D90387impl_uses*
;

{$Include Mm3QueryExecutor_imp.pas}

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

function Tm3TextQueryExecutor.FindByParams(const aParams: TdaTextQueryParams;
 const aSearcher: Im3AttrIndexSearcher): Il3RangeEnumerable;
//#UC START# *670660CF0357_670F87D90387_var*
var
 l_Name : TFileName;
 l_Formula : AnsiString;
 l_IT : TdaIndexType;
 l_DBHelper : Im3DBHelper;
 l_IDList : Tl3LongintList;
 l_Res : Pm4SearchResult;
 {$IfDef l3Use_Tl3RangeEnumerableIntersect}
 l_All : Il3RangeEnumerable;
 {$EndIf l3Use_Tl3RangeEnumerableIntersect}
//#UC END# *670660CF0357_670F87D90387_var*
begin
//#UC START# *670660CF0357_670F87D90387_impl*
 Result := nil;
 FreeAndNil(f_Addresses);
 l_IT := Params.IndexType;
 l_Name := Self.f_BaseName;
 l_Res := @f_Addresses;
 Case l_IT of
  da_itHeading:
  begin
   l_Name := l_Name + '#Name_(s)#.idx';
   //l_Res := nil;
   // - детализацию адресов нам не надо
  end;//da_itHeading
  da_itText:
  begin
   l_DBHelper := Tm3DBHelper.Make(l_Name);
   //l_DBHelper := Tm3DBHelper.Make(GlobalHtServer.FamilyTbl.FamilyPath(aFamily)+'bserv'+IntToHex(aFamily,3));
   try
    l_Name := Il3CString_ToFileName(l_DBHelper.IndexName);
   finally
    l_DBHelper := nil;
   end;//try..finally
  end;//da_itText
  da_itDictEntry:
   Assert(false);
 end;//Case l_IT
 l_Formula := Params.TextFormula;
 l_IDList := m4SearchByFormula(l_Name, l3PCharLen(l_Formula), l_Res);
 try
  Result := Il3RangeEnumerable_FromIntegerEnumerable(l_IDList.AsEnumerable);
  {$IfDef l3Use_Tl3RangeEnumerableIntersect}
  l_All := aSearcher.AllDocuments;
  Result := Il3RangeEnumerable_Intersect(Result, l_All);
  // - пересекаем со списком "всех документов", чтобы отсечь "несуществующие"
  {$EndIf l3Use_Tl3RangeEnumerableIntersect}
  Result := Il3RangeEnumerable_Diff(Result, aSearcher.AllRelated);
(*  f_Sab := MakeValueSet(Get_MainTblPhoto.Table, fID_Fld, l_IDList);
  f_Sab.RecordsByKey;*)
 finally
  FreeAndNil(l_IDList);
 end;//try..finally
//#UC END# *670660CF0357_670F87D90387_impl*
end;//Tm3TextQueryExecutor.FindByParams

procedure Tm3TextQueryExecutor.Cleanup;
 {* Функция очистки полей объекта. }
//#UC START# *479731C50290_670F87D90387_var*
//#UC END# *479731C50290_670F87D90387_var*
begin
//#UC START# *479731C50290_670F87D90387_impl*
 FreeAndNil(f_Addresses);
 inherited;
//#UC END# *479731C50290_670F87D90387_impl*
end;//Tm3TextQueryExecutor.Cleanup

function Tm3TextQueryExecutor.DoGetAddressList: Tm4SearchResult;
//#UC START# *670F8AF6026D_670F87D90387_var*
//#UC END# *670F8AF6026D_670F87D90387_var*
begin
//#UC START# *670F8AF6026D_670F87D90387_impl*
 Self.GetList;
 Result := f_Addresses;
//#UC END# *670F8AF6026D_670F87D90387_impl*
end;//Tm3TextQueryExecutor.DoGetAddressList


//#UC START# *670F87D90387forDiagramm*
(*
*)
//#UC END# *670F87D90387forDiagramm*

end.

Комментариев нет:

Отправить комментарий