Skip to content

Commit af47911

Browse files
Merge branch 'master' into featureview-versioning
2 parents 903bda5 + 088a802 commit af47911

File tree

85 files changed

+15549
-17223
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

85 files changed

+15549
-17223
lines changed

.secrets.baseline

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -934,7 +934,7 @@
934934
"filename": "infra/feast-operator/api/v1/featurestore_types.go",
935935
"hashed_secret": "44e17306b837162269a410204daaa5ecee4ec22c",
936936
"is_verified": false,
937-
"line_number": 726
937+
"line_number": 729
938938
}
939939
],
940940
"infra/feast-operator/api/v1/zz_generated.deepcopy.go": [
@@ -943,21 +943,21 @@
943943
"filename": "infra/feast-operator/api/v1/zz_generated.deepcopy.go",
944944
"hashed_secret": "f914fc9324de1bec1ad13dec94a8ea2ddb41fc87",
945945
"is_verified": false,
946-
"line_number": 681
946+
"line_number": 686
947947
},
948948
{
949949
"type": "Secret Keyword",
950950
"filename": "infra/feast-operator/api/v1/zz_generated.deepcopy.go",
951951
"hashed_secret": "44e17306b837162269a410204daaa5ecee4ec22c",
952952
"is_verified": false,
953-
"line_number": 1249
953+
"line_number": 1254
954954
},
955955
{
956956
"type": "Secret Keyword",
957957
"filename": "infra/feast-operator/api/v1/zz_generated.deepcopy.go",
958958
"hashed_secret": "c2028031c154bbe86fd69bef740855c74b927dcf",
959959
"is_verified": false,
960-
"line_number": 1254
960+
"line_number": 1259
961961
}
962962
],
963963
"infra/feast-operator/api/v1alpha1/featurestore_types.go": [
@@ -966,7 +966,7 @@
966966
"filename": "infra/feast-operator/api/v1alpha1/featurestore_types.go",
967967
"hashed_secret": "44e17306b837162269a410204daaa5ecee4ec22c",
968968
"is_verified": false,
969-
"line_number": 647
969+
"line_number": 649
970970
}
971971
],
972972
"infra/feast-operator/api/v1alpha1/zz_generated.deepcopy.go": [
@@ -975,21 +975,21 @@
975975
"filename": "infra/feast-operator/api/v1alpha1/zz_generated.deepcopy.go",
976976
"hashed_secret": "f914fc9324de1bec1ad13dec94a8ea2ddb41fc87",
977977
"is_verified": false,
978-
"line_number": 590
978+
"line_number": 595
979979
},
980980
{
981981
"type": "Secret Keyword",
982982
"filename": "infra/feast-operator/api/v1alpha1/zz_generated.deepcopy.go",
983983
"hashed_secret": "44e17306b837162269a410204daaa5ecee4ec22c",
984984
"is_verified": false,
985-
"line_number": 1098
985+
"line_number": 1103
986986
},
987987
{
988988
"type": "Secret Keyword",
989989
"filename": "infra/feast-operator/api/v1alpha1/zz_generated.deepcopy.go",
990990
"hashed_secret": "c2028031c154bbe86fd69bef740855c74b927dcf",
991991
"is_verified": false,
992-
"line_number": 1103
992+
"line_number": 1108
993993
}
994994
],
995995
"infra/feast-operator/config/samples/v1_featurestore_db_persistence.yaml": [
@@ -1539,5 +1539,5 @@
15391539
}
15401540
]
15411541
},
1542-
"generated_at": "2026-03-05T15:25:10Z"
1542+
"generated_at": "2026-03-14T16:01:28Z"
15431543
}

docs/SUMMARY.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@
9898
* [Trino (contrib)](reference/data-sources/trino.md)
9999
* [Azure Synapse + Azure SQL (contrib)](reference/data-sources/mssql.md)
100100
* [Couchbase (contrib)](reference/data-sources/couchbase.md)
101+
* [Oracle (contrib)](reference/data-sources/oracle.md)
101102
* [Offline stores](reference/offline-stores/README.md)
102103
* [Overview](reference/offline-stores/overview.md)
103104
* [Dask](reference/offline-stores/dask.md)
@@ -112,6 +113,7 @@
112113
* [Azure Synapse + Azure SQL (contrib)](reference/offline-stores/mssql.md)
113114
* [Clickhouse (contrib)](reference/offline-stores/clickhouse.md)
114115
* [Ray (contrib)](reference/offline-stores/ray.md)
116+
* [Oracle (contrib)](reference/offline-stores/oracle.md)
115117
* [Remote Offline](reference/offline-stores/remote-offline-store.md)
116118
* [Online stores](reference/online-stores/README.md)
117119
* [Overview](reference/online-stores/overview.md)

