@@ -23,7 +23,7 @@ public inherited sharing class SOQL implements Queryable {
2323
2424 public static FilterGroup FilterGroup { // A group to nest more filters
2525 get {
26- return new FilterGroup (false );
26+ return new FilterGroup ();
2727 }
2828 }
2929
@@ -559,12 +559,12 @@ public inherited sharing class SOQL implements Queryable {
559559 }
560560 }
561561
562- public FilterGroup conditions {
562+ public MainFilterGroup conditions {
563563 get {
564564 if (clauses [4 ] == null ) {
565- clauses .set (4 , new FilterGroup ( true ));
565+ clauses .set (4 , new MainFilterGroup ( ));
566566 }
567- return (FilterGroup ) clauses [4 ];
567+ return (MainFilterGroup ) clauses [4 ];
568568 }
569569 }
570570
@@ -629,7 +629,7 @@ public inherited sharing class SOQL implements Queryable {
629629 soqlParts .add (clause .build ());
630630 }
631631
632- return String .join (new List < String >( soqlParts ) , ' ' ).trim ();
632+ return String .join (soqlParts , ' ' ).trim ();
633633 }
634634 }
635635
@@ -662,7 +662,7 @@ public inherited sharing class SOQL implements Queryable {
662662
663663 public void with (List <SObjectField > fields ) {
664664 for (SObjectField field : fields ) {
665- queryFields . add (field . getDescribe (). getName () );
665+ with (field );
666666 }
667667 }
668668
@@ -855,16 +855,10 @@ public inherited sharing class SOQL implements Queryable {
855855 Boolean isEmpty ();
856856 }
857857
858- public class FilterGroup implements FilterClause , QueryClause, SoqlFiltersGroup {
858+ public virtual class FilterGroup implements FilterClause , QueryClause, SoqlFiltersGroup {
859859 private List <FilterClause > queryConditions = new List <FilterClause >();
860- private String stringConditions ;
861- private String order = ' ' ;
860+ private String order ;
862861 private String connector = ' AND' ;
863- private Boolean isMain = false ;
864-
865- public FilterGroup (Boolean isMain ) {
866- this .isMain = isMain ;
867- }
868862
869863 public FilterGroup add (FilterClause condition ) {
870864 if (condition .isEmpty ()) {
@@ -874,13 +868,6 @@ public inherited sharing class SOQL implements Queryable {
874868 return this ;
875869 }
876870
877- public void evaluate (String conditions ) {
878- if (String .isEmpty (conditions )) {
879- return ;
880- }
881- stringConditions = String .escapeSingleQuotes (conditions );
882- }
883-
884871 public FilterGroup anyConditionMatching () {
885872 connector = ' OR' ;
886873 return this ;
@@ -895,68 +882,69 @@ public inherited sharing class SOQL implements Queryable {
895882 return queryConditions .isEmpty ();
896883 }
897884
898- public String build () {
899- if (String .isNotEmpty (stringConditions )) {
900- return ' WHERE ' + stringConditions ;
901- }
902-
903- if (String .isEmpty (order )) {
904- setDefaultOrder ();
905- }
906-
907- String conditions = buildNested ();
908-
909- if (String .isEmpty (conditions )) {
910- return ' ' ;
911- }
885+ public virtual String build () {
886+ return ' (' + buildNested () + ' )' ;
887+ }
912888
913- if (isMain ) {
914- return ' WHERE ' + conditions ;
889+ private void setDefaultOrderWhenEmpty () {
890+ if (String .isNotEmpty (order )) {
891+ return ;
915892 }
916893
917- return conditions ;
918- }
919-
920- private void setDefaultOrder () {
921894 List <String > defaultOrder = new List <String >();
922895
923- for (Integer i = 0 ; i < queryConditions .size (); i ++ ) {
924- defaultOrder .add (String .valueOf (i + 1 ));
896+ for (Integer i = 1 ; i <= queryConditions .size (); i ++ ) {
897+ defaultOrder .add (String .valueOf (i ));
925898 }
926899
927900 order = String .join (defaultOrder , ' ' + connector + ' ' ); // e.g (1 AND 2 AND 3)
928901 }
929902
930903 public String buildNested () {
931- String conditions = addSpecialCharactersToOrder (order ); // e.g (*1* AND (*2* OR *3*))
904+ setDefaultOrderWhenEmpty ();
905+
906+ String conditions = applySpecialCharactersToOrder (); // e.g (*1* AND (*2* OR *3*))
932907
933908 for (Integer i = 0 ; i < queryConditions .size (); i ++ ) {
934909 conditions = conditions .replace (
935- addSpecialCharacters ( String . valueOf ( i + 1 ) ), // e.g *1*
910+ conditionNumberWithSpecialCharacters ( i + 1 ), // e.g *1*
936911 queryConditions .get (i ).build ()
937912 );
938913 }
939914
940915 return conditions ;
941916 }
942917
943- private String addSpecialCharactersToOrder (String order ) {
944- String formattedOrder = order ;
945-
946- for (Integer i = 0 ; i < queryConditions .size (); i ++ ) {
947- String conditionNumber = String .valueOf (i + 1 );
948- formattedOrder = formattedOrder .replace (conditionNumber , addSpecialCharacters (conditionNumber ));
918+ private String applySpecialCharactersToOrder () {
919+ for (Integer i = 1 ; i <= queryConditions .size (); i ++ ) {
920+ order = order .replace (String .valueOf (i ), conditionNumberWithSpecialCharacters (i ));
949921 }
950922
951- if (isMain ) {
952- return formattedOrder ;
953- }
923+ return order ; // e.g (*1* AND (*2* OR *3*))
924+ }
925+
926+ private String conditionNumberWithSpecialCharacters (Integer conditionNumber ) {
927+ return ' *' + conditionNumber + ' *' ;
928+ }
929+ }
954930
955- return ' (' + formattedOrder + ' )' ; // e.g (*1* AND (*2* OR *3*))
931+ public class MainFilterGroup extends FilterGroup {
932+ private String stringConditions ;
933+
934+ public void evaluate (String conditions ) {
935+ stringConditions = String .escapeSingleQuotes (conditions );
956936 }
957937
958- private String addSpecialCharacters (String condition ) {
959- return ' *' + condition .trim () + ' *' ;
938+ public override String build () {
939+ if (String .isNotEmpty (stringConditions )) {
940+ return ' WHERE ' + stringConditions ;
941+ }
942+
943+ if (isEmpty ()) {
944+ return ' ' ;
945+ }
946+
947+ return ' WHERE ' + buildNested ();
960948 }
961949 }
962950
0 commit comments