diff --git a/sdk/python/feast/big_query_source.py b/sdk/python/feast/big_query_source.py new file mode 100644 index 0000000000..5fe3df1bd2 --- /dev/null +++ b/sdk/python/feast/big_query_source.py @@ -0,0 +1,37 @@ +# Copyright 2019 The Feast Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from typing import Dict, Optional + + +class BigQuerySource: + """ + Represents a BigQuery table reference or BigQuery query that returns a set of features. + """ + + def __init__( + self, + table_ref: Optional[str], + event_timestamp_column: str, + created_timestamp_column: Optional[str], + field_mapping: Optional[Dict[str, str]], + query: Optional[str], + ): + if (table_ref is None) != (query is None): + raise Exception("Exactly one of table_ref and query should be specified") + self.table_ref = table_ref + self.event_timestamp_column = event_timestamp_column + self.created_timestamp_column = created_timestamp_column + self.field_mapping = field_mapping + self.query = query + return diff --git a/sdk/python/feast/feature_store.py b/sdk/python/feast/feature_store.py new file mode 100644 index 0000000000..aea899e1ab --- /dev/null +++ b/sdk/python/feast/feature_store.py @@ -0,0 +1,34 @@ +# Copyright 2019 The Feast Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from typing import Optional + +from feast.feature_store_config import Config + + +class FeatureStore: + """ + A FeatureStore object is used to define, create, and retrieve features. + """ + + def __init__( + self, config_path: Optional[str], config: Optional[Config], + ): + if config_path is None or config is None: + raise Exception("You cannot specify both config_path and config") + if config is not None: + self.config = config + elif config_path is not None: + self.config = Config.from_path(config_path) + else: + self.config = Config() diff --git a/sdk/python/feast/feature_store_config.py b/sdk/python/feast/feature_store_config.py new file mode 100644 index 0000000000..b26d1e0bd5 --- /dev/null +++ b/sdk/python/feast/feature_store_config.py @@ -0,0 +1,53 @@ +# Copyright 2019 The Feast Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from typing import Optional + +import yaml + + +class Config: + """ + Configuration object that contains all possible configuration options for a FeatureStore. + """ + + def __init__( + self, + provider: Optional[str], + online_store: Optional[str], + metadata_store: Optional[str], + ): + self.provider = provider if (provider is not None) else "local" + self.online_store = online_store if (online_store is not None) else "local" + self.metadata_store = ( + metadata_store if (metadata_store is not None) else "./metadata_store" + ) + + @classmethod + def from_path(cls, config_path: str): + """ + Construct the configuration object from a filepath containing a yaml file. + + Example yaml file: + + provider: gcp + online_store: firestore + metadata_store: gs://my_bucket/metadata_store + """ + with open(config_path, "r") as f: + config_dict = yaml.safe_load(f) + return cls( + provider=config_dict.get("provider"), + online_store=config_dict.get("online_store"), + metadata_store=config_dict.get("metadata_store"), + ) diff --git a/sdk/python/feast/feature_view.py b/sdk/python/feast/feature_view.py new file mode 100644 index 0000000000..1047678dca --- /dev/null +++ b/sdk/python/feast/feature_view.py @@ -0,0 +1,46 @@ +# Copyright 2019 The Feast Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from datetime import datetime +from typing import Dict, List + +from feast.big_query_source import BigQuerySource +from feast.entity import Entity +from feast.feature import Feature + + +class FeatureView: + """ + A FeatureView defines a logical grouping of servable features. + """ + + def __init__( + self, + name: str, + entities: List[Entity], + features: List[Feature], + tags: Dict[str, str], + ttl: str, + online: bool, + inputs: BigQuerySource, + feature_start_time: datetime, + ): + self.name = name + self.entities = entities + self.features = features + self.tags = tags + self.ttl = ttl + self.online = online + self.inputs = inputs + self.feature_start_time = feature_start_time + return