Browse Source

[linq] some fixes

Exilon 3 years ago
parent
commit
9ca32261bb

+ 10 - 0
Quick.Arrays.pas

@@ -53,6 +53,9 @@ type
       public
         constructor Create(var aArray: TArray<T>);
       end;
+  private type
+    arrayofT = array of T;
+    ParrayofT = ^arrayofT;
   private
     fArray : TArray<T>;
     function GetItem(Index : Integer) : T;
@@ -60,6 +63,7 @@ type
     function GetCapacity: Integer;
     function GetCount: Integer;
     procedure SetCapacity(const Value: Integer);
+    function GetPArray: ParrayofT;
   public
     function GetEnumerator: TEnumerator<T>;
     property AsArray : TArray<T> read fArray;
@@ -72,6 +76,7 @@ type
     procedure Remove(aItem : T);
     function Contains(aItem : T) : Boolean;
     function IndexOf(aItem : T) : Integer;
+    property PArray : ParrayofT read GetPArray;
     class operator Implicit(const Value : TxArray<T>) : TArray<T>;
     class operator Implicit(const Value : TArray<T>) : TxArray<T>;
   end;
@@ -128,6 +133,11 @@ begin
   Result := fArray[Index];
 end;
 
+function TXArray<T>.GetPArray: ParrayofT;
+begin
+  Pointer(Result) := fArray;
+end;
+
 procedure TXArray<T>.SetCapacity(const Value: Integer);
 begin
   if Value = High(fArray) then Exit;

+ 6 - 2
Quick.Collections.pas

