Skip to content

Commit e8c29ed

Browse files
cci: improve sort order guessing algo
1 parent fa06183 commit e8c29ed

File tree

1 file changed

+23
-5
lines changed

1 file changed

+23
-5
lines changed

src/models/ContributionSurveyRow.ts

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,31 +66,49 @@ export default class ContributionSurveyRow {
6666
diffs: Iterable<ContributionSurveyRevision>
6767
): ContributionSurveyRowSort {
6868
let last: ContributionSurveyRevision = null;
69+
6970
let dateScore = 1;
7071
let dateReverseScore = 1;
7172
let byteScore = 1;
73+
let dateStreak = 0;
74+
let dateReverseStreak = 0;
75+
let byteStreak = 0;
76+
7277
for ( const diff of diffs ) {
7378
if ( last == null ) {
7479
last = diff;
7580
} else {
7681
const diffTimestamp = new Date( diff.timestamp ).getTime();
7782
const lastTimestamp = new Date( last.timestamp ).getTime();
83+
84+
// The use of the OR operator here has a specific purpose:
85+
// * On the first iteration, we want all streak values to be 1
86+
// * On any other iteration, we want it to increment the streak by 1 if a streak
87+
// exists, or set it to 1 if a streak was broken.
88+
dateStreak =
89+
diffTimestamp > lastTimestamp ? dateStreak + 1 : 0;
90+
dateReverseStreak =
91+
diffTimestamp < lastTimestamp ? dateReverseStreak + 1 : 0;
92+
byteStreak =
93+
diff.diffsize <= last.diffsize ? byteStreak + 1 : 0;
94+
7895
dateScore = ( dateScore + (
79-
diffTimestamp > lastTimestamp ? 1 : 0
96+
( diffTimestamp > lastTimestamp ? 1 : 0 ) * ( 1 + dateStreak * 0.3 )
8097
) ) / 2;
8198
dateReverseScore = ( dateReverseScore + (
82-
diffTimestamp < lastTimestamp ? 1 : 0
99+
( diffTimestamp < lastTimestamp ? 1 : 0 ) * ( 1 + dateReverseStreak * 0.3 )
83100
) ) / 2;
84101
byteScore = ( byteScore + (
85-
diff.diffsize < last.diffsize ? 1 : 0
102+
( diff.diffsize <= last.diffsize ? 1 : 0 ) * ( 1 + byteStreak * 0.3 )
86103
) ) / 2;
104+
87105
last = diff;
88106
}
89107
}
90108

91109
// Multiply by weights to remove ties
92-
dateScore *= 1.1;
93-
dateReverseScore *= 1.05;
110+
dateScore *= 1.05;
111+
dateReverseScore *= 1.025;
94112

95113
switch ( Math.max( dateScore, dateReverseScore, byteScore ) ) {
96114
case byteScore:

0 commit comments

Comments
 (0)