@@ -231,6 +231,61 @@ def test_on_demand_feature_view_lineage(self):
231231 assert isinstance (relationships , list )
232232 assert isinstance (indirect_relationships , list )
233233
234+ def test_on_demand_feature_view_entity_relationships (self ):
235+ """Test entity relationships with on-demand feature views."""
236+ registry = Registry ()
237+
238+ # Create entities
239+ entity1_spec = EntitySpecV2 (name = "user_id" )
240+ entity1 = Entity (spec = entity1_spec )
241+
242+ entity2_spec = EntitySpecV2 (name = "dummy" )
243+ entity2 = Entity (spec = entity2_spec )
244+
245+ registry .entities .extend ([entity1 , entity2 ])
246+
247+ # Create on-demand feature view with entities
248+ odfv_spec = OnDemandFeatureViewSpec (name = "transformed_features" )
249+ odfv_spec .entities .append ("user_id" )
250+ odfv_spec .entities .append ("dummy" )
251+ odfv = OnDemandFeatureView (spec = odfv_spec )
252+ registry .on_demand_feature_views .append (odfv )
253+
254+ # Generate lineage
255+ lineage_generator = RegistryLineageGenerator ()
256+ direct_relationships , indirect_relationships = (
257+ lineage_generator .generate_lineage (registry )
258+ )
259+
260+ # Filter Entity -> OnDemandFeatureView relationships
261+ entity_to_odfv_relationships = [
262+ rel
263+ for rel in direct_relationships
264+ if rel .source .type == FeastObjectType .ENTITY
265+ and rel .target .type == FeastObjectType .FEATURE_VIEW
266+ and rel .target .name == "transformed_features"
267+ ]
268+
269+ # Should have 2 relationships: user_id -> transformed_features, dummy -> transformed_features
270+ assert len (entity_to_odfv_relationships ) == 2
271+
272+ # Check specific relationships
273+ relationship_pairs = {
274+ (rel .source .name , rel .target .name ) for rel in entity_to_odfv_relationships
275+ }
276+
277+ expected_pairs = {
278+ ("user_id" , "transformed_features" ),
279+ ("dummy" , "transformed_features" ),
280+ }
281+
282+ assert relationship_pairs == expected_pairs
283+
284+ # Test relationship types
285+ for rel in entity_to_odfv_relationships :
286+ assert rel .source .type == FeastObjectType .ENTITY
287+ assert rel .target .type == FeastObjectType .FEATURE_VIEW
288+
234289 def test_stream_feature_view_lineage (self ):
235290 """Test lineage with stream feature views."""
236291 registry = Registry ()
0 commit comments