@@ -845,6 +845,16 @@ def search_companies(state: State, search_input: str, limit: int = 10) -> pd.Dat
845845 return df
846846
847847
848+ def get_company_follow_lookup (state : State , company_domain : str ) -> pd .DataFrame :
849+ """Resolve company domain to canonical company metadata."""
850+ df = pd .read_sql (
851+ sql .company_follow_lookup ,
852+ state .dbcon .engine ,
853+ params = {"company_domain" : company_domain },
854+ )
855+ return df
856+
857+
848858def search_apps (state : State , search_input : str , limit : int = 100 ) -> pd .DataFrame :
849859 """Search apps by term in database."""
850860 logger .info (f"App search: { search_input = } " )
@@ -967,10 +977,21 @@ def query_apps_crossfilter(
967977 return df
968978
969979
970- def get_single_app_keywords (state : State , store_id : str ) -> pd .DataFrame :
980+ def get_single_app_keywords (
981+ state : State , store_id : str , keyword_texts : list [str ] | None = None
982+ ) -> pd .DataFrame :
971983 """Get single app keywords."""
984+ if keyword_texts is None :
985+ keyword_texts = []
986+
987+ keyword_texts = [
988+ text .strip ().lower () for text in keyword_texts if text and text .strip ()
989+ ]
990+
972991 df = pd .read_sql (
973- sql .single_app_keywords , state .dbcon .engine , params = {"store_id" : store_id }
992+ sql .single_app_keywords ,
993+ state .dbcon .engine ,
994+ params = {"store_id" : store_id , "keyword_texts" : keyword_texts },
974995 )
975996 df = df .sort_values (by = "d30_best_rank" , ascending = True )
976997 return df
@@ -1056,3 +1077,25 @@ def insert_search_query(state: State, search_term: str, user_id: int | None) ->
10561077
10571078 with state .dbconwrite .engine .connect () as connection , connection .begin ():
10581079 connection .execute (sql .insert_search_query , data )
1080+
1081+
1082+ def get_app_keywords_history (
1083+ state : State , store_app_id : int , keyword_ids : tuple [int , ...], days : int = 120
1084+ ) -> pd .DataFrame :
1085+ """Get app keyword rank history."""
1086+ start_date = (
1087+ datetime .datetime .now (datetime .UTC ) - datetime .timedelta (days = days )
1088+ ).strftime ("%Y-%m-%d" )
1089+ query = sql .app_keywords_history .bindparams (
1090+ bindparam ("keyword_ids" , expanding = True )
1091+ )
1092+ df = pd .read_sql_query (
1093+ query ,
1094+ state .dbcon .engine ,
1095+ params = {
1096+ "store_app_id" : store_app_id ,
1097+ "keyword_ids" : keyword_ids ,
1098+ "start_date" : start_date ,
1099+ },
1100+ )
1101+ return df
0 commit comments