@@ -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