docs/getting-started/concepts/feast-types.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@ Feast's type system is built on top of [protobuf](https://github.com/protocolbuf
88
Feast supports the following categories of data types:
99

1010
- **Primitive types**: numerical values (`Int32`, `Int64`, `Float32`, `Float64`), `String`, `Bytes`, `Bool`, and `UnixTimestamp`.
11+
- **Domain-specific primitives**: `PdfBytes` (PDF binary data for RAG/document pipelines) and `ImageBytes` (image binary data for multimodal pipelines). These are semantic aliases over `Bytes` and must be explicitly declared in schema — no backend infers them.
1112
- **Array types**: ordered lists of any primitive type, e.g. `Array(Int64)`, `Array(String)`.
12-
- **Set types**: unordered collections of unique values for any primitive type, e.g. `Set(String)`, `Set(Int64)`.
13+
- **Set types**: unordered collections of unique values for any primitive type, e.g. `Set(String)`, `Set(Int64)`. Set types are not inferred by any backend and must be explicitly declared. They are best suited for online serving use cases.
1314
- **Map types**: dictionary-like structures with string keys and values that can be any supported Feast type (including nested maps), e.g. `Map`, `Array(Map)`.
1415
- **JSON type**: opaque JSON data stored as a string at the proto level but semantically distinct from `String` — backends use native JSON types (`jsonb`, `VARIANT`, etc.), e.g. `Json`, `Array(Json)`.
1516
- **Struct type**: schema-aware structured type with named, typed fields. Unlike `Map` (which is schema-free), a `Struct` declares its field names and their types, enabling schema validation, e.g. `Struct({"name": String, "age": Int32})`.

