forked from feast-dev/feast
-
Notifications
You must be signed in to change notification settings - Fork 0
/
request_feature_view.py
132 lines (113 loc) · 4.54 KB
/
request_feature_view.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
import copy
import warnings
from typing import Dict, List, Optional, Type
from feast.base_feature_view import BaseFeatureView
from feast.data_source import RequestSource
from feast.feature import Feature
from feast.feature_view_projection import FeatureViewProjection
from feast.protos.feast.core.RequestFeatureView_pb2 import (
RequestFeatureView as RequestFeatureViewProto,
)
from feast.protos.feast.core.RequestFeatureView_pb2 import RequestFeatureViewSpec
from feast.usage import log_exceptions
class RequestFeatureView(BaseFeatureView):
"""
[Experimental] A RequestFeatureView defines a logical group of features that should
be available as an input to an on demand feature view at request time.
Attributes:
name: The unique name of the request feature view.
request_source: The request source that specifies the schema and
features of the request feature view.
features: The list of features defined as part of this request feature view.
description: A human-readable description.
tags: A dictionary of key-value pairs to store arbitrary metadata.
owner: The owner of the request feature view, typically the email of the primary
maintainer.
"""
name: str
request_source: RequestSource
features: List[Feature]
description: str
tags: Dict[str, str]
owner: str
@log_exceptions
def __init__(
self,
name: str,
request_data_source: RequestSource,
description: str = "",
tags: Optional[Dict[str, str]] = None,
owner: str = "",
):
"""
Creates a RequestFeatureView object.
Args:
name: The unique name of the request feature view.
request_data_source: The request data source that specifies the schema and
features of the request feature view.
description (optional): A human-readable description.
tags (optional): A dictionary of key-value pairs to store arbitrary metadata.
owner (optional): The owner of the request feature view, typically the email
of the primary maintainer.
"""
warnings.warn(
"Request feature view is deprecated. "
"Please use request data source instead",
DeprecationWarning,
)
super().__init__(
name=name,
features=[
Feature(name=name, dtype=dtype)
for name, dtype in request_data_source.schema.items()
],
description=description,
tags=tags,
owner=owner,
)
self.request_source = request_data_source
@property
def proto_class(self) -> Type[RequestFeatureViewProto]:
return RequestFeatureViewProto
def to_proto(self) -> RequestFeatureViewProto:
"""
Converts an request feature view object to its protobuf representation.
Returns:
A RequestFeatureViewProto protobuf.
"""
spec = RequestFeatureViewSpec(
name=self.name,
request_data_source=self.request_source.to_proto(),
description=self.description,
tags=self.tags,
owner=self.owner,
)
return RequestFeatureViewProto(spec=spec)
@classmethod
def from_proto(cls, request_feature_view_proto: RequestFeatureViewProto):
"""
Creates a request feature view from a protobuf representation.
Args:
request_feature_view_proto: A protobuf representation of an request feature view.
Returns:
A RequestFeatureView object based on the request feature view protobuf.
"""
request_feature_view_obj = cls(
name=request_feature_view_proto.spec.name,
request_data_source=RequestSource.from_proto(
request_feature_view_proto.spec.request_data_source
),
description=request_feature_view_proto.spec.description,
tags=dict(request_feature_view_proto.spec.tags),
owner=request_feature_view_proto.spec.owner,
)
# FeatureViewProjections are not saved in the RequestFeatureView proto.
# Create the default projection.
request_feature_view_obj.projection = FeatureViewProjection.from_definition(
request_feature_view_obj
)
return request_feature_view_obj
def __copy__(self):
fv = RequestFeatureView(name=self.name, request_data_source=self.request_source)
fv.projection = copy.copy(self.projection)
return fv