From 1e2a8f58b94405b4e0d4b9e79656d34ef97bad40 Mon Sep 17 00:00:00 2001 From: Piotr Gajek Date: Thu, 3 Oct 2024 13:37:57 +0200 Subject: [PATCH] Duplicated Conditions (#127) Signed-off-by: Piotr PG Gajek --- force-app/main/default/classes/SOQL.cls | 2 +- force-app/main/default/classes/SOQL_Test.cls | 38 ++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/force-app/main/default/classes/SOQL.cls b/force-app/main/default/classes/SOQL.cls index a9bb09a..9669563 100644 --- a/force-app/main/default/classes/SOQL.cls +++ b/force-app/main/default/classes/SOQL.cls @@ -1311,7 +1311,7 @@ public virtual inherited sharing class SOQL implements Queryable { String orderWithSpecialCharacters = getConditionsLogic(); for (Integer i = 0; i < queryConditions.size(); i++) { - orderWithSpecialCharacters = orderWithSpecialCharacters.replaceFirst(String.valueOf(i + 1), '{' + i + '}'); + orderWithSpecialCharacters = orderWithSpecialCharacters.replaceAll('\\b' + String.valueOf(i + 1) + '\\b', '{' + i + '}'); } return orderWithSpecialCharacters; // e.g ({0} AND ({1} AND {2})) diff --git a/force-app/main/default/classes/SOQL_Test.cls b/force-app/main/default/classes/SOQL_Test.cls index 0db1db6..2e54b98 100644 --- a/force-app/main/default/classes/SOQL_Test.cls +++ b/force-app/main/default/classes/SOQL_Test.cls @@ -1559,6 +1559,44 @@ private class SOQL_Test { Assert.areEqual('%11%', binding.get('v11')); } + @IsTest + static void duplicatedConditionsInConditionOrder() { + // Test + SOQL builder = SOQL.of(Account.SObjectType) + .whereAre(SOQL.FilterGroup.add(SOQL.Filter.with(Account.Name).contains('1'))) + .whereAre(SOQL.FilterGroup.add(SOQL.Filter.with(Account.Name).contains('2'))) + .whereAre(SOQL.FilterGroup.add(SOQL.Filter.with(Account.Name).contains('3'))) + .whereAre(SOQL.FilterGroup.add(SOQL.Filter.with(Account.Name).contains('4'))) + .whereAre(SOQL.FilterGroup.add(SOQL.Filter.with(Account.Name).contains('5'))) + .whereAre(SOQL.FilterGroup.add(SOQL.Filter.with(Account.Name).contains('6'))) + .whereAre(SOQL.FilterGroup.add(SOQL.Filter.with(Account.Name).contains('7'))) + .whereAre(SOQL.FilterGroup.add(SOQL.Filter.with(Account.Name).contains('8'))) + .whereAre(SOQL.FilterGroup.add(SOQL.Filter.with(Account.Name).contains('9'))) + .whereAre(SOQL.FilterGroup.add(SOQL.Filter.with(Account.Name).contains('10'))) + .whereAre(SOQL.FilterGroup.add(SOQL.Filter.with(Account.Name).contains('11'))) + .conditionLogic('(1 AND 2 AND 3 AND 4 AND 5 AND 5 AND 7 AND 8 AND 9 AND 10 AND 11) OR (11 AND 1 AND 10)'); + + // Verify + String soql = builder.toString(); + Assert.areEqual( + 'SELECT Id FROM Account WHERE ((Name LIKE :v1) AND (Name LIKE :v2) AND (Name LIKE :v3) AND (Name LIKE :v4) AND (Name LIKE :v5) AND (Name LIKE :v5) AND (Name LIKE :v7) AND (Name LIKE :v8) AND (Name LIKE :v9) AND (Name LIKE :v10) AND (Name LIKE :v11)) OR ((Name LIKE :v11) AND (Name LIKE :v1) AND (Name LIKE :v10))', + soql + ); + + Map binding = builder.binding(); + Assert.areEqual('%1%', binding.get('v1')); + Assert.areEqual('%2%', binding.get('v2')); + Assert.areEqual('%3%', binding.get('v3')); + Assert.areEqual('%4%', binding.get('v4')); + Assert.areEqual('%5%', binding.get('v5')); + Assert.areEqual('%6%', binding.get('v6')); + Assert.areEqual('%7%', binding.get('v7')); + Assert.areEqual('%8%', binding.get('v8')); + Assert.areEqual('%9%', binding.get('v9')); + Assert.areEqual('%10%', binding.get('v10')); + Assert.areEqual('%11%', binding.get('v11')); + } + @IsTest static void anyConditionMatchingForInnerGroup() { // Test