diff --git a/core/src/main/java/feast/core/service/SpecService.java b/core/src/main/java/feast/core/service/SpecService.java index 4ea2d288f2e..31040063fa1 100644 --- a/core/src/main/java/feast/core/service/SpecService.java +++ b/core/src/main/java/feast/core/service/SpecService.java @@ -136,8 +136,8 @@ public GetFeatureSetResponse getFeatureSet(GetFeatureSetRequest request) * Get featureSets matching the feature name and version provided in the filter. If the feature * name is not provided, the method will return all featureSets currently registered to Feast. * - *

The feature set name in the filter accepts any valid regex string. All matching featureSets - * will be returned. + *

The feature set name in the filter accepts an asterisk as a wildcard. All matching + * featureSets will be returned. * *

The version filter is optional; If not provided, this method will return all featureSet * versions of the featureSet name provided. Valid version filters should optionally contain a diff --git a/protos/feast/core/CoreService.proto b/protos/feast/core/CoreService.proto index 2e0646e9730..0ffbb7edfb5 100644 --- a/protos/feast/core/CoreService.proto +++ b/protos/feast/core/CoreService.proto @@ -58,11 +58,28 @@ service CoreService { // // If the changes are valid, core will return the given store configuration in response, and // start or update the necessary feature population jobs for the updated store. - rpc UpdateStore(UpdateStoreRequest) returns (UpdateStoreResponse); + rpc UpdateStore (UpdateStoreRequest) returns (UpdateStoreResponse); + + // Creates a project. Projects serve as namespaces within which resources like features will be + // created. Both feature set names as well as field names must be unique within a project. Project + // names themselves must be globally unique. + rpc CreateProject (CreateProjectRequest) returns (CreateProjectResponse); + + // Archives a project. Archived projects will continue to exist and function, but won't be visible + // through the Core API. Any existing ingestion or serving requests will continue to function, + // but will result in warning messages being logged. It is not possible to unarchive a project + // through the Core API + rpc ArchiveProject (ArchiveProjectRequest) returns (ArchiveProjectResponse); + + // Lists all projects active projects. + rpc ListProjects (ListProjectsRequest) returns (ListProjectsResponse); } // Request for a single feature set message GetFeatureSetRequest { + // Name of project the feature set belongs to (required) + string project = 3; + // Name of feature set (required). string name = 1; @@ -77,12 +94,18 @@ message GetFeatureSetResponse { // Retrieves details for all versions of a specific feature set message ListFeatureSetsRequest { + // Name of project that the feature sets belongs to. + string project = 2; + + Filter filter = 1; + message Filter { - // Name of the desired feature set. Valid regex strings are allowed. + // Name of the desired feature set. Asterisks can be used as wildcards in the name. // e.g. - // - .* can be used to match all feature sets - // - my-project-.* can be used to match all features prefixed by "my-project" + // - * can be used to match all feature sets + // - my-feature-set* can be used to match all features prefixed by "my-feature-set" string feature_set_name = 1; + // Version of the desired feature set. Either a number or valid expression can be provided. // e.g. // - 1 will match version 1 exactly @@ -90,8 +113,6 @@ message ListFeatureSetsRequest { // - <10 will match all versions less than 10 string feature_set_version = 2; } - - Filter filter = 1; } message ListFeatureSetsResponse { @@ -112,6 +133,9 @@ message ListStoresResponse { } message ApplyFeatureSetRequest { + // Name of project that the feature set belongs to. + string project = 2; + // Feature set version and source will be ignored feast.core.FeatureSetSpec feature_set = 1; } @@ -133,7 +157,8 @@ message ApplyFeatureSetResponse { Status status = 2; } -message GetFeastCoreVersionRequest {} +message GetFeastCoreVersionRequest { +} message GetFeastCoreVersionResponse { string version = 1; @@ -153,4 +178,34 @@ message UpdateStoreResponse { } feast.core.Store store = 1; Status status = 2; +} + +// Request to create a project +message CreateProjectRequest { + // Name of project (required) + string name = 1; +} + +// Response for creation of a project +message CreateProjectResponse { +} + +// Request for the archival of a project +message ArchiveProjectRequest { + // Name of project to be archived + string name = 1; +} + +// Response for archival of a project +message ArchiveProjectResponse { +} + +// Request for listing of projects +message ListProjectsRequest { +} + +// Response for listing of projects +message ListProjectsResponse { + // List of project names (archived projects are filtered out) + repeated string projects = 1; } \ No newline at end of file diff --git a/protos/feast/core/FeatureSet.proto b/protos/feast/core/FeatureSet.proto index a80ae36f088..be6dfcadc5d 100644 --- a/protos/feast/core/FeatureSet.proto +++ b/protos/feast/core/FeatureSet.proto @@ -27,10 +27,13 @@ import "feast/core/Source.proto"; import "google/protobuf/duration.proto"; message FeatureSetSpec { + // Name of project that this feature set belongs to (read-only). + string project = 7; + // Name of the featureSet. Must be unique. string name = 1; - // FeatureSet version. + // FeatureSet version (read-only). int32 version = 2; // List of entities contained within this featureSet. diff --git a/protos/feast/core/Store.proto b/protos/feast/core/Store.proto index e1b8c581a38..6ea2aacd703 100644 --- a/protos/feast/core/Store.proto +++ b/protos/feast/core/Store.proto @@ -123,6 +123,10 @@ message Store { } message Subscription { + // Name of project where subscribed feature sets can be found. All feature sets must be located + // within this project. Wildcards are not supported. + string project = 3; + // Name of featureSet to subscribe to. This field supports any valid basic POSIX regex, // e.g. customer_.* or .* // https://www.regular-expressions.info/posix.html diff --git a/protos/feast/serving/ServingService.proto b/protos/feast/serving/ServingService.proto index fe896253a94..5145670ec9a 100644 --- a/protos/feast/serving/ServingService.proto +++ b/protos/feast/serving/ServingService.proto @@ -62,15 +62,15 @@ message GetFeastServingInfoResponse { string job_staging_location = 10; } -message FeatureSetRequest { - // Feature set name - string name = 1; +message FeatureReference { + // Project name + string project = 1; - // Feature set version - int32 version = 2; + // Feature name + string name = 2; - // Features that should be retrieved from this feature set - repeated string feature_names = 3; + // Feature version + int32 version = 3; // The features will be retrieved if: // entity_timestamp - max_age <= event_timestamp <= entity_timestamp @@ -81,8 +81,8 @@ message FeatureSetRequest { } message GetOnlineFeaturesRequest { - // List of feature sets and their features that are being retrieved - repeated FeatureSetRequest feature_sets = 1; + // List of features that are being retrieved + repeated FeatureReference features = 4; // List of entity rows, containing entity id and timestamp data. // Used during retrieval of feature rows and for joining feature @@ -104,8 +104,8 @@ message GetOnlineFeaturesRequest { } message GetBatchFeaturesRequest { - // List of feature sets and their features that are being retrieved. - repeated FeatureSetRequest feature_sets = 1; + // List of features that are being retrieved + repeated FeatureReference features = 3; // Source of the entity dataset containing the timestamps and entity keys to retrieve // features for. diff --git a/sdk/go/go.mod b/sdk/go/go.mod index 7c029da1095..0def759a4f2 100644 --- a/sdk/go/go.mod +++ b/sdk/go/go.mod @@ -4,7 +4,7 @@ go 1.13 require ( github.com/golang/protobuf v1.3.2 - github.com/google/go-cmp v0.3.0 + github.com/google/go-cmp v0.3.1 github.com/opentracing/opentracing-go v1.1.0 github.com/stretchr/testify v1.4.0 // indirect go.opencensus.io v0.22.1 diff --git a/sdk/go/go.sum b/sdk/go/go.sum index 56df48673e5..04cf3d8d7f3 100644 --- a/sdk/go/go.sum +++ b/sdk/go/go.sum @@ -16,6 +16,8 @@ github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/sdk/go/protos/feast/core/CoreService.pb.go b/sdk/go/protos/feast/core/CoreService.pb.go index e0af92433b7..71700ac94f4 100644 --- a/sdk/go/protos/feast/core/CoreService.pb.go +++ b/sdk/go/protos/feast/core/CoreService.pb.go @@ -84,6 +84,8 @@ func (UpdateStoreResponse_Status) EnumDescriptor() ([]byte, []int) { // Request for a single feature set type GetFeatureSetRequest struct { + // Name of project the feature set belongs to (required) + Project string `protobuf:"bytes,3,opt,name=project,proto3" json:"project,omitempty"` // Name of feature set (required). Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Version of feature set (optional). If omitted then latest feature set will be returned. @@ -118,6 +120,13 @@ func (m *GetFeatureSetRequest) XXX_DiscardUnknown() { var xxx_messageInfo_GetFeatureSetRequest proto.InternalMessageInfo +func (m *GetFeatureSetRequest) GetProject() string { + if m != nil { + return m.Project + } + return "" +} + func (m *GetFeatureSetRequest) GetName() string { if m != nil { return m.Name @@ -174,6 +183,8 @@ func (m *GetFeatureSetResponse) GetFeatureSet() *FeatureSetSpec { // Retrieves details for all versions of a specific feature set type ListFeatureSetsRequest struct { + // Name of project that the feature sets belongs to. + Project string `protobuf:"bytes,2,opt,name=project,proto3" json:"project,omitempty"` Filter *ListFeatureSetsRequest_Filter `protobuf:"bytes,1,opt,name=filter,proto3" json:"filter,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -205,6 +216,13 @@ func (m *ListFeatureSetsRequest) XXX_DiscardUnknown() { var xxx_messageInfo_ListFeatureSetsRequest proto.InternalMessageInfo +func (m *ListFeatureSetsRequest) GetProject() string { + if m != nil { + return m.Project + } + return "" +} + func (m *ListFeatureSetsRequest) GetFilter() *ListFeatureSetsRequest_Filter { if m != nil { return m.Filter @@ -213,10 +231,10 @@ func (m *ListFeatureSetsRequest) GetFilter() *ListFeatureSetsRequest_Filter { } type ListFeatureSetsRequest_Filter struct { - // Name of the desired feature set. Valid regex strings are allowed. + // Name of the desired feature set. Asterisks can be used as wildcards in the name. // e.g. - // - .* can be used to match all feature sets - // - my-project-.* can be used to match all features prefixed by "my-project" + // - * can be used to match all feature sets + // - my-feature-set* can be used to match all features prefixed by "my-feature-set" FeatureSetName string `protobuf:"bytes,1,opt,name=feature_set_name,json=featureSetName,proto3" json:"feature_set_name,omitempty"` // Version of the desired feature set. Either a number or valid expression can be provided. // e.g. @@ -426,6 +444,8 @@ func (m *ListStoresResponse) GetStore() []*Store { } type ApplyFeatureSetRequest struct { + // Name of project that the feature set belongs to. + Project string `protobuf:"bytes,2,opt,name=project,proto3" json:"project,omitempty"` // Feature set version and source will be ignored FeatureSet *FeatureSetSpec `protobuf:"bytes,1,opt,name=feature_set,json=featureSet,proto3" json:"feature_set,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -458,6 +478,13 @@ func (m *ApplyFeatureSetRequest) XXX_DiscardUnknown() { var xxx_messageInfo_ApplyFeatureSetRequest proto.InternalMessageInfo +func (m *ApplyFeatureSetRequest) GetProject() string { + if m != nil { + return m.Project + } + return "" +} + func (m *ApplyFeatureSetRequest) GetFeatureSet() *FeatureSetSpec { if m != nil { return m.FeatureSet @@ -669,6 +696,225 @@ func (m *UpdateStoreResponse) GetStatus() UpdateStoreResponse_Status { return UpdateStoreResponse_NO_CHANGE } +// Request to create a project +type CreateProjectRequest struct { + // Name of project (required) + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *CreateProjectRequest) Reset() { *m = CreateProjectRequest{} } +func (m *CreateProjectRequest) String() string { return proto.CompactTextString(m) } +func (*CreateProjectRequest) ProtoMessage() {} +func (*CreateProjectRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_d9be266444105411, []int{12} +} + +func (m *CreateProjectRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_CreateProjectRequest.Unmarshal(m, b) +} +func (m *CreateProjectRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_CreateProjectRequest.Marshal(b, m, deterministic) +} +func (m *CreateProjectRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_CreateProjectRequest.Merge(m, src) +} +func (m *CreateProjectRequest) XXX_Size() int { + return xxx_messageInfo_CreateProjectRequest.Size(m) +} +func (m *CreateProjectRequest) XXX_DiscardUnknown() { + xxx_messageInfo_CreateProjectRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_CreateProjectRequest proto.InternalMessageInfo + +func (m *CreateProjectRequest) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +// Response for creation of a project +type CreateProjectResponse struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *CreateProjectResponse) Reset() { *m = CreateProjectResponse{} } +func (m *CreateProjectResponse) String() string { return proto.CompactTextString(m) } +func (*CreateProjectResponse) ProtoMessage() {} +func (*CreateProjectResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_d9be266444105411, []int{13} +} + +func (m *CreateProjectResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_CreateProjectResponse.Unmarshal(m, b) +} +func (m *CreateProjectResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_CreateProjectResponse.Marshal(b, m, deterministic) +} +func (m *CreateProjectResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_CreateProjectResponse.Merge(m, src) +} +func (m *CreateProjectResponse) XXX_Size() int { + return xxx_messageInfo_CreateProjectResponse.Size(m) +} +func (m *CreateProjectResponse) XXX_DiscardUnknown() { + xxx_messageInfo_CreateProjectResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_CreateProjectResponse proto.InternalMessageInfo + +// Request for the archival of a project +type ArchiveProjectRequest struct { + // Name of project to be archived + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ArchiveProjectRequest) Reset() { *m = ArchiveProjectRequest{} } +func (m *ArchiveProjectRequest) String() string { return proto.CompactTextString(m) } +func (*ArchiveProjectRequest) ProtoMessage() {} +func (*ArchiveProjectRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_d9be266444105411, []int{14} +} + +func (m *ArchiveProjectRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ArchiveProjectRequest.Unmarshal(m, b) +} +func (m *ArchiveProjectRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ArchiveProjectRequest.Marshal(b, m, deterministic) +} +func (m *ArchiveProjectRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ArchiveProjectRequest.Merge(m, src) +} +func (m *ArchiveProjectRequest) XXX_Size() int { + return xxx_messageInfo_ArchiveProjectRequest.Size(m) +} +func (m *ArchiveProjectRequest) XXX_DiscardUnknown() { + xxx_messageInfo_ArchiveProjectRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_ArchiveProjectRequest proto.InternalMessageInfo + +func (m *ArchiveProjectRequest) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +// Response for archival of a project +type ArchiveProjectResponse struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ArchiveProjectResponse) Reset() { *m = ArchiveProjectResponse{} } +func (m *ArchiveProjectResponse) String() string { return proto.CompactTextString(m) } +func (*ArchiveProjectResponse) ProtoMessage() {} +func (*ArchiveProjectResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_d9be266444105411, []int{15} +} + +func (m *ArchiveProjectResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ArchiveProjectResponse.Unmarshal(m, b) +} +func (m *ArchiveProjectResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ArchiveProjectResponse.Marshal(b, m, deterministic) +} +func (m *ArchiveProjectResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_ArchiveProjectResponse.Merge(m, src) +} +func (m *ArchiveProjectResponse) XXX_Size() int { + return xxx_messageInfo_ArchiveProjectResponse.Size(m) +} +func (m *ArchiveProjectResponse) XXX_DiscardUnknown() { + xxx_messageInfo_ArchiveProjectResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_ArchiveProjectResponse proto.InternalMessageInfo + +// Request for listing of projects +type ListProjectsRequest struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ListProjectsRequest) Reset() { *m = ListProjectsRequest{} } +func (m *ListProjectsRequest) String() string { return proto.CompactTextString(m) } +func (*ListProjectsRequest) ProtoMessage() {} +func (*ListProjectsRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_d9be266444105411, []int{16} +} + +func (m *ListProjectsRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ListProjectsRequest.Unmarshal(m, b) +} +func (m *ListProjectsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ListProjectsRequest.Marshal(b, m, deterministic) +} +func (m *ListProjectsRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ListProjectsRequest.Merge(m, src) +} +func (m *ListProjectsRequest) XXX_Size() int { + return xxx_messageInfo_ListProjectsRequest.Size(m) +} +func (m *ListProjectsRequest) XXX_DiscardUnknown() { + xxx_messageInfo_ListProjectsRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_ListProjectsRequest proto.InternalMessageInfo + +// Response for listing of projects +type ListProjectsResponse struct { + // List of project names (archived projects are filtered out) + Projects []string `protobuf:"bytes,1,rep,name=projects,proto3" json:"projects,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ListProjectsResponse) Reset() { *m = ListProjectsResponse{} } +func (m *ListProjectsResponse) String() string { return proto.CompactTextString(m) } +func (*ListProjectsResponse) ProtoMessage() {} +func (*ListProjectsResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_d9be266444105411, []int{17} +} + +func (m *ListProjectsResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ListProjectsResponse.Unmarshal(m, b) +} +func (m *ListProjectsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ListProjectsResponse.Marshal(b, m, deterministic) +} +func (m *ListProjectsResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_ListProjectsResponse.Merge(m, src) +} +func (m *ListProjectsResponse) XXX_Size() int { + return xxx_messageInfo_ListProjectsResponse.Size(m) +} +func (m *ListProjectsResponse) XXX_DiscardUnknown() { + xxx_messageInfo_ListProjectsResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_ListProjectsResponse proto.InternalMessageInfo + +func (m *ListProjectsResponse) GetProjects() []string { + if m != nil { + return m.Projects + } + return nil +} + func init() { proto.RegisterEnum("feast.core.ApplyFeatureSetResponse_Status", ApplyFeatureSetResponse_Status_name, ApplyFeatureSetResponse_Status_value) proto.RegisterEnum("feast.core.UpdateStoreResponse_Status", UpdateStoreResponse_Status_name, UpdateStoreResponse_Status_value) @@ -686,52 +932,67 @@ func init() { proto.RegisterType((*GetFeastCoreVersionResponse)(nil), "feast.core.GetFeastCoreVersionResponse") proto.RegisterType((*UpdateStoreRequest)(nil), "feast.core.UpdateStoreRequest") proto.RegisterType((*UpdateStoreResponse)(nil), "feast.core.UpdateStoreResponse") + proto.RegisterType((*CreateProjectRequest)(nil), "feast.core.CreateProjectRequest") + proto.RegisterType((*CreateProjectResponse)(nil), "feast.core.CreateProjectResponse") + proto.RegisterType((*ArchiveProjectRequest)(nil), "feast.core.ArchiveProjectRequest") + proto.RegisterType((*ArchiveProjectResponse)(nil), "feast.core.ArchiveProjectResponse") + proto.RegisterType((*ListProjectsRequest)(nil), "feast.core.ListProjectsRequest") + proto.RegisterType((*ListProjectsResponse)(nil), "feast.core.ListProjectsResponse") } func init() { proto.RegisterFile("feast/core/CoreService.proto", fileDescriptor_d9be266444105411) } var fileDescriptor_d9be266444105411 = []byte{ - // 636 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x55, 0xdd, 0x72, 0xd2, 0x40, - 0x14, 0x36, 0xb5, 0xa5, 0xc3, 0x89, 0xad, 0xb0, 0x28, 0x65, 0x52, 0xac, 0x18, 0x3b, 0x16, 0xbd, - 0x48, 0x66, 0xf0, 0xc2, 0x0b, 0xc5, 0x19, 0xfe, 0x5a, 0x67, 0x74, 0xa0, 0xb3, 0x80, 0xe3, 0xf4, - 0x86, 0x01, 0xba, 0x20, 0xb6, 0x65, 0x63, 0x76, 0xe9, 0x8c, 0x6f, 0xe3, 0x85, 0xef, 0xe1, 0x03, - 0xf8, 0x52, 0x4e, 0xb2, 0x5b, 0xb2, 0x09, 0x21, 0x5c, 0xe8, 0x5d, 0xb2, 0xe7, 0x3b, 0xdf, 0x9e, - 0xfd, 0xce, 0x1f, 0x14, 0x27, 0x64, 0xc8, 0xb8, 0x3d, 0xa6, 0x2e, 0xb1, 0x1b, 0xd4, 0x25, 0x5d, - 0xe2, 0xde, 0xce, 0xc6, 0xc4, 0x72, 0x5c, 0xca, 0x29, 0x02, 0xdf, 0x6a, 0x79, 0x56, 0xe3, 0x50, - 0x41, 0x9e, 0x92, 0x21, 0x5f, 0x78, 0x60, 0x2e, 0x80, 0x46, 0x5e, 0x31, 0x76, 0x39, 0x75, 0x25, - 0x81, 0xd9, 0x84, 0x47, 0x67, 0x84, 0x07, 0x70, 0x4c, 0xbe, 0x2f, 0x08, 0xe3, 0x08, 0xc1, 0xf6, - 0x7c, 0x78, 0x43, 0x0a, 0x5a, 0x49, 0x2b, 0xa7, 0xb1, 0xff, 0x8d, 0x0a, 0xb0, 0x7b, 0x4b, 0x5c, - 0x36, 0xa3, 0xf3, 0xc2, 0x56, 0x49, 0x2b, 0xef, 0xe0, 0xbb, 0x5f, 0xb3, 0x07, 0x8f, 0x23, 0x2c, - 0xcc, 0xa1, 0x73, 0x46, 0xd0, 0x5b, 0xd0, 0x27, 0xe2, 0x74, 0xc0, 0x08, 0xf7, 0xd9, 0xf4, 0x8a, - 0x61, 0x05, 0x51, 0x5b, 0x81, 0x53, 0xd7, 0x21, 0x63, 0x0c, 0x93, 0xe5, 0xbf, 0xf9, 0x5b, 0x83, - 0xfc, 0xa7, 0x19, 0x53, 0x78, 0xd9, 0x5d, 0x78, 0x35, 0x48, 0x4d, 0x66, 0xd7, 0x9c, 0xb8, 0x92, - 0xf2, 0xa5, 0x4a, 0x19, 0xef, 0x63, 0x9d, 0xfa, 0x0e, 0x58, 0x3a, 0x1a, 0x23, 0x48, 0x89, 0x13, - 0x54, 0x86, 0x8c, 0x12, 0xe4, 0x40, 0x79, 0xf7, 0x7e, 0x10, 0x4d, 0xdb, 0x53, 0xc0, 0x82, 0x9c, - 0x8a, 0x54, 0xd5, 0x48, 0xe3, 0x6c, 0x00, 0xfe, 0x2c, 0x75, 0xf9, 0x02, 0x07, 0x2b, 0xc1, 0x48, - 0x65, 0xaa, 0xf0, 0x40, 0xa1, 0x62, 0x05, 0xad, 0x74, 0x7f, 0x83, 0x34, 0x7a, 0xc0, 0xcf, 0x4c, - 0x0a, 0x59, 0x8f, 0xd9, 0x4f, 0xe5, 0x52, 0x95, 0x77, 0x11, 0x55, 0x8e, 0xa3, 0xaa, 0x84, 0xe0, - 0x51, 0x41, 0x8a, 0x4b, 0x41, 0x62, 0x92, 0x6f, 0x56, 0x01, 0xa9, 0x0c, 0xf2, 0x15, 0x27, 0xb0, - 0xc3, 0xbc, 0x13, 0x19, 0x7e, 0x56, 0xbd, 0xd0, 0x87, 0x62, 0x61, 0x37, 0xfb, 0x90, 0xaf, 0x39, - 0xce, 0xf5, 0x8f, 0xd5, 0x4a, 0xfb, 0xa7, 0x12, 0xf9, 0xa3, 0xc1, 0xc1, 0x0a, 0xef, 0x7f, 0xa8, - 0x3d, 0x54, 0x87, 0x14, 0xe3, 0x43, 0xbe, 0x60, 0x7e, 0x72, 0xf7, 0x2b, 0xaf, 0x54, 0xbf, 0x35, - 0x37, 0x5a, 0x5d, 0xdf, 0x03, 0x4b, 0x4f, 0xd3, 0x86, 0x94, 0x38, 0x41, 0x7b, 0x90, 0x6e, 0x77, - 0x06, 0x8d, 0x0f, 0xb5, 0xf6, 0x59, 0x2b, 0x73, 0x0f, 0xe9, 0xb0, 0xdb, 0xc0, 0xad, 0x5a, 0xaf, - 0xd5, 0xcc, 0x68, 0x28, 0x0d, 0x3b, 0x2d, 0x8c, 0x3b, 0x38, 0xb3, 0x65, 0x16, 0xc1, 0x10, 0x6d, - 0xc4, 0xb8, 0xd7, 0xea, 0xb2, 0x8a, 0xa4, 0x50, 0xe6, 0x1b, 0x38, 0x8c, 0xb5, 0xca, 0xe7, 0x2a, - 0xdd, 0x29, 0xf2, 0xb6, 0xec, 0xce, 0x2a, 0xa0, 0xbe, 0x73, 0x39, 0xe4, 0x44, 0x64, 0x44, 0xea, - 0xae, 0xa4, 0x4e, 0x4b, 0x4c, 0xdd, 0x2f, 0x0d, 0x72, 0x21, 0xff, 0xd5, 0xdc, 0x27, 0x12, 0xa0, - 0xf7, 0x11, 0x2d, 0x5f, 0xa8, 0xc8, 0x18, 0xe6, 0xa8, 0x8e, 0xc7, 0x09, 0x3a, 0xf6, 0xcf, 0x9b, - 0x42, 0xc7, 0xca, 0xcf, 0x6d, 0xd0, 0x95, 0x01, 0x89, 0x26, 0x90, 0x8b, 0x91, 0x0b, 0x85, 0x2e, - 0x5f, 0xaf, 0xb6, 0x71, 0xb2, 0x11, 0x27, 0x65, 0xe8, 0xc1, 0x5e, 0x68, 0xf6, 0xa1, 0xd2, 0xaa, - 0x67, 0xb8, 0xe4, 0x8d, 0x67, 0x09, 0x08, 0xc9, 0x7a, 0x01, 0x0f, 0x23, 0x93, 0x03, 0x99, 0x9b, - 0x67, 0x9c, 0xf1, 0x3c, 0x11, 0x23, 0xb9, 0x3f, 0x02, 0x04, 0xad, 0x8c, 0x9e, 0x24, 0x0e, 0x09, - 0xe3, 0x68, 0x9d, 0x39, 0x08, 0x34, 0xd2, 0x0e, 0xe1, 0x40, 0xe3, 0xbb, 0x3e, 0x1c, 0xe8, 0xba, - 0x0e, 0x6e, 0x83, 0xae, 0x94, 0x07, 0x3a, 0x5a, 0x5b, 0x37, 0x82, 0xf3, 0xe9, 0x86, 0xba, 0xaa, - 0x77, 0x40, 0xd9, 0x97, 0xf5, 0x8c, 0x52, 0x2d, 0xe7, 0xde, 0x32, 0xbc, 0xb0, 0xa7, 0x33, 0xfe, - 0x75, 0x31, 0xb2, 0xc6, 0xf4, 0xc6, 0x9e, 0xd2, 0x6f, 0xe4, 0xca, 0x16, 0x5b, 0x93, 0x5d, 0x5e, - 0xd9, 0x53, 0x6a, 0xfb, 0x1b, 0x93, 0xd9, 0xc1, 0x26, 0x1d, 0xa5, 0xfc, 0xa3, 0xd7, 0x7f, 0x03, - 0x00, 0x00, 0xff, 0xff, 0xc7, 0xc1, 0x10, 0xf1, 0xa5, 0x07, 0x00, 0x00, + // 772 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x56, 0xdd, 0x4e, 0x1b, 0x39, + 0x14, 0xde, 0x81, 0x25, 0x6c, 0x4e, 0x80, 0x0d, 0x0e, 0x09, 0xd1, 0xc0, 0x42, 0xd6, 0x45, 0x85, + 0x52, 0x69, 0x46, 0x4a, 0x2f, 0x7a, 0xd1, 0x52, 0x29, 0x84, 0x40, 0xa5, 0x56, 0x81, 0x4e, 0xa0, + 0xad, 0xb8, 0x28, 0x0a, 0xc1, 0x81, 0xf0, 0xe7, 0xe9, 0xd8, 0x41, 0xea, 0xeb, 0x54, 0x7d, 0x9b, + 0x3e, 0x41, 0xdf, 0xa6, 0x9a, 0xb1, 0x93, 0xb1, 0x9d, 0xc9, 0xa4, 0x52, 0x7b, 0x97, 0xb1, 0xbf, + 0xf3, 0xf9, 0xf8, 0x3b, 0xe7, 0x3b, 0x31, 0xac, 0x76, 0x49, 0x9b, 0x71, 0xb7, 0x43, 0x03, 0xe2, + 0xd6, 0x69, 0x40, 0x5a, 0x24, 0x78, 0xe8, 0x75, 0x88, 0xe3, 0x07, 0x94, 0x53, 0x04, 0xd1, 0xae, + 0x13, 0xee, 0xda, 0x2b, 0x0a, 0x72, 0x9f, 0xb4, 0x79, 0x3f, 0x04, 0x73, 0x01, 0xb4, 0x4b, 0xca, + 0x66, 0x8b, 0xd3, 0x40, 0x12, 0xe0, 0x4f, 0xb0, 0x74, 0x40, 0x78, 0x0c, 0xf7, 0xc8, 0xe7, 0x3e, + 0x61, 0x1c, 0x95, 0x61, 0xd6, 0x0f, 0xe8, 0x35, 0xe9, 0xf0, 0xf2, 0x74, 0xc5, 0xda, 0xca, 0x7a, + 0x83, 0x4f, 0x84, 0xe0, 0xef, 0xfb, 0xf6, 0x1d, 0x29, 0x5b, 0xd1, 0x72, 0xf4, 0x3b, 0x44, 0x3f, + 0x90, 0x80, 0xf5, 0xe8, 0x7d, 0x79, 0xaa, 0x62, 0x6d, 0xcd, 0x78, 0x83, 0x4f, 0x7c, 0x0c, 0x45, + 0x83, 0x9f, 0xf9, 0xf4, 0x9e, 0x11, 0xf4, 0x02, 0x72, 0x5d, 0xb1, 0x7a, 0xc6, 0x08, 0x8f, 0xd8, + 0x72, 0x55, 0xdb, 0x89, 0xef, 0xe3, 0xc4, 0x41, 0x2d, 0x9f, 0x74, 0x3c, 0xe8, 0x0e, 0xbf, 0xf1, + 0x0f, 0x0b, 0x4a, 0x6f, 0x7b, 0x4c, 0xe1, 0x65, 0x09, 0x89, 0x4f, 0xe9, 0x89, 0xd7, 0x20, 0xd3, + 0xed, 0xdd, 0x72, 0x12, 0xc8, 0xc3, 0x9e, 0xa8, 0x87, 0x25, 0xb3, 0x39, 0xfb, 0x51, 0x80, 0x27, + 0x03, 0xed, 0x73, 0xc8, 0x88, 0x15, 0xb4, 0x05, 0x79, 0x25, 0xfd, 0x33, 0x45, 0x91, 0x85, 0x38, + 0xcf, 0x66, 0xa8, 0x8d, 0x03, 0x05, 0x15, 0xa9, 0xea, 0x94, 0xf5, 0x16, 0x63, 0xf0, 0x7b, 0xa9, + 0xd8, 0x47, 0x58, 0x1e, 0x49, 0x46, 0x6a, 0xb6, 0x03, 0x73, 0x0a, 0x15, 0x2b, 0x5b, 0x95, 0xe9, + 0x09, 0xa2, 0xe5, 0x62, 0x7e, 0x86, 0x29, 0x2c, 0x86, 0xcc, 0x51, 0xf9, 0x87, 0x7a, 0xbd, 0x34, + 0x54, 0xd9, 0x30, 0x55, 0xd1, 0xe0, 0xa6, 0x20, 0xab, 0x43, 0x41, 0x12, 0xda, 0x02, 0xef, 0x00, + 0x52, 0x19, 0xe4, 0x2d, 0x36, 0x61, 0x86, 0x85, 0x2b, 0x32, 0xfd, 0x45, 0xf5, 0xc0, 0x08, 0xea, + 0x89, 0x7d, 0x4c, 0xa1, 0x54, 0xf3, 0xfd, 0xdb, 0x2f, 0xa9, 0xdd, 0x69, 0x14, 0xf9, 0xb7, 0xda, + 0xea, 0xbb, 0x05, 0xcb, 0x23, 0x27, 0xfe, 0x81, 0x7e, 0x45, 0xbb, 0x90, 0x61, 0xbc, 0xcd, 0xfb, + 0x2c, 0x4a, 0x77, 0xa1, 0xba, 0xad, 0xc6, 0x8d, 0x39, 0xd1, 0x69, 0x45, 0x11, 0x9e, 0x8c, 0xc4, + 0x2e, 0x64, 0xc4, 0x0a, 0x9a, 0x87, 0x6c, 0xf3, 0xf0, 0xac, 0xfe, 0xba, 0xd6, 0x3c, 0x68, 0xe4, + 0xff, 0x42, 0x39, 0x98, 0xad, 0x7b, 0x8d, 0xda, 0x71, 0x63, 0x2f, 0x6f, 0xa1, 0x2c, 0xcc, 0x34, + 0x3c, 0xef, 0xd0, 0xcb, 0x4f, 0xe1, 0x55, 0xb0, 0x85, 0xf5, 0x18, 0x0f, 0x07, 0x87, 0xec, 0x2f, + 0x29, 0x21, 0x7e, 0x0e, 0x2b, 0x89, 0xbb, 0xf2, 0xba, 0x8a, 0xa3, 0x45, 0x45, 0x87, 0x8e, 0xde, + 0x01, 0x74, 0xe2, 0x5f, 0xb4, 0x39, 0x11, 0xb5, 0x92, 0x15, 0x51, 0x8a, 0x6a, 0xa5, 0x16, 0xf5, + 0x9b, 0x05, 0x05, 0x2d, 0x7e, 0xb4, 0x2b, 0x52, 0x09, 0xd0, 0x2b, 0x43, 0xcb, 0xc7, 0x2a, 0x32, + 0x81, 0xd9, 0xd4, 0x71, 0x23, 0x45, 0xc7, 0x93, 0xa3, 0x3d, 0xa1, 0x23, 0xde, 0x86, 0xa5, 0x7a, + 0x40, 0xda, 0x9c, 0x1c, 0x89, 0xc6, 0x1a, 0xdc, 0x33, 0xa9, 0xcd, 0x97, 0xa1, 0x68, 0x60, 0xc5, + 0xc9, 0xf8, 0x29, 0x14, 0x6b, 0x41, 0xe7, 0xaa, 0xf7, 0xf0, 0x2b, 0x2c, 0x65, 0x28, 0x99, 0x60, + 0x49, 0x53, 0x84, 0x42, 0x68, 0x23, 0xb9, 0x3c, 0xb0, 0x22, 0xae, 0xc2, 0x92, 0xbe, 0x2c, 0x95, + 0xb4, 0xe1, 0x1f, 0xe9, 0x06, 0x31, 0x21, 0xb2, 0xde, 0xf0, 0xbb, 0xfa, 0x35, 0x03, 0x39, 0xe5, + 0x5f, 0x04, 0x75, 0xa1, 0x90, 0xd0, 0x05, 0x48, 0xd3, 0x74, 0x7c, 0x13, 0xd9, 0x9b, 0x13, 0x71, + 0x32, 0xa7, 0x63, 0x98, 0xd7, 0xfe, 0x06, 0x50, 0x65, 0x34, 0x52, 0xf7, 0xb8, 0xfd, 0x7f, 0x0a, + 0x42, 0xb2, 0x9e, 0xc2, 0xbf, 0xc6, 0xa8, 0x44, 0x78, 0xf2, 0x50, 0xb7, 0x1f, 0xa5, 0x62, 0x24, + 0xf7, 0x1b, 0x80, 0x78, 0x76, 0xa1, 0xff, 0x52, 0xa7, 0xa2, 0xbd, 0x36, 0x6e, 0x3b, 0x4e, 0xd4, + 0x70, 0xb9, 0x9e, 0x68, 0xf2, 0x98, 0xd3, 0x13, 0x1d, 0x37, 0x98, 0x9a, 0x90, 0x53, 0xba, 0x1e, + 0xad, 0x8d, 0xb5, 0x83, 0xe0, 0x5c, 0x9f, 0x60, 0x97, 0xb0, 0x54, 0x5a, 0x37, 0xeb, 0xa5, 0x4a, + 0x32, 0x85, 0x5e, 0xaa, 0x44, 0x2b, 0xa0, 0x0f, 0xb0, 0xa0, 0x77, 0x37, 0xd2, 0x82, 0x12, 0x6d, + 0x62, 0xe3, 0x34, 0x88, 0x24, 0x7e, 0x07, 0x73, 0xaa, 0x0b, 0xd0, 0xba, 0x59, 0x0a, 0xc3, 0x36, + 0x76, 0x65, 0x3c, 0x40, 0x50, 0xee, 0x1e, 0x82, 0xf2, 0xac, 0xda, 0xcd, 0x2b, 0x7e, 0x39, 0x0a, + 0xdf, 0x4c, 0xa7, 0xee, 0x65, 0x8f, 0x5f, 0xf5, 0xcf, 0x9d, 0x0e, 0xbd, 0x73, 0x2f, 0xe9, 0x35, + 0xb9, 0x71, 0xc5, 0xe3, 0x8a, 0x5d, 0xdc, 0xb8, 0x97, 0xd4, 0x8d, 0x1e, 0x56, 0xcc, 0x8d, 0x1f, + 0x5c, 0xe7, 0x99, 0x68, 0xe9, 0xd9, 0xcf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x07, 0xcb, 0xa4, 0xd7, + 0xcc, 0x09, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -774,6 +1035,17 @@ type CoreServiceClient interface { // If the changes are valid, core will return the given store configuration in response, and // start or update the necessary feature population jobs for the updated store. UpdateStore(ctx context.Context, in *UpdateStoreRequest, opts ...grpc.CallOption) (*UpdateStoreResponse, error) + // Creates a project. Projects serve as namespaces within which resources like features will be + // created. Both feature set names as well as field names must be unique within a project. Project + // names themselves must be globally unique. + CreateProject(ctx context.Context, in *CreateProjectRequest, opts ...grpc.CallOption) (*CreateProjectResponse, error) + // Archives a project. Archived projects will continue to exist and function, but won't be visible + // through the Core API. Any existing ingestion or serving requests will continue to function, + // but will result in warning messages being logged. It is not possible to unarchive a project + // through the Core API + ArchiveProject(ctx context.Context, in *ArchiveProjectRequest, opts ...grpc.CallOption) (*ArchiveProjectResponse, error) + // Lists all projects active projects. + ListProjects(ctx context.Context, in *ListProjectsRequest, opts ...grpc.CallOption) (*ListProjectsResponse, error) } type coreServiceClient struct { @@ -838,6 +1110,33 @@ func (c *coreServiceClient) UpdateStore(ctx context.Context, in *UpdateStoreRequ return out, nil } +func (c *coreServiceClient) CreateProject(ctx context.Context, in *CreateProjectRequest, opts ...grpc.CallOption) (*CreateProjectResponse, error) { + out := new(CreateProjectResponse) + err := c.cc.Invoke(ctx, "/feast.core.CoreService/CreateProject", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *coreServiceClient) ArchiveProject(ctx context.Context, in *ArchiveProjectRequest, opts ...grpc.CallOption) (*ArchiveProjectResponse, error) { + out := new(ArchiveProjectResponse) + err := c.cc.Invoke(ctx, "/feast.core.CoreService/ArchiveProject", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *coreServiceClient) ListProjects(ctx context.Context, in *ListProjectsRequest, opts ...grpc.CallOption) (*ListProjectsResponse, error) { + out := new(ListProjectsResponse) + err := c.cc.Invoke(ctx, "/feast.core.CoreService/ListProjects", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // CoreServiceServer is the server API for CoreService service. type CoreServiceServer interface { // Retrieve version information about this Feast deployment @@ -868,6 +1167,17 @@ type CoreServiceServer interface { // If the changes are valid, core will return the given store configuration in response, and // start or update the necessary feature population jobs for the updated store. UpdateStore(context.Context, *UpdateStoreRequest) (*UpdateStoreResponse, error) + // Creates a project. Projects serve as namespaces within which resources like features will be + // created. Both feature set names as well as field names must be unique within a project. Project + // names themselves must be globally unique. + CreateProject(context.Context, *CreateProjectRequest) (*CreateProjectResponse, error) + // Archives a project. Archived projects will continue to exist and function, but won't be visible + // through the Core API. Any existing ingestion or serving requests will continue to function, + // but will result in warning messages being logged. It is not possible to unarchive a project + // through the Core API + ArchiveProject(context.Context, *ArchiveProjectRequest) (*ArchiveProjectResponse, error) + // Lists all projects active projects. + ListProjects(context.Context, *ListProjectsRequest) (*ListProjectsResponse, error) } // UnimplementedCoreServiceServer can be embedded to have forward compatible implementations. @@ -892,6 +1202,15 @@ func (*UnimplementedCoreServiceServer) ApplyFeatureSet(ctx context.Context, req func (*UnimplementedCoreServiceServer) UpdateStore(ctx context.Context, req *UpdateStoreRequest) (*UpdateStoreResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateStore not implemented") } +func (*UnimplementedCoreServiceServer) CreateProject(ctx context.Context, req *CreateProjectRequest) (*CreateProjectResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateProject not implemented") +} +func (*UnimplementedCoreServiceServer) ArchiveProject(ctx context.Context, req *ArchiveProjectRequest) (*ArchiveProjectResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ArchiveProject not implemented") +} +func (*UnimplementedCoreServiceServer) ListProjects(ctx context.Context, req *ListProjectsRequest) (*ListProjectsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListProjects not implemented") +} func RegisterCoreServiceServer(s *grpc.Server, srv CoreServiceServer) { s.RegisterService(&_CoreService_serviceDesc, srv) @@ -1005,6 +1324,60 @@ func _CoreService_UpdateStore_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } +func _CoreService_CreateProject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateProjectRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(CoreServiceServer).CreateProject(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/feast.core.CoreService/CreateProject", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(CoreServiceServer).CreateProject(ctx, req.(*CreateProjectRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _CoreService_ArchiveProject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ArchiveProjectRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(CoreServiceServer).ArchiveProject(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/feast.core.CoreService/ArchiveProject", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(CoreServiceServer).ArchiveProject(ctx, req.(*ArchiveProjectRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _CoreService_ListProjects_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListProjectsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(CoreServiceServer).ListProjects(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/feast.core.CoreService/ListProjects", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(CoreServiceServer).ListProjects(ctx, req.(*ListProjectsRequest)) + } + return interceptor(ctx, in, info, handler) +} + var _CoreService_serviceDesc = grpc.ServiceDesc{ ServiceName: "feast.core.CoreService", HandlerType: (*CoreServiceServer)(nil), @@ -1033,6 +1406,18 @@ var _CoreService_serviceDesc = grpc.ServiceDesc{ MethodName: "UpdateStore", Handler: _CoreService_UpdateStore_Handler, }, + { + MethodName: "CreateProject", + Handler: _CoreService_CreateProject_Handler, + }, + { + MethodName: "ArchiveProject", + Handler: _CoreService_ArchiveProject_Handler, + }, + { + MethodName: "ListProjects", + Handler: _CoreService_ListProjects_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "feast/core/CoreService.proto", diff --git a/sdk/go/protos/feast/core/FeatureSet.pb.go b/sdk/go/protos/feast/core/FeatureSet.pb.go index 79cbcaa94b1..538887de34c 100644 --- a/sdk/go/protos/feast/core/FeatureSet.pb.go +++ b/sdk/go/protos/feast/core/FeatureSet.pb.go @@ -23,9 +23,11 @@ var _ = math.Inf const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package type FeatureSetSpec struct { + // Name of project that this feature set belongs to (read-only). + Project string `protobuf:"bytes,7,opt,name=project,proto3" json:"project,omitempty"` // Name of the featureSet. Must be unique. Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - // FeatureSet version. + // FeatureSet version (read-only). Version int32 `protobuf:"varint,2,opt,name=version,proto3" json:"version,omitempty"` // List of entities contained within this featureSet. // This allows the feature to be used during joins between feature sets. @@ -71,6 +73,13 @@ func (m *FeatureSetSpec) XXX_DiscardUnknown() { var xxx_messageInfo_FeatureSetSpec proto.InternalMessageInfo +func (m *FeatureSetSpec) GetProject() string { + if m != nil { + return m.Project + } + return "" +} + func (m *FeatureSetSpec) GetName() string { if m != nil { return m.Name @@ -220,28 +229,28 @@ func init() { func init() { proto.RegisterFile("feast/core/FeatureSet.proto", fileDescriptor_972fbd278ac19c0c) } var fileDescriptor_972fbd278ac19c0c = []byte{ - // 357 bytes of a gzipped FileDescriptorProto + // 368 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x52, 0x4d, 0x6f, 0xe2, 0x30, - 0x10, 0x55, 0xf8, 0x08, 0x30, 0x48, 0xac, 0xe4, 0xc3, 0x92, 0x5d, 0xa4, 0x55, 0xc4, 0x29, 0xda, - 0x83, 0x2d, 0x85, 0x5b, 0x6f, 0x45, 0x6d, 0x8f, 0x55, 0x15, 0xaa, 0x1e, 0xaa, 0x56, 0xc8, 0x84, - 0x21, 0x4d, 0x21, 0x71, 0x14, 0x3b, 0x08, 0x7e, 0x41, 0xff, 0x76, 0x15, 0x1b, 0x37, 0x39, 0xf4, - 0xd8, 0x9b, 0xc7, 0xef, 0xcd, 0xc7, 0x7b, 0x33, 0x30, 0xdb, 0x21, 0x97, 0x8a, 0xc5, 0xa2, 0x44, - 0x76, 0x87, 0x5c, 0x55, 0x25, 0xae, 0x50, 0xd1, 0xa2, 0x14, 0x4a, 0x10, 0xd0, 0x20, 0xad, 0xc1, - 0xbf, 0x53, 0x43, 0x54, 0xe7, 0x02, 0x25, 0x7b, 0xe2, 0x87, 0x0a, 0x0d, 0xc9, 0x02, 0xba, 0xc2, - 0x4a, 0x54, 0x65, 0x6c, 0x81, 0x7f, 0x89, 0x10, 0xc9, 0x01, 0x99, 0x8e, 0x36, 0xd5, 0x8e, 0x6d, - 0xab, 0x92, 0xab, 0x54, 0xe4, 0x06, 0x9f, 0x7f, 0x74, 0x60, 0xd2, 0xb4, 0x5c, 0x15, 0x18, 0x13, - 0x02, 0xbd, 0x9c, 0x67, 0xe8, 0x39, 0xbe, 0x13, 0x8c, 0x22, 0xfd, 0x26, 0x1e, 0x0c, 0x8e, 0x58, - 0xca, 0x54, 0xe4, 0x5e, 0xc7, 0x77, 0x82, 0x7e, 0x64, 0x43, 0x12, 0xc2, 0x10, 0x73, 0x95, 0xaa, - 0x14, 0xa5, 0xd7, 0xf5, 0xbb, 0xc1, 0x38, 0xfc, 0x4d, 0x9b, 0x89, 0xe9, 0x6d, 0x8d, 0x9d, 0xeb, - 0xba, 0xd1, 0x17, 0x8f, 0x2c, 0x60, 0xb8, 0x33, 0x3d, 0xa5, 0xd7, 0xd3, 0x39, 0xd3, 0x76, 0x8e, - 0x9d, 0x47, 0x27, 0x59, 0x22, 0x09, 0x61, 0x90, 0xf1, 0xd3, 0x9a, 0x27, 0xe8, 0xf5, 0x7d, 0x27, - 0x18, 0x87, 0x7f, 0xa8, 0xd1, 0x46, 0xad, 0x36, 0x7a, 0x73, 0xd1, 0x16, 0xb9, 0x19, 0x3f, 0x5d, - 0x27, 0x48, 0xfe, 0x83, 0x2b, 0xb5, 0x1b, 0x9e, 0xab, 0x53, 0x48, 0xbb, 0x8d, 0xf1, 0x29, 0xba, - 0x30, 0xe6, 0x2f, 0x00, 0xcd, 0xb0, 0xdf, 0x9a, 0x70, 0x05, 0x70, 0xac, 0x3d, 0x5f, 0xd7, 0xfe, - 0x6b, 0x1f, 0x26, 0xe1, 0xec, 0x52, 0x51, 0xaf, 0x84, 0xea, 0x95, 0x3c, 0x9e, 0x8b, 0x5a, 0x77, - 0x95, 0x45, 0xa3, 0xa3, 0x8d, 0xe7, 0xaf, 0x30, 0x6e, 0xc9, 0xfa, 0xe9, 0xf2, 0xcb, 0x7b, 0x68, - 0x9d, 0xc9, 0xf2, 0x57, 0xb3, 0xd1, 0x87, 0xda, 0x9b, 0x67, 0x96, 0xa4, 0xea, 0xad, 0xda, 0xd0, - 0x58, 0x64, 0x2c, 0x11, 0xef, 0xb8, 0x67, 0xe6, 0x5e, 0xe4, 0x76, 0xcf, 0x12, 0x61, 0x8e, 0x43, - 0xb2, 0xe6, 0x86, 0x36, 0xae, 0xfe, 0x5a, 0x7c, 0x06, 0x00, 0x00, 0xff, 0xff, 0xdb, 0x96, 0x15, - 0x04, 0x9a, 0x02, 0x00, 0x00, + 0x10, 0x55, 0xf8, 0x08, 0x60, 0x24, 0x56, 0xf2, 0x61, 0xf1, 0x2e, 0xd2, 0x2a, 0xe2, 0x14, 0xed, + 0xc1, 0x96, 0xc2, 0x6d, 0x6f, 0x8b, 0xda, 0x1e, 0xab, 0x2a, 0x54, 0x3d, 0x54, 0xad, 0x90, 0x09, + 0x43, 0x1a, 0x20, 0x71, 0x14, 0x3b, 0x08, 0x7e, 0x4e, 0xff, 0x69, 0x65, 0x1b, 0x37, 0x39, 0xf4, + 0xd8, 0x9b, 0xc7, 0xef, 0xcd, 0xc7, 0x9b, 0x37, 0x68, 0xb6, 0x03, 0x2e, 0x15, 0x4b, 0x44, 0x05, + 0xec, 0x0e, 0xb8, 0xaa, 0x2b, 0x58, 0x81, 0xa2, 0x65, 0x25, 0x94, 0xc0, 0xc8, 0x80, 0x54, 0x83, + 0xbf, 0xa7, 0x96, 0xa8, 0x2e, 0x25, 0x48, 0xf6, 0xc4, 0x8f, 0x35, 0x58, 0x92, 0x03, 0x4c, 0x85, + 0x95, 0xa8, 0xab, 0xc4, 0x01, 0x7f, 0x52, 0x21, 0xd2, 0x23, 0x30, 0x13, 0x6d, 0xea, 0x1d, 0xdb, + 0xd6, 0x15, 0x57, 0x99, 0x28, 0x2c, 0x3e, 0x7f, 0xef, 0xa0, 0x49, 0xd3, 0x72, 0x55, 0x42, 0x82, + 0x09, 0x1a, 0x94, 0x95, 0xd8, 0x43, 0xa2, 0xc8, 0x20, 0xf0, 0xc2, 0x51, 0xec, 0x42, 0x8c, 0x51, + 0xaf, 0xe0, 0x39, 0x10, 0xcf, 0x7c, 0x9b, 0xb7, 0x66, 0x9f, 0xa0, 0x92, 0x99, 0x28, 0x48, 0x27, + 0xf0, 0xc2, 0x7e, 0xec, 0x42, 0x1c, 0xa1, 0x21, 0x14, 0x2a, 0x53, 0x19, 0x48, 0xd2, 0x0d, 0xba, + 0xe1, 0x38, 0xfa, 0x49, 0x1b, 0x2d, 0xf4, 0x56, 0x63, 0x17, 0xdd, 0x31, 0xfe, 0xe4, 0xe1, 0x05, + 0x1a, 0xee, 0xec, 0x34, 0x92, 0xf4, 0x4c, 0xce, 0xb4, 0x9d, 0xe3, 0x26, 0x35, 0x49, 0x8e, 0x88, + 0x23, 0x34, 0xc8, 0xf9, 0x79, 0xcd, 0x53, 0x20, 0xfd, 0xc0, 0x0b, 0xc7, 0xd1, 0x2f, 0x6a, 0x55, + 0x53, 0xa7, 0x9a, 0xde, 0x5c, 0x55, 0xc7, 0x7e, 0xce, 0xcf, 0xff, 0x53, 0xc0, 0x7f, 0x91, 0x2f, + 0xcd, 0x9e, 0x88, 0x6f, 0x52, 0x70, 0xbb, 0x8d, 0xdd, 0x60, 0x7c, 0x65, 0xcc, 0x5f, 0x10, 0x6a, + 0x86, 0xfd, 0x72, 0x09, 0xff, 0x10, 0x3a, 0x69, 0x37, 0xd6, 0xda, 0x19, 0xb3, 0x87, 0x49, 0x34, + 0xbb, 0x56, 0x34, 0x66, 0x51, 0x63, 0xd6, 0xe3, 0xa5, 0xd4, 0xba, 0xeb, 0x3c, 0x1e, 0x9d, 0x5c, + 0x3c, 0x7f, 0x45, 0xe3, 0x96, 0xac, 0xef, 0x2e, 0xbf, 0xbc, 0x47, 0xad, 0x03, 0x5a, 0xfe, 0x68, + 0xbc, 0x7e, 0xd0, 0xbb, 0x79, 0x66, 0x69, 0xa6, 0xde, 0xea, 0x0d, 0x4d, 0x44, 0xce, 0x52, 0xb1, + 0x87, 0x03, 0xb3, 0x97, 0x24, 0xb7, 0x07, 0x96, 0x0a, 0x7b, 0x36, 0x92, 0x35, 0xd7, 0xb5, 0xf1, + 0xcd, 0xd7, 0xe2, 0x23, 0x00, 0x00, 0xff, 0xff, 0xa9, 0x76, 0xdf, 0xba, 0xb4, 0x02, 0x00, 0x00, } diff --git a/sdk/go/protos/feast/core/Store.pb.go b/sdk/go/protos/feast/core/Store.pb.go index 5dafb63d942..8e0452d5354 100644 --- a/sdk/go/protos/feast/core/Store.pb.go +++ b/sdk/go/protos/feast/core/Store.pb.go @@ -391,6 +391,9 @@ func (m *Store_CassandraConfig) GetPort() int32 { } type Store_Subscription struct { + // Name of project where subscribed feature sets can be found. All feature sets must be located + // within this project. Wildcards are not supported. + Project string `protobuf:"bytes,3,opt,name=project,proto3" json:"project,omitempty"` // Name of featureSet to subscribe to. This field supports any valid basic POSIX regex, // e.g. customer_.* or .* // https://www.regular-expressions.info/posix.html @@ -431,6 +434,13 @@ func (m *Store_Subscription) XXX_DiscardUnknown() { var xxx_messageInfo_Store_Subscription proto.InternalMessageInfo +func (m *Store_Subscription) GetProject() string { + if m != nil { + return m.Project + } + return "" +} + func (m *Store_Subscription) GetName() string { if m != nil { return m.Name @@ -457,33 +467,34 @@ func init() { func init() { proto.RegisterFile("feast/core/Store.proto", fileDescriptor_4b177bc9ccf64875) } var fileDescriptor_4b177bc9ccf64875 = []byte{ - // 442 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x93, 0xcf, 0x6f, 0xd3, 0x30, - 0x14, 0xc7, 0x97, 0xae, 0xdd, 0x96, 0x97, 0xfe, 0x88, 0x7c, 0x40, 0x51, 0xd1, 0x50, 0xd8, 0xa9, - 0xa7, 0x58, 0x2a, 0xe2, 0x80, 0xc4, 0x81, 0xa6, 0x9d, 0x20, 0x02, 0x55, 0xcc, 0x05, 0x24, 0xb8, - 0x4c, 0xf9, 0xe1, 0x65, 0xde, 0xb4, 0x38, 0xd8, 0x2e, 0x52, 0xff, 0x3a, 0xfe, 0x35, 0x64, 0x27, - 0x69, 0x53, 0xda, 0xc3, 0x2e, 0x91, 0xfd, 0x7d, 0xdf, 0xf7, 0xc9, 0xd3, 0xf3, 0x7b, 0xf0, 0xe2, - 0x8e, 0xc6, 0x52, 0xe1, 0x94, 0x0b, 0x8a, 0x57, 0x8a, 0x0b, 0x1a, 0x94, 0x82, 0x2b, 0x8e, 0xc0, - 0xe8, 0x81, 0xd6, 0xaf, 0xfe, 0xf6, 0xa0, 0x67, 0x62, 0x08, 0x41, 0xb7, 0x88, 0x9f, 0xa8, 0x67, - 0xf9, 0xd6, 0xc4, 0x26, 0xe6, 0x8c, 0x30, 0x74, 0xd5, 0xa6, 0xa4, 0x5e, 0xc7, 0xb7, 0x26, 0xc3, - 0xe9, 0xcb, 0x60, 0x97, 0x18, 0x54, 0x40, 0xf3, 0xfd, 0xb6, 0x29, 0x29, 0x31, 0x46, 0xb4, 0x80, - 0x81, 0x5c, 0x27, 0x32, 0x15, 0xac, 0x54, 0x8c, 0x17, 0xd2, 0xeb, 0xfa, 0xa7, 0x13, 0x67, 0xfa, - 0xea, 0x48, 0x66, 0xcb, 0x46, 0xf6, 0x93, 0x50, 0x08, 0x7d, 0x41, 0x33, 0x26, 0x6f, 0x53, 0x5e, - 0xdc, 0xb1, 0xdc, 0x73, 0x7c, 0x6b, 0xe2, 0x4c, 0x2f, 0x0f, 0x21, 0x44, 0xbb, 0xe6, 0xc6, 0xf4, - 0xe9, 0x84, 0x38, 0x62, 0x77, 0x45, 0x9f, 0x61, 0x94, 0xb0, 0xfc, 0xf7, 0x9a, 0x8a, 0x4d, 0x83, - 0xe9, 0x1b, 0x8c, 0x7f, 0x88, 0x09, 0x59, 0x7e, 0xa3, 0x8d, 0x5b, 0xd2, 0xb0, 0x49, 0xad, 0x61, - 0x4b, 0x70, 0xd3, 0x58, 0xca, 0xb8, 0xc8, 0x44, 0xdc, 0xd0, 0x06, 0x86, 0xf6, 0xfa, 0x90, 0x36, - 0x6f, 0x9c, 0x5b, 0xdc, 0x28, 0xdd, 0x97, 0xc6, 0x6f, 0xc1, 0x69, 0x95, 0xae, 0x5b, 0x7f, 0xcf, - 0xa5, 0x6a, 0x5a, 0xaf, 0xcf, 0x5a, 0x2b, 0xb9, 0x50, 0xa6, 0xf5, 0x3d, 0x62, 0xce, 0xe3, 0x25, - 0x0c, 0xf7, 0x4b, 0x45, 0x97, 0x00, 0xa5, 0xe0, 0x0f, 0x34, 0x55, 0xb7, 0x2c, 0xab, 0xf3, 0xed, - 0x5a, 0x89, 0x32, 0x1d, 0xce, 0x62, 0x15, 0x4b, 0x6a, 0xc2, 0x9d, 0x2a, 0x5c, 0x2b, 0x51, 0x36, - 0x7e, 0x07, 0xa3, 0xff, 0x8a, 0x7d, 0x76, 0x29, 0xef, 0xa1, 0xdf, 0x7e, 0xc1, 0xa3, 0xd3, 0xe3, - 0xc1, 0xf9, 0x1f, 0x2a, 0x24, 0xe3, 0x45, 0xfd, 0xeb, 0xe6, 0x7a, 0xf5, 0x01, 0xec, 0xed, 0xe4, - 0x20, 0x07, 0xce, 0xa3, 0xe5, 0x8f, 0xd9, 0x97, 0x68, 0xe1, 0x9e, 0x20, 0x1b, 0x7a, 0xe4, 0x7a, - 0x11, 0xad, 0x5c, 0x0b, 0xf5, 0xe1, 0x22, 0x8c, 0x3e, 0xde, 0x7c, 0xbf, 0x26, 0x3f, 0xdd, 0x0e, - 0x1a, 0x80, 0x3d, 0x9f, 0xad, 0x56, 0xb3, 0xe5, 0x82, 0xcc, 0xdc, 0xd3, 0xf0, 0x02, 0xce, 0xaa, - 0x77, 0x08, 0x23, 0x68, 0xcd, 0x73, 0x08, 0x86, 0xfb, 0x55, 0xcf, 0xf9, 0x2f, 0x9c, 0x33, 0x75, - 0xbf, 0x4e, 0x82, 0x94, 0x3f, 0xe1, 0x9c, 0x3f, 0xd0, 0x47, 0x5c, 0x2d, 0x84, 0xcc, 0x1e, 0x71, - 0xce, 0xb1, 0x59, 0x06, 0x89, 0x77, 0x4b, 0x92, 0x9c, 0x19, 0xe9, 0xcd, 0xbf, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xdc, 0xaf, 0xad, 0x8c, 0x39, 0x03, 0x00, 0x00, + // 450 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x93, 0x4f, 0x6f, 0xd3, 0x30, + 0x18, 0xc6, 0x97, 0xfe, 0x59, 0x97, 0x37, 0xfd, 0x13, 0xf9, 0x80, 0xa2, 0xa2, 0xa1, 0xb0, 0x53, + 0x4f, 0xb1, 0x54, 0xc4, 0x81, 0x1b, 0x4d, 0x3b, 0x41, 0x04, 0xaa, 0x98, 0x0b, 0x93, 0xe0, 0x32, + 0xa5, 0x89, 0x97, 0x79, 0xd3, 0xe2, 0x60, 0xbb, 0x48, 0xfd, 0xa8, 0x7c, 0x1b, 0x64, 0x27, 0x69, + 0x53, 0xda, 0xc3, 0x2e, 0x91, 0xfd, 0xbc, 0xcf, 0xf3, 0xcb, 0x2b, 0xdb, 0x2f, 0xbc, 0xba, 0xa7, + 0xb1, 0x54, 0x38, 0xe1, 0x82, 0xe2, 0x95, 0xe2, 0x82, 0x06, 0x85, 0xe0, 0x8a, 0x23, 0x30, 0x7a, + 0xa0, 0xf5, 0xab, 0xbf, 0x5d, 0xe8, 0x9a, 0x1a, 0x42, 0xd0, 0xc9, 0xe3, 0x67, 0xea, 0x59, 0xbe, + 0x35, 0xb1, 0x89, 0x59, 0x23, 0x0c, 0x1d, 0xb5, 0x2d, 0xa8, 0xd7, 0xf2, 0xad, 0xc9, 0x70, 0xfa, + 0x3a, 0xd8, 0x07, 0x83, 0x12, 0x68, 0xbe, 0xdf, 0xb7, 0x05, 0x25, 0xc6, 0x88, 0x16, 0x30, 0x90, + 0x9b, 0xb5, 0x4c, 0x04, 0x2b, 0x14, 0xe3, 0xb9, 0xf4, 0x3a, 0x7e, 0x7b, 0xe2, 0x4c, 0xdf, 0x9c, + 0x48, 0x36, 0x6c, 0xe4, 0x30, 0x84, 0x42, 0xe8, 0x0b, 0x9a, 0x32, 0x79, 0x97, 0xf0, 0xfc, 0x9e, + 0x65, 0x9e, 0xe3, 0x5b, 0x13, 0x67, 0x7a, 0x79, 0x0c, 0x21, 0xda, 0x35, 0x37, 0xa6, 0xcf, 0x67, + 0xc4, 0x11, 0xfb, 0x2d, 0xfa, 0x02, 0xa3, 0x35, 0xcb, 0x7e, 0x6f, 0xa8, 0xd8, 0xd6, 0x98, 0xbe, + 0xc1, 0xf8, 0xc7, 0x98, 0x90, 0x65, 0x37, 0xda, 0xb8, 0x23, 0x0d, 0xeb, 0x68, 0x05, 0x5b, 0x82, + 0x9b, 0xc4, 0x52, 0xc6, 0x79, 0x2a, 0xe2, 0x9a, 0x36, 0x30, 0xb4, 0xb7, 0xc7, 0xb4, 0x79, 0xed, + 0xdc, 0xe1, 0x46, 0xc9, 0xa1, 0x34, 0x7e, 0x0f, 0x4e, 0xa3, 0x75, 0x7d, 0xf4, 0x0f, 0x5c, 0xaa, + 0xfa, 0xe8, 0xf5, 0x5a, 0x6b, 0x05, 0x17, 0xca, 0x1c, 0x7d, 0x97, 0x98, 0xf5, 0x78, 0x09, 0xc3, + 0xc3, 0x56, 0xd1, 0x25, 0x40, 0x21, 0xf8, 0x23, 0x4d, 0xd4, 0x1d, 0x4b, 0xab, 0xbc, 0x5d, 0x29, + 0x51, 0xaa, 0xcb, 0x69, 0xac, 0x62, 0x49, 0x4d, 0xb9, 0x55, 0x96, 0x2b, 0x25, 0x4a, 0xc7, 0x1f, + 0x60, 0xf4, 0x5f, 0xb3, 0x2f, 0x6e, 0xe5, 0x16, 0xfa, 0xcd, 0x1b, 0x44, 0x1e, 0xf4, 0xaa, 0xdf, + 0x7a, 0x6d, 0x13, 0xad, 0xb7, 0x27, 0xdf, 0x95, 0x07, 0xbd, 0x3f, 0x54, 0x48, 0xc6, 0xf3, 0xaa, + 0xa9, 0x7a, 0x7b, 0xf5, 0x11, 0xec, 0xdd, 0x9b, 0x42, 0x0e, 0xf4, 0xa2, 0xe5, 0xed, 0xec, 0x6b, + 0xb4, 0x70, 0xcf, 0x90, 0x0d, 0x5d, 0x72, 0xbd, 0x88, 0x56, 0xae, 0x85, 0xfa, 0x70, 0x11, 0x46, + 0x9f, 0x6e, 0x7e, 0x5c, 0x93, 0x9f, 0x6e, 0x0b, 0x0d, 0xc0, 0x9e, 0xcf, 0x56, 0xab, 0xd9, 0x72, + 0x41, 0x66, 0x6e, 0x3b, 0xbc, 0x80, 0xf3, 0xf2, 0x86, 0xc2, 0x08, 0x1a, 0x2f, 0x3d, 0x04, 0xc3, + 0xfd, 0xa6, 0x27, 0xe0, 0x17, 0xce, 0x98, 0x7a, 0xd8, 0xac, 0x83, 0x84, 0x3f, 0xe3, 0x8c, 0x3f, + 0xd2, 0x27, 0x5c, 0x8e, 0x8a, 0x4c, 0x9f, 0x70, 0xc6, 0xb1, 0x19, 0x13, 0x89, 0xf7, 0xe3, 0xb3, + 0x3e, 0x37, 0xd2, 0xbb, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x56, 0xfe, 0x58, 0x14, 0x53, 0x03, + 0x00, 0x00, } diff --git a/sdk/go/protos/feast/serving/ServingService.pb.go b/sdk/go/protos/feast/serving/ServingService.pb.go index 49c730ad3ca..41c642d9f8b 100644 --- a/sdk/go/protos/feast/serving/ServingService.pb.go +++ b/sdk/go/protos/feast/serving/ServingService.pb.go @@ -231,13 +231,13 @@ func (m *GetFeastServingInfoResponse) GetJobStagingLocation() string { return "" } -type FeatureSetRequest struct { - // Feature set name - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - // Feature set version - Version int32 `protobuf:"varint,2,opt,name=version,proto3" json:"version,omitempty"` - // Features that should be retrieved from this feature set - FeatureNames []string `protobuf:"bytes,3,rep,name=feature_names,json=featureNames,proto3" json:"feature_names,omitempty"` +type FeatureReference struct { + // Project name + Project string `protobuf:"bytes,1,opt,name=project,proto3" json:"project,omitempty"` + // Feature name + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + // Feature version + Version int32 `protobuf:"varint,3,opt,name=version,proto3" json:"version,omitempty"` // The features will be retrieved if: // entity_timestamp - max_age <= event_timestamp <= entity_timestamp // @@ -249,53 +249,53 @@ type FeatureSetRequest struct { XXX_sizecache int32 `json:"-"` } -func (m *FeatureSetRequest) Reset() { *m = FeatureSetRequest{} } -func (m *FeatureSetRequest) String() string { return proto.CompactTextString(m) } -func (*FeatureSetRequest) ProtoMessage() {} -func (*FeatureSetRequest) Descriptor() ([]byte, []int) { +func (m *FeatureReference) Reset() { *m = FeatureReference{} } +func (m *FeatureReference) String() string { return proto.CompactTextString(m) } +func (*FeatureReference) ProtoMessage() {} +func (*FeatureReference) Descriptor() ([]byte, []int) { return fileDescriptor_0c1ba93cf29a8d9d, []int{2} } -func (m *FeatureSetRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_FeatureSetRequest.Unmarshal(m, b) +func (m *FeatureReference) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_FeatureReference.Unmarshal(m, b) } -func (m *FeatureSetRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_FeatureSetRequest.Marshal(b, m, deterministic) +func (m *FeatureReference) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_FeatureReference.Marshal(b, m, deterministic) } -func (m *FeatureSetRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_FeatureSetRequest.Merge(m, src) +func (m *FeatureReference) XXX_Merge(src proto.Message) { + xxx_messageInfo_FeatureReference.Merge(m, src) } -func (m *FeatureSetRequest) XXX_Size() int { - return xxx_messageInfo_FeatureSetRequest.Size(m) +func (m *FeatureReference) XXX_Size() int { + return xxx_messageInfo_FeatureReference.Size(m) } -func (m *FeatureSetRequest) XXX_DiscardUnknown() { - xxx_messageInfo_FeatureSetRequest.DiscardUnknown(m) +func (m *FeatureReference) XXX_DiscardUnknown() { + xxx_messageInfo_FeatureReference.DiscardUnknown(m) } -var xxx_messageInfo_FeatureSetRequest proto.InternalMessageInfo +var xxx_messageInfo_FeatureReference proto.InternalMessageInfo -func (m *FeatureSetRequest) GetName() string { +func (m *FeatureReference) GetProject() string { if m != nil { - return m.Name + return m.Project } return "" } -func (m *FeatureSetRequest) GetVersion() int32 { +func (m *FeatureReference) GetName() string { if m != nil { - return m.Version + return m.Name } - return 0 + return "" } -func (m *FeatureSetRequest) GetFeatureNames() []string { +func (m *FeatureReference) GetVersion() int32 { if m != nil { - return m.FeatureNames + return m.Version } - return nil + return 0 } -func (m *FeatureSetRequest) GetMaxAge() *duration.Duration { +func (m *FeatureReference) GetMaxAge() *duration.Duration { if m != nil { return m.MaxAge } @@ -303,8 +303,8 @@ func (m *FeatureSetRequest) GetMaxAge() *duration.Duration { } type GetOnlineFeaturesRequest struct { - // List of feature sets and their features that are being retrieved - FeatureSets []*FeatureSetRequest `protobuf:"bytes,1,rep,name=feature_sets,json=featureSets,proto3" json:"feature_sets,omitempty"` + // List of features that are being retrieved + Features []*FeatureReference `protobuf:"bytes,4,rep,name=features,proto3" json:"features,omitempty"` // List of entity rows, containing entity id and timestamp data. // Used during retrieval of feature rows and for joining feature // rows into a final dataset @@ -342,9 +342,9 @@ func (m *GetOnlineFeaturesRequest) XXX_DiscardUnknown() { var xxx_messageInfo_GetOnlineFeaturesRequest proto.InternalMessageInfo -func (m *GetOnlineFeaturesRequest) GetFeatureSets() []*FeatureSetRequest { +func (m *GetOnlineFeaturesRequest) GetFeatures() []*FeatureReference { if m != nil { - return m.FeatureSets + return m.Features } return nil } @@ -414,8 +414,8 @@ func (m *GetOnlineFeaturesRequest_EntityRow) GetFields() map[string]*types.Value } type GetBatchFeaturesRequest struct { - // List of feature sets and their features that are being retrieved. - FeatureSets []*FeatureSetRequest `protobuf:"bytes,1,rep,name=feature_sets,json=featureSets,proto3" json:"feature_sets,omitempty"` + // List of features that are being retrieved + Features []*FeatureReference `protobuf:"bytes,4,rep,name=features,proto3" json:"features,omitempty"` // Source of the entity dataset containing the timestamps and entity keys to retrieve // features for. DatasetSource *DatasetSource `protobuf:"bytes,2,opt,name=dataset_source,json=datasetSource,proto3" json:"dataset_source,omitempty"` @@ -449,9 +449,9 @@ func (m *GetBatchFeaturesRequest) XXX_DiscardUnknown() { var xxx_messageInfo_GetBatchFeaturesRequest proto.InternalMessageInfo -func (m *GetBatchFeaturesRequest) GetFeatureSets() []*FeatureSetRequest { +func (m *GetBatchFeaturesRequest) GetFeatures() []*FeatureReference { if m != nil { - return m.FeatureSets + return m.Features } return nil } @@ -870,7 +870,7 @@ func init() { proto.RegisterEnum("feast.serving.DataFormat", DataFormat_name, DataFormat_value) proto.RegisterType((*GetFeastServingInfoRequest)(nil), "feast.serving.GetFeastServingInfoRequest") proto.RegisterType((*GetFeastServingInfoResponse)(nil), "feast.serving.GetFeastServingInfoResponse") - proto.RegisterType((*FeatureSetRequest)(nil), "feast.serving.FeatureSetRequest") + proto.RegisterType((*FeatureReference)(nil), "feast.serving.FeatureReference") proto.RegisterType((*GetOnlineFeaturesRequest)(nil), "feast.serving.GetOnlineFeaturesRequest") proto.RegisterType((*GetOnlineFeaturesRequest_EntityRow)(nil), "feast.serving.GetOnlineFeaturesRequest.EntityRow") proto.RegisterMapType((map[string]*types.Value)(nil), "feast.serving.GetOnlineFeaturesRequest.EntityRow.FieldsEntry") @@ -889,77 +889,76 @@ func init() { func init() { proto.RegisterFile("feast/serving/ServingService.proto", fileDescriptor_0c1ba93cf29a8d9d) } var fileDescriptor_0c1ba93cf29a8d9d = []byte{ - // 1105 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x56, 0x4f, 0x73, 0xda, 0x46, - 0x14, 0x8f, 0xc0, 0xc6, 0xe1, 0x11, 0x63, 0x79, 0xed, 0xda, 0xb2, 0xe2, 0x24, 0x0c, 0xed, 0xd4, - 0x94, 0x83, 0x68, 0x49, 0x9b, 0x69, 0xd3, 0xe9, 0x4c, 0xc0, 0x08, 0x82, 0xc7, 0x11, 0x9e, 0x05, - 0x3b, 0x6d, 0x2f, 0x1a, 0x01, 0x0b, 0x96, 0x0d, 0x5a, 0x57, 0xbb, 0x38, 0xf1, 0xd7, 0xe8, 0xb1, - 0x87, 0x5e, 0x7a, 0xee, 0xb5, 0x9f, 0xa4, 0x9f, 0xa0, 0xb7, 0x7e, 0x83, 0x1e, 0x3b, 0x5a, 0xad, - 0x30, 0xff, 0x9c, 0xd8, 0x9d, 0x69, 0x4e, 0xda, 0x7d, 0xef, 0xf7, 0xfe, 0xee, 0x7b, 0x4f, 0x0f, - 0xb2, 0x3d, 0xe2, 0x30, 0x5e, 0x60, 0xc4, 0xbf, 0x74, 0xbd, 0x7e, 0xa1, 0x19, 0x7e, 0xc5, 0xa7, - 0x43, 0x8c, 0x0b, 0x9f, 0x72, 0x8a, 0x56, 0x05, 0xc6, 0x90, 0x18, 0xfd, 0x49, 0x9f, 0xd2, 0xfe, - 0x80, 0x14, 0x04, 0xb3, 0x3d, 0xea, 0x15, 0xb8, 0x3b, 0x24, 0x8c, 0x3b, 0xc3, 0x8b, 0x10, 0xaf, - 0x3f, 0x9e, 0x05, 0x74, 0x47, 0xbe, 0xc3, 0x5d, 0xea, 0x49, 0xfe, 0x76, 0x68, 0x93, 0x5f, 0x5d, - 0x10, 0x56, 0x38, 0x71, 0x06, 0x23, 0x69, 0x28, 0xbb, 0x0b, 0x7a, 0x8d, 0xf0, 0x6a, 0xc0, 0x95, - 0x8e, 0xd4, 0xbd, 0x1e, 0xc5, 0xe4, 0xa7, 0x11, 0x61, 0x3c, 0xfb, 0xab, 0x02, 0x0f, 0x17, 0xb2, - 0xd9, 0x05, 0xf5, 0x18, 0x41, 0x1a, 0xac, 0x5c, 0x12, 0x9f, 0xb9, 0xd4, 0xd3, 0x94, 0x8c, 0x92, - 0x4b, 0xe2, 0xe8, 0x8a, 0x9e, 0xc2, 0x52, 0x60, 0x4c, 0x8b, 0x65, 0x94, 0x5c, 0xba, 0xf8, 0xc4, - 0x98, 0x8a, 0xc7, 0x98, 0x54, 0xd8, 0xba, 0xba, 0x20, 0x58, 0x80, 0xd1, 0xe7, 0xb0, 0x79, 0x46, - 0xdb, 0x36, 0xe3, 0x4e, 0xdf, 0xf5, 0xfa, 0xf6, 0x80, 0x76, 0x44, 0x0c, 0x1a, 0x08, 0xdd, 0xe8, - 0x8c, 0xb6, 0x9b, 0x21, 0xeb, 0x50, 0x72, 0xb2, 0xbf, 0x28, 0xb0, 0x5e, 0x25, 0x0e, 0x1f, 0xf9, - 0xa4, 0x49, 0xb8, 0x74, 0x1b, 0x21, 0x58, 0xf2, 0x9c, 0x21, 0x91, 0x3e, 0x89, 0xf3, 0xa4, 0xab, - 0x81, 0x4f, 0xcb, 0xd7, 0xae, 0x7e, 0x0c, 0x41, 0xb6, 0x03, 0x15, 0x76, 0x80, 0x64, 0x5a, 0x3c, - 0x13, 0xcf, 0x25, 0xf1, 0x03, 0x49, 0xb4, 0x02, 0x1a, 0x2a, 0xc2, 0xca, 0xd0, 0x79, 0x6b, 0x3b, - 0x7d, 0xa2, 0x2d, 0x65, 0x94, 0x5c, 0xaa, 0xb8, 0x63, 0x84, 0x29, 0x37, 0xa2, 0x94, 0x1b, 0x15, - 0x99, 0x72, 0x9c, 0x18, 0x3a, 0x6f, 0x4b, 0x7d, 0x92, 0xfd, 0x3b, 0x0e, 0x5a, 0x8d, 0xf0, 0x86, - 0x37, 0x70, 0x3d, 0x22, 0xbd, 0x64, 0x91, 0x8f, 0xfb, 0x10, 0x19, 0xb0, 0x19, 0xe1, 0x4c, 0x53, - 0x32, 0xf1, 0x5c, 0xaa, 0x98, 0x99, 0x4f, 0xd4, 0x74, 0x6c, 0x38, 0xd5, 0x1b, 0x93, 0x18, 0xc2, - 0x90, 0x22, 0x1e, 0x77, 0xf9, 0x95, 0xed, 0xd3, 0x37, 0x4c, 0x8b, 0x09, 0x1d, 0x5f, 0xcc, 0xe8, - 0xb8, 0xc9, 0x05, 0xc3, 0x14, 0xa2, 0x98, 0xbe, 0xc1, 0x40, 0xa2, 0x23, 0x43, 0xdf, 0xc0, 0x0e, - 0x1d, 0xba, 0xdc, 0x16, 0x24, 0x97, 0x30, 0xdb, 0xf5, 0x6c, 0x5f, 0x3e, 0xb8, 0x16, 0xcf, 0x28, - 0xb9, 0xfb, 0x78, 0x2b, 0x00, 0x98, 0x92, 0x5f, 0xf7, 0xa2, 0x72, 0xd0, 0xff, 0x51, 0x20, 0x39, - 0x56, 0x8a, 0x4c, 0x50, 0xa5, 0x73, 0xe3, 0x6a, 0x15, 0x2f, 0x92, 0x2a, 0xea, 0x73, 0xb9, 0x6b, - 0x45, 0x08, 0xbc, 0x16, 0xca, 0x8c, 0x09, 0xe8, 0x18, 0x12, 0x3d, 0x97, 0x0c, 0xba, 0x51, 0x78, - 0xdf, 0xdd, 0x39, 0x3c, 0xa3, 0x2a, 0xe4, 0x4d, 0x8f, 0xfb, 0x57, 0x58, 0x2a, 0xd3, 0x5f, 0x41, - 0x6a, 0x82, 0x8c, 0x54, 0x88, 0x9f, 0x93, 0x2b, 0x59, 0x31, 0xc1, 0x11, 0xe5, 0x60, 0xf9, 0x32, - 0x68, 0x14, 0x51, 0x2e, 0xa9, 0x22, 0x92, 0x66, 0x45, 0x0b, 0x19, 0xa2, 0x85, 0x70, 0x08, 0x78, - 0x1e, 0xfb, 0x5a, 0xc9, 0xfe, 0xa6, 0xc0, 0x76, 0x8d, 0xf0, 0xb2, 0xc3, 0x3b, 0xa7, 0xff, 0xcb, - 0x53, 0xef, 0x43, 0xba, 0xeb, 0x70, 0x87, 0x11, 0x6e, 0x33, 0x3a, 0xf2, 0x3b, 0x91, 0x5f, 0xbb, - 0x33, 0x6a, 0x2a, 0x21, 0xa8, 0x29, 0x30, 0x78, 0xb5, 0x3b, 0x79, 0xcd, 0xfe, 0x1e, 0x83, 0x9d, - 0x05, 0xf9, 0x92, 0xdd, 0xfc, 0x1a, 0x1e, 0x88, 0xe4, 0xd8, 0x22, 0xac, 0xc8, 0xcf, 0x2f, 0xdf, - 0x9f, 0xef, 0x50, 0x3e, 0x4c, 0xb3, 0xc8, 0x0c, 0xc3, 0xa9, 0xde, 0xf5, 0x45, 0xff, 0x43, 0x91, - 0xc9, 0x0e, 0xef, 0xe8, 0xfb, 0xf1, 0x93, 0x86, 0x26, 0x5e, 0xfc, 0x17, 0x13, 0x1f, 0xe2, 0x55, - 0x5f, 0x88, 0x06, 0x9e, 0x79, 0x54, 0x99, 0xad, 0x4f, 0x20, 0x7e, 0x46, 0xdb, 0xb2, 0xa2, 0xd1, - 0x4c, 0x04, 0x07, 0xb4, 0x8d, 0x03, 0x76, 0xf6, 0x2b, 0x58, 0xad, 0x11, 0x1e, 0x5c, 0x65, 0x31, - 0xdc, 0x4e, 0xec, 0x19, 0xa4, 0x23, 0xb1, 0x3b, 0x99, 0xfb, 0x4b, 0x81, 0xf8, 0x01, 0x6d, 0xa3, - 0x34, 0xc4, 0xdc, 0xae, 0x8c, 0x3b, 0xe6, 0x76, 0x51, 0x7e, 0x6a, 0x1c, 0x6f, 0xcd, 0x8b, 0x4f, - 0x4d, 0xe1, 0x04, 0xe3, 0x0e, 0x1f, 0x31, 0xd1, 0xed, 0xe9, 0xa2, 0x36, 0x8f, 0x6e, 0x0a, 0x3e, - 0x96, 0x38, 0xb4, 0x09, 0xcb, 0xc4, 0xf7, 0xa9, 0x2f, 0x46, 0x63, 0x12, 0x87, 0x17, 0xf4, 0x10, - 0x92, 0x3d, 0x77, 0x40, 0xec, 0x91, 0xef, 0x32, 0x6d, 0x59, 0xcc, 0xd4, 0xfb, 0x01, 0xe1, 0xd8, - 0x77, 0x19, 0x7a, 0x0e, 0xa9, 0xa0, 0x34, 0xed, 0x1e, 0xf5, 0x87, 0x0e, 0xd7, 0x12, 0xc2, 0xd2, - 0xce, 0x82, 0x5a, 0xae, 0x0a, 0x00, 0x86, 0xee, 0xf8, 0x9c, 0xfd, 0x53, 0x81, 0xd5, 0xa9, 0x32, - 0x47, 0x07, 0x90, 0x12, 0xa6, 0x64, 0x67, 0x84, 0x49, 0xda, 0x7b, 0x57, 0x67, 0x18, 0x55, 0x77, - 0x40, 0xc2, 0xe3, 0xcb, 0x7b, 0x18, 0x7a, 0xe3, 0x9b, 0x4e, 0x00, 0xae, 0x79, 0xd3, 0x41, 0x28, - 0xef, 0x0e, 0x22, 0x76, 0x87, 0x20, 0xca, 0xea, 0x6c, 0x3f, 0xe7, 0x29, 0xa8, 0xb3, 0xff, 0x45, - 0xf4, 0x18, 0xf4, 0xaa, 0x59, 0x6a, 0xb6, 0xec, 0xa6, 0x89, 0x4f, 0xea, 0x56, 0xcd, 0x6e, 0xfd, - 0x70, 0x64, 0xda, 0x75, 0xeb, 0xa4, 0x74, 0x58, 0xaf, 0xa8, 0xf7, 0xd0, 0x23, 0xd8, 0x59, 0xc0, - 0x6f, 0x58, 0x87, 0x75, 0xcb, 0x54, 0x15, 0xb4, 0x0b, 0xda, 0x02, 0x76, 0xb9, 0xd4, 0xda, 0x7f, - 0xa9, 0xc6, 0xf2, 0xcf, 0x60, 0x45, 0xbe, 0x3c, 0xda, 0x04, 0xf5, 0xa0, 0x51, 0x9e, 0xd5, 0xfe, - 0x11, 0xac, 0x8f, 0xa9, 0x95, 0xc6, 0x6b, 0xeb, 0xb0, 0x51, 0xaa, 0xa8, 0x4a, 0xfe, 0x14, 0x92, - 0xe3, 0x1a, 0x40, 0x5b, 0x80, 0x02, 0x4c, 0xb3, 0x55, 0x6a, 0x1d, 0x37, 0x27, 0x64, 0xa7, 0xe9, - 0x47, 0xa6, 0x55, 0xa9, 0x5b, 0x35, 0x55, 0x99, 0xa1, 0xe3, 0x63, 0xcb, 0x0a, 0xe8, 0x31, 0xb4, - 0x01, 0x6b, 0x13, 0xf4, 0x4a, 0xc3, 0x32, 0xd5, 0x78, 0xfe, 0x5b, 0x80, 0xeb, 0xf4, 0xa1, 0x6d, - 0xd8, 0xa8, 0x94, 0x5a, 0x25, 0xbb, 0xda, 0xc0, 0xaf, 0x4a, 0xad, 0x09, 0x5b, 0x9b, 0xa0, 0x4e, - 0x32, 0x4a, 0x27, 0xb8, 0xa1, 0x2a, 0xc5, 0x9f, 0xe3, 0x90, 0x9e, 0x5e, 0xae, 0xd0, 0x00, 0x36, - 0x16, 0xac, 0x33, 0xe8, 0xb3, 0xf9, 0xf9, 0x73, 0xc3, 0x46, 0xa4, 0xe7, 0x6f, 0x03, 0x95, 0x2d, - 0xdb, 0x83, 0xf5, 0xb9, 0x49, 0x86, 0xf6, 0x6e, 0xf9, 0xfb, 0xd2, 0x73, 0xb7, 0x1d, 0x8a, 0xa8, - 0x03, 0xea, 0xec, 0x94, 0x42, 0x9f, 0xce, 0x4b, 0x2f, 0xfa, 0x37, 0xe9, 0x7b, 0xef, 0xc5, 0x49, - 0x23, 0x26, 0x24, 0xc2, 0x89, 0x84, 0x76, 0xe7, 0x45, 0xae, 0xe7, 0x9b, 0xfe, 0xe8, 0x06, 0x6e, - 0xa8, 0xa6, 0xdc, 0x82, 0xe9, 0xd5, 0xb6, 0xbc, 0x26, 0x33, 0x57, 0x3a, 0xaa, 0x1f, 0x05, 0xdb, - 0xc0, 0x8f, 0xc5, 0xbe, 0xcb, 0x4f, 0x47, 0x6d, 0xa3, 0x43, 0x87, 0x85, 0x3e, 0x3d, 0x23, 0xe7, - 0x05, 0xb9, 0x2f, 0x77, 0xcf, 0x0b, 0x7d, 0x1a, 0x6e, 0xb8, 0xac, 0x30, 0xb5, 0x43, 0xb7, 0x13, - 0x82, 0xfa, 0xf4, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xa8, 0xc6, 0xa7, 0xc9, 0x5b, 0x0b, 0x00, - 0x00, + // 1097 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x56, 0x51, 0x73, 0xda, 0x46, + 0x10, 0x8e, 0xc0, 0xc6, 0x66, 0xa9, 0xb1, 0x72, 0x76, 0x6d, 0x59, 0x71, 0x12, 0x86, 0xe9, 0xd4, + 0x94, 0x07, 0xd1, 0x92, 0x36, 0xd3, 0x26, 0xd3, 0x99, 0x40, 0x10, 0x04, 0x8f, 0x03, 0x9e, 0x03, + 0x3b, 0x6d, 0x5f, 0x34, 0x02, 0x4e, 0x58, 0x36, 0xe8, 0xa8, 0xee, 0x70, 0xe2, 0x3f, 0xd1, 0x87, + 0xbe, 0x76, 0xa6, 0xff, 0xa0, 0xaf, 0xfd, 0x25, 0xfd, 0x03, 0xed, 0xaf, 0xe8, 0x63, 0x47, 0xa7, + 0x03, 0x23, 0xc0, 0x89, 0xdd, 0xe9, 0xf4, 0x49, 0x77, 0xbb, 0xdf, 0xde, 0xde, 0x7e, 0xb7, 0xbb, + 0x5a, 0xc8, 0x3a, 0xc4, 0x66, 0xbc, 0xc0, 0x88, 0x7f, 0xe9, 0x7a, 0xfd, 0x42, 0x2b, 0xfc, 0x8a, + 0x4f, 0x97, 0x18, 0x23, 0x9f, 0x72, 0x8a, 0x36, 0x04, 0xc6, 0x90, 0x18, 0xfd, 0x71, 0x9f, 0xd2, + 0xfe, 0x80, 0x14, 0x84, 0xb2, 0x33, 0x76, 0x0a, 0xdc, 0x1d, 0x12, 0xc6, 0xed, 0xe1, 0x28, 0xc4, + 0xeb, 0x8f, 0xe6, 0x01, 0xbd, 0xb1, 0x6f, 0x73, 0x97, 0x7a, 0x52, 0xbf, 0x1b, 0xfa, 0xe4, 0x57, + 0x23, 0xc2, 0x0a, 0xa7, 0xf6, 0x60, 0x2c, 0x1d, 0x65, 0xf7, 0x41, 0xaf, 0x11, 0x5e, 0x0d, 0xb4, + 0xf2, 0x22, 0x75, 0xcf, 0xa1, 0x98, 0xfc, 0x38, 0x26, 0x8c, 0x67, 0x7f, 0x55, 0xe0, 0xc1, 0x52, + 0x35, 0x1b, 0x51, 0x8f, 0x11, 0xa4, 0xc1, 0xda, 0x25, 0xf1, 0x99, 0x4b, 0x3d, 0x4d, 0xc9, 0x28, + 0xb9, 0x24, 0x9e, 0x6c, 0xd1, 0x13, 0x58, 0x09, 0x9c, 0x69, 0xb1, 0x8c, 0x92, 0x4b, 0x17, 0x1f, + 0x1b, 0x91, 0x78, 0x8c, 0xd9, 0x03, 0xdb, 0x57, 0x23, 0x82, 0x05, 0x18, 0x7d, 0x0e, 0xdb, 0xe7, + 0xb4, 0x63, 0x31, 0x6e, 0xf7, 0x5d, 0xaf, 0x6f, 0x0d, 0x68, 0x57, 0xc4, 0xa0, 0x81, 0x38, 0x1b, + 0x9d, 0xd3, 0x4e, 0x2b, 0x54, 0x1d, 0x49, 0x4d, 0xf6, 0x27, 0x05, 0xd4, 0x2a, 0xb1, 0xf9, 0xd8, + 0x27, 0x98, 0x38, 0xc4, 0x27, 0x5e, 0x57, 0xdc, 0x6a, 0xe4, 0xd3, 0x73, 0xd2, 0xe5, 0x93, 0x5b, + 0xc9, 0x2d, 0x42, 0xb0, 0xe2, 0xd9, 0xc3, 0xf0, 0x56, 0x49, 0x2c, 0xd6, 0xb3, 0x31, 0xc4, 0x33, + 0x4a, 0x6e, 0xf5, 0x3a, 0x86, 0x22, 0xac, 0x0d, 0xed, 0x77, 0x96, 0xdd, 0x27, 0xda, 0x4a, 0x46, + 0xc9, 0xa5, 0x8a, 0x7b, 0x46, 0x48, 0xb3, 0x31, 0xa1, 0xd9, 0xa8, 0x48, 0x9a, 0x71, 0x62, 0x68, + 0xbf, 0x2b, 0xf5, 0x49, 0xf6, 0xcf, 0x38, 0x68, 0x35, 0xc2, 0x9b, 0xde, 0xc0, 0xf5, 0x88, 0xbc, + 0x19, 0x93, 0x74, 0xa2, 0xe7, 0xb0, 0xee, 0x48, 0x91, 0xb6, 0x92, 0x89, 0xe7, 0x52, 0xcb, 0x88, + 0x89, 0xc4, 0x82, 0xa7, 0x06, 0x08, 0x43, 0x8a, 0x78, 0xdc, 0xe5, 0x57, 0x96, 0x4f, 0xdf, 0x32, + 0x2d, 0x26, 0xec, 0xbf, 0x98, 0xb3, 0xbf, 0xc9, 0xb5, 0x61, 0x0a, 0x53, 0x4c, 0xdf, 0x62, 0x20, + 0x93, 0x25, 0x43, 0xdf, 0xc0, 0x1e, 0x1d, 0xba, 0xdc, 0x12, 0x22, 0x97, 0x30, 0xcb, 0xf5, 0x2c, + 0x5f, 0x3e, 0xae, 0x60, 0x63, 0x1d, 0xef, 0x04, 0x00, 0x53, 0xea, 0xeb, 0xde, 0xe4, 0xe9, 0xf5, + 0xbf, 0x15, 0x48, 0x4e, 0x0f, 0x45, 0x26, 0xa8, 0xf2, 0x72, 0xd3, 0xcc, 0x14, 0xdc, 0xa7, 0x8a, + 0xfa, 0x02, 0x67, 0xed, 0x09, 0x02, 0x6f, 0x86, 0x36, 0x53, 0x01, 0x3a, 0x81, 0x84, 0xe3, 0x92, + 0x41, 0x6f, 0x12, 0xde, 0xb7, 0x77, 0x0e, 0xcf, 0xa8, 0x0a, 0x7b, 0xd3, 0xe3, 0xfe, 0x15, 0x96, + 0x87, 0xe9, 0xaf, 0x21, 0x35, 0x23, 0x46, 0x2a, 0xc4, 0x2f, 0xc8, 0x95, 0xcc, 0x8d, 0x60, 0x89, + 0x72, 0xb0, 0x7a, 0x19, 0x14, 0x85, 0x48, 0x8c, 0x54, 0x11, 0x49, 0xb7, 0xa2, 0x5c, 0x0c, 0x51, + 0x2e, 0x38, 0x04, 0x3c, 0x8b, 0x7d, 0xad, 0x64, 0x7f, 0x51, 0x60, 0xb7, 0x46, 0x78, 0xd9, 0xe6, + 0xdd, 0xb3, 0xff, 0xf4, 0x89, 0x5f, 0x42, 0xba, 0x67, 0x73, 0x9b, 0x11, 0x6e, 0x31, 0x3a, 0xf6, + 0xbb, 0x93, 0xfb, 0xec, 0xcf, 0x1d, 0x51, 0x09, 0x41, 0x2d, 0x81, 0xc1, 0x1b, 0xbd, 0xd9, 0x6d, + 0xf6, 0xb7, 0x18, 0xec, 0x2d, 0xe1, 0x49, 0x56, 0xec, 0x1b, 0xf8, 0x48, 0x90, 0x62, 0x89, 0x70, + 0x98, 0xa6, 0x88, 0x3b, 0x7e, 0xf9, 0x61, 0x9e, 0x43, 0xfb, 0x90, 0x5e, 0xc1, 0x08, 0xc3, 0x29, + 0xe7, 0x7a, 0xa3, 0xff, 0xae, 0x48, 0x92, 0xc3, 0x3d, 0xfa, 0x6e, 0xfa, 0x94, 0xa1, 0x8b, 0x17, + 0xff, 0xc6, 0xc5, 0xff, 0xf1, 0x9a, 0x2f, 0x44, 0xc1, 0xce, 0x3d, 0xa6, 0x64, 0xeb, 0x13, 0x88, + 0x9f, 0xd3, 0x8e, 0xcc, 0x64, 0x34, 0x17, 0xc1, 0x21, 0xed, 0xe0, 0x40, 0x9d, 0xfd, 0x0a, 0x36, + 0x6a, 0x84, 0x07, 0x5b, 0x99, 0x04, 0xb7, 0x33, 0x7b, 0x0a, 0xe9, 0x89, 0xd9, 0x9d, 0xdc, 0xfd, + 0xa5, 0x40, 0xfc, 0x90, 0x76, 0x50, 0x1a, 0x62, 0x6e, 0x4f, 0xc6, 0x1d, 0x73, 0x7b, 0x28, 0x1f, + 0x69, 0xb9, 0x3b, 0x8b, 0xe6, 0x91, 0x4e, 0x9b, 0x60, 0xdc, 0xe6, 0x63, 0x26, 0xaa, 0x3c, 0x5d, + 0xd4, 0x16, 0xd1, 0x2d, 0xa1, 0xc7, 0x12, 0x87, 0xb6, 0x61, 0x95, 0xf8, 0x3e, 0xf5, 0x45, 0x2b, + 0x4c, 0xe2, 0x70, 0x83, 0x1e, 0x40, 0xd2, 0x71, 0x07, 0xc4, 0x1a, 0xfb, 0x2e, 0xd3, 0x56, 0x33, + 0xf1, 0x5c, 0x12, 0xaf, 0x07, 0x82, 0x13, 0xdf, 0x65, 0xe8, 0x19, 0xa4, 0x82, 0xd4, 0xb4, 0x1c, + 0xea, 0x0f, 0x6d, 0xae, 0x25, 0x84, 0xa7, 0xbd, 0x25, 0xb9, 0x5c, 0x15, 0x00, 0x0c, 0xbd, 0xe9, + 0x3a, 0xfb, 0x87, 0x02, 0x1b, 0x91, 0x34, 0x47, 0x87, 0x90, 0x12, 0xae, 0x64, 0x65, 0x84, 0x24, + 0x1d, 0xbc, 0xaf, 0x32, 0x8c, 0xaa, 0x3b, 0x20, 0xe1, 0xf2, 0xd5, 0x3d, 0x0c, 0xce, 0x74, 0xa7, + 0x13, 0x80, 0x6b, 0x5d, 0x34, 0x08, 0xe5, 0xfd, 0x41, 0xc4, 0xee, 0x10, 0x44, 0x59, 0x9d, 0xaf, + 0xe7, 0x3c, 0x15, 0xbf, 0xab, 0xc8, 0xbf, 0x0f, 0x3d, 0x02, 0xbd, 0x6a, 0x96, 0x5a, 0x6d, 0xab, + 0x65, 0xe2, 0xd3, 0x7a, 0xa3, 0x66, 0xb5, 0xbf, 0x3f, 0x36, 0xad, 0x7a, 0xe3, 0xb4, 0x74, 0x54, + 0xaf, 0xa8, 0xf7, 0xd0, 0x43, 0xd8, 0x5b, 0xa2, 0x6f, 0x36, 0x8e, 0xea, 0x0d, 0x53, 0x55, 0xd0, + 0x3e, 0x68, 0x4b, 0xd4, 0xe5, 0x52, 0xfb, 0xe5, 0x2b, 0x35, 0x96, 0x7f, 0x0a, 0x6b, 0xf2, 0xe5, + 0xd1, 0x36, 0xa8, 0x87, 0xcd, 0xf2, 0xfc, 0xe9, 0x1f, 0xc3, 0xfd, 0xa9, 0xb4, 0xd2, 0x7c, 0xd3, + 0x38, 0x6a, 0x96, 0x2a, 0xaa, 0x92, 0x3f, 0x83, 0xe4, 0x34, 0x07, 0xd0, 0x0e, 0xa0, 0x00, 0xd3, + 0x6a, 0x97, 0xda, 0x27, 0xad, 0x19, 0xdb, 0xa8, 0xfc, 0xd8, 0x6c, 0x54, 0xea, 0x8d, 0x9a, 0xaa, + 0xcc, 0xc9, 0xf1, 0x49, 0xa3, 0x11, 0xc8, 0x63, 0x68, 0x0b, 0x36, 0x67, 0xe4, 0x95, 0x66, 0xc3, + 0x54, 0xe3, 0xf9, 0xe7, 0x00, 0xd7, 0xf4, 0xa1, 0x5d, 0xd8, 0xaa, 0x94, 0xda, 0x25, 0xab, 0xda, + 0xc4, 0xaf, 0x4b, 0xed, 0x19, 0x5f, 0xdb, 0xa0, 0xce, 0x2a, 0x4a, 0xa7, 0xb8, 0xa9, 0x2a, 0xc5, + 0x9f, 0xe3, 0x90, 0x8e, 0x0e, 0x50, 0x68, 0x00, 0x5b, 0x4b, 0x46, 0x16, 0xf4, 0xd9, 0x62, 0xff, + 0xb9, 0x61, 0xea, 0xd1, 0xf3, 0xb7, 0x81, 0xca, 0x92, 0x75, 0xe0, 0xfe, 0x42, 0x27, 0x43, 0x07, + 0xb7, 0xfc, 0x6d, 0xe9, 0xb9, 0xdb, 0x36, 0x45, 0xd4, 0x05, 0x75, 0xbe, 0x4b, 0xa1, 0x4f, 0x17, + 0xad, 0x97, 0xfd, 0x93, 0xf4, 0x83, 0x0f, 0xe2, 0xa4, 0x13, 0x13, 0x12, 0x61, 0x47, 0x42, 0xfb, + 0x8b, 0x26, 0xd7, 0xfd, 0x4d, 0x7f, 0x78, 0x83, 0x36, 0x3c, 0xa6, 0xdc, 0x86, 0xe8, 0xf8, 0x5a, + 0xde, 0x94, 0xcc, 0x95, 0x8e, 0xeb, 0xc7, 0xc1, 0x14, 0xf0, 0x43, 0xb1, 0xef, 0xf2, 0xb3, 0x71, + 0xc7, 0xe8, 0xd2, 0x61, 0xa1, 0x4f, 0xcf, 0xc9, 0x45, 0x41, 0xce, 0xc4, 0xbd, 0x8b, 0x42, 0x9f, + 0x86, 0x53, 0x2c, 0x2b, 0x44, 0xe6, 0xe4, 0x4e, 0x42, 0x48, 0x9f, 0xfc, 0x13, 0x00, 0x00, 0xff, + 0xff, 0xb8, 0x72, 0x65, 0xdc, 0x3f, 0x0b, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/sdk/go/request.go b/sdk/go/request.go index 5ffacea2e84..9e97dffb72f 100644 --- a/sdk/go/request.go +++ b/sdk/go/request.go @@ -8,23 +8,30 @@ import ( ) var ( - ErrInvalidFeatureName = "invalid feature name %s provided, feature names must be in the format featureSet:version:featureName" + ErrInvalidFeatureName = "invalid feature ids %s provided, feature names must be in the format /:" ) // OnlineFeaturesRequest wrapper on feast.serving.GetOnlineFeaturesRequest. type OnlineFeaturesRequest struct { - - // Features is the list of features to obtain from Feast. Each feature must be given by its fully qualified ID, - // in the format featureSet:version:featureName. - Features []string + // Features is the list of features to obtain from Feast. Each feature can be given as + // + // : + // / + // /: + // The only required components are the feature name and project. + Features []string // Entities is the list of entity rows to retrieve features on. Each row is a map of entity name to entity value. - Entities []Row + Entities []Row + + // Project is the default project to use when looking up features. This is only used when a project is not found + // within the feature id. + Project string } // Builds the feast-specified request payload from the wrapper. func (r OnlineFeaturesRequest) buildRequest() (*serving.GetOnlineFeaturesRequest, error) { - featureSets, err := buildFeatureSets(r.Features) + features, err := buildFeatures(r.Features, r.Project) if err != nil { return nil, err } @@ -33,55 +40,62 @@ func (r OnlineFeaturesRequest) buildRequest() (*serving.GetOnlineFeaturesRequest for i := range r.Entities { entityRows[i] = &serving.GetOnlineFeaturesRequest_EntityRow{ - Fields: r.Entities[i], + Fields: r.Entities[i], } } return &serving.GetOnlineFeaturesRequest{ - FeatureSets: featureSets, - EntityRows: entityRows, + Features: features, + EntityRows: entityRows, }, nil } -// buildFeatureSets create a slice of FeatureSetRequest object from -// a slice of "feature_set:version:feature_name" string. -// -// It returns an error when "feature_set:version:feature_name" string -// has an invalid format. -func buildFeatureSets(features []string) ([]*serving.FeatureSetRequest, error) { - var requests []*serving.FeatureSetRequest - - // Map of "feature_set_name:version" to "FeatureSetRequest" pointer - // to reference existing FeatureSetRequest, if any. - fsNameVersionToRequest := make(map[string]*serving.FeatureSetRequest) - - for _, feature := range features { - splits := strings.Split(feature, ":") - if len(splits) != 3 { - return nil, fmt.Errorf(ErrInvalidFeatureName, feature) - } +// buildFeatures create a slice of FeatureReferences from a slice of "/:" +// It returns an error when the format is invalid +func buildFeatures(featureReferences []string, defaultProject string) ([]*serving.FeatureReference, error) { + var features []*serving.FeatureReference - featureSetName, featureSetVersionString, featureName := splits[0], splits[1], splits[2] - featureSetVersion, err := strconv.Atoi(featureSetVersionString) - if err != nil { - return nil, fmt.Errorf(ErrInvalidFeatureName, feature) + for _, featureRef := range featureReferences { + var project string + var name string + var version int + var featureSplit []string + + projectSplit := strings.Split(featureRef, "/") + + if len(projectSplit) == 2 { + project = projectSplit[0] + featureSplit = strings.Split(projectSplit[1], ":") + } else if len(projectSplit) == 1 { + project = defaultProject + featureSplit = strings.Split(projectSplit[0], ":") + } else { + return nil, fmt.Errorf(ErrInvalidFeatureName, featureRef) } - fsNameVersion := featureSetName + ":" + featureSetVersionString - if request, ok := fsNameVersionToRequest[fsNameVersion]; !ok { - request = &serving.FeatureSetRequest{ - Name: featureSetName, - Version: int32(featureSetVersion), - FeatureNames: []string{featureName}, + if len(featureSplit) == 2 { + name = featureSplit[0] + v, err := strconv.Atoi(featureSplit[1]) + if err != nil { + return nil, fmt.Errorf(ErrInvalidFeatureName, featureRef) } - fsNameVersionToRequest[fsNameVersion] = request - // Adding FeatureSetRequest in this step ensures the order of - // FeatureSetRequest in the slice follows the order of feature sets - // in the "features" argument in buildFeatureSets method. - requests = append(requests, request) + version = v + } else if len(featureSplit) == 1 { + name = featureSplit[0] } else { - request.FeatureNames = append(request.FeatureNames, featureName) + return nil, fmt.Errorf(ErrInvalidFeatureName, featureRef) } + + + if project == "" || name == "" || version < 0 { + return nil, fmt.Errorf(ErrInvalidFeatureName, featureRef) + } + + features = append(features, &serving.FeatureReference{ + Name: name, + Version: int32(version), + Project: project, + }) } - return requests, nil -} \ No newline at end of file + return features, nil +} diff --git a/sdk/go/request_test.go b/sdk/go/request_test.go index 3da4fd465b8..2e403f0bd3e 100644 --- a/sdk/go/request_test.go +++ b/sdk/go/request_test.go @@ -20,24 +20,40 @@ func TestGetOnlineFeaturesRequest(t *testing.T) { { name: "valid", req: OnlineFeaturesRequest{ - Features: []string{"fs:1:feature1", "fs:1:feature2", "fs:2:feature1"}, + Features: []string{"my_project_1/feature1:1", "my_project_2/feature1:1", "my_project_4/feature3", "feature2:2", "feature2"}, Entities: []Row{ {"entity1": Int64Val(1), "entity2": StrVal("bob")}, {"entity1": Int64Val(1), "entity2": StrVal("annie")}, {"entity1": Int64Val(1), "entity2": StrVal("jane")}, }, + Project: "my_project_3", }, want: &serving.GetOnlineFeaturesRequest{ - FeatureSets: []*serving.FeatureSetRequest{ + Features: []*serving.FeatureReference{ { - Name: "fs", - Version: 1, - FeatureNames: []string{"feature1", "feature2"}, + Project: "my_project_1", + Name: "feature1", + Version: 1, }, { - Name: "fs", - Version: 2, - FeatureNames: []string{"feature1"}, + Project: "my_project_2", + Name: "feature1", + Version: 1, + }, + { + Project: "my_project_4", + Name: "feature3", + Version: 0, + }, + { + Project: "my_project_3", + Name: "feature2", + Version: 2, + }, + { + Project: "my_project_3", + Name: "feature2", + Version: 0, }, }, EntityRows: []*serving.GetOnlineFeaturesRequest_EntityRow{ @@ -63,38 +79,72 @@ func TestGetOnlineFeaturesRequest(t *testing.T) { OmitEntitiesInResponse: false, }, wantErr: false, - err: nil, + err: nil, + }, + { + name: "valid_project_in_name", + req: OnlineFeaturesRequest{ + Features: []string{"project/feature1"}, + Entities: []Row{}, + }, + want: &serving.GetOnlineFeaturesRequest{ + Features: []*serving.FeatureReference{ + { + Project: "project", + Name: "feature1", + Version: 0, + }, + }, + EntityRows: []*serving.GetOnlineFeaturesRequest_EntityRow{ + }, + OmitEntitiesInResponse: false, + }, + wantErr: false, + err: nil, + }, + { + name: "no_project", + req: OnlineFeaturesRequest{ + Features: []string{"feature1"}, + Entities: []Row{}, + }, + wantErr: true, + err: fmt.Errorf(ErrInvalidFeatureName, "feature1"), }, { name: "invalid_feature_name/wrong_format", req: OnlineFeaturesRequest{ - Features: []string{"fs1:feature1"}, - Entities: []Row{}, + Features: []string{"fs1:3:feature1"}, + Entities: []Row{}, + Project: "my_project", }, wantErr: true, - err: fmt.Errorf(ErrInvalidFeatureName, "fs1:feature1"), + err: fmt.Errorf(ErrInvalidFeatureName, "fs1:3:feature1"), }, { name: "invalid_feature_name/invalid_version", req: OnlineFeaturesRequest{ - Features: []string{"fs:a:feature1"}, - Entities: []Row{}, + Features: []string{"project/a:feature1"}, + Entities: []Row{}, }, wantErr: true, - err: fmt.Errorf(ErrInvalidFeatureName, "fs:a:feature1"), + err: fmt.Errorf(ErrInvalidFeatureName, "project/a:feature1"), }, } for _, tc := range tt { t.Run(tc.name, func(t *testing.T) { got, err := tc.req.buildRequest() + if (err != nil) != tc.wantErr { t.Errorf("error = %v, wantErr %v", err, tc.wantErr) return } + if tc.wantErr && err.Error() != tc.err.Error() { t.Errorf("error = %v, expected err = %v", err, tc.err) return } + if !cmp.Equal(got, tc.want) { m := json.Marshaler{} gotJson, _ := m.MarshalToString(got) diff --git a/sdk/go/response_test.go b/sdk/go/response_test.go index 9975457c147..882c1695d59 100644 --- a/sdk/go/response_test.go +++ b/sdk/go/response_test.go @@ -13,14 +13,14 @@ RawResponse: &serving.GetOnlineFeaturesResponse{ FieldValues: []*serving.GetOnlineFeaturesResponse_FieldValues{ { Fields: map[string]*types.Value{ - "fs:1:feature1": Int64Val(1), - "fs:1:feature2": &types.Value{}, + "project1/feature1": Int64Val(1), + "project1/feature2": &types.Value{}, }, }, { Fields: map[string]*types.Value{ - "fs:1:feature1": Int64Val(2), - "fs:1:feature2": Int64Val(2), + "project1/feature1": Int64Val(2), + "project1/feature2": Int64Val(2), }, }, }, @@ -30,8 +30,8 @@ RawResponse: &serving.GetOnlineFeaturesResponse{ func TestOnlineFeaturesResponseToRow(t *testing.T) { actual := response.Rows() expected := []Row{ - {"fs:1:feature1": Int64Val(1), "fs:1:feature2": &types.Value{}}, - {"fs:1:feature1": Int64Val(2), "fs:1:feature2": Int64Val(2)}, + {"project1/feature1": Int64Val(1), "project1/feature2": &types.Value{}}, + {"project1/feature1": Int64Val(2), "project1/feature2": Int64Val(2)}, } if !cmp.Equal(actual, expected) { t.Errorf("expected: %v, got: %v", expected, actual) @@ -53,7 +53,7 @@ func TestOnlineFeaturesResponseToInt64Array(t *testing.T) { { name: "valid", args: args{ - order: []string{"fs:1:feature2", "fs:1:feature1"}, + order: []string{"project1/feature2", "project1/feature1" }, fillNa: []int64{-1, -1}, }, want: [][]int64{{-1, 1}, {2, 2}}, @@ -72,12 +72,12 @@ func TestOnlineFeaturesResponseToInt64Array(t *testing.T) { { name: "length mismatch", args: args{ - order: []string{"fs:1:feature2", "fs:1:feature3"}, + order: []string{"project1/feature2", "project1/feature3" }, fillNa: []int64{-1, -1}, }, want: nil, wantErr: true, - err: fmt.Errorf(ErrFeatureNotFound, "fs:1:feature3"), + err: fmt.Errorf(ErrFeatureNotFound, "project1/feature3"), }, } for _, tc := range tt { diff --git a/sdk/java/pom.xml b/sdk/java/pom.xml index bd44d5af2cf..2c8b1d837a3 100644 --- a/sdk/java/pom.xml +++ b/sdk/java/pom.xml @@ -56,6 +56,12 @@ ${junit.version} test + + org.junit.jupiter + junit-jupiter-api + ${junit.version} + test + org.junit.jupiter junit-jupiter-params @@ -85,6 +91,14 @@ true + + maven-surefire-plugin + 2.22.2 + + + maven-failsafe-plugin + 2.22.2 + diff --git a/sdk/java/src/main/java/com/gojek/feast/v1alpha1/FeastClient.java b/sdk/java/src/main/java/com/gojek/feast/v1alpha1/FeastClient.java index b7a3e78ab13..f4fac8f4c60 100644 --- a/sdk/java/src/main/java/com/gojek/feast/v1alpha1/FeastClient.java +++ b/sdk/java/src/main/java/com/gojek/feast/v1alpha1/FeastClient.java @@ -16,7 +16,7 @@ */ package com.gojek.feast.v1alpha1; -import feast.serving.ServingAPIProto.FeatureSetRequest; +import feast.serving.ServingAPIProto.FeatureReference; import feast.serving.ServingAPIProto.GetFeastServingInfoRequest; import feast.serving.ServingAPIProto.GetFeastServingInfoResponse; import feast.serving.ServingAPIProto.GetOnlineFeaturesRequest; @@ -59,42 +59,46 @@ public GetFeastServingInfoResponse getFeastServingInfo() { /** * Get online features from Feast. * - *

See {@link #getOnlineFeatures(List, List, boolean)} + *

See {@link #getOnlineFeatures(List, List, str)} * - * @param featureIds list of feature id to retrieve, feature id follows this format - * [feature_set_name]:[version]:[feature_name] + * @param features list of string feature references to retrieve, feature reference follows this format + * [project]/[name]:[version] * @param rows list of {@link Row} to select the entities to retrieve the features for + * @param defaultProject {@link String} Default project to find features in if not provided in + * feature reference. * @return list of {@link Row} containing features */ - public List getOnlineFeatures(List featureIds, List rows) { - return getOnlineFeatures(featureIds, rows, false); + public List getOnlineFeatures(List features, List rows, String defaultProject) { + return getOnlineFeatures(features, rows, defaultProject, false); } /** * Get online features from Feast. * - *

Example of retrieving online features for driver feature set, version 1, with features - * driver_id and driver_name + *

Example of retrieving online features for the driver project, with features + * driver_id and driver_name, both version 1 * *

{@code
    * FeastClient client = FeastClient.create("localhost", 6566);
-   * List requestedFeatureIds = Arrays.asList("driver:1:driver_id", "driver:1:driver_name");
+   * List requestedFeatureIds = Arrays.asList("driver/driver_id:1", "driver/driver_name:1");
    * List requestedRows =
    *         Arrays.asList(Row.create().set("driver_id", 123), Row.create().set("driver_id", 456));
    * List retrievedFeatures = client.getOnlineFeatures(requestedFeatureIds, requestedRows);
    * retrievedFeatures.forEach(System.out::println);
    * }
* - * @param featureIds list of feature id to retrieve, feature id follows this format - * [feature_set_name]:[version]:[feature_name] + * @param featureRefStrings list of feature refs to retrieve, feature refs follow this format + * [project]/[name]:[version] * @param rows list of {@link Row} to select the entities to retrieve the features for + * @param defaultProject {@link String} Default project to find features in if not provided in + * feature reference. * @param omitEntitiesInResponse if true, the returned {@link Row} will not contain field and * value for the entity * @return list of {@link Row} containing features */ public List getOnlineFeatures( - List featureIds, List rows, boolean omitEntitiesInResponse) { - List featureSets = RequestUtil.createFeatureSets(featureIds); + List featureRefStrings, List rows, String defaultProject, boolean omitEntitiesInResponse) { + List features = RequestUtil.createFeatureRefs(featureRefStrings, defaultProject); List entityRows = rows.stream() .map( @@ -108,7 +112,7 @@ public List getOnlineFeatures( GetOnlineFeaturesResponse response = stub.getOnlineFeatures( GetOnlineFeaturesRequest.newBuilder() - .addAllFeatureSets(featureSets) + .addAllFeatures(features) .addAllEntityRows(entityRows) .setOmitEntitiesInResponse(omitEntitiesInResponse) .build()); diff --git a/sdk/java/src/main/java/com/gojek/feast/v1alpha1/RequestUtil.java b/sdk/java/src/main/java/com/gojek/feast/v1alpha1/RequestUtil.java index 72fbe289f2f..912a6ea1e27 100644 --- a/sdk/java/src/main/java/com/gojek/feast/v1alpha1/RequestUtil.java +++ b/sdk/java/src/main/java/com/gojek/feast/v1alpha1/RequestUtil.java @@ -16,60 +16,73 @@ */ package com.gojek.feast.v1alpha1; -import feast.serving.ServingAPIProto.FeatureSetRequest; +import feast.serving.ServingAPIProto.FeatureReference; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; @SuppressWarnings("WeakerAccess") public class RequestUtil { - public static List createFeatureSets(List featureIds) { - if (featureIds == null) { - throw new IllegalArgumentException("featureIds cannot be null"); + + public static List createFeatureRefs(List featureRefStrings, + String defaultProject) { + if (featureRefStrings == null) { + throw new IllegalArgumentException("featureRefs cannot be null"); } - // featureSetMap is a map of pair of feature set name and version -> a list of feature names - Map, List> featureSetMap = new HashMap<>(); + List featureRefs = new ArrayList<>(); + + for (String featureRefString : featureRefStrings) { + String project; + String name; + int version = 0; + String[] featureSplit; + String[] projectSplit = featureRefString.split("/"); - for (String featureId : featureIds) { - String[] parts = featureId.split(":"); - if (parts.length < 3) { + if (projectSplit.length == 2) { + project = projectSplit[0]; + featureSplit = projectSplit[1].split(":"); + } else if (projectSplit.length == 1) { + project = defaultProject; + featureSplit = projectSplit[0].split(":"); + } else { throw new IllegalArgumentException( String.format( - "Feature id '%s' has invalid format. Expected format: ::.", - featureId)); + "Feature id '%s' has invalid format. Expected format: ::.", + featureRefString)); } - String featureSetName = parts[0]; - int featureSetVersion; - try { - featureSetVersion = Integer.parseInt(parts[1]); - } catch (NumberFormatException e) { + + if (featureSplit.length == 2) { + name = featureSplit[0]; + try { + version = Integer.parseInt(featureSplit[1]); + } catch (NumberFormatException e) { + throw new IllegalArgumentException( + String.format( + "Feature id '%s' contains invalid version. Expected format: /:.", + featureRefString)); + } + } else if (projectSplit.length == 1) { + name = featureSplit[0]; + } else { throw new IllegalArgumentException( String.format( - "Feature id '%s' contains invalid version. Expected format: ::.", - parts[1])); + "Feature id '%s' has invalid format. Expected format: /:.", + featureRefString)); } - Pair key = new ImmutablePair<>(featureSetName, featureSetVersion); - if (!featureSetMap.containsKey(key)) { - featureSetMap.put(key, new ArrayList<>()); + if (project.isEmpty() || name.isEmpty() || version < 0) { + throw new IllegalArgumentException( + String.format( + "Feature id '%s' has invalid format. Expected format: /:.", + featureRefString)); } - String featureName = parts[2]; - featureSetMap.get(key).add(featureName); + + featureRefs.add( + FeatureReference.newBuilder().setName(name).setProject(project).setVersion(version) + .build()); } - return featureSetMap.entrySet().stream() - .map( - entry -> - FeatureSetRequest.newBuilder() - .setName(entry.getKey().getKey()) - .setVersion(entry.getKey().getValue()) - .addAllFeatureNames(entry.getValue()) - .build()) - .collect(Collectors.toList()); + ; return featureRefs; + } } diff --git a/sdk/java/src/test/java/com/gojek/feast/v1alpha1/RequestUtilTest.java b/sdk/java/src/test/java/com/gojek/feast/v1alpha1/RequestUtilTest.java index 5f87ba01535..3af0621bd8c 100644 --- a/sdk/java/src/test/java/com/gojek/feast/v1alpha1/RequestUtilTest.java +++ b/sdk/java/src/test/java/com/gojek/feast/v1alpha1/RequestUtilTest.java @@ -20,7 +20,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import com.google.protobuf.TextFormat; -import feast.serving.ServingAPIProto.FeatureSetRequest; +import feast.serving.ServingAPIProto.FeatureReference; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; @@ -36,43 +36,56 @@ class RequestUtilTest { private static Stream provideValidFeatureIds() { return Stream.of( Arguments.of( - Collections.singletonList("driver:1:driver_id"), + Collections.singletonList("driver_project/driver_id:1"), Collections.singletonList( - FeatureSetRequest.newBuilder() - .setName("driver") - .setVersion(1) - .addFeatureNames("driver_id"))), + FeatureReference.newBuilder() + .setProject("driver_project") + .setName("driver_id") + .setVersion(1).build() + ) + ), Arguments.of( - Arrays.asList("driver:1:driver_id", "driver:1:driver_name"), - Collections.singletonList( - FeatureSetRequest.newBuilder() - .setName("driver") + Arrays.asList("driver_project/driver_id:1", "driver_project/driver_name:1"), + Arrays.asList( + FeatureReference.newBuilder() + .setProject("driver_project") + .setName("driver_id") + .setVersion(1) + .build(), + FeatureReference.newBuilder() + .setProject("driver_project") + .setName("driver_name") .setVersion(1) - .addAllFeatureNames(Arrays.asList("driver_id", "driver_name")) - .build())), + .build()) + ), Arguments.of( - Arrays.asList("driver:1:driver_id", "driver:1:driver_name", "booking:2:booking_id"), + Arrays.asList("driver_project/driver_id:1", "driver_project/driver_name:1", "booking_project/driver_name:1"), Arrays.asList( - FeatureSetRequest.newBuilder() - .setName("driver") + FeatureReference.newBuilder() + .setProject("driver_project") + .setVersion(1) + .setName("driver_id") + .build(), + FeatureReference.newBuilder() + .setProject("driver_project") .setVersion(1) - .addAllFeatureNames(Arrays.asList("driver_id", "driver_name")) + .setName("driver_name") .build(), - FeatureSetRequest.newBuilder() - .setName("booking") - .setVersion(2) - .addFeatureNames("booking_id") + FeatureReference.newBuilder() + .setProject("booking_project") + .setVersion(1) + .setName("driver_name") .build()))); } @ParameterizedTest @MethodSource("provideValidFeatureIds") void createFeatureSets_ShouldReturnFeatureSetsForValidFeatureIds( - List input, List expected) { - List actual = RequestUtil.createFeatureSets(input); + List input, List expected) { + List actual = RequestUtil.createFeatureRefs(input, "my-project"); // Order of the actual and expected featureSets do no not matter - actual.sort(Comparator.comparing(FeatureSetRequest::getName)); - expected.sort(Comparator.comparing(FeatureSetRequest::getName)); + actual.sort(Comparator.comparing(FeatureReference::getName)); + expected.sort(Comparator.comparing(FeatureReference::getName)); assertEquals(expected.size(), actual.size()); for (int i = 0; i < expected.size(); i++) { String expectedString = TextFormat.printer().printToString(expected.get(i)); @@ -81,23 +94,21 @@ void createFeatureSets_ShouldReturnFeatureSetsForValidFeatureIds( } } - private static Stream provideInvalidFeatureIds() { + private static Stream provideInvalidFeatureRefs() { return Stream.of( - Arguments.of(Collections.singletonList("feature_set_only")), - Arguments.of(Collections.singletonList("missing:feature_name")), - Arguments.of(Collections.singletonList("invalid:version:value")), + Arguments.of(Collections.singletonList("missing:bad_version")), Arguments.of(Collections.singletonList(""))); } @ParameterizedTest - @MethodSource("provideInvalidFeatureIds") - void createFeatureSets_ShouldThrowExceptionForInvalidFeatureIds(List input) { - assertThrows(IllegalArgumentException.class, () -> RequestUtil.createFeatureSets(input)); + @MethodSource("provideInvalidFeatureRefs") + void createFeatureSets_ShouldThrowExceptionForInvalidFeatureRefs(List input) { + assertThrows(IllegalArgumentException.class, () -> RequestUtil.createFeatureRefs(input, "my-project")); } @ParameterizedTest @NullSource - void createFeatureSets_ShouldThrowExceptionForNullFeatureIds(List input) { - assertThrows(IllegalArgumentException.class, () -> RequestUtil.createFeatureSets(input)); + void createFeatureSets_ShouldThrowExceptionForNullFeatureRefs(List input) { + assertThrows(IllegalArgumentException.class, () -> RequestUtil.createFeatureRefs(input, "my-project")); } } diff --git a/sdk/python/feast/core/CoreService_pb2.py b/sdk/python/feast/core/CoreService_pb2.py index 69a5498d879..664e33f7c95 100644 --- a/sdk/python/feast/core/CoreService_pb2.py +++ b/sdk/python/feast/core/CoreService_pb2.py @@ -22,7 +22,7 @@ package='feast.core', syntax='proto3', serialized_options=_b('\n\nfeast.coreB\020CoreServiceProtoZ/github.com/gojek/feast/sdk/go/protos/feast/core'), - serialized_pb=_b('\n\x1c\x66\x65\x61st/core/CoreService.proto\x12\nfeast.core\x1a\x1b\x66\x65\x61st/core/FeatureSet.proto\x1a\x16\x66\x65\x61st/core/Store.proto\"5\n\x14GetFeatureSetRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0f\n\x07version\x18\x02 \x01(\x05\"H\n\x15GetFeatureSetResponse\x12/\n\x0b\x66\x65\x61ture_set\x18\x01 \x01(\x0b\x32\x1a.feast.core.FeatureSetSpec\"\x94\x01\n\x16ListFeatureSetsRequest\x12\x39\n\x06\x66ilter\x18\x01 \x01(\x0b\x32).feast.core.ListFeatureSetsRequest.Filter\x1a?\n\x06\x46ilter\x12\x18\n\x10\x66\x65\x61ture_set_name\x18\x01 \x01(\t\x12\x1b\n\x13\x66\x65\x61ture_set_version\x18\x02 \x01(\t\"K\n\x17ListFeatureSetsResponse\x12\x30\n\x0c\x66\x65\x61ture_sets\x18\x01 \x03(\x0b\x32\x1a.feast.core.FeatureSetSpec\"a\n\x11ListStoresRequest\x12\x34\n\x06\x66ilter\x18\x01 \x01(\x0b\x32$.feast.core.ListStoresRequest.Filter\x1a\x16\n\x06\x46ilter\x12\x0c\n\x04name\x18\x01 \x01(\t\"6\n\x12ListStoresResponse\x12 \n\x05store\x18\x01 \x03(\x0b\x32\x11.feast.core.Store\"I\n\x16\x41pplyFeatureSetRequest\x12/\n\x0b\x66\x65\x61ture_set\x18\x01 \x01(\x0b\x32\x1a.feast.core.FeatureSetSpec\"\xb7\x01\n\x17\x41pplyFeatureSetResponse\x12/\n\x0b\x66\x65\x61ture_set\x18\x01 \x01(\x0b\x32\x1a.feast.core.FeatureSetSpec\x12:\n\x06status\x18\x02 \x01(\x0e\x32*.feast.core.ApplyFeatureSetResponse.Status\"/\n\x06Status\x12\r\n\tNO_CHANGE\x10\x00\x12\x0b\n\x07\x43REATED\x10\x01\x12\t\n\x05\x45RROR\x10\x02\"\x1c\n\x1aGetFeastCoreVersionRequest\".\n\x1bGetFeastCoreVersionResponse\x12\x0f\n\x07version\x18\x01 \x01(\t\"6\n\x12UpdateStoreRequest\x12 \n\x05store\x18\x01 \x01(\x0b\x32\x11.feast.core.Store\"\x95\x01\n\x13UpdateStoreResponse\x12 \n\x05store\x18\x01 \x01(\x0b\x32\x11.feast.core.Store\x12\x36\n\x06status\x18\x02 \x01(\x0e\x32&.feast.core.UpdateStoreResponse.Status\"$\n\x06Status\x12\r\n\tNO_CHANGE\x10\x00\x12\x0b\n\x07UPDATED\x10\x01\x32\xa0\x04\n\x0b\x43oreService\x12\x66\n\x13GetFeastCoreVersion\x12&.feast.core.GetFeastCoreVersionRequest\x1a\'.feast.core.GetFeastCoreVersionResponse\x12T\n\rGetFeatureSet\x12 .feast.core.GetFeatureSetRequest\x1a!.feast.core.GetFeatureSetResponse\x12Z\n\x0fListFeatureSets\x12\".feast.core.ListFeatureSetsRequest\x1a#.feast.core.ListFeatureSetsResponse\x12K\n\nListStores\x12\x1d.feast.core.ListStoresRequest\x1a\x1e.feast.core.ListStoresResponse\x12Z\n\x0f\x41pplyFeatureSet\x12\".feast.core.ApplyFeatureSetRequest\x1a#.feast.core.ApplyFeatureSetResponse\x12N\n\x0bUpdateStore\x12\x1e.feast.core.UpdateStoreRequest\x1a\x1f.feast.core.UpdateStoreResponseBO\n\nfeast.coreB\x10\x43oreServiceProtoZ/github.com/gojek/feast/sdk/go/protos/feast/coreb\x06proto3') + serialized_pb=_b('\n\x1c\x66\x65\x61st/core/CoreService.proto\x12\nfeast.core\x1a\x1b\x66\x65\x61st/core/FeatureSet.proto\x1a\x16\x66\x65\x61st/core/Store.proto\"F\n\x14GetFeatureSetRequest\x12\x0f\n\x07project\x18\x03 \x01(\t\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0f\n\x07version\x18\x02 \x01(\x05\"H\n\x15GetFeatureSetResponse\x12/\n\x0b\x66\x65\x61ture_set\x18\x01 \x01(\x0b\x32\x1a.feast.core.FeatureSetSpec\"\xa5\x01\n\x16ListFeatureSetsRequest\x12\x0f\n\x07project\x18\x02 \x01(\t\x12\x39\n\x06\x66ilter\x18\x01 \x01(\x0b\x32).feast.core.ListFeatureSetsRequest.Filter\x1a?\n\x06\x46ilter\x12\x18\n\x10\x66\x65\x61ture_set_name\x18\x01 \x01(\t\x12\x1b\n\x13\x66\x65\x61ture_set_version\x18\x02 \x01(\t\"K\n\x17ListFeatureSetsResponse\x12\x30\n\x0c\x66\x65\x61ture_sets\x18\x01 \x03(\x0b\x32\x1a.feast.core.FeatureSetSpec\"a\n\x11ListStoresRequest\x12\x34\n\x06\x66ilter\x18\x01 \x01(\x0b\x32$.feast.core.ListStoresRequest.Filter\x1a\x16\n\x06\x46ilter\x12\x0c\n\x04name\x18\x01 \x01(\t\"6\n\x12ListStoresResponse\x12 \n\x05store\x18\x01 \x03(\x0b\x32\x11.feast.core.Store\"Z\n\x16\x41pplyFeatureSetRequest\x12\x0f\n\x07project\x18\x02 \x01(\t\x12/\n\x0b\x66\x65\x61ture_set\x18\x01 \x01(\x0b\x32\x1a.feast.core.FeatureSetSpec\"\xb7\x01\n\x17\x41pplyFeatureSetResponse\x12/\n\x0b\x66\x65\x61ture_set\x18\x01 \x01(\x0b\x32\x1a.feast.core.FeatureSetSpec\x12:\n\x06status\x18\x02 \x01(\x0e\x32*.feast.core.ApplyFeatureSetResponse.Status\"/\n\x06Status\x12\r\n\tNO_CHANGE\x10\x00\x12\x0b\n\x07\x43REATED\x10\x01\x12\t\n\x05\x45RROR\x10\x02\"\x1c\n\x1aGetFeastCoreVersionRequest\".\n\x1bGetFeastCoreVersionResponse\x12\x0f\n\x07version\x18\x01 \x01(\t\"6\n\x12UpdateStoreRequest\x12 \n\x05store\x18\x01 \x01(\x0b\x32\x11.feast.core.Store\"\x95\x01\n\x13UpdateStoreResponse\x12 \n\x05store\x18\x01 \x01(\x0b\x32\x11.feast.core.Store\x12\x36\n\x06status\x18\x02 \x01(\x0e\x32&.feast.core.UpdateStoreResponse.Status\"$\n\x06Status\x12\r\n\tNO_CHANGE\x10\x00\x12\x0b\n\x07UPDATED\x10\x01\"$\n\x14\x43reateProjectRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"\x17\n\x15\x43reateProjectResponse\"%\n\x15\x41rchiveProjectRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"\x18\n\x16\x41rchiveProjectResponse\"\x15\n\x13ListProjectsRequest\"(\n\x14ListProjectsResponse\x12\x10\n\x08projects\x18\x01 \x03(\t2\xa2\x06\n\x0b\x43oreService\x12\x66\n\x13GetFeastCoreVersion\x12&.feast.core.GetFeastCoreVersionRequest\x1a\'.feast.core.GetFeastCoreVersionResponse\x12T\n\rGetFeatureSet\x12 .feast.core.GetFeatureSetRequest\x1a!.feast.core.GetFeatureSetResponse\x12Z\n\x0fListFeatureSets\x12\".feast.core.ListFeatureSetsRequest\x1a#.feast.core.ListFeatureSetsResponse\x12K\n\nListStores\x12\x1d.feast.core.ListStoresRequest\x1a\x1e.feast.core.ListStoresResponse\x12Z\n\x0f\x41pplyFeatureSet\x12\".feast.core.ApplyFeatureSetRequest\x1a#.feast.core.ApplyFeatureSetResponse\x12N\n\x0bUpdateStore\x12\x1e.feast.core.UpdateStoreRequest\x1a\x1f.feast.core.UpdateStoreResponse\x12T\n\rCreateProject\x12 .feast.core.CreateProjectRequest\x1a!.feast.core.CreateProjectResponse\x12W\n\x0e\x41rchiveProject\x12!.feast.core.ArchiveProjectRequest\x1a\".feast.core.ArchiveProjectResponse\x12Q\n\x0cListProjects\x12\x1f.feast.core.ListProjectsRequest\x1a .feast.core.ListProjectsResponseBO\n\nfeast.coreB\x10\x43oreServiceProtoZ/github.com/gojek/feast/sdk/go/protos/feast/coreb\x06proto3') , dependencies=[feast_dot_core_dot_FeatureSet__pb2.DESCRIPTOR,feast_dot_core_dot_Store__pb2.DESCRIPTOR,]) @@ -49,8 +49,8 @@ ], containing_type=None, serialized_options=None, - serialized_start=821, - serialized_end=868, + serialized_start=872, + serialized_end=919, ) _sym_db.RegisterEnumDescriptor(_APPLYFEATURESETRESPONSE_STATUS) @@ -71,8 +71,8 @@ ], containing_type=None, serialized_options=None, - serialized_start=1118, - serialized_end=1154, + serialized_start=1169, + serialized_end=1205, ) _sym_db.RegisterEnumDescriptor(_UPDATESTORERESPONSE_STATUS) @@ -85,14 +85,21 @@ containing_type=None, fields=[ _descriptor.FieldDescriptor( - name='name', full_name='feast.core.GetFeatureSetRequest.name', index=0, + name='project', full_name='feast.core.GetFeatureSetRequest.project', index=0, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='name', full_name='feast.core.GetFeatureSetRequest.name', index=1, number=1, type=9, cpp_type=9, label=1, has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='version', full_name='feast.core.GetFeatureSetRequest.version', index=1, + name='version', full_name='feast.core.GetFeatureSetRequest.version', index=2, number=2, type=5, cpp_type=1, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, @@ -111,7 +118,7 @@ oneofs=[ ], serialized_start=97, - serialized_end=150, + serialized_end=167, ) @@ -141,8 +148,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=152, - serialized_end=224, + serialized_start=169, + serialized_end=241, ) @@ -179,8 +186,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=312, - serialized_end=375, + serialized_start=346, + serialized_end=409, ) _LISTFEATURESETSREQUEST = _descriptor.Descriptor( @@ -191,7 +198,14 @@ containing_type=None, fields=[ _descriptor.FieldDescriptor( - name='filter', full_name='feast.core.ListFeatureSetsRequest.filter', index=0, + name='project', full_name='feast.core.ListFeatureSetsRequest.project', index=0, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='filter', full_name='feast.core.ListFeatureSetsRequest.filter', index=1, number=1, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, @@ -209,8 +223,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=227, - serialized_end=375, + serialized_start=244, + serialized_end=409, ) @@ -240,8 +254,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=377, - serialized_end=452, + serialized_start=411, + serialized_end=486, ) @@ -271,8 +285,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=529, - serialized_end=551, + serialized_start=563, + serialized_end=585, ) _LISTSTORESREQUEST = _descriptor.Descriptor( @@ -301,8 +315,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=454, - serialized_end=551, + serialized_start=488, + serialized_end=585, ) @@ -332,8 +346,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=553, - serialized_end=607, + serialized_start=587, + serialized_end=641, ) @@ -345,7 +359,14 @@ containing_type=None, fields=[ _descriptor.FieldDescriptor( - name='feature_set', full_name='feast.core.ApplyFeatureSetRequest.feature_set', index=0, + name='project', full_name='feast.core.ApplyFeatureSetRequest.project', index=0, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='feature_set', full_name='feast.core.ApplyFeatureSetRequest.feature_set', index=1, number=1, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, @@ -363,8 +384,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=609, - serialized_end=682, + serialized_start=643, + serialized_end=733, ) @@ -402,8 +423,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=685, - serialized_end=868, + serialized_start=736, + serialized_end=919, ) @@ -426,8 +447,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=870, - serialized_end=898, + serialized_start=921, + serialized_end=949, ) @@ -457,8 +478,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=900, - serialized_end=946, + serialized_start=951, + serialized_end=997, ) @@ -488,8 +509,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=948, - serialized_end=1002, + serialized_start=999, + serialized_end=1053, ) @@ -527,8 +548,173 @@ extension_ranges=[], oneofs=[ ], - serialized_start=1005, - serialized_end=1154, + serialized_start=1056, + serialized_end=1205, +) + + +_CREATEPROJECTREQUEST = _descriptor.Descriptor( + name='CreateProjectRequest', + full_name='feast.core.CreateProjectRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='feast.core.CreateProjectRequest.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1207, + serialized_end=1243, +) + + +_CREATEPROJECTRESPONSE = _descriptor.Descriptor( + name='CreateProjectResponse', + full_name='feast.core.CreateProjectResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1245, + serialized_end=1268, +) + + +_ARCHIVEPROJECTREQUEST = _descriptor.Descriptor( + name='ArchiveProjectRequest', + full_name='feast.core.ArchiveProjectRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='feast.core.ArchiveProjectRequest.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1270, + serialized_end=1307, +) + + +_ARCHIVEPROJECTRESPONSE = _descriptor.Descriptor( + name='ArchiveProjectResponse', + full_name='feast.core.ArchiveProjectResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1309, + serialized_end=1333, +) + + +_LISTPROJECTSREQUEST = _descriptor.Descriptor( + name='ListProjectsRequest', + full_name='feast.core.ListProjectsRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1335, + serialized_end=1356, +) + + +_LISTPROJECTSRESPONSE = _descriptor.Descriptor( + name='ListProjectsResponse', + full_name='feast.core.ListProjectsResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='projects', full_name='feast.core.ListProjectsResponse.projects', index=0, + number=1, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1358, + serialized_end=1398, ) _GETFEATURESETRESPONSE.fields_by_name['feature_set'].message_type = feast_dot_core_dot_FeatureSet__pb2._FEATURESETSPEC @@ -558,6 +744,12 @@ DESCRIPTOR.message_types_by_name['GetFeastCoreVersionResponse'] = _GETFEASTCOREVERSIONRESPONSE DESCRIPTOR.message_types_by_name['UpdateStoreRequest'] = _UPDATESTOREREQUEST DESCRIPTOR.message_types_by_name['UpdateStoreResponse'] = _UPDATESTORERESPONSE +DESCRIPTOR.message_types_by_name['CreateProjectRequest'] = _CREATEPROJECTREQUEST +DESCRIPTOR.message_types_by_name['CreateProjectResponse'] = _CREATEPROJECTRESPONSE +DESCRIPTOR.message_types_by_name['ArchiveProjectRequest'] = _ARCHIVEPROJECTREQUEST +DESCRIPTOR.message_types_by_name['ArchiveProjectResponse'] = _ARCHIVEPROJECTRESPONSE +DESCRIPTOR.message_types_by_name['ListProjectsRequest'] = _LISTPROJECTSREQUEST +DESCRIPTOR.message_types_by_name['ListProjectsResponse'] = _LISTPROJECTSRESPONSE _sym_db.RegisterFileDescriptor(DESCRIPTOR) GetFeatureSetRequest = _reflection.GeneratedProtocolMessageType('GetFeatureSetRequest', (_message.Message,), { @@ -660,6 +852,48 @@ }) _sym_db.RegisterMessage(UpdateStoreResponse) +CreateProjectRequest = _reflection.GeneratedProtocolMessageType('CreateProjectRequest', (_message.Message,), { + 'DESCRIPTOR' : _CREATEPROJECTREQUEST, + '__module__' : 'feast.core.CoreService_pb2' + # @@protoc_insertion_point(class_scope:feast.core.CreateProjectRequest) + }) +_sym_db.RegisterMessage(CreateProjectRequest) + +CreateProjectResponse = _reflection.GeneratedProtocolMessageType('CreateProjectResponse', (_message.Message,), { + 'DESCRIPTOR' : _CREATEPROJECTRESPONSE, + '__module__' : 'feast.core.CoreService_pb2' + # @@protoc_insertion_point(class_scope:feast.core.CreateProjectResponse) + }) +_sym_db.RegisterMessage(CreateProjectResponse) + +ArchiveProjectRequest = _reflection.GeneratedProtocolMessageType('ArchiveProjectRequest', (_message.Message,), { + 'DESCRIPTOR' : _ARCHIVEPROJECTREQUEST, + '__module__' : 'feast.core.CoreService_pb2' + # @@protoc_insertion_point(class_scope:feast.core.ArchiveProjectRequest) + }) +_sym_db.RegisterMessage(ArchiveProjectRequest) + +ArchiveProjectResponse = _reflection.GeneratedProtocolMessageType('ArchiveProjectResponse', (_message.Message,), { + 'DESCRIPTOR' : _ARCHIVEPROJECTRESPONSE, + '__module__' : 'feast.core.CoreService_pb2' + # @@protoc_insertion_point(class_scope:feast.core.ArchiveProjectResponse) + }) +_sym_db.RegisterMessage(ArchiveProjectResponse) + +ListProjectsRequest = _reflection.GeneratedProtocolMessageType('ListProjectsRequest', (_message.Message,), { + 'DESCRIPTOR' : _LISTPROJECTSREQUEST, + '__module__' : 'feast.core.CoreService_pb2' + # @@protoc_insertion_point(class_scope:feast.core.ListProjectsRequest) + }) +_sym_db.RegisterMessage(ListProjectsRequest) + +ListProjectsResponse = _reflection.GeneratedProtocolMessageType('ListProjectsResponse', (_message.Message,), { + 'DESCRIPTOR' : _LISTPROJECTSRESPONSE, + '__module__' : 'feast.core.CoreService_pb2' + # @@protoc_insertion_point(class_scope:feast.core.ListProjectsResponse) + }) +_sym_db.RegisterMessage(ListProjectsResponse) + DESCRIPTOR._options = None @@ -669,8 +903,8 @@ file=DESCRIPTOR, index=0, serialized_options=None, - serialized_start=1157, - serialized_end=1701, + serialized_start=1401, + serialized_end=2203, methods=[ _descriptor.MethodDescriptor( name='GetFeastCoreVersion', @@ -726,6 +960,33 @@ output_type=_UPDATESTORERESPONSE, serialized_options=None, ), + _descriptor.MethodDescriptor( + name='CreateProject', + full_name='feast.core.CoreService.CreateProject', + index=6, + containing_service=None, + input_type=_CREATEPROJECTREQUEST, + output_type=_CREATEPROJECTRESPONSE, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='ArchiveProject', + full_name='feast.core.CoreService.ArchiveProject', + index=7, + containing_service=None, + input_type=_ARCHIVEPROJECTREQUEST, + output_type=_ARCHIVEPROJECTRESPONSE, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='ListProjects', + full_name='feast.core.CoreService.ListProjects', + index=8, + containing_service=None, + input_type=_LISTPROJECTSREQUEST, + output_type=_LISTPROJECTSRESPONSE, + serialized_options=None, + ), ]) _sym_db.RegisterServiceDescriptor(_CORESERVICE) diff --git a/sdk/python/feast/core/CoreService_pb2.pyi b/sdk/python/feast/core/CoreService_pb2.pyi index 0bf897000bc..eb0a8fb6362 100644 --- a/sdk/python/feast/core/CoreService_pb2.pyi +++ b/sdk/python/feast/core/CoreService_pb2.pyi @@ -15,6 +15,7 @@ from google.protobuf.descriptor import ( from google.protobuf.internal.containers import ( RepeatedCompositeFieldContainer as google___protobuf___internal___containers___RepeatedCompositeFieldContainer, + RepeatedScalarFieldContainer as google___protobuf___internal___containers___RepeatedScalarFieldContainer, ) from google.protobuf.message import ( @@ -37,11 +38,13 @@ from typing_extensions import ( class GetFeatureSetRequest(google___protobuf___message___Message): DESCRIPTOR: google___protobuf___descriptor___Descriptor = ... + project = ... # type: typing___Text name = ... # type: typing___Text version = ... # type: int def __init__(self, *, + project : typing___Optional[typing___Text] = None, name : typing___Optional[typing___Text] = None, version : typing___Optional[int] = None, ) -> None: ... @@ -50,9 +53,9 @@ class GetFeatureSetRequest(google___protobuf___message___Message): def MergeFrom(self, other_msg: google___protobuf___message___Message) -> None: ... def CopyFrom(self, other_msg: google___protobuf___message___Message) -> None: ... if sys.version_info >= (3,): - def ClearField(self, field_name: typing_extensions___Literal[u"name",u"version"]) -> None: ... + def ClearField(self, field_name: typing_extensions___Literal[u"name",u"project",u"version"]) -> None: ... else: - def ClearField(self, field_name: typing_extensions___Literal[u"name",b"name",u"version",b"version"]) -> None: ... + def ClearField(self, field_name: typing_extensions___Literal[u"name",b"name",u"project",b"project",u"version",b"version"]) -> None: ... class GetFeatureSetResponse(google___protobuf___message___Message): DESCRIPTOR: google___protobuf___descriptor___Descriptor = ... @@ -96,12 +99,14 @@ class ListFeatureSetsRequest(google___protobuf___message___Message): else: def ClearField(self, field_name: typing_extensions___Literal[u"feature_set_name",b"feature_set_name",u"feature_set_version",b"feature_set_version"]) -> None: ... + project = ... # type: typing___Text @property def filter(self) -> ListFeatureSetsRequest.Filter: ... def __init__(self, *, + project : typing___Optional[typing___Text] = None, filter : typing___Optional[ListFeatureSetsRequest.Filter] = None, ) -> None: ... @classmethod @@ -110,10 +115,10 @@ class ListFeatureSetsRequest(google___protobuf___message___Message): def CopyFrom(self, other_msg: google___protobuf___message___Message) -> None: ... if sys.version_info >= (3,): def HasField(self, field_name: typing_extensions___Literal[u"filter"]) -> bool: ... - def ClearField(self, field_name: typing_extensions___Literal[u"filter"]) -> None: ... + def ClearField(self, field_name: typing_extensions___Literal[u"filter",u"project"]) -> None: ... else: def HasField(self, field_name: typing_extensions___Literal[u"filter",b"filter"]) -> bool: ... - def ClearField(self, field_name: typing_extensions___Literal[u"filter",b"filter"]) -> None: ... + def ClearField(self, field_name: typing_extensions___Literal[u"filter",b"filter",u"project",b"project"]) -> None: ... class ListFeatureSetsResponse(google___protobuf___message___Message): DESCRIPTOR: google___protobuf___descriptor___Descriptor = ... @@ -193,12 +198,14 @@ class ListStoresResponse(google___protobuf___message___Message): class ApplyFeatureSetRequest(google___protobuf___message___Message): DESCRIPTOR: google___protobuf___descriptor___Descriptor = ... + project = ... # type: typing___Text @property def feature_set(self) -> feast___core___FeatureSet_pb2___FeatureSetSpec: ... def __init__(self, *, + project : typing___Optional[typing___Text] = None, feature_set : typing___Optional[feast___core___FeatureSet_pb2___FeatureSetSpec] = None, ) -> None: ... @classmethod @@ -207,10 +214,10 @@ class ApplyFeatureSetRequest(google___protobuf___message___Message): def CopyFrom(self, other_msg: google___protobuf___message___Message) -> None: ... if sys.version_info >= (3,): def HasField(self, field_name: typing_extensions___Literal[u"feature_set"]) -> bool: ... - def ClearField(self, field_name: typing_extensions___Literal[u"feature_set"]) -> None: ... + def ClearField(self, field_name: typing_extensions___Literal[u"feature_set",u"project"]) -> None: ... else: def HasField(self, field_name: typing_extensions___Literal[u"feature_set",b"feature_set"]) -> bool: ... - def ClearField(self, field_name: typing_extensions___Literal[u"feature_set",b"feature_set"]) -> None: ... + def ClearField(self, field_name: typing_extensions___Literal[u"feature_set",b"feature_set",u"project",b"project"]) -> None: ... class ApplyFeatureSetResponse(google___protobuf___message___Message): DESCRIPTOR: google___protobuf___descriptor___Descriptor = ... @@ -341,3 +348,84 @@ class UpdateStoreResponse(google___protobuf___message___Message): else: def HasField(self, field_name: typing_extensions___Literal[u"store",b"store"]) -> bool: ... def ClearField(self, field_name: typing_extensions___Literal[u"status",b"status",u"store",b"store"]) -> None: ... + +class CreateProjectRequest(google___protobuf___message___Message): + DESCRIPTOR: google___protobuf___descriptor___Descriptor = ... + name = ... # type: typing___Text + + def __init__(self, + *, + name : typing___Optional[typing___Text] = None, + ) -> None: ... + @classmethod + def FromString(cls, s: bytes) -> CreateProjectRequest: ... + def MergeFrom(self, other_msg: google___protobuf___message___Message) -> None: ... + def CopyFrom(self, other_msg: google___protobuf___message___Message) -> None: ... + if sys.version_info >= (3,): + def ClearField(self, field_name: typing_extensions___Literal[u"name"]) -> None: ... + else: + def ClearField(self, field_name: typing_extensions___Literal[u"name",b"name"]) -> None: ... + +class CreateProjectResponse(google___protobuf___message___Message): + DESCRIPTOR: google___protobuf___descriptor___Descriptor = ... + + def __init__(self, + ) -> None: ... + @classmethod + def FromString(cls, s: bytes) -> CreateProjectResponse: ... + def MergeFrom(self, other_msg: google___protobuf___message___Message) -> None: ... + def CopyFrom(self, other_msg: google___protobuf___message___Message) -> None: ... + +class ArchiveProjectRequest(google___protobuf___message___Message): + DESCRIPTOR: google___protobuf___descriptor___Descriptor = ... + name = ... # type: typing___Text + + def __init__(self, + *, + name : typing___Optional[typing___Text] = None, + ) -> None: ... + @classmethod + def FromString(cls, s: bytes) -> ArchiveProjectRequest: ... + def MergeFrom(self, other_msg: google___protobuf___message___Message) -> None: ... + def CopyFrom(self, other_msg: google___protobuf___message___Message) -> None: ... + if sys.version_info >= (3,): + def ClearField(self, field_name: typing_extensions___Literal[u"name"]) -> None: ... + else: + def ClearField(self, field_name: typing_extensions___Literal[u"name",b"name"]) -> None: ... + +class ArchiveProjectResponse(google___protobuf___message___Message): + DESCRIPTOR: google___protobuf___descriptor___Descriptor = ... + + def __init__(self, + ) -> None: ... + @classmethod + def FromString(cls, s: bytes) -> ArchiveProjectResponse: ... + def MergeFrom(self, other_msg: google___protobuf___message___Message) -> None: ... + def CopyFrom(self, other_msg: google___protobuf___message___Message) -> None: ... + +class ListProjectsRequest(google___protobuf___message___Message): + DESCRIPTOR: google___protobuf___descriptor___Descriptor = ... + + def __init__(self, + ) -> None: ... + @classmethod + def FromString(cls, s: bytes) -> ListProjectsRequest: ... + def MergeFrom(self, other_msg: google___protobuf___message___Message) -> None: ... + def CopyFrom(self, other_msg: google___protobuf___message___Message) -> None: ... + +class ListProjectsResponse(google___protobuf___message___Message): + DESCRIPTOR: google___protobuf___descriptor___Descriptor = ... + projects = ... # type: google___protobuf___internal___containers___RepeatedScalarFieldContainer[typing___Text] + + def __init__(self, + *, + projects : typing___Optional[typing___Iterable[typing___Text]] = None, + ) -> None: ... + @classmethod + def FromString(cls, s: bytes) -> ListProjectsResponse: ... + def MergeFrom(self, other_msg: google___protobuf___message___Message) -> None: ... + def CopyFrom(self, other_msg: google___protobuf___message___Message) -> None: ... + if sys.version_info >= (3,): + def ClearField(self, field_name: typing_extensions___Literal[u"projects"]) -> None: ... + else: + def ClearField(self, field_name: typing_extensions___Literal[u"projects",b"projects"]) -> None: ... diff --git a/sdk/python/feast/core/CoreService_pb2_grpc.py b/sdk/python/feast/core/CoreService_pb2_grpc.py index c4d28087791..0e17d0552a2 100644 --- a/sdk/python/feast/core/CoreService_pb2_grpc.py +++ b/sdk/python/feast/core/CoreService_pb2_grpc.py @@ -44,6 +44,21 @@ def __init__(self, channel): request_serializer=feast_dot_core_dot_CoreService__pb2.UpdateStoreRequest.SerializeToString, response_deserializer=feast_dot_core_dot_CoreService__pb2.UpdateStoreResponse.FromString, ) + self.CreateProject = channel.unary_unary( + '/feast.core.CoreService/CreateProject', + request_serializer=feast_dot_core_dot_CoreService__pb2.CreateProjectRequest.SerializeToString, + response_deserializer=feast_dot_core_dot_CoreService__pb2.CreateProjectResponse.FromString, + ) + self.ArchiveProject = channel.unary_unary( + '/feast.core.CoreService/ArchiveProject', + request_serializer=feast_dot_core_dot_CoreService__pb2.ArchiveProjectRequest.SerializeToString, + response_deserializer=feast_dot_core_dot_CoreService__pb2.ArchiveProjectResponse.FromString, + ) + self.ListProjects = channel.unary_unary( + '/feast.core.CoreService/ListProjects', + request_serializer=feast_dot_core_dot_CoreService__pb2.ListProjectsRequest.SerializeToString, + response_deserializer=feast_dot_core_dot_CoreService__pb2.ListProjectsResponse.FromString, + ) class CoreServiceServicer(object): @@ -108,6 +123,32 @@ def UpdateStore(self, request, context): context.set_details('Method not implemented!') raise NotImplementedError('Method not implemented!') + def CreateProject(self, request, context): + """Creates a project. Projects serve as namespaces within which resources like features will be + created. Both feature set names as well as field names must be unique within a project. Project + names themselves must be globally unique. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ArchiveProject(self, request, context): + """Archives a project. Archived projects will continue to exist and function, but won't be visible + through the Core API. Any existing ingestion or serving requests will continue to function, + but will result in warning messages being logged. It is not possible to unarchive a project + through the Core API + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ListProjects(self, request, context): + """Lists all projects active projects. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + def add_CoreServiceServicer_to_server(servicer, server): rpc_method_handlers = { @@ -141,6 +182,21 @@ def add_CoreServiceServicer_to_server(servicer, server): request_deserializer=feast_dot_core_dot_CoreService__pb2.UpdateStoreRequest.FromString, response_serializer=feast_dot_core_dot_CoreService__pb2.UpdateStoreResponse.SerializeToString, ), + 'CreateProject': grpc.unary_unary_rpc_method_handler( + servicer.CreateProject, + request_deserializer=feast_dot_core_dot_CoreService__pb2.CreateProjectRequest.FromString, + response_serializer=feast_dot_core_dot_CoreService__pb2.CreateProjectResponse.SerializeToString, + ), + 'ArchiveProject': grpc.unary_unary_rpc_method_handler( + servicer.ArchiveProject, + request_deserializer=feast_dot_core_dot_CoreService__pb2.ArchiveProjectRequest.FromString, + response_serializer=feast_dot_core_dot_CoreService__pb2.ArchiveProjectResponse.SerializeToString, + ), + 'ListProjects': grpc.unary_unary_rpc_method_handler( + servicer.ListProjects, + request_deserializer=feast_dot_core_dot_CoreService__pb2.ListProjectsRequest.FromString, + response_serializer=feast_dot_core_dot_CoreService__pb2.ListProjectsResponse.SerializeToString, + ), } generic_handler = grpc.method_handlers_generic_handler( 'feast.core.CoreService', rpc_method_handlers) diff --git a/sdk/python/feast/core/FeatureSet_pb2.py b/sdk/python/feast/core/FeatureSet_pb2.py index 8c331db16b1..6473c823ebc 100644 --- a/sdk/python/feast/core/FeatureSet_pb2.py +++ b/sdk/python/feast/core/FeatureSet_pb2.py @@ -23,7 +23,7 @@ package='feast.core', syntax='proto3', serialized_options=_b('\n\nfeast.coreB\017FeatureSetProtoZ/github.com/gojek/feast/sdk/go/protos/feast/core'), - serialized_pb=_b('\n\x1b\x66\x65\x61st/core/FeatureSet.proto\x12\nfeast.core\x1a\x17\x66\x65\x61st/types/Value.proto\x1a\x17\x66\x65\x61st/core/Source.proto\x1a\x1egoogle/protobuf/duration.proto\"\xd4\x01\n\x0e\x46\x65\x61tureSetSpec\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0f\n\x07version\x18\x02 \x01(\x05\x12(\n\x08\x65ntities\x18\x03 \x03(\x0b\x32\x16.feast.core.EntitySpec\x12)\n\x08\x66\x65\x61tures\x18\x04 \x03(\x0b\x32\x17.feast.core.FeatureSpec\x12*\n\x07max_age\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\"\n\x06source\x18\x06 \x01(\x0b\x32\x12.feast.core.Source\"K\n\nEntitySpec\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\nvalue_type\x18\x02 \x01(\x0e\x32\x1b.feast.types.ValueType.Enum\"L\n\x0b\x46\x65\x61tureSpec\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\nvalue_type\x18\x02 \x01(\x0e\x32\x1b.feast.types.ValueType.EnumBN\n\nfeast.coreB\x0f\x46\x65\x61tureSetProtoZ/github.com/gojek/feast/sdk/go/protos/feast/coreb\x06proto3') + serialized_pb=_b('\n\x1b\x66\x65\x61st/core/FeatureSet.proto\x12\nfeast.core\x1a\x17\x66\x65\x61st/types/Value.proto\x1a\x17\x66\x65\x61st/core/Source.proto\x1a\x1egoogle/protobuf/duration.proto\"\xe5\x01\n\x0e\x46\x65\x61tureSetSpec\x12\x0f\n\x07project\x18\x07 \x01(\t\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0f\n\x07version\x18\x02 \x01(\x05\x12(\n\x08\x65ntities\x18\x03 \x03(\x0b\x32\x16.feast.core.EntitySpec\x12)\n\x08\x66\x65\x61tures\x18\x04 \x03(\x0b\x32\x17.feast.core.FeatureSpec\x12*\n\x07max_age\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\"\n\x06source\x18\x06 \x01(\x0b\x32\x12.feast.core.Source\"K\n\nEntitySpec\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\nvalue_type\x18\x02 \x01(\x0e\x32\x1b.feast.types.ValueType.Enum\"L\n\x0b\x46\x65\x61tureSpec\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\nvalue_type\x18\x02 \x01(\x0e\x32\x1b.feast.types.ValueType.EnumBN\n\nfeast.coreB\x0f\x46\x65\x61tureSetProtoZ/github.com/gojek/feast/sdk/go/protos/feast/coreb\x06proto3') , dependencies=[feast_dot_types_dot_Value__pb2.DESCRIPTOR,feast_dot_core_dot_Source__pb2.DESCRIPTOR,google_dot_protobuf_dot_duration__pb2.DESCRIPTOR,]) @@ -38,42 +38,49 @@ containing_type=None, fields=[ _descriptor.FieldDescriptor( - name='name', full_name='feast.core.FeatureSetSpec.name', index=0, + name='project', full_name='feast.core.FeatureSetSpec.project', index=0, + number=7, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='name', full_name='feast.core.FeatureSetSpec.name', index=1, number=1, type=9, cpp_type=9, label=1, has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='version', full_name='feast.core.FeatureSetSpec.version', index=1, + name='version', full_name='feast.core.FeatureSetSpec.version', index=2, number=2, type=5, cpp_type=1, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='entities', full_name='feast.core.FeatureSetSpec.entities', index=2, + name='entities', full_name='feast.core.FeatureSetSpec.entities', index=3, number=3, type=11, cpp_type=10, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='features', full_name='feast.core.FeatureSetSpec.features', index=3, + name='features', full_name='feast.core.FeatureSetSpec.features', index=4, number=4, type=11, cpp_type=10, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='max_age', full_name='feast.core.FeatureSetSpec.max_age', index=4, + name='max_age', full_name='feast.core.FeatureSetSpec.max_age', index=5, number=5, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='source', full_name='feast.core.FeatureSetSpec.source', index=5, + name='source', full_name='feast.core.FeatureSetSpec.source', index=6, number=6, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, @@ -92,7 +99,7 @@ oneofs=[ ], serialized_start=126, - serialized_end=338, + serialized_end=355, ) @@ -129,8 +136,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=340, - serialized_end=415, + serialized_start=357, + serialized_end=432, ) @@ -167,8 +174,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=417, - serialized_end=493, + serialized_start=434, + serialized_end=510, ) _FEATURESETSPEC.fields_by_name['entities'].message_type = _ENTITYSPEC diff --git a/sdk/python/feast/core/FeatureSet_pb2.pyi b/sdk/python/feast/core/FeatureSet_pb2.pyi index 5d93721fe16..3368fac91f4 100644 --- a/sdk/python/feast/core/FeatureSet_pb2.pyi +++ b/sdk/python/feast/core/FeatureSet_pb2.pyi @@ -37,6 +37,7 @@ from typing_extensions import ( class FeatureSetSpec(google___protobuf___message___Message): DESCRIPTOR: google___protobuf___descriptor___Descriptor = ... + project = ... # type: typing___Text name = ... # type: typing___Text version = ... # type: int @@ -54,6 +55,7 @@ class FeatureSetSpec(google___protobuf___message___Message): def __init__(self, *, + project : typing___Optional[typing___Text] = None, name : typing___Optional[typing___Text] = None, version : typing___Optional[int] = None, entities : typing___Optional[typing___Iterable[EntitySpec]] = None, @@ -67,10 +69,10 @@ class FeatureSetSpec(google___protobuf___message___Message): def CopyFrom(self, other_msg: google___protobuf___message___Message) -> None: ... if sys.version_info >= (3,): def HasField(self, field_name: typing_extensions___Literal[u"max_age",u"source"]) -> bool: ... - def ClearField(self, field_name: typing_extensions___Literal[u"entities",u"features",u"max_age",u"name",u"source",u"version"]) -> None: ... + def ClearField(self, field_name: typing_extensions___Literal[u"entities",u"features",u"max_age",u"name",u"project",u"source",u"version"]) -> None: ... else: def HasField(self, field_name: typing_extensions___Literal[u"max_age",b"max_age",u"source",b"source"]) -> bool: ... - def ClearField(self, field_name: typing_extensions___Literal[u"entities",b"entities",u"features",b"features",u"max_age",b"max_age",u"name",b"name",u"source",b"source",u"version",b"version"]) -> None: ... + def ClearField(self, field_name: typing_extensions___Literal[u"entities",b"entities",u"features",b"features",u"max_age",b"max_age",u"name",b"name",u"project",b"project",u"source",b"source",u"version",b"version"]) -> None: ... class EntitySpec(google___protobuf___message___Message): DESCRIPTOR: google___protobuf___descriptor___Descriptor = ... diff --git a/sdk/python/feast/core/Store_pb2.py b/sdk/python/feast/core/Store_pb2.py index c7f9e07d871..716a597b9a3 100644 --- a/sdk/python/feast/core/Store_pb2.py +++ b/sdk/python/feast/core/Store_pb2.py @@ -20,7 +20,7 @@ package='feast.core', syntax='proto3', serialized_options=_b('\n\nfeast.coreB\nStoreProtoZ/github.com/gojek/feast/sdk/go/protos/feast/core'), - serialized_pb=_b('\n\x16\x66\x65\x61st/core/Store.proto\x12\nfeast.core\"\xb9\x04\n\x05Store\x12\x0c\n\x04name\x18\x01 \x01(\t\x12)\n\x04type\x18\x02 \x01(\x0e\x32\x1b.feast.core.Store.StoreType\x12\x35\n\rsubscriptions\x18\x04 \x03(\x0b\x32\x1e.feast.core.Store.Subscription\x12\x35\n\x0credis_config\x18\x0b \x01(\x0b\x32\x1d.feast.core.Store.RedisConfigH\x00\x12;\n\x0f\x62igquery_config\x18\x0c \x01(\x0b\x32 .feast.core.Store.BigQueryConfigH\x00\x12=\n\x10\x63\x61ssandra_config\x18\r \x01(\x0b\x32!.feast.core.Store.CassandraConfigH\x00\x1a)\n\x0bRedisConfig\x12\x0c\n\x04host\x18\x01 \x01(\t\x12\x0c\n\x04port\x18\x02 \x01(\x05\x1a\x38\n\x0e\x42igQueryConfig\x12\x12\n\nproject_id\x18\x01 \x01(\t\x12\x12\n\ndataset_id\x18\x02 \x01(\t\x1a-\n\x0f\x43\x61ssandraConfig\x12\x0c\n\x04host\x18\x01 \x01(\t\x12\x0c\n\x04port\x18\x02 \x01(\x05\x1a-\n\x0cSubscription\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0f\n\x07version\x18\x02 \x01(\t\"@\n\tStoreType\x12\x0b\n\x07INVALID\x10\x00\x12\t\n\x05REDIS\x10\x01\x12\x0c\n\x08\x42IGQUERY\x10\x02\x12\r\n\tCASSANDRA\x10\x03\x42\x08\n\x06\x63onfigBI\n\nfeast.coreB\nStoreProtoZ/github.com/gojek/feast/sdk/go/protos/feast/coreb\x06proto3') + serialized_pb=_b('\n\x16\x66\x65\x61st/core/Store.proto\x12\nfeast.core\"\xca\x04\n\x05Store\x12\x0c\n\x04name\x18\x01 \x01(\t\x12)\n\x04type\x18\x02 \x01(\x0e\x32\x1b.feast.core.Store.StoreType\x12\x35\n\rsubscriptions\x18\x04 \x03(\x0b\x32\x1e.feast.core.Store.Subscription\x12\x35\n\x0credis_config\x18\x0b \x01(\x0b\x32\x1d.feast.core.Store.RedisConfigH\x00\x12;\n\x0f\x62igquery_config\x18\x0c \x01(\x0b\x32 .feast.core.Store.BigQueryConfigH\x00\x12=\n\x10\x63\x61ssandra_config\x18\r \x01(\x0b\x32!.feast.core.Store.CassandraConfigH\x00\x1a)\n\x0bRedisConfig\x12\x0c\n\x04host\x18\x01 \x01(\t\x12\x0c\n\x04port\x18\x02 \x01(\x05\x1a\x38\n\x0e\x42igQueryConfig\x12\x12\n\nproject_id\x18\x01 \x01(\t\x12\x12\n\ndataset_id\x18\x02 \x01(\t\x1a-\n\x0f\x43\x61ssandraConfig\x12\x0c\n\x04host\x18\x01 \x01(\t\x12\x0c\n\x04port\x18\x02 \x01(\x05\x1a>\n\x0cSubscription\x12\x0f\n\x07project\x18\x03 \x01(\t\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0f\n\x07version\x18\x02 \x01(\t\"@\n\tStoreType\x12\x0b\n\x07INVALID\x10\x00\x12\t\n\x05REDIS\x10\x01\x12\x0c\n\x08\x42IGQUERY\x10\x02\x12\r\n\tCASSANDRA\x10\x03\x42\x08\n\x06\x63onfigBI\n\nfeast.coreB\nStoreProtoZ/github.com/gojek/feast/sdk/go/protos/feast/coreb\x06proto3') ) @@ -50,8 +50,8 @@ ], containing_type=None, serialized_options=None, - serialized_start=534, - serialized_end=598, + serialized_start=551, + serialized_end=615, ) _sym_db.RegisterEnumDescriptor(_STORE_STORETYPE) @@ -175,14 +175,21 @@ containing_type=None, fields=[ _descriptor.FieldDescriptor( - name='name', full_name='feast.core.Store.Subscription.name', index=0, + name='project', full_name='feast.core.Store.Subscription.project', index=0, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='name', full_name='feast.core.Store.Subscription.name', index=1, number=1, type=9, cpp_type=9, label=1, has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='version', full_name='feast.core.Store.Subscription.version', index=1, + name='version', full_name='feast.core.Store.Subscription.version', index=2, number=2, type=9, cpp_type=9, label=1, has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, @@ -201,7 +208,7 @@ oneofs=[ ], serialized_start=487, - serialized_end=532, + serialized_end=549, ) _STORE = _descriptor.Descriptor( @@ -270,7 +277,7 @@ index=0, containing_type=None, fields=[]), ], serialized_start=39, - serialized_end=608, + serialized_end=625, ) _STORE_REDISCONFIG.containing_type = _STORE diff --git a/sdk/python/feast/core/Store_pb2.pyi b/sdk/python/feast/core/Store_pb2.pyi index 726a9d5443e..541bcd329bb 100644 --- a/sdk/python/feast/core/Store_pb2.pyi +++ b/sdk/python/feast/core/Store_pb2.pyi @@ -109,11 +109,13 @@ class Store(google___protobuf___message___Message): class Subscription(google___protobuf___message___Message): DESCRIPTOR: google___protobuf___descriptor___Descriptor = ... + project = ... # type: typing___Text name = ... # type: typing___Text version = ... # type: typing___Text def __init__(self, *, + project : typing___Optional[typing___Text] = None, name : typing___Optional[typing___Text] = None, version : typing___Optional[typing___Text] = None, ) -> None: ... @@ -122,9 +124,9 @@ class Store(google___protobuf___message___Message): def MergeFrom(self, other_msg: google___protobuf___message___Message) -> None: ... def CopyFrom(self, other_msg: google___protobuf___message___Message) -> None: ... if sys.version_info >= (3,): - def ClearField(self, field_name: typing_extensions___Literal[u"name",u"version"]) -> None: ... + def ClearField(self, field_name: typing_extensions___Literal[u"name",u"project",u"version"]) -> None: ... else: - def ClearField(self, field_name: typing_extensions___Literal[u"name",b"name",u"version",b"version"]) -> None: ... + def ClearField(self, field_name: typing_extensions___Literal[u"name",b"name",u"project",b"project",u"version",b"version"]) -> None: ... name = ... # type: typing___Text type = ... # type: Store.StoreType diff --git a/sdk/python/feast/serving/ServingService_pb2.py b/sdk/python/feast/serving/ServingService_pb2.py index e7258f5a7d5..283ec358da9 100644 --- a/sdk/python/feast/serving/ServingService_pb2.py +++ b/sdk/python/feast/serving/ServingService_pb2.py @@ -24,7 +24,7 @@ package='feast.serving', syntax='proto3', serialized_options=_b('\n\rfeast.servingB\017ServingAPIProtoZ2github.com/gojek/feast/sdk/go/protos/feast/serving'), - serialized_pb=_b('\n\"feast/serving/ServingService.proto\x12\rfeast.serving\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x17\x66\x65\x61st/types/Value.proto\"\x1c\n\x1aGetFeastServingInfoRequest\"{\n\x1bGetFeastServingInfoResponse\x12\x0f\n\x07version\x18\x01 \x01(\t\x12-\n\x04type\x18\x02 \x01(\x0e\x32\x1f.feast.serving.FeastServingType\x12\x1c\n\x14job_staging_location\x18\n \x01(\t\"u\n\x11\x46\x65\x61tureSetRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0f\n\x07version\x18\x02 \x01(\x05\x12\x15\n\rfeature_names\x18\x03 \x03(\t\x12*\n\x07max_age\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\"\x93\x03\n\x18GetOnlineFeaturesRequest\x12\x36\n\x0c\x66\x65\x61ture_sets\x18\x01 \x03(\x0b\x32 .feast.serving.FeatureSetRequest\x12\x46\n\x0b\x65ntity_rows\x18\x02 \x03(\x0b\x32\x31.feast.serving.GetOnlineFeaturesRequest.EntityRow\x12!\n\x19omit_entities_in_response\x18\x03 \x01(\x08\x1a\xd3\x01\n\tEntityRow\x12\x34\n\x10\x65ntity_timestamp\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12M\n\x06\x66ields\x18\x02 \x03(\x0b\x32=.feast.serving.GetOnlineFeaturesRequest.EntityRow.FieldsEntry\x1a\x41\n\x0b\x46ieldsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.feast.types.Value:\x02\x38\x01\"\x87\x01\n\x17GetBatchFeaturesRequest\x12\x36\n\x0c\x66\x65\x61ture_sets\x18\x01 \x03(\x0b\x32 .feast.serving.FeatureSetRequest\x12\x34\n\x0e\x64\x61taset_source\x18\x02 \x01(\x0b\x32\x1c.feast.serving.DatasetSource\"\x8c\x02\n\x19GetOnlineFeaturesResponse\x12J\n\x0c\x66ield_values\x18\x01 \x03(\x0b\x32\x34.feast.serving.GetOnlineFeaturesResponse.FieldValues\x1a\xa2\x01\n\x0b\x46ieldValues\x12P\n\x06\x66ields\x18\x01 \x03(\x0b\x32@.feast.serving.GetOnlineFeaturesResponse.FieldValues.FieldsEntry\x1a\x41\n\x0b\x46ieldsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.feast.types.Value:\x02\x38\x01\";\n\x18GetBatchFeaturesResponse\x12\x1f\n\x03job\x18\x01 \x01(\x0b\x32\x12.feast.serving.Job\"0\n\rGetJobRequest\x12\x1f\n\x03job\x18\x01 \x01(\x0b\x32\x12.feast.serving.Job\"1\n\x0eGetJobResponse\x12\x1f\n\x03job\x18\x01 \x01(\x0b\x32\x12.feast.serving.Job\"\xb3\x01\n\x03Job\x12\n\n\x02id\x18\x01 \x01(\t\x12$\n\x04type\x18\x02 \x01(\x0e\x32\x16.feast.serving.JobType\x12(\n\x06status\x18\x03 \x01(\x0e\x32\x18.feast.serving.JobStatus\x12\r\n\x05\x65rror\x18\x04 \x01(\t\x12\x11\n\tfile_uris\x18\x05 \x03(\t\x12.\n\x0b\x64\x61ta_format\x18\x06 \x01(\x0e\x32\x19.feast.serving.DataFormat\"\xb2\x01\n\rDatasetSource\x12>\n\x0b\x66ile_source\x18\x01 \x01(\x0b\x32\'.feast.serving.DatasetSource.FileSourceH\x00\x1aO\n\nFileSource\x12\x11\n\tfile_uris\x18\x01 \x03(\t\x12.\n\x0b\x64\x61ta_format\x18\x02 \x01(\x0e\x32\x19.feast.serving.DataFormatB\x10\n\x0e\x64\x61taset_source*o\n\x10\x46\x65\x61stServingType\x12\x1e\n\x1a\x46\x45\x41ST_SERVING_TYPE_INVALID\x10\x00\x12\x1d\n\x19\x46\x45\x41ST_SERVING_TYPE_ONLINE\x10\x01\x12\x1c\n\x18\x46\x45\x41ST_SERVING_TYPE_BATCH\x10\x02*6\n\x07JobType\x12\x14\n\x10JOB_TYPE_INVALID\x10\x00\x12\x15\n\x11JOB_TYPE_DOWNLOAD\x10\x01*h\n\tJobStatus\x12\x16\n\x12JOB_STATUS_INVALID\x10\x00\x12\x16\n\x12JOB_STATUS_PENDING\x10\x01\x12\x16\n\x12JOB_STATUS_RUNNING\x10\x02\x12\x13\n\x0fJOB_STATUS_DONE\x10\x03*;\n\nDataFormat\x12\x17\n\x13\x44\x41TA_FORMAT_INVALID\x10\x00\x12\x14\n\x10\x44\x41TA_FORMAT_AVRO\x10\x01\x32\x92\x03\n\x0eServingService\x12l\n\x13GetFeastServingInfo\x12).feast.serving.GetFeastServingInfoRequest\x1a*.feast.serving.GetFeastServingInfoResponse\x12\x66\n\x11GetOnlineFeatures\x12\'.feast.serving.GetOnlineFeaturesRequest\x1a(.feast.serving.GetOnlineFeaturesResponse\x12\x63\n\x10GetBatchFeatures\x12&.feast.serving.GetBatchFeaturesRequest\x1a\'.feast.serving.GetBatchFeaturesResponse\x12\x45\n\x06GetJob\x12\x1c.feast.serving.GetJobRequest\x1a\x1d.feast.serving.GetJobResponseBT\n\rfeast.servingB\x0fServingAPIProtoZ2github.com/gojek/feast/sdk/go/protos/feast/servingb\x06proto3') + serialized_pb=_b('\n\"feast/serving/ServingService.proto\x12\rfeast.serving\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x17\x66\x65\x61st/types/Value.proto\"\x1c\n\x1aGetFeastServingInfoRequest\"{\n\x1bGetFeastServingInfoResponse\x12\x0f\n\x07version\x18\x01 \x01(\t\x12-\n\x04type\x18\x02 \x01(\x0e\x32\x1f.feast.serving.FeastServingType\x12\x1c\n\x14job_staging_location\x18\n \x01(\t\"n\n\x10\x46\x65\x61tureReference\x12\x0f\n\x07project\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0f\n\x07version\x18\x03 \x01(\x05\x12*\n\x07max_age\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\"\x8e\x03\n\x18GetOnlineFeaturesRequest\x12\x31\n\x08\x66\x65\x61tures\x18\x04 \x03(\x0b\x32\x1f.feast.serving.FeatureReference\x12\x46\n\x0b\x65ntity_rows\x18\x02 \x03(\x0b\x32\x31.feast.serving.GetOnlineFeaturesRequest.EntityRow\x12!\n\x19omit_entities_in_response\x18\x03 \x01(\x08\x1a\xd3\x01\n\tEntityRow\x12\x34\n\x10\x65ntity_timestamp\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12M\n\x06\x66ields\x18\x02 \x03(\x0b\x32=.feast.serving.GetOnlineFeaturesRequest.EntityRow.FieldsEntry\x1a\x41\n\x0b\x46ieldsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.feast.types.Value:\x02\x38\x01\"\x82\x01\n\x17GetBatchFeaturesRequest\x12\x31\n\x08\x66\x65\x61tures\x18\x04 \x03(\x0b\x32\x1f.feast.serving.FeatureReference\x12\x34\n\x0e\x64\x61taset_source\x18\x02 \x01(\x0b\x32\x1c.feast.serving.DatasetSource\"\x8c\x02\n\x19GetOnlineFeaturesResponse\x12J\n\x0c\x66ield_values\x18\x01 \x03(\x0b\x32\x34.feast.serving.GetOnlineFeaturesResponse.FieldValues\x1a\xa2\x01\n\x0b\x46ieldValues\x12P\n\x06\x66ields\x18\x01 \x03(\x0b\x32@.feast.serving.GetOnlineFeaturesResponse.FieldValues.FieldsEntry\x1a\x41\n\x0b\x46ieldsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.feast.types.Value:\x02\x38\x01\";\n\x18GetBatchFeaturesResponse\x12\x1f\n\x03job\x18\x01 \x01(\x0b\x32\x12.feast.serving.Job\"0\n\rGetJobRequest\x12\x1f\n\x03job\x18\x01 \x01(\x0b\x32\x12.feast.serving.Job\"1\n\x0eGetJobResponse\x12\x1f\n\x03job\x18\x01 \x01(\x0b\x32\x12.feast.serving.Job\"\xb3\x01\n\x03Job\x12\n\n\x02id\x18\x01 \x01(\t\x12$\n\x04type\x18\x02 \x01(\x0e\x32\x16.feast.serving.JobType\x12(\n\x06status\x18\x03 \x01(\x0e\x32\x18.feast.serving.JobStatus\x12\r\n\x05\x65rror\x18\x04 \x01(\t\x12\x11\n\tfile_uris\x18\x05 \x03(\t\x12.\n\x0b\x64\x61ta_format\x18\x06 \x01(\x0e\x32\x19.feast.serving.DataFormat\"\xb2\x01\n\rDatasetSource\x12>\n\x0b\x66ile_source\x18\x01 \x01(\x0b\x32\'.feast.serving.DatasetSource.FileSourceH\x00\x1aO\n\nFileSource\x12\x11\n\tfile_uris\x18\x01 \x03(\t\x12.\n\x0b\x64\x61ta_format\x18\x02 \x01(\x0e\x32\x19.feast.serving.DataFormatB\x10\n\x0e\x64\x61taset_source*o\n\x10\x46\x65\x61stServingType\x12\x1e\n\x1a\x46\x45\x41ST_SERVING_TYPE_INVALID\x10\x00\x12\x1d\n\x19\x46\x45\x41ST_SERVING_TYPE_ONLINE\x10\x01\x12\x1c\n\x18\x46\x45\x41ST_SERVING_TYPE_BATCH\x10\x02*6\n\x07JobType\x12\x14\n\x10JOB_TYPE_INVALID\x10\x00\x12\x15\n\x11JOB_TYPE_DOWNLOAD\x10\x01*h\n\tJobStatus\x12\x16\n\x12JOB_STATUS_INVALID\x10\x00\x12\x16\n\x12JOB_STATUS_PENDING\x10\x01\x12\x16\n\x12JOB_STATUS_RUNNING\x10\x02\x12\x13\n\x0fJOB_STATUS_DONE\x10\x03*;\n\nDataFormat\x12\x17\n\x13\x44\x41TA_FORMAT_INVALID\x10\x00\x12\x14\n\x10\x44\x41TA_FORMAT_AVRO\x10\x01\x32\x92\x03\n\x0eServingService\x12l\n\x13GetFeastServingInfo\x12).feast.serving.GetFeastServingInfoRequest\x1a*.feast.serving.GetFeastServingInfoResponse\x12\x66\n\x11GetOnlineFeatures\x12\'.feast.serving.GetOnlineFeaturesRequest\x1a(.feast.serving.GetOnlineFeaturesResponse\x12\x63\n\x10GetBatchFeatures\x12&.feast.serving.GetBatchFeaturesRequest\x1a\'.feast.serving.GetBatchFeaturesResponse\x12\x45\n\x06GetJob\x12\x1c.feast.serving.GetJobRequest\x1a\x1d.feast.serving.GetJobResponseBT\n\rfeast.servingB\x0fServingAPIProtoZ2github.com/gojek/feast/sdk/go/protos/feast/servingb\x06proto3') , dependencies=[google_dot_protobuf_dot_timestamp__pb2.DESCRIPTOR,google_dot_protobuf_dot_duration__pb2.DESCRIPTOR,feast_dot_types_dot_Value__pb2.DESCRIPTOR,]) @@ -49,8 +49,8 @@ ], containing_type=None, serialized_options=None, - serialized_start=1757, - serialized_end=1868, + serialized_start=1740, + serialized_end=1851, ) _sym_db.RegisterEnumDescriptor(_FEASTSERVINGTYPE) @@ -72,8 +72,8 @@ ], containing_type=None, serialized_options=None, - serialized_start=1870, - serialized_end=1924, + serialized_start=1853, + serialized_end=1907, ) _sym_db.RegisterEnumDescriptor(_JOBTYPE) @@ -103,8 +103,8 @@ ], containing_type=None, serialized_options=None, - serialized_start=1926, - serialized_end=2030, + serialized_start=1909, + serialized_end=2013, ) _sym_db.RegisterEnumDescriptor(_JOBSTATUS) @@ -126,8 +126,8 @@ ], containing_type=None, serialized_options=None, - serialized_start=2032, - serialized_end=2091, + serialized_start=2015, + serialized_end=2074, ) _sym_db.RegisterEnumDescriptor(_DATAFORMAT) @@ -215,36 +215,36 @@ ) -_FEATURESETREQUEST = _descriptor.Descriptor( - name='FeatureSetRequest', - full_name='feast.serving.FeatureSetRequest', +_FEATUREREFERENCE = _descriptor.Descriptor( + name='FeatureReference', + full_name='feast.serving.FeatureReference', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ _descriptor.FieldDescriptor( - name='name', full_name='feast.serving.FeatureSetRequest.name', index=0, + name='project', full_name='feast.serving.FeatureReference.project', index=0, number=1, type=9, cpp_type=9, label=1, has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='version', full_name='feast.serving.FeatureSetRequest.version', index=1, - number=2, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, + name='name', full_name='feast.serving.FeatureReference.name', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='feature_names', full_name='feast.serving.FeatureSetRequest.feature_names', index=2, - number=3, type=9, cpp_type=9, label=3, - has_default_value=False, default_value=[], + name='version', full_name='feast.serving.FeatureReference.version', index=2, + number=3, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='max_age', full_name='feast.serving.FeatureSetRequest.max_age', index=3, + name='max_age', full_name='feast.serving.FeatureReference.max_age', index=3, number=4, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, @@ -263,7 +263,7 @@ oneofs=[ ], serialized_start=298, - serialized_end=415, + serialized_end=408, ) @@ -300,8 +300,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=756, - serialized_end=821, + serialized_start=744, + serialized_end=809, ) _GETONLINEFEATURESREQUEST_ENTITYROW = _descriptor.Descriptor( @@ -337,8 +337,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=610, - serialized_end=821, + serialized_start=598, + serialized_end=809, ) _GETONLINEFEATURESREQUEST = _descriptor.Descriptor( @@ -349,8 +349,8 @@ containing_type=None, fields=[ _descriptor.FieldDescriptor( - name='feature_sets', full_name='feast.serving.GetOnlineFeaturesRequest.feature_sets', index=0, - number=1, type=11, cpp_type=10, label=3, + name='features', full_name='feast.serving.GetOnlineFeaturesRequest.features', index=0, + number=4, type=11, cpp_type=10, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, @@ -381,8 +381,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=418, - serialized_end=821, + serialized_start=411, + serialized_end=809, ) @@ -394,8 +394,8 @@ containing_type=None, fields=[ _descriptor.FieldDescriptor( - name='feature_sets', full_name='feast.serving.GetBatchFeaturesRequest.feature_sets', index=0, - number=1, type=11, cpp_type=10, label=3, + name='features', full_name='feast.serving.GetBatchFeaturesRequest.features', index=0, + number=4, type=11, cpp_type=10, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, @@ -419,8 +419,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=824, - serialized_end=959, + serialized_start=812, + serialized_end=942, ) @@ -457,8 +457,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=756, - serialized_end=821, + serialized_start=744, + serialized_end=809, ) _GETONLINEFEATURESRESPONSE_FIELDVALUES = _descriptor.Descriptor( @@ -487,8 +487,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=1068, - serialized_end=1230, + serialized_start=1051, + serialized_end=1213, ) _GETONLINEFEATURESRESPONSE = _descriptor.Descriptor( @@ -517,8 +517,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=962, - serialized_end=1230, + serialized_start=945, + serialized_end=1213, ) @@ -548,8 +548,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=1232, - serialized_end=1291, + serialized_start=1215, + serialized_end=1274, ) @@ -579,8 +579,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=1293, - serialized_end=1341, + serialized_start=1276, + serialized_end=1324, ) @@ -610,8 +610,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=1343, - serialized_end=1392, + serialized_start=1326, + serialized_end=1375, ) @@ -676,8 +676,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=1395, - serialized_end=1574, + serialized_start=1378, + serialized_end=1557, ) @@ -714,8 +714,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=1658, - serialized_end=1737, + serialized_start=1641, + serialized_end=1720, ) _DATASETSOURCE = _descriptor.Descriptor( @@ -747,20 +747,20 @@ name='dataset_source', full_name='feast.serving.DatasetSource.dataset_source', index=0, containing_type=None, fields=[]), ], - serialized_start=1577, - serialized_end=1755, + serialized_start=1560, + serialized_end=1738, ) _GETFEASTSERVINGINFORESPONSE.fields_by_name['type'].enum_type = _FEASTSERVINGTYPE -_FEATURESETREQUEST.fields_by_name['max_age'].message_type = google_dot_protobuf_dot_duration__pb2._DURATION +_FEATUREREFERENCE.fields_by_name['max_age'].message_type = google_dot_protobuf_dot_duration__pb2._DURATION _GETONLINEFEATURESREQUEST_ENTITYROW_FIELDSENTRY.fields_by_name['value'].message_type = feast_dot_types_dot_Value__pb2._VALUE _GETONLINEFEATURESREQUEST_ENTITYROW_FIELDSENTRY.containing_type = _GETONLINEFEATURESREQUEST_ENTITYROW _GETONLINEFEATURESREQUEST_ENTITYROW.fields_by_name['entity_timestamp'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP _GETONLINEFEATURESREQUEST_ENTITYROW.fields_by_name['fields'].message_type = _GETONLINEFEATURESREQUEST_ENTITYROW_FIELDSENTRY _GETONLINEFEATURESREQUEST_ENTITYROW.containing_type = _GETONLINEFEATURESREQUEST -_GETONLINEFEATURESREQUEST.fields_by_name['feature_sets'].message_type = _FEATURESETREQUEST +_GETONLINEFEATURESREQUEST.fields_by_name['features'].message_type = _FEATUREREFERENCE _GETONLINEFEATURESREQUEST.fields_by_name['entity_rows'].message_type = _GETONLINEFEATURESREQUEST_ENTITYROW -_GETBATCHFEATURESREQUEST.fields_by_name['feature_sets'].message_type = _FEATURESETREQUEST +_GETBATCHFEATURESREQUEST.fields_by_name['features'].message_type = _FEATUREREFERENCE _GETBATCHFEATURESREQUEST.fields_by_name['dataset_source'].message_type = _DATASETSOURCE _GETONLINEFEATURESRESPONSE_FIELDVALUES_FIELDSENTRY.fields_by_name['value'].message_type = feast_dot_types_dot_Value__pb2._VALUE _GETONLINEFEATURESRESPONSE_FIELDVALUES_FIELDSENTRY.containing_type = _GETONLINEFEATURESRESPONSE_FIELDVALUES @@ -781,7 +781,7 @@ _DATASETSOURCE.fields_by_name['file_source'].containing_oneof = _DATASETSOURCE.oneofs_by_name['dataset_source'] DESCRIPTOR.message_types_by_name['GetFeastServingInfoRequest'] = _GETFEASTSERVINGINFOREQUEST DESCRIPTOR.message_types_by_name['GetFeastServingInfoResponse'] = _GETFEASTSERVINGINFORESPONSE -DESCRIPTOR.message_types_by_name['FeatureSetRequest'] = _FEATURESETREQUEST +DESCRIPTOR.message_types_by_name['FeatureReference'] = _FEATUREREFERENCE DESCRIPTOR.message_types_by_name['GetOnlineFeaturesRequest'] = _GETONLINEFEATURESREQUEST DESCRIPTOR.message_types_by_name['GetBatchFeaturesRequest'] = _GETBATCHFEATURESREQUEST DESCRIPTOR.message_types_by_name['GetOnlineFeaturesResponse'] = _GETONLINEFEATURESRESPONSE @@ -810,12 +810,12 @@ }) _sym_db.RegisterMessage(GetFeastServingInfoResponse) -FeatureSetRequest = _reflection.GeneratedProtocolMessageType('FeatureSetRequest', (_message.Message,), { - 'DESCRIPTOR' : _FEATURESETREQUEST, +FeatureReference = _reflection.GeneratedProtocolMessageType('FeatureReference', (_message.Message,), { + 'DESCRIPTOR' : _FEATUREREFERENCE, '__module__' : 'feast.serving.ServingService_pb2' - # @@protoc_insertion_point(class_scope:feast.serving.FeatureSetRequest) + # @@protoc_insertion_point(class_scope:feast.serving.FeatureReference) }) -_sym_db.RegisterMessage(FeatureSetRequest) +_sym_db.RegisterMessage(FeatureReference) GetOnlineFeaturesRequest = _reflection.GeneratedProtocolMessageType('GetOnlineFeaturesRequest', (_message.Message,), { @@ -924,8 +924,8 @@ file=DESCRIPTOR, index=0, serialized_options=None, - serialized_start=2094, - serialized_end=2496, + serialized_start=2077, + serialized_end=2479, methods=[ _descriptor.MethodDescriptor( name='GetFeastServingInfo', diff --git a/sdk/python/feast/serving/ServingService_pb2.pyi b/sdk/python/feast/serving/ServingService_pb2.pyi index d03fa6568fa..e10245d6c7a 100644 --- a/sdk/python/feast/serving/ServingService_pb2.pyi +++ b/sdk/python/feast/serving/ServingService_pb2.pyi @@ -147,32 +147,32 @@ class GetFeastServingInfoResponse(google___protobuf___message___Message): else: def ClearField(self, field_name: typing_extensions___Literal[u"job_staging_location",b"job_staging_location",u"type",b"type",u"version",b"version"]) -> None: ... -class FeatureSetRequest(google___protobuf___message___Message): +class FeatureReference(google___protobuf___message___Message): DESCRIPTOR: google___protobuf___descriptor___Descriptor = ... + project = ... # type: typing___Text name = ... # type: typing___Text version = ... # type: int - feature_names = ... # type: google___protobuf___internal___containers___RepeatedScalarFieldContainer[typing___Text] @property def max_age(self) -> google___protobuf___duration_pb2___Duration: ... def __init__(self, *, + project : typing___Optional[typing___Text] = None, name : typing___Optional[typing___Text] = None, version : typing___Optional[int] = None, - feature_names : typing___Optional[typing___Iterable[typing___Text]] = None, max_age : typing___Optional[google___protobuf___duration_pb2___Duration] = None, ) -> None: ... @classmethod - def FromString(cls, s: bytes) -> FeatureSetRequest: ... + def FromString(cls, s: bytes) -> FeatureReference: ... def MergeFrom(self, other_msg: google___protobuf___message___Message) -> None: ... def CopyFrom(self, other_msg: google___protobuf___message___Message) -> None: ... if sys.version_info >= (3,): def HasField(self, field_name: typing_extensions___Literal[u"max_age"]) -> bool: ... - def ClearField(self, field_name: typing_extensions___Literal[u"feature_names",u"max_age",u"name",u"version"]) -> None: ... + def ClearField(self, field_name: typing_extensions___Literal[u"max_age",u"name",u"project",u"version"]) -> None: ... else: def HasField(self, field_name: typing_extensions___Literal[u"max_age",b"max_age"]) -> bool: ... - def ClearField(self, field_name: typing_extensions___Literal[u"feature_names",b"feature_names",u"max_age",b"max_age",u"name",b"name",u"version",b"version"]) -> None: ... + def ClearField(self, field_name: typing_extensions___Literal[u"max_age",b"max_age",u"name",b"name",u"project",b"project",u"version",b"version"]) -> None: ... class GetOnlineFeaturesRequest(google___protobuf___message___Message): DESCRIPTOR: google___protobuf___descriptor___Descriptor = ... @@ -227,14 +227,14 @@ class GetOnlineFeaturesRequest(google___protobuf___message___Message): omit_entities_in_response = ... # type: bool @property - def feature_sets(self) -> google___protobuf___internal___containers___RepeatedCompositeFieldContainer[FeatureSetRequest]: ... + def features(self) -> google___protobuf___internal___containers___RepeatedCompositeFieldContainer[FeatureReference]: ... @property def entity_rows(self) -> google___protobuf___internal___containers___RepeatedCompositeFieldContainer[GetOnlineFeaturesRequest.EntityRow]: ... def __init__(self, *, - feature_sets : typing___Optional[typing___Iterable[FeatureSetRequest]] = None, + features : typing___Optional[typing___Iterable[FeatureReference]] = None, entity_rows : typing___Optional[typing___Iterable[GetOnlineFeaturesRequest.EntityRow]] = None, omit_entities_in_response : typing___Optional[bool] = None, ) -> None: ... @@ -243,22 +243,22 @@ class GetOnlineFeaturesRequest(google___protobuf___message___Message): def MergeFrom(self, other_msg: google___protobuf___message___Message) -> None: ... def CopyFrom(self, other_msg: google___protobuf___message___Message) -> None: ... if sys.version_info >= (3,): - def ClearField(self, field_name: typing_extensions___Literal[u"entity_rows",u"feature_sets",u"omit_entities_in_response"]) -> None: ... + def ClearField(self, field_name: typing_extensions___Literal[u"entity_rows",u"features",u"omit_entities_in_response"]) -> None: ... else: - def ClearField(self, field_name: typing_extensions___Literal[u"entity_rows",b"entity_rows",u"feature_sets",b"feature_sets",u"omit_entities_in_response",b"omit_entities_in_response"]) -> None: ... + def ClearField(self, field_name: typing_extensions___Literal[u"entity_rows",b"entity_rows",u"features",b"features",u"omit_entities_in_response",b"omit_entities_in_response"]) -> None: ... class GetBatchFeaturesRequest(google___protobuf___message___Message): DESCRIPTOR: google___protobuf___descriptor___Descriptor = ... @property - def feature_sets(self) -> google___protobuf___internal___containers___RepeatedCompositeFieldContainer[FeatureSetRequest]: ... + def features(self) -> google___protobuf___internal___containers___RepeatedCompositeFieldContainer[FeatureReference]: ... @property def dataset_source(self) -> DatasetSource: ... def __init__(self, *, - feature_sets : typing___Optional[typing___Iterable[FeatureSetRequest]] = None, + features : typing___Optional[typing___Iterable[FeatureReference]] = None, dataset_source : typing___Optional[DatasetSource] = None, ) -> None: ... @classmethod @@ -267,10 +267,10 @@ class GetBatchFeaturesRequest(google___protobuf___message___Message): def CopyFrom(self, other_msg: google___protobuf___message___Message) -> None: ... if sys.version_info >= (3,): def HasField(self, field_name: typing_extensions___Literal[u"dataset_source"]) -> bool: ... - def ClearField(self, field_name: typing_extensions___Literal[u"dataset_source",u"feature_sets"]) -> None: ... + def ClearField(self, field_name: typing_extensions___Literal[u"dataset_source",u"features"]) -> None: ... else: def HasField(self, field_name: typing_extensions___Literal[u"dataset_source",b"dataset_source"]) -> bool: ... - def ClearField(self, field_name: typing_extensions___Literal[u"dataset_source",b"dataset_source",u"feature_sets",b"feature_sets"]) -> None: ... + def ClearField(self, field_name: typing_extensions___Literal[u"dataset_source",b"dataset_source",u"features",b"features"]) -> None: ... class GetOnlineFeaturesResponse(google___protobuf___message___Message): DESCRIPTOR: google___protobuf___descriptor___Descriptor = ...