@@ -31,11 +31,11 @@ def py_path_to_module(path: Path, repo_root: Path) -> str:
3131
3232
3333class ParsedRepo (NamedTuple ):
34- feature_tables : List [FeatureTable ]
35- feature_views : List [FeatureView ]
36- on_demand_feature_views : List [OnDemandFeatureView ]
37- entities : List [Entity ]
38- feature_services : List [FeatureService ]
34+ feature_tables : Set [FeatureTable ]
35+ feature_views : Set [FeatureView ]
36+ on_demand_feature_views : Set [OnDemandFeatureView ]
37+ entities : Set [Entity ]
38+ feature_services : Set [FeatureService ]
3939
4040
4141def read_feastignore (repo_root : Path ) -> List [str ]:
@@ -94,11 +94,11 @@ def get_repo_files(repo_root: Path) -> List[Path]:
9494def parse_repo (repo_root : Path ) -> ParsedRepo :
9595 """ Collect feature table definitions from feature repo """
9696 res = ParsedRepo (
97- feature_tables = [] ,
98- entities = [] ,
99- feature_views = [] ,
100- feature_services = [] ,
101- on_demand_feature_views = [] ,
97+ feature_tables = set () ,
98+ entities = set () ,
99+ feature_views = set () ,
100+ feature_services = set () ,
101+ on_demand_feature_views = set () ,
102102 )
103103
104104 for repo_file in get_repo_files (repo_root ):
@@ -107,25 +107,15 @@ def parse_repo(repo_root: Path) -> ParsedRepo:
107107 for attr_name in dir (module ):
108108 obj = getattr (module , attr_name )
109109 if isinstance (obj , FeatureTable ):
110- assert obj .defined_in is not None
111- if obj .defined_in == module .__file__ :
112- res .feature_tables .append (obj )
110+ res .feature_tables .add (obj )
113111 if isinstance (obj , FeatureView ):
114- assert obj .defined_in is not None
115- if obj .defined_in == module .__file__ :
116- res .feature_views .append (obj )
112+ res .feature_views .add (obj )
117113 elif isinstance (obj , Entity ):
118- assert obj .defined_in is not None
119- if obj .defined_in == module .__file__ :
120- res .entities .append (obj )
114+ res .entities .add (obj )
121115 elif isinstance (obj , FeatureService ):
122- assert obj .defined_in is not None
123- if obj .defined_in == module .__file__ :
124- res .feature_services .append (obj )
116+ res .feature_services .add (obj )
125117 elif isinstance (obj , OnDemandFeatureView ):
126- assert obj .defined_in is not None
127- if obj .defined_in == module .__file__ :
128- res .on_demand_feature_views .append (obj )
118+ res .on_demand_feature_views .add (obj )
129119 return res
130120
131121
@@ -146,7 +136,7 @@ def apply_total(repo_config: RepoConfig, repo_path: Path, skip_source_validation
146136 registry ._initialize_registry ()
147137 sys .dont_write_bytecode = True
148138 repo = parse_repo (repo_path )
149- _validate_feature_views (repo .feature_views )
139+ _validate_feature_views (list ( repo .feature_views ) )
150140
151141 if not skip_source_validation :
152142 data_sources = [t .batch_source for t in repo .feature_views ]
@@ -259,8 +249,8 @@ def apply_total(repo_config: RepoConfig, repo_path: Path, skip_source_validation
259249 project ,
260250 tables_to_delete = all_to_delete ,
261251 tables_to_keep = all_to_keep ,
262- entities_to_delete = entities_to_delete ,
263- entities_to_keep = entities_to_keep ,
252+ entities_to_delete = list ( entities_to_delete ) ,
253+ entities_to_keep = list ( entities_to_keep ) ,
264254 partial = False ,
265255 )
266256
@@ -270,63 +260,63 @@ def apply_total(repo_config: RepoConfig, repo_path: Path, skip_source_validation
270260
271261def _tag_registry_entities_for_keep_delete (
272262 project : str , registry : Registry , repo : ParsedRepo
273- ) -> Tuple [List [Entity ], List [Entity ]]:
274- entities_to_keep : List [Entity ] = repo .entities
275- entities_to_delete : List [Entity ] = []
263+ ) -> Tuple [Set [Entity ], Set [Entity ]]:
264+ entities_to_keep : Set [Entity ] = repo .entities
265+ entities_to_delete : Set [Entity ] = set ()
276266 repo_entities_names = set ([e .name for e in repo .entities ])
277267 for registry_entity in registry .list_entities (project = project ):
278268 if registry_entity .name not in repo_entities_names :
279- entities_to_delete .append (registry_entity )
269+ entities_to_delete .add (registry_entity )
280270 return entities_to_keep , entities_to_delete
281271
282272
283273def _tag_registry_views_for_keep_delete (
284274 project : str , registry : Registry , repo : ParsedRepo
285- ) -> Tuple [List [FeatureView ], List [FeatureView ]]:
286- views_to_keep : List [FeatureView ] = repo .feature_views
287- views_to_delete : List [FeatureView ] = []
275+ ) -> Tuple [Set [FeatureView ], Set [FeatureView ]]:
276+ views_to_keep : Set [FeatureView ] = repo .feature_views
277+ views_to_delete : Set [FeatureView ] = set ()
288278 repo_feature_view_names = set (t .name for t in repo .feature_views )
289279 for registry_view in registry .list_feature_views (project = project ):
290280 if registry_view .name not in repo_feature_view_names :
291- views_to_delete .append (registry_view )
281+ views_to_delete .add (registry_view )
292282 return views_to_keep , views_to_delete
293283
294284
295285def _tag_registry_on_demand_feature_views_for_keep_delete (
296286 project : str , registry : Registry , repo : ParsedRepo
297- ) -> Tuple [List [OnDemandFeatureView ], List [OnDemandFeatureView ]]:
298- odfvs_to_keep : List [OnDemandFeatureView ] = repo .on_demand_feature_views
299- odfvs_to_delete : List [OnDemandFeatureView ] = []
287+ ) -> Tuple [Set [OnDemandFeatureView ], Set [OnDemandFeatureView ]]:
288+ odfvs_to_keep : Set [OnDemandFeatureView ] = repo .on_demand_feature_views
289+ odfvs_to_delete : Set [OnDemandFeatureView ] = set ()
300290 repo_on_demand_feature_view_names = set (
301291 t .name for t in repo .on_demand_feature_views
302292 )
303293 for registry_odfv in registry .list_on_demand_feature_views (project = project ):
304294 if registry_odfv .name not in repo_on_demand_feature_view_names :
305- odfvs_to_delete .append (registry_odfv )
295+ odfvs_to_delete .add (registry_odfv )
306296 return odfvs_to_keep , odfvs_to_delete
307297
308298
309299def _tag_registry_tables_for_keep_delete (
310300 project : str , registry : Registry , repo : ParsedRepo
311- ) -> Tuple [List [FeatureTable ], List [FeatureTable ]]:
312- tables_to_keep : List [FeatureTable ] = repo .feature_tables
313- tables_to_delete : List [FeatureTable ] = []
301+ ) -> Tuple [Set [FeatureTable ], Set [FeatureTable ]]:
302+ tables_to_keep : Set [FeatureTable ] = repo .feature_tables
303+ tables_to_delete : Set [FeatureTable ] = set ()
314304 repo_table_names = set (t .name for t in repo .feature_tables )
315305 for registry_table in registry .list_feature_tables (project = project ):
316306 if registry_table .name not in repo_table_names :
317- tables_to_delete .append (registry_table )
307+ tables_to_delete .add (registry_table )
318308 return tables_to_keep , tables_to_delete
319309
320310
321311def _tag_registry_services_for_keep_delete (
322312 project : str , registry : Registry , repo : ParsedRepo
323- ) -> Tuple [List [FeatureService ], List [FeatureService ]]:
324- services_to_keep : List [FeatureService ] = repo .feature_services
325- services_to_delete : List [FeatureService ] = []
313+ ) -> Tuple [Set [FeatureService ], Set [FeatureService ]]:
314+ services_to_keep : Set [FeatureService ] = repo .feature_services
315+ services_to_delete : Set [FeatureService ] = set ()
326316 repo_feature_service_names = set (t .name for t in repo .feature_services )
327317 for registry_service in registry .list_feature_services (project = project ):
328318 if registry_service .name not in repo_feature_service_names :
329- services_to_delete .append (registry_service )
319+ services_to_delete .add (registry_service )
330320 return services_to_keep , services_to_delete
331321
332322
0 commit comments