@@ -253,14 +253,50 @@ def _path_is_valid(self, path: list) -> bool:
253253
254254 def get_count (self , tiered_keys : list , id ) -> int :
255255 if len (tiered_keys ) == 0 :
256- filters = [Q (code__iregex = PSC_GROUPS .get (id , {}).get ("count_pattern" ) or "(?!)" )]
257- return PSC .objects .filter (* filters ).count ()
256+ if id == "Research and Development" :
257+ return (
258+ PSC .objects .filter (Q (code__startswith = "A" ))
259+ .annotate (code_prefix = Substr ("code" , 1 , 2 ))
260+ .values ("code_prefix" )
261+ .distinct ()
262+ .count ()
263+ )
264+ elif id == "Service" :
265+ return (
266+ PSC .objects .filter (Q (code__regex = r"^[B-Z]$" ))
267+ .annotate (code_prefix = Substr ("code" , 1 , 1 ))
268+ .values ("code_prefix" )
269+ .distinct ()
270+ .count ()
271+ )
272+ elif id == "Product" :
273+ return (
274+ PSC .objects .filter (Q (code__regex = r"^\d\d$" ))
275+ .annotate (code_prefix = Substr ("code" , 1 , 2 ))
276+ .values ("code_prefix" )
277+ .distinct ()
278+ .count ()
279+ )
258280 else :
259- new_length = len (id ) + 1
260- filters = [Q (code__startswith = id ), ~ Q (code__endswith = 0 )]
281+ if id .startswith ("A" ):
282+ return self .get_research_and_dev_count (id )
283+ elif len (id ) == 1 :
284+ new_length = 2
285+ else :
286+ new_length = 4
261287 all_codes = (
262- PSC .objects .filter (* filters )
288+ PSC .objects .filter (code__startswith = id )
263289 .annotate (code_prefix = Substr ("code" , 1 , new_length ), code_len = Length ("code" ))
264290 .filter (code_len__gte = new_length )
265291 )
266292 return all_codes .values ("code_prefix" ).distinct ().count ()
293+
294+ def get_research_and_dev_count (self , id ):
295+ new_length = len (id ) + 1
296+ filters = [Q (code__startswith = id ), ~ Q (code__endswith = 0 )]
297+ all_codes = (
298+ PSC .objects .filter (* filters )
299+ .annotate (code_prefix = Substr ("code" , 1 , new_length ), code_len = Length ("code" ))
300+ .filter (code_len__gte = new_length )
301+ )
302+ return all_codes .values ("code_prefix" ).distinct ().count ()
0 commit comments