diff --git a/extra-tests/customMetadata/RollupOrderBy.Integration_NumberValue_FIRST.md-meta.xml b/extra-tests/customMetadata/RollupOrderBy.Integration_NumberValue_FIRST.md-meta.xml new file mode 100644 index 00000000..fa49e308 --- /dev/null +++ b/extra-tests/customMetadata/RollupOrderBy.Integration_NumberValue_FIRST.md-meta.xml @@ -0,0 +1,29 @@ + + + + false + + FieldName__c + NumberField__c + + + NullSortOrder__c + NULLS FIRST + + + Ranking__c + 1.0 + + + Rollup__c + RollupIntegrationChildRollupText + + + SortOrder__c + Ascending + + diff --git a/rollup/core/classes/RollupCalculator.cls b/rollup/core/classes/RollupCalculator.cls index b4be10b7..82e7e8e4 100644 --- a/rollup/core/classes/RollupCalculator.cls +++ b/rollup/core/classes/RollupCalculator.cls @@ -321,8 +321,9 @@ public without sharing abstract class RollupCalculator { protected List winnowItems(List items, Map oldCalcItems) { List orderBys = this.metadata?.LimitAmount__c != null && this.metadata.RollupOrderBys__r.isEmpty() ? new List{ new RollupOrderBy__mdt(FieldName__c = 'Id', Ranking__c = 0) } - : this.metadata.RollupOrderBys__r; + : new List(this.metadata.RollupOrderBys__r); if (orderBys.isEmpty() == false) { + orderBys.sort(new RollupRepository.OrderBySorter()); items.sort(new RollupCalcItemSorter(orderBys)); } List winnowedItems = new List(); diff --git a/rollup/core/classes/RollupRepository.cls b/rollup/core/classes/RollupRepository.cls index 471dbe9a..18147540 100644 --- a/rollup/core/classes/RollupRepository.cls +++ b/rollup/core/classes/RollupRepository.cls @@ -128,7 +128,7 @@ public without sharing class RollupRepository implements RollupLogger.ToStringOb SharingMode__c, ShouldRunWithoutCustomSettingEnabled__c, SplitConcatDelimiterOnCalcItem__c, - (SELECT Id, FieldName__c, NullSortOrder__c, Ranking__c, SortOrder__c FROM RollupOrderBys__r), + (SELECT Id, DeveloperName, FieldName__c, NullSortOrder__c, Ranking__c, SortOrder__c FROM RollupOrderBys__r), RollupGrouping__r.Id, RollupGrouping__r.RollupOperation__c FROM Rollup__mdt @@ -149,7 +149,6 @@ public without sharing class RollupRepository implements RollupLogger.ToStringOb meta.GroupByRowStartDelimiter__c = meta.GroupByRowStartDelimiter__c?.unescapeJava(); meta.SharingMode__c = meta.SharingMode__c ?? RollupMetaPicklists.SharingMode.SystemLevel; meta.UltimateParentLookup__c = meta.UltimateParentLookup__r.QualifiedApiName; - meta.RollupOrderBys__r.sort(new OrderBySorter()); } return matchingMetadata; diff --git a/sfdx-project.json b/sfdx-project.json index 2ae33484..5764331d 100644 --- a/sfdx-project.json +++ b/sfdx-project.json @@ -5,8 +5,8 @@ "package": "apex-rollup", "path": "rollup", "scopeProfiles": true, - "versionName": "Fixes parentRecordIdForEmptyChildrenCollections flow case", - "versionNumber": "1.6.34.0", + "versionName": "Fixes Rollup Order By sorting to always be deterministic", + "versionNumber": "1.6.35.0", "versionDescription": "Fast, configurable, elastically scaling custom rollup solution. Apex Invocable action, one-liner Apex trigger/CMDT-driven logic, and scheduled Apex-ready.", "releaseNotesUrl": "https://github.com/jamessimone/apex-rollup/releases/latest", "unpackagedMetadata": { @@ -101,12 +101,9 @@ "Apex Rollup - Rollup Callback@0.0.3-0": "04t6g000008Sis0AAC", "Nebula Logger - Core@4.14.4-optionally-auto-call-lightning-logger-lwc": "04t5Y0000015oRNQAY", "apex-rollup": "0Ho6g000000TNcOCAW", - "apex-rollup@1.6.28": "04t6g000008ObN8AAK", - "apex-rollup@1.6.29": "04t6g000008ObNNAA0", - "apex-rollup@1.6.30": "04t6g000008ObVhAAK", "apex-rollup@1.6.31": "04t6g000008ObblAAC", "apex-rollup@1.6.32": "04t6g000008ObbvAAC", "apex-rollup@1.6.33": "04t6g000008ObeQAAS", "apex-rollup@1.6.34": "04t6g000008OfJfAAK" } -} +} \ No newline at end of file