| 888 | |
| 889 | |
| 890 | def _get_entity_maps( |
| 891 | registry, |
| 892 | project, |
| 893 | feature_views, |
| 894 | ) -> Tuple[Dict[str, str], Dict[str, ValueType], Set[str]]: |
| 895 | # TODO(felixwang9817): Support entities that have different types for different feature views. |
| 896 | entities = registry.list_entities(project, allow_cache=True) |
| 897 | |
| 898 | entity_by_name: Dict[str, "Entity"] = {entity.name: entity for entity in entities} |
| 899 | |
| 900 | entity_name_to_join_key_map: Dict[str, str] = {} |
| 901 | entity_type_map: Dict[str, ValueType] = {} |
| 902 | for entity in entities: |
| 903 | entity_name_to_join_key_map[entity.name] = entity.join_key |
| 904 | for feature_view in feature_views: |
| 905 | for entity_name in feature_view.entities: |
| 906 | entity = entity_by_name.get(entity_name) |
| 907 | if entity is None: |
| 908 | from feast.errors import EntityNotFoundException |
| 909 | |
| 910 | raise EntityNotFoundException(entity_name, project=project) |
| 911 | # User directly uses join_key as the entity reference in the entity_rows for the |
| 912 | # entity mapping case. |
| 913 | entity_name = feature_view.projection.join_key_map.get( |
| 914 | entity.join_key, entity.name |
| 915 | ) |
| 916 | join_key = feature_view.projection.join_key_map.get( |
| 917 | entity.join_key, entity.join_key |
| 918 | ) |
| 919 | entity_name_to_join_key_map[entity_name] = join_key |
| 920 | |
| 921 | for entity_column in feature_view.entity_columns: |
| 922 | dtype = entity_column.dtype.to_value_type() |
| 923 | entity_join_key_column_name = feature_view.projection.join_key_map.get( |
| 924 | entity_column.name, entity_column.name |
| 925 | ) |
| 926 | entity_type_map[entity_join_key_column_name] = dtype |
| 927 | |
| 928 | return ( |
| 929 | entity_name_to_join_key_map, |
| 930 | entity_type_map, |
| 931 | set(entity_name_to_join_key_map.values()), |
| 932 | ) |
| 933 | |
| 934 | |
| 935 | def _get_table_entity_values( |