Skip to content

Commit

Permalink
chore: Deprecate request feature views (remove it from tests & go) (#…
Browse files Browse the repository at this point in the history
…2477)

* remove request feature view from tests & go

Signed-off-by: pyalex <[email protected]>

* deprecation warnings

Signed-off-by: pyalex <[email protected]>
  • Loading branch information
pyalex authored Apr 1, 2022
1 parent 7c19cf7 commit 37971a4
Show file tree
Hide file tree
Showing 9 changed files with 116 additions and 274 deletions.
88 changes: 22 additions & 66 deletions go/internal/feast/featurestore.go
Original file line number Diff line number Diff line change
Expand Up @@ -109,13 +109,12 @@ func (fs *FeatureStore) GetOnlineFeatures(

var fvs map[string]*FeatureView
var requestedFeatureViews []*featureViewAndRefs
var requestedRequestFeatureViews []*RequestFeatureView
var requestedOnDemandFeatureViews []*OnDemandFeatureView
if featureService != nil {
fvs, requestedFeatureViews, requestedRequestFeatureViews, requestedOnDemandFeatureViews, err =
fvs, requestedFeatureViews, requestedOnDemandFeatureViews, err =
fs.getFeatureViewsToUseByService(featureService, false)
} else {
fvs, requestedFeatureViews, requestedRequestFeatureViews, requestedOnDemandFeatureViews, err =
fvs, requestedFeatureViews, requestedOnDemandFeatureViews, err =
fs.getFeatureViewsToUseByFeatureRefs(featureRefs, false)
}

Expand All @@ -124,7 +123,7 @@ func (fs *FeatureStore) GetOnlineFeatures(
return nil, err
}

if len(requestedRequestFeatureViews)+len(requestedOnDemandFeatureViews) > 0 {
if len(requestedOnDemandFeatureViews) > 0 {
return nil, status.Errorf(codes.InvalidArgument, "on demand feature views are currently not supported")
}

Expand All @@ -134,7 +133,7 @@ func (fs *FeatureStore) GetOnlineFeatures(
}
// TODO (Ly): This should return empty now
// Expect no ODFV or Request FV passed in GetOnlineFearuresRequest
neededRequestData, neededRequestODFVFeatures, err := fs.getNeededRequestData(requestedRequestFeatureViews, requestedOnDemandFeatureViews)
neededRequestData, err := fs.getNeededRequestData(requestedOnDemandFeatureViews)
if err != nil {
return nil, err
}
Expand All @@ -145,10 +144,7 @@ func (fs *FeatureStore) GetOnlineFeatures(
// requestDataFeatures := make(map[string]*prototypes.RepeatedValue) // TODO (Ly): Should be empty now until ODFV and Request FV are supported
mappedEntityProtos := make(map[string]*prototypes.RepeatedValue)
for joinKeyOrFeature, vals := range entityProtos {
if _, ok := neededRequestODFVFeatures[joinKeyOrFeature]; ok {
mappedEntityProtos[joinKeyOrFeature] = vals
// requestDataFeatures[joinKeyOrFeature] = vals
} else if _, ok = neededRequestData[joinKeyOrFeature]; ok {
if _, ok := neededRequestData[joinKeyOrFeature]; ok {
// requestDataFeatures[joinKeyOrFeature] = vals
} else {
if _, ok := expectedJoinKeysSet[joinKeyOrFeature]; !ok {
Expand Down Expand Up @@ -263,44 +259,34 @@ func (fs *FeatureStore) GetFeatureService(name string, project string) (*Feature

/*
Return a list of copies of FeatureViewProjection
copied from FeatureView, OnDemandFeatureView, RequestFeatureView existed in the registry
copied from FeatureView, OnDemandFeatureView existed in the registry
TODO (Ly): Since the implementation of registry has changed, a better approach here is just
retrieving featureViews asked in the passed in list of feature references instead of
retrieving all feature views. Similar argument to FeatureService applies.
*/
func (fs *FeatureStore) getFeatureViewsToUseByService(featureService *FeatureService, hideDummyEntity bool) (map[string]*FeatureView, []*featureViewAndRefs, []*RequestFeatureView, []*OnDemandFeatureView, error) {
func (fs *FeatureStore) getFeatureViewsToUseByService(featureService *FeatureService, hideDummyEntity bool) (map[string]*FeatureView, []*featureViewAndRefs, []*OnDemandFeatureView, error) {
fvs := make(map[string]*FeatureView)
requestFvs := make(map[string]*RequestFeatureView)
odFvs := make(map[string]*OnDemandFeatureView)

featureViews, err := fs.listFeatureViews(hideDummyEntity)
if err != nil {
return nil, nil, nil, nil, err
return nil, nil, nil, err
}
for _, featureView := range featureViews {
fvs[featureView.base.name] = featureView
}

requestFeatureViews, err := fs.registry.listRequestFeatureViews(fs.config.Project)
if err != nil {
return nil, nil, nil, nil, err
}
for _, requestFeatureView := range requestFeatureViews {
requestFvs[requestFeatureView.base.name] = requestFeatureView
}

onDemandFeatureViews, err := fs.registry.listOnDemandFeatureViews(fs.config.Project)
if err != nil {
return nil, nil, nil, nil, err
return nil, nil, nil, err
}
for _, onDemandFeatureView := range onDemandFeatureViews {
odFvs[onDemandFeatureView.base.name] = onDemandFeatureView
}

fvsToUse := make([]*featureViewAndRefs, 0)
requestFvsToUse := make([]*RequestFeatureView, 0)
odFvsToUse := make([]*OnDemandFeatureView, 0)

for _, featureProjection := range featureService.projections {
Expand All @@ -310,7 +296,7 @@ func (fs *FeatureStore) getFeatureViewsToUseByService(featureService *FeatureSer
if fv, ok := fvs[featureViewName]; ok {
base, err := fv.base.withProjection(featureProjection)
if err != nil {
return nil, nil, nil, nil, err
return nil, nil, nil, err
}
newFv := fv.NewFeatureViewFromBase(base)
features := make([]string, len(newFv.base.features))
Expand All @@ -321,66 +307,50 @@ func (fs *FeatureStore) getFeatureViewsToUseByService(featureService *FeatureSer
view: newFv,
featureRefs: features,
})
} else if requestFv, ok := requestFvs[featureViewName]; ok {
base, err := requestFv.base.withProjection(featureProjection)
if err != nil {
return nil, nil, nil, nil, err
}
requestFvsToUse = append(requestFvsToUse, requestFv.NewRequestFeatureViewFromBase(base))
} else if odFv, ok := odFvs[featureViewName]; ok {
base, err := odFv.base.withProjection(featureProjection)
if err != nil {
return nil, nil, nil, nil, err
return nil, nil, nil, err
}
odFvsToUse = append(odFvsToUse, odFv.NewOnDemandFeatureViewFromBase(base))
} else {
return nil, nil, nil, nil, fmt.Errorf("the provided feature service %s contains a reference to a feature view"+
return nil, nil, nil, fmt.Errorf("the provided feature service %s contains a reference to a feature view"+
"%s which doesn't exist, please make sure that you have created the feature view"+
"%s and that you have registered it by running \"apply\"", featureService.name, featureViewName, featureViewName)
}
}
return fvs, fvsToUse, requestFvsToUse, odFvsToUse, nil
return fvs, fvsToUse, odFvsToUse, nil
}

/*
Return all FeatureView, OnDemandFeatureView, RequestFeatureView from the registry
Return all FeatureView, OnDemandFeatureView from the registry
*/
func (fs *FeatureStore) getFeatureViewsToUseByFeatureRefs(features []string, hideDummyEntity bool) (map[string]*FeatureView, []*featureViewAndRefs, []*RequestFeatureView, []*OnDemandFeatureView, error) {
func (fs *FeatureStore) getFeatureViewsToUseByFeatureRefs(features []string, hideDummyEntity bool) (map[string]*FeatureView, []*featureViewAndRefs, []*OnDemandFeatureView, error) {
fvs := make(map[string]*FeatureView)
requestFvs := make(map[string]*RequestFeatureView)
odFvs := make(map[string]*OnDemandFeatureView)
featureViews, err := fs.listFeatureViews(hideDummyEntity)
if err != nil {
return nil, nil, nil, nil, err
return nil, nil, nil, err
}
for _, featureView := range featureViews {
fvs[featureView.base.name] = featureView
}

requestFeatureViews, err := fs.registry.listRequestFeatureViews(fs.config.Project)
if err != nil {
return nil, nil, nil, nil, err
}
for _, requestFeatureView := range requestFeatureViews {
requestFvs[requestFeatureView.base.name] = requestFeatureView
}

onDemandFeatureViews, err := fs.registry.listOnDemandFeatureViews(fs.config.Project)
if err != nil {
return nil, nil, nil, nil, err
return nil, nil, nil, err
}
for _, onDemandFeatureView := range onDemandFeatureViews {
odFvs[onDemandFeatureView.base.name] = onDemandFeatureView
}

fvsToUse := make([]*featureViewAndRefs, 0)
requestFvsToUse := make([]*RequestFeatureView, 0)
odFvsToUse := make([]*OnDemandFeatureView, 0)

for _, featureRef := range features {
featureViewName, featureName, err := parseFeatureReference(featureRef)
if err != nil {
return nil, nil, nil, nil, err
return nil, nil, nil, err
}
if fv, ok := fvs[featureViewName]; ok {
found := false
Expand All @@ -396,16 +366,14 @@ func (fs *FeatureStore) getFeatureViewsToUseByFeatureRefs(features []string, hid
featureRefs: []string{featureName},
})
}
} else if requestFv, ok := requestFvs[featureViewName]; ok {
requestFvsToUse = append(requestFvsToUse, requestFv)
} else if odFv, ok := odFvs[featureViewName]; ok {
odFvsToUse = append(odFvsToUse, odFv)
} else {
return nil, nil, nil, nil, fmt.Errorf("feature view %s doesn't exist, please make sure that you have created the"+
return nil, nil, nil, fmt.Errorf("feature view %s doesn't exist, please make sure that you have created the"+
" feature view %s and that you have registered it by running \"apply\"", featureViewName, featureViewName)
}
}
return fvs, fvsToUse, requestFvsToUse, odFvsToUse, nil
return fvs, fvsToUse, odFvsToUse, nil
}

func (fs *FeatureStore) getEntityMaps(requestedFeatureViews []*featureViewAndRefs) (map[string]string, map[string]interface{}, error) {
Expand Down Expand Up @@ -507,10 +475,8 @@ func validateFeatureRefs(requestedFeatures []*featureViewAndRefs, fullFeatureNam
return nil
}

func (fs *FeatureStore) getNeededRequestData(requestedRequestFeatureViews []*RequestFeatureView,
requestedOnDemandFeatureViews []*OnDemandFeatureView) (map[string]struct{}, map[string]struct{}, error) {
func (fs *FeatureStore) getNeededRequestData(requestedOnDemandFeatureViews []*OnDemandFeatureView) (map[string]struct{}, error) {
neededRequestData := make(map[string]struct{})
neededRequestFvFeatures := make(map[string]struct{})

for _, onDemandFeatureView := range requestedOnDemandFeatureViews {
requestSchema := onDemandFeatureView.getRequestDataSchema()
Expand All @@ -519,13 +485,7 @@ func (fs *FeatureStore) getNeededRequestData(requestedRequestFeatureViews []*Req
}
}

for _, requestFeatureView := range requestedRequestFeatureViews {
for _, feature := range requestFeatureView.base.features {
neededRequestFvFeatures[feature.name] = struct{}{}
}
}

return neededRequestData, neededRequestFvFeatures, nil
return neededRequestData, nil
}

func (fs *FeatureStore) ensureRequestedDataExist(neededRequestData map[string]struct{},
Expand Down Expand Up @@ -670,10 +630,6 @@ func (fs *FeatureStore) listFeatureViews(hideDummyEntity bool) ([]*FeatureView,
return featureViews, nil
}

func (fs *FeatureStore) listRequestFeatureViews() ([]*RequestFeatureView, error) {
return fs.registry.listRequestFeatureViews(fs.config.Project)
}

func (fs *FeatureStore) listEntities(hideDummyEntity bool) ([]*Entity, error) {

allEntities, err := fs.registry.listEntities(fs.config.Project)
Expand Down
46 changes: 1 addition & 45 deletions go/internal/feast/registry.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ var REGISTRY_STORE_CLASS_FOR_SCHEME map[string]string = map[string]string{
}

/*
Store protos of FeatureView, FeatureService, Entity, OnDemandFeatureView, RequestFeatureView
Store protos of FeatureView, FeatureService, Entity, OnDemandFeatureView
but return to user copies of non-proto versions of these objects
*/

Expand All @@ -29,7 +29,6 @@ type Registry struct {
cachedEntities map[string]map[string]*core.Entity
cachedFeatureViews map[string]map[string]*core.FeatureView
cachedOnDemandFeatureViews map[string]map[string]*core.OnDemandFeatureView
cachedRequestFeatureViews map[string]map[string]*core.RequestFeatureView
cachedRegistry *core.Registry
cachedRegistryProtoLastUpdated time.Time
cachedRegistryProtoTtl time.Duration
Expand Down Expand Up @@ -106,12 +105,10 @@ func (r *Registry) load(registry *core.Registry) {
r.cachedEntities = make(map[string]map[string]*core.Entity)
r.cachedFeatureViews = make(map[string]map[string]*core.FeatureView)
r.cachedOnDemandFeatureViews = make(map[string]map[string]*core.OnDemandFeatureView)
r.cachedRequestFeatureViews = make(map[string]map[string]*core.RequestFeatureView)
r.loadEntities(registry)
r.loadFeatureServices(registry)
r.loadFeatureViews(registry)
r.loadOnDemandFeatureViews(registry)
r.loadRequestFeatureViews(registry)
r.cachedRegistryProtoLastUpdated = time.Now()
}

Expand Down Expand Up @@ -155,16 +152,6 @@ func (r *Registry) loadOnDemandFeatureViews(registry *core.Registry) {
}
}

func (r *Registry) loadRequestFeatureViews(registry *core.Registry) {
requestFeatureViews := registry.RequestFeatureViews
for _, requestFeatureView := range requestFeatureViews {
if _, ok := r.cachedRequestFeatureViews[requestFeatureView.Spec.Project]; !ok {
r.cachedRequestFeatureViews[requestFeatureView.Spec.Project] = make(map[string]*core.RequestFeatureView)
}
r.cachedRequestFeatureViews[requestFeatureView.Spec.Project][requestFeatureView.Spec.Name] = requestFeatureView
}
}

/*
Look up Entities inside project
Returns empty list if project not found
Expand Down Expand Up @@ -241,25 +228,6 @@ func (r *Registry) listOnDemandFeatureViews(project string) ([]*OnDemandFeatureV
}
}

/*
Look up Request Feature Views inside project
Returns empty list if project not found
*/

func (r *Registry) listRequestFeatureViews(project string) ([]*RequestFeatureView, error) {
if cachedRequestFeatureViews, ok := r.cachedRequestFeatureViews[project]; !ok {
return []*RequestFeatureView{}, nil
} else {
requestFeatureViews := make([]*RequestFeatureView, len(cachedRequestFeatureViews))
index := 0
for _, requestFeatureViewProto := range cachedRequestFeatureViews {
requestFeatureViews[index] = NewRequestFeatureViewFromProto(requestFeatureViewProto)
index += 1
}
return requestFeatureViews, nil
}
}

func (r *Registry) getEntity(project, entityName string) (*Entity, error) {
if cachedEntities, ok := r.cachedEntities[project]; !ok {
return nil, fmt.Errorf("no cached entities found for project %s", project)
Expand Down Expand Up @@ -308,18 +276,6 @@ func (r *Registry) getOnDemandFeatureView(project, onDemandFeatureViewName strin
}
}

func (r *Registry) getRequestFeatureView(project, requestFeatureViewName string) (*RequestFeatureView, error) {
if cachedRequestFeatureViews, ok := r.cachedRequestFeatureViews[project]; !ok {
return nil, fmt.Errorf("no cached on request feature views found for project %s", project)
} else {
if requestFeatureViewProto, ok := cachedRequestFeatureViews[requestFeatureViewName]; !ok {
return nil, fmt.Errorf("no cached request feature view %s found for project %s", requestFeatureViewName, project)
} else {
return NewRequestFeatureViewFromProto(requestFeatureViewProto), nil
}
}
}

func getRegistryStoreFromScheme(registryPath string, registryConfig *RegistryConfig, repoPath string) (RegistryStore, error) {
uri, err := url.Parse(registryPath)
if err != nil {
Expand Down
33 changes: 0 additions & 33 deletions go/internal/feast/requestfeatureview.go

This file was deleted.

Loading

0 comments on commit 37971a4

Please sign in to comment.