docs/reference/data-sources/README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,3 +57,7 @@ Please see [Data Source](../../getting-started/concepts/data-ingestion.md) for a
5757
{% content-ref url="clickhouse.md" %}
5858
[clickhouse.md](clickhouse.md)
5959
{% endcontent-ref %}
60+
61+
{% content-ref url="oracle.md" %}
62+
[oracle.md](oracle.md)
63+
{% endcontent-ref %}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# Oracle source (contrib)
2+
3+
## Description
4+
5+
Oracle data sources are Oracle database tables.
6+
These are specified by a table reference (e.g. `"TRANSACTION_FEATURES"` or `"SCHEMA.TABLE"`).
7+
8+
## Disclaimer
9+
10+
The Oracle data source does not achieve full test coverage.
11+
Please do not assume complete stability.
12+
13+
## Examples
14+
15+
Defining an Oracle source:
16+
17+
```python
18+
from feast.infra.offline_stores.contrib.oracle_offline_store.oracle_source import (
19+
OracleSource,
20+
)
21+
22+
driver_stats_source = OracleSource(
23+
name="driver_hourly_stats",
24+
table_ref="DRIVER_HOURLY_STATS",
25+
event_timestamp_column="EVENT_TIMESTAMP",
26+
created_timestamp_column="CREATED",
27+
)
28+
```
29+
30+
**Note:** Oracle stores unquoted identifiers in uppercase. Reference columns using the casing shown by Oracle (e.g. `USER_ID` for unquoted identifiers).
31+
32+
## Supported Types
33+
34+
Oracle data sources support standard Oracle numeric, string, date, and timestamp types mapped through the ibis Oracle backend.
35+
For a comparison against other batch data sources, please see [here](overview.md#functionality-matrix).
36+

docs/reference/data-sources/overview.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
In Feast, each batch data source is associated with corresponding offline stores.
66
For example, a `SnowflakeSource` can only be processed by the Snowflake offline store, while a `FileSource` can be processed by both File and DuckDB offline stores.
77
Otherwise, the primary difference between batch data sources is the set of supported types.
8-
Feast has an internal type system, and aims to support eight primitive types (`bytes`, `string`, `int32`, `int64`, `float32`, `float64`, `bool`, and `timestamp`) along with the corresponding array types.
8+
Feast has an internal type system that supports primitive types (`bytes`, `string`, `int32`, `int64`, `float32`, `float64`, `bool`, `timestamp`), array types, set types, map/JSON types, and struct types.
99
However, not every batch data source supports all of these types.
1010

1111
For more details on the Feast type system, see [here](../type-system.md).
@@ -29,3 +29,9 @@ Below is a matrix indicating which data sources support which types.
2929
| `bool` | yes | yes | yes | yes | yes | yes | yes | yes |
3030
| `timestamp` | yes | yes | yes | yes | yes | yes | yes | yes |
3131
| array types | yes | yes | yes | no | yes | yes | yes | no |
32+
| `Map` | yes | no | yes | yes | yes | yes | yes | no |
33+
| `Json` | yes | yes | yes | yes | yes | no | no | no |
34+
| `Struct` | yes | yes | no | no | yes | yes | no | no |
35+
| set types | yes* | no | no | no | no | no | no | no |
36+
37+
\* **Set types** are defined in Feast's proto and Python type system but are **not inferred** by any backend. They must be explicitly declared in the feature view schema and are best suited for online serving use cases. See [Type System](../type-system.md#set-types) for details.

docs/reference/offline-stores/README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,3 +49,7 @@ Please see [Offline Store](../../getting-started/components/offline-store.md) fo
4949
{% content-ref url="ray.md" %}
5050
[ray.md](ray.md)
5151
{% endcontent-ref %}
52+
53+
{% content-ref url="oracle.md" %}
54+
[oracle.md](oracle.md)
55+
{% endcontent-ref %}
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
# Oracle offline store (contrib)
2+
3+
## Description
4+
5+
The Oracle offline store provides support for reading [OracleSources](../data-sources/oracle.md).
6+
* Entity dataframes can be provided as a SQL query or as a Pandas dataframe.
7+
* Uses the [ibis](https://ibis-project.org/) Oracle backend (`ibis.oracle`) for all database interactions.
8+
* Only one of `service_name`, `sid`, or `dsn` may be set in the configuration.
9+
10+
## Disclaimer
11+
12+
The Oracle offline store does not achieve full test coverage.
13+
Please do not assume complete stability.
14+
15+
## Getting started
16+
17+
Install the Oracle extras:
18+
19+
```bash
20+
pip install 'feast[oracle]'
21+
```
22+
23+
## Example
24+
25+
{% code title="feature_store.yaml" %}
26+
```yaml
27+
project: my_project
28+
registry: data/registry.db
29+
provider: local
30+
offline_store:
31+
type: oracle
32+
host: DB_HOST
33+
port: 1521
34+
user: DB_USERNAME
35+
password: DB_PASSWORD
36+
service_name: ORCL
37+
online_store:
38+
path: data/online_store.db
39+
```
40+
{% endcode %}
41+
42+
Connection can alternatively use `sid` or `dsn` instead of `service_name`:
43+
44+
```yaml
45+
# Using SID
46+
offline_store:
47+
type: oracle
48+
host: DB_HOST
49+
port: 1521
50+
user: DB_USERNAME
51+
password: DB_PASSWORD
52+
sid: ORCL
53+
54+
# Using DSN
55+
offline_store:
56+
type: oracle
57+
host: DB_HOST
58+
port: 1521
59+
user: DB_USERNAME
60+
password: DB_PASSWORD
61+
dsn: "(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=DB_HOST)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL)))"
62+
```
63+
64+
### Configuration reference
65+
66+
| Parameter | Required | Default | Description |
67+
| :------------- | :------- | :---------- | :------------------------------------------------------- |
68+
| `type` | yes | — | Must be set to `oracle` |
69+
| `user` | yes | — | Oracle database user |
70+
| `password` | yes | — | Oracle database password |
71+
| `host` | no | `localhost` | Oracle database host |
72+
| `port` | no | `1521` | Oracle database port |
73+
| `service_name` | no | — | Oracle service name (mutually exclusive with sid and dsn) |
74+
| `sid` | no | — | Oracle SID (mutually exclusive with service_name and dsn) |
75+
| `database` | no | — | Oracle database name |
76+
| `dsn` | no | — | Oracle DSN string (mutually exclusive with service_name and sid) |
77+
78+
## Functionality Matrix
79+
80+
The set of functionality supported by offline stores is described in detail [here](overview.md#functionality).
81+
Below is a matrix indicating which functionality is supported by the Oracle offline store.
82+
83+
| | Oracle |
84+
| :----------------------------------------------------------------- | :----- |
85+
| `get_historical_features` (point-in-time correct join) | yes |
86+
| `pull_latest_from_table_or_query` (retrieve latest feature values) | yes |
87+
| `pull_all_from_table_or_query` (retrieve a saved dataset) | yes |
88+
| `offline_write_batch` (persist dataframes to offline store) | yes |
89+
| `write_logged_features` (persist logged features to offline store) | yes |
90+
91+
Below is a matrix indicating which functionality is supported by `OracleRetrievalJob`.
92+
93+
| | Oracle |
94+
| ----------------------------------------------------- | ------ |
95+
| export to dataframe | yes |
96+
| export to arrow table | yes |
97+
| export to arrow batches | no |
98+
| export to SQL | no |
99+
| export to data lake (S3, GCS, etc.) | no |
100+
| export to data warehouse | no |
101+
| export as Spark dataframe | no |
102+
| local execution of Python-based on-demand transforms | yes |
103+
| remote execution of Python-based on-demand transforms | no |
104+
| persist results in the offline store | yes |
105+
| preview the query plan before execution | no |
106+
| read partitioned data | no |
107+
108+
To compare this set of functionality against other offline stores, please see the full [functionality matrix](overview.md#functionality-matrix).
109+

0 commit comments

Comments
 (0)