15
15
#
16
16
17
17
import json
18
+ import humps
18
19
from typing import Optional , List , Union
19
20
20
21
from hsfs import util , engine
25
26
class Query :
26
27
def __init__ (
27
28
self ,
28
- feature_store_name ,
29
- feature_store_id ,
30
29
left_feature_group ,
31
30
left_features ,
32
- left_featuregroup_start_time = None ,
33
- left_featuregroup_end_time = None ,
31
+ feature_store_name = None ,
32
+ feature_store_id = None ,
33
+ left_feature_group_start_time = None ,
34
+ left_feature_group_end_time = None ,
35
+ joins = [],
36
+ filter = None ,
34
37
):
35
38
self ._feature_store_name = feature_store_name
36
39
self ._feature_store_id = feature_store_id
37
40
self ._left_feature_group = left_feature_group
38
41
self ._left_features = util .parse_features (left_features )
39
- self ._left_featuregroup_start_time = left_featuregroup_start_time
40
- self ._left_featuregroup_end_time = left_featuregroup_end_time
41
- self ._joins = []
42
- self ._filter = None
42
+ self ._left_feature_group_start_time = left_feature_group_start_time
43
+ self ._left_feature_group_end_time = left_feature_group_end_time
44
+ self ._joins = joins
45
+ self ._filter = filter
43
46
self ._query_constructor_api = query_constructor_api .QueryConstructorApi ()
44
47
self ._storage_connector_api = storage_connector_api .StorageConnectorApi (
45
48
feature_store_id
@@ -155,13 +158,13 @@ def join(
155
158
156
159
def as_of (self , wallclock_time ):
157
160
for join in self ._joins :
158
- join .query .left_featuregroup_end_time = wallclock_time
159
- self .left_featuregroup_end_time = wallclock_time
161
+ join .query .left_feature_group_end_time = wallclock_time
162
+ self .left_feature_group_end_time = wallclock_time
160
163
return self
161
164
162
165
def pull_changes (self , wallclock_start_time , wallclock_end_time ):
163
- self .left_featuregroup_start_time = wallclock_start_time
164
- self .left_featuregroup_end_time = wallclock_end_time
166
+ self .left_feature_group_start_time = wallclock_start_time
167
+ self .left_feature_group_end_time = wallclock_end_time
165
168
return self
166
169
167
170
def filter (self , f : Union [filter .Filter , filter .Logic ]):
@@ -211,14 +214,32 @@ def json(self):
211
214
212
215
def to_dict (self ):
213
216
return {
217
+ "featureStoreName" : self ._feature_store_name ,
218
+ "featureStoreId" : self ._feature_store_id ,
214
219
"leftFeatureGroup" : self ._left_feature_group ,
215
220
"leftFeatures" : self ._left_features ,
216
- "leftFeatureGroupStartTime" : self ._left_featuregroup_start_time ,
217
- "leftFeatureGroupEndTime" : self ._left_featuregroup_end_time ,
221
+ "leftFeatureGroupStartTime" : self ._left_feature_group_start_time ,
222
+ "leftFeatureGroupEndTime" : self ._left_feature_group_end_time ,
218
223
"joins" : self ._joins ,
219
224
"filter" : self ._filter ,
220
225
}
221
226
227
+ @classmethod
228
+ def _hopsworks_json (cls , json_dict ):
229
+ """
230
+ This method is used by the Hopsworks helper job.
231
+ It does not fully deserialize the message as the usecase is to
232
+ send it straight back to Hopsworks to read the content of the query
233
+
234
+ Args:
235
+ json_dict (str): a json string containing a query object
236
+
237
+ Returns:
238
+ A partially deserialize query object
239
+ """
240
+ json_decamelized = humps .decamelize (json_dict )
241
+ return cls (** json_decamelized )
242
+
222
243
def to_string (self , online = False ):
223
244
fs_query_instance = self ._query_constructor_api .construct_query (self )
224
245
return fs_query_instance .query_online if online else fs_query_instance .query
@@ -232,24 +253,25 @@ def _register_on_demand(self, on_demand_fg_aliases):
232
253
233
254
for on_demand_fg_alias in on_demand_fg_aliases :
234
255
engine .get_instance ().register_on_demand_temporary_table (
235
- on_demand_fg_alias .on_demand_feature_group , on_demand_fg_alias .alias ,
256
+ on_demand_fg_alias .on_demand_feature_group ,
257
+ on_demand_fg_alias .alias ,
236
258
)
237
259
238
260
@property
239
- def left_featuregroup_start_time (self ):
240
- return self ._left_featuregroup_start_time
261
+ def left_feature_group_start_time (self ):
262
+ return self ._left_feature_group_start_time
241
263
242
264
@property
243
- def left_featuregroup_end_time (self ):
244
- return self ._left_featuregroup_start_time
265
+ def left_feature_group_end_time (self ):
266
+ return self ._left_feature_group_start_time
245
267
246
- @left_featuregroup_start_time .setter
247
- def left_featuregroup_start_time (self , left_featuregroup_start_time ):
248
- self ._left_featuregroup_start_time = left_featuregroup_start_time
268
+ @left_feature_group_start_time .setter
269
+ def left_feature_group_start_time (self , left_feature_group_start_time ):
270
+ self ._left_feature_group_start_time = left_feature_group_start_time
249
271
250
- @left_featuregroup_end_time .setter
251
- def left_featuregroup_end_time (self , left_featuregroup_start_time ):
252
- self ._left_featuregroup_end_time = left_featuregroup_start_time
272
+ @left_feature_group_end_time .setter
273
+ def left_feature_group_end_time (self , left_feature_group_start_time ):
274
+ self ._left_feature_group_end_time = left_feature_group_start_time
253
275
254
276
def _register_hudi_tables (
255
277
self , hudi_feature_groups , feature_store_id , feature_store_name , read_options
0 commit comments