@@ -185,11 +185,58 @@ def updater(registry_proto: RegistryProto):
185185 == feature_view_proto .spec .name
186186 and existing_feature_view_proto .spec .project == project
187187 ):
188+ # do not update if feature view has not changed; updating will erase tracked materialization intervals
189+ if (
190+ FeatureView .from_proto (existing_feature_view_proto )
191+ == feature_view
192+ ):
193+ return registry_proto
194+ else :
195+ del registry_proto .feature_views [idx ]
196+ registry_proto .feature_views .append (feature_view_proto )
197+ return registry_proto
198+ registry_proto .feature_views .append (feature_view_proto )
199+ return registry_proto
200+
201+ self ._registry_store .update_registry_proto (updater )
202+
203+ def apply_materialization (
204+ self ,
205+ feature_view : FeatureView ,
206+ project : str ,
207+ start_date : datetime ,
208+ end_date : datetime ,
209+ ):
210+ """
211+ Updates materialization intervals tracked for a single feature view in Feast
212+
213+ Args:
214+ feature_view: Feature view that will be updated with an additional materialization interval tracked
215+ project: Feast project that this feature view belongs to
216+ start_date (datetime): Start date of the materialization interval to track
217+ end_date (datetime): End date of the materialization interval to track
218+ """
219+
220+ def updater (registry_proto : RegistryProto ):
221+ for idx , existing_feature_view_proto in enumerate (
222+ registry_proto .feature_views
223+ ):
224+ if (
225+ existing_feature_view_proto .spec .name == feature_view .name
226+ and existing_feature_view_proto .spec .project == project
227+ ):
228+ existing_feature_view = FeatureView .from_proto (
229+ existing_feature_view_proto
230+ )
231+ existing_feature_view .materialization_intervals .append (
232+ (start_date , end_date )
233+ )
234+ feature_view_proto = existing_feature_view .to_proto ()
235+ feature_view_proto .spec .project = project
188236 del registry_proto .feature_views [idx ]
189237 registry_proto .feature_views .append (feature_view_proto )
190238 return registry_proto
191- registry_proto .feature_views .append (feature_view_proto )
192- return registry_proto
239+ raise FeatureViewNotFoundException (feature_view .name , project )
193240
194241 self ._registry_store .update_registry_proto (updater )
195242
@@ -249,7 +296,7 @@ def get_feature_table(self, name: str, project: str) -> FeatureTable:
249296 and feature_table_proto .spec .project == project
250297 ):
251298 return FeatureTable .from_proto (feature_table_proto )
252- raise FeatureTableNotFoundException (project , name )
299+ raise FeatureTableNotFoundException (name , project )
253300
254301 def get_feature_view (self , name : str , project : str ) -> FeatureView :
255302 """
@@ -291,7 +338,7 @@ def updater(registry_proto: RegistryProto):
291338 ):
292339 del registry_proto .feature_tables [idx ]
293340 return registry_proto
294- raise FeatureTableNotFoundException (project , name )
341+ raise FeatureTableNotFoundException (name , project )
295342
296343 self ._registry_store .update_registry_proto (updater )
297344 return
0 commit comments