From f7dabe6a673ab1dd84c6471e95183da34be8fa84 Mon Sep 17 00:00:00 2001 From: Piotr PG Gajek Date: Tue, 12 Sep 2023 12:47:52 +0200 Subject: [PATCH 1/5] SOSL Binding --- force-app/main/default/classes/SOSL.cls | 85 +++++++++++++++----- website/docs/examples/{select.md => find.md} | 2 +- 2 files changed, 66 insertions(+), 21 deletions(-) rename website/docs/examples/{select.md => find.md} (99%) diff --git a/force-app/main/default/classes/SOSL.cls b/force-app/main/default/classes/SOSL.cls index a194518..1f86f4f 100644 --- a/force-app/main/default/classes/SOSL.cls +++ b/force-app/main/default/classes/SOSL.cls @@ -149,6 +149,7 @@ public inherited sharing class SOSL implements ISearchable { } // Config + private static Binder binder; private SearchableBuilder builder; private Executor executor; @@ -160,6 +161,7 @@ public inherited sharing class SOSL implements ISearchable { private SOSL(String searchValue) { builder = new SearchableBuilder(searchValue); executor = new Executor(); + binder = new Binder(); } public SOSL inAllFields() { @@ -277,11 +279,11 @@ public inherited sharing class SOSL implements ISearchable { } public List> toSearchList() { - return executor.search(builder.toString()); + return executor.search(builder.toString(), binder.getBindedValues()); } public Search.SearchResults toSearchResult() { - return executor.find(builder.toString()); + return executor.find(builder.toString(), binder.getBindedValues()); } public interface QueryClause { @@ -910,6 +912,7 @@ public inherited sharing class SOSL implements ISearchable { private String field; private String comperator; private Object value; + private Boolean skipBinding = false; public IFilter id() { return with('Id'); @@ -1025,18 +1028,22 @@ public inherited sharing class SOSL implements ISearchable { } public IFilter includesAll(Iterable iterable) { + skipBinding = true; return set('INCLUDES', '(\'' + String.join(iterable, ';') + '\')'); } public IFilter includesSome(Iterable iterable) { + skipBinding = true; return set('INCLUDES', '(\'' + String.join(iterable, '\', \'') + '\')'); } public IFilter excludesAll(Iterable iterable) { + skipBinding = true; return set('EXCLUDES', '(\'' + String.join(iterable, '\', \'') + '\')'); } public IFilter excludesSome(Iterable iterable) { + skipBinding = true; return set('EXCLUDES', '(\'' + String.join(iterable, ';') + '\')'); } @@ -1059,8 +1066,23 @@ public inherited sharing class SOSL implements ISearchable { } public override String toString() { - // Dynamic binding not available for SOSL - return field + ' ' + comperator + ' ' + value; + if (skipBinding) { + return field + ' ' + comperator + ' ' + value; + } + return field + ' ' + comperator + ' :' + binder.bind(value); + } + } + + private class Binder { + private List bindedValues = new List(); + + public String bind(Object value) { + bindedValues.add(value); + return 'binded' + (bindedValues.size() - 1); + } + + public List getBindedValues() { + return bindedValues; } } @@ -1082,46 +1104,69 @@ public inherited sharing class SOSL implements ISearchable { accessMode = AccessLevel.SYSTEM_MODE; } - public List> search(String query) { - return sharingExecutor.search(query, accessMode); + public List> search(String query, List bindedValues) { + return sharingExecutor.setBinding(bindedValues).search(query, accessMode); } - public Search.SearchResults find(String query) { - return sharingExecutor.find(query, accessMode); + public Search.SearchResults find(String query, List bindedValues) { + return sharingExecutor.setBinding(bindedValues).find(query, accessMode); } } - private interface DatabaseSearch { - List> search(String query, AccessLevel accessLevel); - Search.SearchResults find(String query, AccessLevel accessLevel); + private abstract class DatabaseSearch { + protected Object binded0; + protected Object binded1; + protected Object binded2; + protected Object binded3; + protected Object binded4; + protected Object binded5; + protected Object binded6; + protected Object binded7; + protected Object binded8; + + public DatabaseSearch setBinding(List bindedValues) { + binded0 = bindedValues[0]; + binded1 = bindedValues[1]; + binded2 = bindedValues[2]; + binded3 = bindedValues[3]; + binded4 = bindedValues[4]; + binded5 = bindedValues[5]; + binded6 = bindedValues[6]; + binded7 = bindedValues[7]; + binded8 = bindedValues[8]; + return this; + } + + abstract List> search(String query, AccessLevel accessLevel); + abstract Search.SearchResults find(String query, AccessLevel accessLevel); } - private inherited sharing class InheritedSharing implements DatabaseSearch { - public List> search(String query, AccessLevel accessLevel) { + private inherited sharing class InheritedSharing extends DatabaseSearch { + public override List> search(String query, AccessLevel accessLevel) { return Search.query(query, accessLevel); } - public Search.SearchResults find(String query, AccessLevel accessLevel) { + public override Search.SearchResults find(String query, AccessLevel accessLevel) { return Search.find(query, accessLevel); } } - private without sharing class WithoutSharing implements DatabaseSearch { - public List> search(String query, AccessLevel accessLevel) { + private without sharing class WithoutSharing extends DatabaseSearch { + public override List> search(String query, AccessLevel accessLevel) { return Search.query(query, accessLevel); } - public Search.SearchResults find(String query, AccessLevel accessLevel) { + public override Search.SearchResults find(String query, AccessLevel accessLevel) { return Search.find(query, accessLevel); } } - private with sharing class WithSharing implements DatabaseSearch { - public List> search(String query, AccessLevel accessLevel) { + private with sharing class WithSharing extends DatabaseSearch { + public override List> search(String query, AccessLevel accessLevel) { return Search.query(query, accessLevel); } - public Search.SearchResults find(String query, AccessLevel accessLevel) { + public override Search.SearchResults find(String query, AccessLevel accessLevel) { return Search.find(query, accessLevel); } } diff --git a/website/docs/examples/select.md b/website/docs/examples/find.md similarity index 99% rename from website/docs/examples/select.md rename to website/docs/examples/find.md index 224590e..7eee9be 100644 --- a/website/docs/examples/select.md +++ b/website/docs/examples/find.md @@ -2,7 +2,7 @@ sidebar_position: 1 --- -# SELECT +# FIND Specify fields that will be retrieved via query. Check [SOSL API - SELECT](../api/sosl.md#select). From 9842910ee6040958651bf0aab87472238b62f269 Mon Sep 17 00:00:00 2001 From: Piotr PG Gajek Date: Tue, 12 Sep 2023 12:54:44 +0200 Subject: [PATCH 2/5] SOSL Binding --- force-app/main/default/classes/SOSL.cls | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/force-app/main/default/classes/SOSL.cls b/force-app/main/default/classes/SOSL.cls index 1f86f4f..8b186c5 100644 --- a/force-app/main/default/classes/SOSL.cls +++ b/force-app/main/default/classes/SOSL.cls @@ -1125,15 +1125,15 @@ public inherited sharing class SOSL implements ISearchable { protected Object binded8; public DatabaseSearch setBinding(List bindedValues) { - binded0 = bindedValues[0]; - binded1 = bindedValues[1]; - binded2 = bindedValues[2]; - binded3 = bindedValues[3]; - binded4 = bindedValues[4]; - binded5 = bindedValues[5]; - binded6 = bindedValues[6]; - binded7 = bindedValues[7]; - binded8 = bindedValues[8]; + binded0 = bindedValues.size() > 0 ? bindedValues[0] : null; + binded1 = bindedValues.size() > 1 ? bindedValues[1] : null; + binded2 = bindedValues.size() > 2 ? bindedValues[2] : null; + binded3 = bindedValues.size() > 3 ? bindedValues[3] : null; + binded4 = bindedValues.size() > 4 ? bindedValues[4] : null; + binded5 = bindedValues.size() > 5 ? bindedValues[5] : null; + binded6 = bindedValues.size() > 6 ? bindedValues[6] : null; + binded7 = bindedValues.size() > 7 ? bindedValues[7] : null; + binded8 = bindedValues.size() > 8 ? bindedValues[8] : null; return this; } From fe830849a9df54cb2169bfd3d92b7974383f09ff Mon Sep 17 00:00:00 2001 From: Piotr PG Gajek Date: Tue, 12 Sep 2023 12:56:21 +0200 Subject: [PATCH 3/5] SOSL Binding --- force-app/main/default/classes/SOSL.cls | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/force-app/main/default/classes/SOSL.cls b/force-app/main/default/classes/SOSL.cls index 8b186c5..f313bcf 100644 --- a/force-app/main/default/classes/SOSL.cls +++ b/force-app/main/default/classes/SOSL.cls @@ -273,6 +273,10 @@ public inherited sharing class SOSL implements ISearchable { return builder.toString(); } + public List binding() { + return binder.getBindedValues(); + } + public SOSL preview() { System.debug(LoggingLevel.ERROR, '\n\n============ SOSL Preview ============\n' + toString() + '\n=======================================\n'); return this; From 8534d9b0e53157015439b65d296a151ca4f2ffd4 Mon Sep 17 00:00:00 2001 From: Piotr PG Gajek Date: Tue, 12 Sep 2023 14:06:15 +0200 Subject: [PATCH 4/5] Fix SOSL_Test --- force-app/main/default/classes/SOSL.cls | 16 +---- force-app/main/default/classes/SOSL_Test.cls | 73 +++++++++++++++----- 2 files changed, 57 insertions(+), 32 deletions(-) diff --git a/force-app/main/default/classes/SOSL.cls b/force-app/main/default/classes/SOSL.cls index f313bcf..bda58b3 100644 --- a/force-app/main/default/classes/SOSL.cls +++ b/force-app/main/default/classes/SOSL.cls @@ -121,9 +121,7 @@ public inherited sharing class SOSL implements ISearchable { IFilter isTrue(); IFilter isFalse(); IFilter equal(Object value); - IFilter equal(String value); IFilter notEqual(Object value); - IFilter notEqual(String value); IFilter lessThan(Object value); IFilter greaterThan(Object value); IFilter lessOrEqual(Object value); @@ -963,18 +961,10 @@ public inherited sharing class SOSL implements ISearchable { return set('=', value); } - public IFilter equal(String value) { - return set('=', quote(value)); - } - public IFilter notEqual(Object value) { return set('!=', value); } - public IFilter notEqual(String value) { - return set('!=', quote(value)); - } - public IFilter lessThan(Object value) { return set('<', value); } @@ -992,7 +982,7 @@ public inherited sharing class SOSL implements ISearchable { } public IFilter containsSome(Iterable values) { - return set('LIKE', '(\'' + String.join(values, '\'') + '\')'); + return set('LIKE', values); } public IFilter contains(String value) { @@ -1008,7 +998,7 @@ public inherited sharing class SOSL implements ISearchable { } public IFilter contains(String prefix, String value, String suffix) { - return set('LIKE', quote(prefix + formattedString(value) + suffix)); + return set('LIKE', prefix + formattedString(value) + suffix); } private String formattedString(String value) { @@ -1052,8 +1042,8 @@ public inherited sharing class SOSL implements ISearchable { } private IFilter set(String comperator, Object value) { - this.value = value; this.comperator = comperator; + this.value = value; return this; } diff --git a/force-app/main/default/classes/SOSL_Test.cls b/force-app/main/default/classes/SOSL_Test.cls index c48cc17..8cfbe4c 100644 --- a/force-app/main/default/classes/SOSL_Test.cls +++ b/force-app/main/default/classes/SOSL_Test.cls @@ -217,7 +217,8 @@ private class SOSL_Test { ); // Verify - Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE RecordType.DeveloperName = \'Partner\')', sosl.toString()); + Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE RecordType.DeveloperName = :binded0)', sosl.toString()); + Assert.areEqual('Partner', sosl.binding()[0]); } @IsTest @@ -232,7 +233,8 @@ private class SOSL_Test { ); // Verify - Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE Name = \'Test\')', sosl.toString()); + Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE Name = :binded0)', sosl.toString()); + Assert.areEqual('Test', sosl.binding()[0]); } @IsTest @@ -247,7 +249,8 @@ private class SOSL_Test { ); // Verify - Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE Industry = \'IT\')', sosl.toString()); + Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE Industry = :binded0)', sosl.toString()); + Assert.areEqual('IT', sosl.binding()[0]); } @IsTest @@ -262,7 +265,8 @@ private class SOSL_Test { ); // Verify - Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Contact(Id, Name WHERE Account.Industry = \'IT\')', sosl.toString()); + Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Contact(Id, Name WHERE Account.Industry = :binded0)', sosl.toString()); + Assert.areEqual('IT', sosl.binding()[0]); } @IsTest @@ -277,7 +281,8 @@ private class SOSL_Test { ); // Verify - Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE Industry = \'IT\')', sosl.toString()); + Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE Industry = :binded0)', sosl.toString()); + Assert.areEqual('IT', sosl.binding()[0]); } @IsTest @@ -292,7 +297,8 @@ private class SOSL_Test { ); // Verify - Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE Industry = null)', sosl.toString()); + Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE Industry = :binded0)', sosl.toString()); + Assert.areEqual(null, sosl.binding()[0]); } @IsTest @@ -352,7 +358,8 @@ private class SOSL_Test { ); // Verify - Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE NumberOfEmployees = 10)', sosl.toString()); + Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE NumberOfEmployees = :binded0)', sosl.toString()); + Assert.areEqual(10, sosl.binding()[0]); } @IsTest @@ -367,7 +374,8 @@ private class SOSL_Test { ); // Verify - Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE Name = \'My Account\')', sosl.toString()); + Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE Name = :binded0)', sosl.toString()); + Assert.areEqual('My Account', sosl.binding()[0]); } @IsTest @@ -382,7 +390,8 @@ private class SOSL_Test { ); // Verify - Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE NumberOfEmployees != 10)', sosl.toString()); + Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE NumberOfEmployees != :binded0)', sosl.toString()); + Assert.areEqual(10, sosl.binding()[0]); } @IsTest @@ -397,7 +406,8 @@ private class SOSL_Test { ); // Verify - Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE Name != \'My Account\')', sosl.toString()); + Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE Name != :binded0)', sosl.toString()); + Assert.areEqual('My Account', sosl.binding()[0]); } @IsTest @@ -462,17 +472,21 @@ private class SOSL_Test { @IsTest static void filterContainsSome() { + // Setup + List names = new List{ 'Test'}; + // Test SOSL sosl = SOSL.find(SEARCH_TEXT) .inAllFields() .returning( SOSL.Returning(Account.SObjectType) .with(Account.Id, Account.Name) - .whereAre(SOSL.Filter.with(Account.Name).containsSome(new List{ 'Test'})) + .whereAre(SOSL.Filter.with(Account.Name).containsSome(names)) ); // Verify - Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE Name LIKE (\'Test\'))', sosl.toString()); + Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE Name LIKE :binded0)', sosl.toString()); + Assert.areEqual(names, sosl.binding()[0]); } @IsTest @@ -487,7 +501,8 @@ private class SOSL_Test { ); // Verify - Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE Name LIKE \'%Test%\')', sosl.toString()); + Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE Name LIKE :binded0)', sosl.toString()); + Assert.areEqual('%Test%', sosl.binding()[0]); } @IsTest @@ -502,7 +517,8 @@ private class SOSL_Test { ); // Verify - Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE Name LIKE \'Test%\')', sosl.toString()); + Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE Name LIKE :binded0)', sosl.toString()); + Assert.areEqual('Test%', sosl.binding()[0]); } @IsTest @@ -517,11 +533,15 @@ private class SOSL_Test { ); // Verify - Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE Name LIKE \'%Test\')', sosl.toString()); + Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE Name LIKE :binded0)', sosl.toString()); + Assert.areEqual('%Test', sosl.binding()[0]); } @IsTest static void filterIsInListOfStrings() { + // Setup + List industries = new List{ 'IT' }; + // Test SOSL sosl = SOSL.find(SEARCH_TEXT) .inAllFields() @@ -532,7 +552,8 @@ private class SOSL_Test { ); // Verify - Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE Industry IN (\'IT\'))', sosl.toString()); + Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE Industry IN :binded0', sosl.toString()); + Assert.areEqual(industries, sosl.binding()[0]); } @IsTest @@ -676,7 +697,11 @@ private class SOSL_Test { ); // Verify - Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE (Name = \'MyAccount\' AND Industry = \'IT\'))', sosl.toString()); + Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE (Name = :binded0 AND Industry = :binded1))', sosl.toString()); + + List bindedValues = sosl.binding(); + Assert.areEqual('MyAccount', bindedValues[0]); + Assert.areEqual('IT', bindedValues[1]); } @IsTest @@ -695,7 +720,11 @@ private class SOSL_Test { ); // Verify - Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE (Name = \'MyAccount\' OR Industry = \'IT\'))', sosl.toString()); + Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE (Name = :binded0 OR Industry = :binded1))', sosl.toString()); + + List bindedValues = sosl.binding(); + Assert.areEqual('MyAccount', bindedValues[0]); + Assert.areEqual('IT', bindedValues[1]); } @IsTest @@ -718,7 +747,13 @@ private class SOSL_Test { ); // Verify - Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE (Name = \'MyAccount\' AND Industry = \'IT\' AND (NumberOfEmployees > 5 OR IsDeleted = false)))', sosl.toString()); + Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE (Name = :binded0 AND Industry = :binded1 AND (NumberOfEmployees > :binded2 OR IsDeleted = :binded3)))', sosl.toString()); + + List bindedValues = sosl.binding(); + Assert.areEqual('MyAccount', bindedValues[0]); + Assert.areEqual('IT', bindedValues[1]); + Assert.areEqual(5, bindedValues[2]); + Assert.areEqual(false, bindedValues[3]); } @IsTest From e742c5764df57c4d57655f2a470f3195a75cfd96 Mon Sep 17 00:00:00 2001 From: Piotr PG Gajek Date: Tue, 12 Sep 2023 16:01:14 +0200 Subject: [PATCH 5/5] SOSL_Test --- force-app/main/default/classes/SOSL.cls | 4 +- force-app/main/default/classes/SOSL_Test.cls | 61 ++++++++++++++------ 2 files changed, 45 insertions(+), 20 deletions(-) diff --git a/force-app/main/default/classes/SOSL.cls b/force-app/main/default/classes/SOSL.cls index bda58b3..fdcba00 100644 --- a/force-app/main/default/classes/SOSL.cls +++ b/force-app/main/default/classes/SOSL.cls @@ -1010,7 +1010,7 @@ public inherited sharing class SOSL implements ISearchable { } public IFilter isIn(List iterable) { - return set('IN', '(\'' + String.join(iterable, '\'') + '\')'); + return set('IN', iterable); } public IFilter notIn(Iterable iterable) { @@ -1018,7 +1018,7 @@ public inherited sharing class SOSL implements ISearchable { } public IFilter notIn(List iterable) { - return set('NOT IN', '(\'' + String.join(iterable, '\'') + '\')'); + return set('NOT IN', iterable); } public IFilter includesAll(Iterable iterable) { diff --git a/force-app/main/default/classes/SOSL_Test.cls b/force-app/main/default/classes/SOSL_Test.cls index 8cfbe4c..8e7b8dc 100644 --- a/force-app/main/default/classes/SOSL_Test.cls +++ b/force-app/main/default/classes/SOSL_Test.cls @@ -202,7 +202,8 @@ private class SOSL_Test { ); // Verify - Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE Id != null)', sosl.toString()); + Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE Id != :binded0)', sosl.toString()); + Assert.areEqual(null, sosl.binding()[0]); } @IsTest @@ -313,7 +314,8 @@ private class SOSL_Test { ); // Verify - Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE Industry != null)', sosl.toString()); + Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE Industry != :binded0)', sosl.toString()); + Assert.areEqual(null, sosl.binding()[0]); } @IsTest @@ -328,7 +330,8 @@ private class SOSL_Test { ); // Verify - Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE IsDeleted = true)', sosl.toString()); + Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE IsDeleted = :binded0)', sosl.toString()); + Assert.areEqual(true, sosl.binding()[0]); } @IsTest @@ -343,7 +346,8 @@ private class SOSL_Test { ); // Verify - Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE IsDeleted = false)', sosl.toString()); + Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE IsDeleted = :binded0)', sosl.toString()); + Assert.areEqual(false, sosl.binding()[0]); } @IsTest @@ -422,7 +426,8 @@ private class SOSL_Test { ); // Verify - Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE NumberOfEmployees < 10)', sosl.toString()); + Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE NumberOfEmployees < :binded0)', sosl.toString()); + Assert.areEqual(10, sosl.binding()[0]); } @IsTest @@ -437,7 +442,8 @@ private class SOSL_Test { ); // Verify - Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE NumberOfEmployees > 10)', sosl.toString()); + Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE NumberOfEmployees > :binded0)', sosl.toString()); + Assert.areEqual(10, sosl.binding()[0]); } @IsTest @@ -452,7 +458,8 @@ private class SOSL_Test { ); // Verify - Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE NumberOfEmployees <= 10)', sosl.toString()); + Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE NumberOfEmployees <= :binded0)', sosl.toString()); + Assert.areEqual(10, sosl.binding()[0]); } @IsTest @@ -467,7 +474,8 @@ private class SOSL_Test { ); // Verify - Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE NumberOfEmployees >= 10)', sosl.toString()); + Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE NumberOfEmployees >= :binded0)', sosl.toString()); + Assert.areEqual(10, sosl.binding()[0]); } @IsTest @@ -548,57 +556,69 @@ private class SOSL_Test { .returning( SOSL.Returning(Account.SObjectType) .with(Account.Id, Account.Name) - .whereAre(SOSL.Filter.with(Account.Industry).isIn(new List{ 'IT' })) + .whereAre(SOSL.Filter.with(Account.Industry).isIn(industries)) ); // Verify - Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE Industry IN :binded0', sosl.toString()); + Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE Industry IN :binded0)', sosl.toString()); Assert.areEqual(industries, sosl.binding()[0]); } @IsTest static void filterIsInListOfIntegers() { + // Setup + List numberOfEmployees = new List{ 10, 20, 30 }; + // Test SOSL sosl = SOSL.find(SEARCH_TEXT) .inAllFields() .returning( SOSL.Returning(Account.SObjectType) .with(Account.Id, Account.Name) - .whereAre(SOSL.Filter.with(Account.NumberOfEmployees).isIn(new List{ 10, 20, 30 })) + .whereAre(SOSL.Filter.with(Account.NumberOfEmployees).isIn(numberOfEmployees)) ); // Verify - Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE NumberOfEmployees IN (10, 20, 30))', sosl.toString()); + Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE NumberOfEmployees IN :binded0)', sosl.toString()); + Assert.areEqual(numberOfEmployees, sosl.binding()[0]); } @IsTest static void filterNotInListOfStrings() { + // Setup + List industries = new List{ 'IT' }; + // Test SOSL sosl = SOSL.find(SEARCH_TEXT) .inAllFields() .returning( SOSL.Returning(Account.SObjectType) .with(Account.Id, Account.Name) - .whereAre(SOSL.Filter.with(Account.Industry).notIn(new List{ 'IT' })) + .whereAre(SOSL.Filter.with(Account.Industry).notIn(industries)) ); // Verify - Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE Industry NOT IN (\'IT\'))', sosl.toString()); + Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE Industry NOT IN :binded0)', sosl.toString()); + Assert.areEqual(industries, sosl.binding()[0]); } @IsTest static void filterIsNotInListOfIntegers() { + // Setup + List numberOfEmployees = new List{ 10, 20, 30 }; + // Test SOSL sosl = SOSL.find(SEARCH_TEXT) .inAllFields() .returning( SOSL.Returning(Account.SObjectType) .with(Account.Id, Account.Name) - .whereAre(SOSL.Filter.with(Account.NumberOfEmployees).notIn(new List{ 10, 20, 30 })) + .whereAre(SOSL.Filter.with(Account.NumberOfEmployees).notIn(numberOfEmployees)) ); // Verify - Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE NumberOfEmployees NOT IN (10, 20, 30))', sosl.toString()); + Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE NumberOfEmployees NOT IN :binded0)', sosl.toString()); + Assert.areEqual(numberOfEmployees, sosl.binding()[0]); } @IsTest @@ -679,7 +699,8 @@ private class SOSL_Test { ); // Verify - Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE (Industry = \'IT\'))', sosl.toString()); + Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE (Industry = :binded0))', sosl.toString()); + Assert.areEqual('IT', sosl.binding()[0]); } @IsTest @@ -789,7 +810,11 @@ private class SOSL_Test { ); // Verify - Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE (Name = \'MyAccount\' OR Industry = \'IT\'))', sosl.toString()); + Assert.areEqual('FIND \'SearchText\' IN ALL FIELDS RETURNING Account(Id, Name WHERE (Name = :binded0 OR Industry = :binded1))', sosl.toString()); + + List bindedValues = sosl.binding(); + Assert.areEqual('MyAccount', bindedValues[0]); + Assert.areEqual('IT', bindedValues[1]); } @isTest