Coverage for mindsdb / integrations / handlers / strava_handler / strava_tables.py: 0%
105 statements
« prev ^ index » next coverage.py v7.13.1, created at 2026-01-21 00:36 +0000
« prev ^ index » next coverage.py v7.13.1, created at 2026-01-21 00:36 +0000
1import pandas as pd
3from typing import List
5from mindsdb.integrations.libs.api_handler import APITable
6from mindsdb.integrations.utilities.sql_utils import extract_comparison_conditions
7from mindsdb.utilities import log
9from mindsdb_sql_parser import ast
12logger = log.getLogger(__name__)
15class StravaAllClubsTable(APITable):
16 """Strava List all Clubs Table implementation"""
18 def select(self, query: ast.Select) -> pd.DataFrame:
19 """Pulls data from the Strava "getLoggedInAthleteClubs" API endpoint
20 Parameters
21 ----------
22 query : ast.Select
23 Given SQL SELECT query
24 Returns
25 -------
26 pd.DataFrame
27 strava "List Athlete Clubs " matching the query
28 Raises
29 ------
30 ValueError
31 If the query contains an unsupported condition
32 """
34 order_by_conditions = {}
36 if query.order_by and len(query.order_by) > 0:
37 order_by_conditions["columns"] = []
38 order_by_conditions["ascending"] = []
40 for an_order in query.order_by:
41 if an_order.field.parts[0] != "id":
42 next
43 if an_order.field.parts[1] in self.get_columns():
44 order_by_conditions["columns"].append(an_order.field.parts[1])
46 if an_order.direction == "ASC":
47 order_by_conditions["ascending"].append(True)
48 else:
49 order_by_conditions["ascending"].append(False)
50 else:
51 raise ValueError(
52 f"Order by unknown column {an_order.field.parts[1]}"
53 )
54 strava_clubs_df = self.call_strava_allclubs_api()
56 selected_columns = []
57 for target in query.targets:
58 if isinstance(target, ast.Star):
59 selected_columns = self.get_columns()
60 break
61 elif isinstance(target, ast.Identifier):
62 selected_columns.append(target.parts[-1])
63 else:
64 raise ValueError(f"Unknown query target {type(target)}")
66 if len(strava_clubs_df) == 0:
67 strava_clubs_df = pd.DataFrame([], columns=selected_columns)
68 else:
69 strava_clubs_df.columns = self.get_columns()
70 for col in set(strava_clubs_df.columns).difference(set(selected_columns)):
71 strava_clubs_df = strava_clubs_df.drop(col, axis=1)
73 if len(order_by_conditions.get("columns", [])) > 0:
74 strava_clubs_df = strava_clubs_df.sort_values(
75 by=order_by_conditions["columns"],
76 ascending=order_by_conditions["ascending"],
77 )
79 if query.limit:
80 strava_clubs_df = strava_clubs_df.head(query.limit.value)
82 return strava_clubs_df
84 def get_columns(self) -> List[str]:
85 """Gets all columns to be returned in pandas DataFrame responses
86 Returns
87 -------
88 List[str]
89 List of columns
90 """
91 return [
92 'id',
93 'name',
94 'sport_type',
95 'city',
96 'state',
97 'country',
98 'member_count',
99 ]
101 def call_strava_allclubs_api(self):
102 """Pulls all the records from the given and returns it select()
104 Returns
105 -------
106 pd.DataFrame of all the records of the "List Athlete Clubs" API end point
107 """
109 clubs = self.handler.connect().get_athlete_clubs()
111 club_cols = self.get_columns()
112 data = []
114 for club in clubs:
115 club_dict = club.dict()
116 data.append([club_dict.get(x) for x in club_cols])
118 all_strava_clubs_df = pd.DataFrame(data, columns=club_cols)
120 return all_strava_clubs_df
123class StravaClubActivitesTable(APITable):
124 """Strava List Club Activities by id Table implementation"""
126 def select(self, query: ast.Select) -> pd.DataFrame:
127 """Pulls data from the Strava "List Club Activities " API endpoint
128 Parameters
129 ----------
130 query : ast.Select
131 Given SQL SELECT query
132 Returns
133 -------
134 pd.DataFrame
135 strava "List Club Activities" matching the query
136 Raises
137 ------
138 ValueError
139 If the query contains an unsupported condition
140 """
141 conditions = extract_comparison_conditions(query.where)
143 order_by_conditions = {}
144 clubs_kwargs = {}
146 if query.order_by and len(query.order_by) > 0:
147 order_by_conditions["columns"] = []
148 order_by_conditions["ascending"] = []
150 for an_order in query.order_by:
151 if an_order.field.parts[0] != "id":
152 next
153 if an_order.field.parts[1] in self.get_columns():
154 order_by_conditions["columns"].append(an_order.field.parts[1])
156 if an_order.direction == "ASC":
157 order_by_conditions["ascending"].append(True)
158 else:
159 order_by_conditions["ascending"].append(False)
160 else:
161 raise ValueError(
162 f"Order by unknown column {an_order.field.parts[1]}"
163 )
165 for a_where in conditions:
166 if a_where[1] == "strava_club_id":
167 if a_where[0] != "=":
168 raise ValueError("Unsupported where operation for strava_club_id ")
169 clubs_kwargs["type"] = a_where[2]
170 else:
171 raise ValueError(f"Unsupported where argument {a_where[1]}")
173 strava_club_activities_df = self.call_strava_clubactivities_api(a_where[2])
175 selected_columns = []
176 for target in query.targets:
177 if isinstance(target, ast.Star):
178 selected_columns = self.get_columns()
179 break
180 elif isinstance(target, ast.Identifier):
181 selected_columns.append(target.parts[-1])
182 else:
183 raise ValueError(f"Unknown query target {type(target)}")
185 if len(strava_club_activities_df) == 0:
186 strava_club_activities_df = pd.DataFrame([], columns=selected_columns)
187 else:
188 strava_club_activities_df.columns = self.get_columns()
189 for col in set(strava_club_activities_df.columns).difference(set(selected_columns)):
190 strava_club_activities_df = strava_club_activities_df.drop(col, axis=1)
192 if len(order_by_conditions.get("columns", [])) > 0:
193 strava_club_activities_df = strava_club_activities_df.sort_values(
194 by=order_by_conditions["columns"],
195 ascending=order_by_conditions["ascending"],
196 )
198 if query.limit:
199 strava_club_activities_df = strava_club_activities_df.head(query.limit.value)
201 return strava_club_activities_df
203 def get_columns(self) -> List[str]:
204 """Gets all columns to be returned in pandas DataFrame responses
205 Returns
206 -------
207 List[str]
208 List of columns
209 """
210 return [
211 'name',
212 'distance',
213 'moving_time',
214 'elapsed_time',
215 'total_elevation_gain',
216 'sport_type',
217 'athlete.firstname',
218 ]
220 def call_strava_clubactivities_api(self, club_id):
221 """Pulls all the records from the given and returns it select()
223 Returns
224 -------
225 pd.DataFrame of all the records of the "getClubActivitiesById" API end point
226 """
228 club_activities = self.handler.connect().get_club_activities(club_id)
230 club_cols = self.get_columns()
231 data = []
233 for club in club_activities:
234 club_dict = club.dict()
235 data.append([club_dict.get(x) for x in club_cols])
237 all_strava_club_activities_df = pd.DataFrame(data, columns=club_cols)
239 return all_strava_club_activities_df