@@ -71,6 +71,31 @@ export class ProjectSearchFilter extends SearchFilter<ProjectData>
7171 ] ;
7272 }
7373
74+ project_scorer ( proj : ProjectData ) : number
75+ {
76+ return Math . max (
77+ partial_ratio ( this . query , proj . name ) ,
78+ partial_ratio ( this . query , proj . tech . join ( " " ) ) ,
79+ proj . desc ? partial_ratio ( this . query , proj . desc ) : 0 ,
80+ proj . tech ? partial_ratio ( this . query , proj . tech . join ( " " ) ) : 0 ,
81+ proj . tags ? partial_ratio ( this . query , proj . tags . join ( " " ) ) : 0 ,
82+ ) ;
83+ }
84+
85+ group_scorer ( group : string , projects : ProjectData [ ] ) : number
86+ {
87+ if ( this . query ) {
88+ return (
89+ projects
90+ . map ( proj => proj . _score_ ?? 0 )
91+ . reduce ( ( acc , n ) => acc + n , 0 )
92+ ) ;
93+ }
94+ else {
95+ return projects . length ;
96+ }
97+ }
98+
7499
75100 apply ( projects : ProjectData [ ] ) : FilterResults < ProjectData >
76101 {
@@ -80,7 +105,7 @@ export class ProjectSearchFilter extends SearchFilter<ProjectData>
80105 out = this . #group_and_sort( out ) ;
81106 }
82107 else if ( this . query ) {
83- out = this . # sort( out ) ;
108+ out = super . sort ( out , this . project_scorer ) ;
84109 }
85110
86111 return out ;
@@ -134,23 +159,13 @@ export class ProjectSearchFilter extends SearchFilter<ProjectData>
134159
135160 #group_and_sort( projects : ProjectData [ ] ) : [ string , ProjectData [ ] ] [ ]
136161 {
137- return super . group (
138- projects ,
139- proj => proj [ this . group_by ] ,
140- group => 1 ,
141- ) ;
142- }
143-
144- #sort( projects : ProjectData [ ] ) : ProjectData [ ]
145- {
146- return super . sort ( projects ,
147- proj => Math . max (
148- partial_ratio ( this . query , proj . name ) ,
149- partial_ratio ( this . query , proj . tech . join ( " " ) ) ,
150- proj . desc ? partial_ratio ( this . query , proj . desc ) : 0 ,
151- proj . tech ? partial_ratio ( this . query , proj . tech . join ( " " ) ) : 0 ,
152- proj . tags ? partial_ratio ( this . query , proj . tags . join ( " " ) ) : 0 ,
153- )
154- ) ;
162+ return super . group ( projects , {
163+ grouper : proj => {
164+ let value = proj [ this . group_by ] ;
165+ return Array . isArray ( value ) ? value [ 0 ] : value ;
166+ } ,
167+ entity_scorer : this . project_scorer . bind ( this ) ,
168+ group_scorer : this . group_scorer . bind ( this ) ,
169+ } ) ;
155170 }
156171}
0 commit comments