@@ -66,31 +66,49 @@ export default class ContributionSurveyRow {
66
66
diffs : Iterable < ContributionSurveyRevision >
67
67
) : ContributionSurveyRowSort {
68
68
let last : ContributionSurveyRevision = null ;
69
+
69
70
let dateScore = 1 ;
70
71
let dateReverseScore = 1 ;
71
72
let byteScore = 1 ;
73
+ let dateStreak = 0 ;
74
+ let dateReverseStreak = 0 ;
75
+ let byteStreak = 0 ;
76
+
72
77
for ( const diff of diffs ) {
73
78
if ( last == null ) {
74
79
last = diff ;
75
80
} else {
76
81
const diffTimestamp = new Date ( diff . timestamp ) . getTime ( ) ;
77
82
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
+
78
95
dateScore = ( dateScore + (
79
- diffTimestamp > lastTimestamp ? 1 : 0
96
+ ( diffTimestamp > lastTimestamp ? 1 : 0 ) * ( 1 + dateStreak * 0.3 )
80
97
) ) / 2 ;
81
98
dateReverseScore = ( dateReverseScore + (
82
- diffTimestamp < lastTimestamp ? 1 : 0
99
+ ( diffTimestamp < lastTimestamp ? 1 : 0 ) * ( 1 + dateReverseStreak * 0.3 )
83
100
) ) / 2 ;
84
101
byteScore = ( byteScore + (
85
- diff . diffsize < last . diffsize ? 1 : 0
102
+ ( diff . diffsize <= last . diffsize ? 1 : 0 ) * ( 1 + byteStreak * 0.3 )
86
103
) ) / 2 ;
104
+
87
105
last = diff ;
88
106
}
89
107
}
90
108
91
109
// Multiply by weights to remove ties
92
- dateScore *= 1.1 ;
93
- dateReverseScore *= 1.05 ;
110
+ dateScore *= 1.05 ;
111
+ dateReverseScore *= 1.025 ;
94
112
95
113
switch ( Math . max ( dateScore , dateReverseScore , byteScore ) ) {
96
114
case byteScore :
0 commit comments