Skip to content

Commit 8eef47e

Browse files
authored
177 support for knowledge releated sobjects (#178)
* WITH DATA CATEGORY draft Signed-off-by: Piotr PG Gajek <[email protected]> * WITH DATA CATEGORY Signed-off-by: Piotr PG Gajek <[email protected]> --------- Signed-off-by: Piotr PG Gajek <[email protected]>
1 parent d988272 commit 8eef47e

File tree

2 files changed

+272
-7
lines changed

2 files changed

+272
-7
lines changed

force-app/main/default/classes/main/standard-soql/SOQL.cls

Lines changed: 132 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,8 @@ public virtual inherited sharing class SOQL implements Queryable {
102102
Queryable have(String havingConditions);
103103
Queryable havingConditionLogic(String havingConditionsOrder);
104104
Queryable anyHavingConditionMatching();
105+
// WITH DATA CATEGORY
106+
Queryable withDataCategory(DataCategoryFilter dataCategoryFilter);
105107
// ORDER BY
106108
Queryable orderBy(SObjectField field);
107109
Queryable orderBy(String field);
@@ -306,6 +308,26 @@ public virtual inherited sharing class SOQL implements Queryable {
306308
Boolean hasValue();
307309
}
308310

311+
public interface DataCategoryFilterGroup {
312+
DataCategoryFilterGroup add(DataCategoryFilter dataCategoryFilter);
313+
}
314+
315+
public interface DataCategoryFilter {
316+
// FIELDS
317+
DataCategoryFilter with(String field);
318+
// COMPERATORS
319+
DataCategoryFilter at(String category);
320+
DataCategoryFilter at(Iterable<String> categories);
321+
DataCategoryFilter above(String category);
322+
DataCategoryFilter above(Iterable<String> categories);
323+
DataCategoryFilter below(String category);
324+
DataCategoryFilter below(Iterable<String> categories);
325+
DataCategoryFilter aboveOrBelow(String category);
326+
DataCategoryFilter aboveOrBelow(Iterable<String> categories);
327+
328+
Boolean hasValue();
329+
}
330+
309331
public static SubQuery SubQuery {
310332
get { return new SoqlSubQuery(); }
311333
}
@@ -330,6 +352,10 @@ public virtual inherited sharing class SOQL implements Queryable {
330352
get { return new SoqlHavingFilter(); }
331353
}
332354

355+
public static DataCategoryFilter DataCategoryFilter {
356+
get { return new SoqlDataCategoryFilter(); }
357+
}
358+
333359
public static SOQL of(SObjectType ofObject) {
334360
return new SOQL(ofObject);
335361
}
@@ -748,6 +774,11 @@ public virtual inherited sharing class SOQL implements Queryable {
748774
return this;
749775
}
750776

777+
public Queryable withDataCategory(DataCategoryFilter dataCategoryFilter) {
778+
this.builder.dataCategory.add(dataCategoryFilter);
779+
return this;
780+
}
781+
751782
public Queryable orderBy(SObjectField field) {
752783
return this.orderBy(field.toString());
753784
}
@@ -981,7 +1012,7 @@ public virtual inherited sharing class SOQL implements Queryable {
9811012
}
9821013

9831014
private class SoqlBuilder implements QueryClause {
984-
private List<QueryClause> clauses = new QueryClause[11];
1015+
private List<QueryClause> clauses = new QueryClause[12];
9851016

9861017
public SoqlBuilder(String ofObject) {
9871018
this.clauses.set(0, new SoqlFields(ofObject));
@@ -1004,32 +1035,36 @@ public virtual inherited sharing class SOQL implements Queryable {
10041035
get { return (MainFilterGroup) getQueryClause(4, MainFilterGroup.class); }
10051036
}
10061037

1038+
public MainDataCategoryGroup dataCategory {
1039+
get { return (MainDataCategoryGroup) getQueryClause(5, MainDataCategoryGroup.class); }
1040+
}
1041+
10071042
public SoqlGroupBy groupBy {
1008-
get { return (SoqlGroupBy) getQueryClause(5, SoqlGroupBy.class); }
1043+
get { return (SoqlGroupBy) getQueryClause(6, SoqlGroupBy.class); }
10091044
}
10101045

10111046
public MainHavingGroup havingClause {
1012-
get { return (MainHavingGroup) getQueryClause(6, MainHavingGroup.class); }
1047+
get { return (MainHavingGroup) getQueryClause(7, MainHavingGroup.class); }
10131048
}
10141049

10151050
public SoqlOrderBy latestOrderBy {
10161051
get { return this.orderBys.latestOrderBy(); }
10171052
}
10181053

10191054
public SoqlOrderBys orderBys {
1020-
get { return (SoqlOrderBys) getQueryClause(7, SoqlOrderBys.class); }
1055+
get { return (SoqlOrderBys) getQueryClause(8, SoqlOrderBys.class); }
10211056
}
10221057

10231058
public SoqlLimit soqlLimit {
1024-
get { return (SoqlLimit) getQueryClause(8, SoqlLimit.class); }
1059+
get { return (SoqlLimit) getQueryClause(9, SoqlLimit.class); }
10251060
}
10261061

10271062
public SoqlOffset soqlOffset {
1028-
get { return (SoqlOffset) getQueryClause(9, SoqlOffset.class); }
1063+
get { return (SoqlOffset) getQueryClause(10, SoqlOffset.class); }
10291064
}
10301065

10311066
public SoqlFor soqlFor {
1032-
get { return (SoqlFor) getQueryClause(10, SoqlFor.class); }
1067+
get { return (SoqlFor) getQueryClause(11, SoqlFor.class); }
10331068
}
10341069

10351070
private QueryClause getQueryClause(Integer position, System.Type queryClause) {
@@ -1753,6 +1788,96 @@ public virtual inherited sharing class SOQL implements Queryable {
17531788
}
17541789
}
17551790

1791+
private virtual class MainDataCategoryGroup extends FilterBuilder implements DataCategoryFilterGroup, QueryClause {
1792+
public DataCategoryFilterGroup add(DataCategoryFilter dataCategoryFilter) {
1793+
this.add(new DataCategoryFilterAdapter(dataCategoryFilter));
1794+
return this;
1795+
}
1796+
1797+
public override String toString() {
1798+
return 'WITH DATA CATEGORY ' + this.buildNested();
1799+
}
1800+
}
1801+
1802+
private class DataCategoryFilterAdapter implements FilterClause {
1803+
private DataCategoryFilter dataCategoryFilter;
1804+
1805+
public DataCategoryFilterAdapter(DataCategoryFilter dataCategoryFilter) {
1806+
this.dataCategoryFilter = dataCategoryFilter;
1807+
}
1808+
1809+
public Boolean hasValue() {
1810+
return this.dataCategoryFilter.hasValue();
1811+
}
1812+
1813+
public override String toString() {
1814+
return this.dataCategoryFilter.toString();
1815+
}
1816+
}
1817+
1818+
private class SoqlDataCategoryFilter implements DataCategoryFilter {
1819+
private String field;
1820+
private String comperator;
1821+
private String value;
1822+
1823+
public DataCategoryFilter with(String field) {
1824+
this.field = field;
1825+
return this;
1826+
}
1827+
1828+
public DataCategoryFilter at(String category) {
1829+
return this.set('AT', category);
1830+
}
1831+
1832+
public DataCategoryFilter at(Iterable<String> categories) {
1833+
return this.set('AT', categories);
1834+
}
1835+
1836+
public DataCategoryFilter above(String category) {
1837+
return this.set('ABOVE', category);
1838+
}
1839+
1840+
public DataCategoryFilter above(Iterable<String> categories) {
1841+
return this.set('ABOVE', categories);
1842+
}
1843+
1844+
public DataCategoryFilter below(String category) {
1845+
return this.set('BELOW', category);
1846+
}
1847+
1848+
public DataCategoryFilter below(Iterable<String> categories) {
1849+
return this.set('BELOW', categories);
1850+
}
1851+
1852+
public DataCategoryFilter aboveOrBelow(String category) {
1853+
return this.set('ABOVE_OR_BELOW', category);
1854+
}
1855+
1856+
public DataCategoryFilter aboveOrBelow(Iterable<String> categories) {
1857+
return this.set('ABOVE_OR_BELOW', categories);
1858+
}
1859+
1860+
public DataCategoryFilter set(String operator, Iterable<String> iterable) {
1861+
this.comperator = operator;
1862+
this.value = '(' + String.join(iterable, ', ') + ')';
1863+
return this;
1864+
}
1865+
1866+
private DataCategoryFilter set(String comperator, String value) {
1867+
this.comperator = comperator;
1868+
this.value = value;
1869+
return this;
1870+
}
1871+
1872+
public Boolean hasValue() {
1873+
return String.isNotEmpty(this.field);
1874+
}
1875+
1876+
public override String toString() {
1877+
return this.field + ' ' + this.comperator + ' ' + this.value;
1878+
}
1879+
}
1880+
17561881
private class SoqlJoinQuery implements InnerJoin {
17571882
private SoqlBuilder builder;
17581883

force-app/main/default/classes/main/standard-soql/SOQL_Test.cls

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2849,6 +2849,146 @@ private class SOQL_Test {
28492849
);
28502850
}
28512851

2852+
// WITH DATA CATEGORY
2853+
2854+
@IsTest
2855+
static void dataCategoryFilterWithStringField() {
2856+
// Test
2857+
String soql = SOQL.of('Knowledge__kav')
2858+
.with('Title')
2859+
.withDataCategory(SOQL.DataCategoryFilter.with('Geography__c').aboveOrBelow('Europe__c'))
2860+
.toString();
2861+
2862+
// Verify
2863+
Assert.areEqual('SELECT Title FROM Knowledge__kav WITH DATA CATEGORY Geography__c ABOVE_OR_BELOW Europe__c', soql, 'The generated SOQL should match the expected one.');
2864+
}
2865+
2866+
@IsTest
2867+
static void dataCategoryFilterAt() {
2868+
// Test
2869+
String soql = SOQL.of('Knowledge__kav')
2870+
.with('Title')
2871+
.withDataCategory(SOQL.DataCategoryFilter.with('Geography__c').at('Europe__c'))
2872+
.toString();
2873+
2874+
// Verify
2875+
Assert.areEqual('SELECT Title FROM Knowledge__kav WITH DATA CATEGORY Geography__c AT Europe__c', soql, 'The generated SOQL should match the expected one.');
2876+
}
2877+
2878+
@IsTest
2879+
static void dataCategoryFilterAtMultiple() {
2880+
// Test
2881+
String soql = SOQL.of('Knowledge__kav')
2882+
.with('Title')
2883+
.withDataCategory(SOQL.DataCategoryFilter.with('Geography__c').at(new List<String>{ 'Europe__c', 'North_America__c' }))
2884+
.toString();
2885+
2886+
// Verify
2887+
Assert.areEqual('SELECT Title FROM Knowledge__kav WITH DATA CATEGORY Geography__c AT (Europe__c, North_America__c)', soql, 'The generated SOQL should match the expected one.');
2888+
}
2889+
2890+
@IsTest
2891+
static void dataCategoryFilterAbove() {
2892+
// Test
2893+
String soql = SOQL.of('Knowledge__kav')
2894+
.with('Title')
2895+
.withDataCategory(SOQL.DataCategoryFilter.with('Geography__c').above('Europe__c'))
2896+
.toString();
2897+
2898+
// Verify
2899+
Assert.areEqual('SELECT Title FROM Knowledge__kav WITH DATA CATEGORY Geography__c ABOVE Europe__c', soql, 'The generated SOQL should match the expected one.');
2900+
}
2901+
2902+
@IsTest
2903+
static void dataCategoryFilterAboveMultipe() {
2904+
// Test
2905+
String soql = SOQL.of('Knowledge__kav')
2906+
.with('Title')
2907+
.withDataCategory(SOQL.DataCategoryFilter.with('Geography__c').above(new List<String>{ 'Europe__c', 'North_America__c' }))
2908+
.toString();
2909+
2910+
// Verify
2911+
Assert.areEqual('SELECT Title FROM Knowledge__kav WITH DATA CATEGORY Geography__c ABOVE (Europe__c, North_America__c)', soql, 'The generated SOQL should match the expected one.');
2912+
}
2913+
2914+
@IsTest
2915+
static void dataCategoryFilterBelow() {
2916+
// Test
2917+
String soql = SOQL.of('Knowledge__kav')
2918+
.with('Title')
2919+
.withDataCategory(SOQL.DataCategoryFilter.with('Geography__c').below('Europe__c'))
2920+
.toString();
2921+
2922+
// Verify
2923+
Assert.areEqual('SELECT Title FROM Knowledge__kav WITH DATA CATEGORY Geography__c BELOW Europe__c', soql, 'The generated SOQL should match the expected one.');
2924+
}
2925+
2926+
@IsTest
2927+
static void dataCategoryFilterBelowMultipe() {
2928+
// Test
2929+
String soql = SOQL.of('Knowledge__kav')
2930+
.with('Title')
2931+
.withDataCategory(SOQL.DataCategoryFilter.with('Geography__c').below(new List<String>{ 'Europe__c', 'North_America__c' }))
2932+
.toString();
2933+
2934+
// Verify
2935+
Assert.areEqual('SELECT Title FROM Knowledge__kav WITH DATA CATEGORY Geography__c BELOW (Europe__c, North_America__c)', soql, 'The generated SOQL should match the expected one.');
2936+
}
2937+
2938+
@IsTest
2939+
static void dataCategoryFilterAboveOrBelow() {
2940+
// Test
2941+
String soql = SOQL.of('Knowledge__kav')
2942+
.with('Title')
2943+
.withDataCategory(SOQL.DataCategoryFilter.with('Geography__c').aboveOrBelow('Europe__c'))
2944+
.toString();
2945+
2946+
// Verify
2947+
Assert.areEqual('SELECT Title FROM Knowledge__kav WITH DATA CATEGORY Geography__c ABOVE_OR_BELOW Europe__c', soql, 'The generated SOQL should match the expected one.');
2948+
}
2949+
2950+
@IsTest
2951+
static void dataCategoryFilterAboveOrBelowMultipe() {
2952+
// Test
2953+
String soql = SOQL.of('Knowledge__kav')
2954+
.with('Title')
2955+
.withDataCategory(SOQL.DataCategoryFilter.with('Geography__c').aboveOrBelow(new List<String>{ 'Europe__c', 'North_America__c' }))
2956+
.toString();
2957+
2958+
// Verify
2959+
Assert.areEqual('SELECT Title FROM Knowledge__kav WITH DATA CATEGORY Geography__c ABOVE_OR_BELOW (Europe__c, North_America__c)', soql, 'The generated SOQL should match the expected one.');
2960+
}
2961+
2962+
@IsTest
2963+
static void dataCategoryWithMultipeDataCategoryFilters() {
2964+
// Test
2965+
String soql = SOQL.of('Knowledge__kav')
2966+
.with('Title')
2967+
.withDataCategory(SOQL.DataCategoryFilter.with('Geography__c').aboveOrBelow(new List<String>{ 'Europe__c', 'North_America__c' }))
2968+
.withDataCategory(SOQL.DataCategoryFilter.with('Product__c').at(new List<String>{ 'Product1__c', 'Product2__c' }))
2969+
.toString();
2970+
2971+
// Verify
2972+
Assert.areEqual('SELECT Title FROM Knowledge__kav WITH DATA CATEGORY Geography__c ABOVE_OR_BELOW (Europe__c, North_America__c) AND Product__c AT (Product1__c, Product2__c)', soql, 'The generated SOQL should match the expected one.');
2973+
}
2974+
2975+
@IsTest
2976+
static void dataCategoryWithMultipeFilters() {
2977+
// Test
2978+
String soql = SOQL.of('Knowledge__kav')
2979+
.with('Title')
2980+
.whereAre(SOQL.Filter.with('PublishStatus').equal('Draft'))
2981+
.whereAre(SOQL.Filter.with('Language').equal('en_US'))
2982+
.withDataCategory(SOQL.DataCategoryFilter.with('Geography__c').aboveOrBelow(new List<String>{ 'Europe__c', 'North_America__c' }))
2983+
.withDataCategory(SOQL.DataCategoryFilter.with('Product__c').at('Product1__c'))
2984+
.toString();
2985+
2986+
// Verify
2987+
Assert.areEqual('SELECT Title FROM Knowledge__kav WHERE PublishStatus = :v1 AND Language = :v2 WITH DATA CATEGORY Geography__c ABOVE_OR_BELOW (Europe__c, North_America__c) AND Product__c AT Product1__c', soql, 'The generated SOQL should match the expected one.');
2988+
}
2989+
2990+
// ORDER BY
2991+
28522992
@IsTest
28532993
static void orderByString() {
28542994
// Test

0 commit comments

Comments
 (0)