@@ -1,13 +1,13 @@
 { ***************************************************************************
 
-  Copyright (c) 2016-2021 Kike Pérez
+  Copyright (c) 2016-2022 Kike Pérez
 
   Unit        : Quick.Collections
   Description : Generic Collections
   Author      : Kike Pérez
   Version     : 1.2
   Created     : 07/03/2020
-  Modified    : 05/08/2021
+  Modified    : 27/01/2022
 
   This file is part of QuickLib: https://github.com/exilon/QuickLib
 
@@ -461,7 +461,11 @@ end;
 
 function TxList<T>.Where(const aMatchString: string; aUseRegEx: Boolean): ILinqArray<T>;
 begin
+  {$IFDEF DELPHIRX104_UP}
+  Result := TLinqArray<T>.Create(fList.PList^);
+  {$ELSE}
   Result := TLinqArray<T>.Create(fList.ToArray);
+  {$ENDIF}
   Result.Where(aMatchString, aUseRegEx);
 end;
 

+ 41 - 8
Quick.Linq.pas

@@ -7,7 +7,7 @@
   Author      : Kike Pérez
   Version     : 1.0
   Created     : 04/04/2019
-  Modified    : 19/01/2022
+  Modified    : 27/01/2022
 
   This file is part of QuickLib: https://github.com/exilon/QuickLib
 
@@ -145,12 +145,14 @@ type
   TLinqQuery<T : class> = class(TInterfacedObject,ILinqQuery<T>)
   private type
     arrayOfT = array of T;
+    TArrType = (atArray, atXArray, atList, atObjectList);
   private
     fWhereClause : TExpression;
     fOrderBy : TArray<string>;
     fOrderDirection : TOrderDirection;
-    //fPList : Pointer;
+    fPList : Pointer;
     fList : arrayOfT;
+    fArrType : TArrType;
     function FormatParams(const aWhereClause : string; aWhereParams : array of const) : string;
     procedure DoOrderBy(vArray : ArrayOfT);
     function Compare(const aPropertyName : string; L, R : T) : Integer;
@@ -205,30 +207,43 @@ end;
 constructor TLinqQuery<T>.Create(aArray: TArray<T>);
 begin
   Clear;
+  fPList := Pointer(aArray);
   fList := aArray;
+  fArrType := TArrType.atArray;
 end;
 
 {$IFNDEF FPC}
 constructor TLinqQuery<T>.Create(aObjectList: TObjectList<T>);
 begin
   Clear;
-  //Create(aObjectList.List);
-  //fPList := Pointer(aObjectList.List);
-  //fList := arrayOfT(fPList);
+  fPList := Pointer(aObjectList);
+  {$IFDEF DELPHIRX104_UP}
+  fList := aObjectList.PList^;
+  {$ELSE}
   fList := aObjectList.List;
+  {$ENDIF}
+  fArrType := TArrType.atObjectList;
 end;
 {$ENDIF}
 
 constructor TLinqQuery<T>.Create(aXArray: TxArray<T>);
 begin
   Clear;
-  fList := aXArray;
+  fPList := Pointer(aXArray);
+  fList := aXArray.PArray^;
+  fArrType := TArrType.atXArray;
 end;
 
 constructor TLinqQuery<T>.Create(aList: TList<T>);
 begin
   Clear;
+  fPList := Pointer(aList);
+  {$IFDEF DELPHIRX104_UP}
+  fList := aList.PList^;
+  {$ELSE}
   fList := aList.ToArray;
+  {$ENDIF}
+  fArrType := TArrType.atList;
 end;
 
 function TLinqQuery<T>.Compare(const aPropertyName: string; L, R: T): Integer;
@@ -285,8 +300,22 @@ begin
   begin
     if fWhereClause.Validate(fList[i]) then
     begin
-      TObject(fList[i]).Free;
-      //System.Delete(fList,i,1);
+      case fArrType of
+        TArrType.atArray, TArrType.atXArray :
+          begin
+            TObject(fList[i]).Free;
+            System.Delete(fList,i,1);
+            //fPList := Pointer(fList);
+          end;
+        TArrType.atList :
+          begin
+            TList<T>(fPList).Delete(i);
+          end;
+        TArrType.atObjectList :
+          begin
+            TObjectList<T>(fPList).Delete(i);
+          end;
+      end;
       Inc(Result);
     end;
   end;
@@ -588,7 +617,11 @@ end;
 
 constructor TLinqArray<T>.Create(aArray: TArray<T>);
 begin
+  {$IFDEF DELPHIRX104_UP}
+  Pointer(fArray) := aArray;
+  {$ELSE}
   fArray := aArray;
+  {$ENDIF}
 end;
 
 function TLinqArray<T>.Delete: Integer;

+ 15 - 2
samples/delphi/QuickCollections/InterfacedLists.dpr

@@ -55,6 +55,8 @@ begin
 
     //add values
     myarray := ['Joe','Mat','Lee'];
+    //remove if starts with J
+    myarray.Where('^J',True).Delete;
     //search for regex match
     cout('Search for regex match',ccYellow);
     for name in myarray.Where('e$',True).Select do
@@ -73,9 +75,9 @@ begin
 
     //search for regex match
     cout('Search for regex match',ccYellow);
-    for name in List.Where('e$',True).Select do
+    for name in List.Where('^Ma',True).Select do
     begin
-      cout('User %s ends with "e"',[name],etInfo);
+      cout('User %s starts with "Ma"',[name],etInfo);
     end;
 
     //add values to objectlist
@@ -102,6 +104,17 @@ begin
     user := ListObj.Where('Roles2 CONTAINS ?',['SuperAdmin']).SelectFirst;
     if user <> nil then cout('%s is %s',[user.Name,CommaText(user.Roles)],etInfo);
 
+    cout('List before remove Mat',ccYellow);
+    for user in ListObj do
+    begin
+      cout('User "%s"',[user.Name],etInfo);
+    end;
+    ListObj.Where('Name = ?',['Mat']).Delete;
+    cout('List after remove Mat',ccYellow);
+    for user in ListObj do
+    begin
+      cout('User "%s"',[user.Name],etInfo);
+    end;
 
     cout('Press ENTER to Exit',ccYellow);
     ConsoleWaitForEnterKey;

File diff suppressed because it is too large
+ 1 - 89
samples/delphi/QuickCollections/InterfacedLists.dproj


Some files were not shown because too many files changed in this diff