diff --git a/common-test/src/main/java/feast/common/it/DataGenerator.java b/common-test/src/main/java/feast/common/it/DataGenerator.java index 57c6970701..398d5b5abb 100644 --- a/common-test/src/main/java/feast/common/it/DataGenerator.java +++ b/common-test/src/main/java/feast/common/it/DataGenerator.java @@ -33,7 +33,6 @@ import feast.proto.core.FeatureProto; import feast.proto.core.FeatureProto.FeatureSpecV2; import feast.proto.core.FeatureTableProto.FeatureTableSpec; -import feast.proto.core.SourceProto; import feast.proto.core.StoreProto; import feast.proto.serving.ServingAPIProto; import feast.proto.types.ValueProto; @@ -50,8 +49,6 @@ public class DataGenerator { createStore( "test-store", StoreProto.Store.StoreType.REDIS, ImmutableList.of(defaultSubscription)); - static SourceProto.Source defaultSource = createSource("localhost", "topic"); - public static Triple getDefaultSubscription() { return defaultSubscription; } @@ -60,21 +57,6 @@ public static StoreProto.Store getDefaultStore() { return defaultStore; } - public static SourceProto.Source getDefaultSource() { - return defaultSource; - } - - public static SourceProto.Source createSource(String server, String topic) { - return SourceProto.Source.newBuilder() - .setType(SourceProto.SourceType.KAFKA) - .setKafkaSourceConfig( - SourceProto.KafkaSourceConfig.newBuilder() - .setBootstrapServers(server) - .setTopic(topic) - .build()) - .build(); - } - public static StoreProto.Store createStore( String name, StoreProto.Store.StoreType type, diff --git a/common/src/main/java/feast/common/models/Feature.java b/common/src/main/java/feast/common/models/Feature.java deleted file mode 100644 index 1d7fc43ba3..0000000000 --- a/common/src/main/java/feast/common/models/Feature.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * Copyright 2018-2020 The Feast Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package feast.common.models; - -import feast.proto.serving.ServingAPIProto.FeatureReference; - -public class Feature { - - /** - * Accepts FeatureReference object and returns its reference in String - * "featureset_name:feature_name". - * - * @param featureReference {@link FeatureReference} - * @return String format of FeatureReference - */ - public static String getFeatureStringRef(FeatureReference featureReference) { - String ref = featureReference.getName(); - if (!featureReference.getFeatureSet().isEmpty()) { - ref = featureReference.getFeatureSet() + ":" + ref; - } - return ref; - } - - /** - * Accepts FeatureReference object and returns its reference with project included in String, eg. - * "project/featureset_name:feature_name". - * - * @param featureReference {@link FeatureReference} - * @return String format of FeatureReference - */ - public static String getFeatureStringWithProjectRef(FeatureReference featureReference) { - String ref = featureReference.getName(); - if (!featureReference.getFeatureSet().isEmpty()) { - ref = featureReference.getFeatureSet() + ":" + ref; - } - if (!featureReference.getProject().isEmpty()) { - ref = featureReference.getProject() + "/" + ref; - } - return ref; - } -} diff --git a/common/src/main/java/feast/common/models/FeatureSet.java b/common/src/main/java/feast/common/models/FeatureSet.java deleted file mode 100644 index f9db0f744f..0000000000 --- a/common/src/main/java/feast/common/models/FeatureSet.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * Copyright 2018-2020 The Feast Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package feast.common.models; - -import feast.proto.core.FeatureSetProto.FeatureSetSpec; -import feast.proto.core.FeatureSetReferenceProto.FeatureSetReference; - -public class FeatureSet { - - /** - * Accepts FeatureSetSpec object and returns its reference in String "project/featureset_name". - * - * @param featureSetSpec {@link FeatureSetSpec} - * @return String format of FeatureSetReference - */ - public static String getFeatureSetStringRef(FeatureSetSpec featureSetSpec) { - return String.format("%s/%s", featureSetSpec.getProject(), featureSetSpec.getName()); - } - - /** - * Accepts FeatureSetReference object and returns its reference in String - * "project/featureset_name". - * - * @param featureSetReference {@link FeatureSetReference} - * @return String format of FeatureSetReference - */ - public static String getFeatureSetStringRef(FeatureSetReference featureSetReference) { - return String.format("%s/%s", featureSetReference.getProject(), featureSetReference.getName()); - } -} diff --git a/common/src/main/java/feast/common/models/FeatureSetReference.java b/common/src/main/java/feast/common/models/FeatureSetReference.java deleted file mode 100644 index ea01bf5cf7..0000000000 --- a/common/src/main/java/feast/common/models/FeatureSetReference.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * Copyright 2018-2020 The Feast Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package feast.common.models; - -import java.io.Serializable; -import lombok.AllArgsConstructor; -import lombok.Data; - -/** - * FeatureSetReference is key that uniquely defines specific version of FeatureSet or FeatureSetSpec - */ -@Data -@AllArgsConstructor -public class FeatureSetReference implements Serializable { - public static String PROJECT_DEFAULT_NAME = "default"; - - /* Name of project to which this featureSet is assigned */ - private String projectName; - /* Name of FeatureSet */ - private String featureSetName; - /* Version of FeatureSet */ - private Integer version; - - // Empty constructor required for Avro decoding. - @SuppressWarnings("unused") - public FeatureSetReference() {} - - public static FeatureSetReference of(String projectName, String featureSetName, Integer version) { - projectName = projectName.isEmpty() ? PROJECT_DEFAULT_NAME : projectName; - return new FeatureSetReference(projectName, featureSetName, version); - } - - public static FeatureSetReference of(String projectName, String featureSetName) { - return FeatureSetReference.of(projectName, featureSetName, -1); - } - - /** - * Parse string representation of FeatureSetReference that expected to have format - * <ProjectName>/<FeatureSetName>. If project's not given - default will be used. - * - * @param reference string representation - * @return construct {@link FeatureSetReference} - */ - public static FeatureSetReference parse(String reference) { - String[] split = reference.split("/", 2); - if (split.length == 1) { - return FeatureSetReference.of(PROJECT_DEFAULT_NAME, split[0]); - } - - if (split.length > 2) { - throw new RuntimeException( - "FeatureSet reference must have the format /"); - } - - return FeatureSetReference.of(split[0], split[1]); - } - - public String getReference() { - return String.format("%s/%s", getProjectName(), getFeatureSetName()); - } -} diff --git a/core/src/main/java/feast/core/config/FeatureStreamConfig.java b/core/src/main/java/feast/core/config/FeatureStreamConfig.java deleted file mode 100644 index cc5e707964..0000000000 --- a/core/src/main/java/feast/core/config/FeatureStreamConfig.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * Copyright 2018-2019 The Feast Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package feast.core.config; - -import feast.core.config.FeastProperties.StreamProperties; -import feast.core.model.Source; -import feast.proto.core.SourceProto; -import feast.proto.core.SourceProto.KafkaSourceConfig; -import feast.proto.core.SourceProto.SourceType; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Slf4j -@Configuration -public class FeatureStreamConfig { - - @Autowired - @Bean - public Source getDefaultSource(FeastProperties feastProperties) { - StreamProperties streamProperties = feastProperties.getStream(); - SourceType featureStreamType = SourceType.valueOf(streamProperties.getType().toUpperCase()); - switch (featureStreamType) { - case KAFKA: - String bootstrapServers = streamProperties.getOptions().getBootstrapServers(); - String topicName = streamProperties.getOptions().getTopic(); - - KafkaSourceConfig sourceConfig = - KafkaSourceConfig.newBuilder() - .setBootstrapServers(bootstrapServers) - .setTopic(topicName) - .build(); - SourceProto.Source source = - SourceProto.Source.newBuilder() - .setType(featureStreamType) - .setKafkaSourceConfig(sourceConfig) - .build(); - return Source.fromProto(source, true); - default: - throw new RuntimeException("Unsupported source stream, only [KAFKA] is supported"); - } - } -} diff --git a/core/src/main/java/feast/core/config/MonitoringConfig.java b/core/src/main/java/feast/core/config/MonitoringConfig.java index 53c9562c47..5fc6b8280e 100644 --- a/core/src/main/java/feast/core/config/MonitoringConfig.java +++ b/core/src/main/java/feast/core/config/MonitoringConfig.java @@ -16,7 +16,7 @@ */ package feast.core.config; -import feast.core.dao.FeatureSetRepository; +import feast.core.dao.FeatureTableRepository; import feast.core.dao.StoreRepository; import feast.core.metrics.collector.FeastResourceCollector; import feast.core.metrics.collector.JVMResourceCollector; @@ -47,18 +47,18 @@ public ServletRegistrationBean metricsServlet() { /** * Register custom Prometheus collector that exports metrics about Feast Resources. * - *

For example: total number of registered feature sets and stores. + *

For example: total number of registered feature tables and stores. * - * @param featureSetRepository {@link FeatureSetRepository} + * @param featureTableRepository {@link FeatureTableRepository} * @param storeRepository {@link StoreRepository} * @return {@link FeastResourceCollector} */ @Bean @Autowired public FeastResourceCollector feastResourceCollector( - FeatureSetRepository featureSetRepository, StoreRepository storeRepository) { + FeatureTableRepository featureTableRepository, StoreRepository storeRepository) { FeastResourceCollector collector = - new FeastResourceCollector(featureSetRepository, storeRepository); + new FeastResourceCollector(featureTableRepository, storeRepository); collector.register(); return collector; } diff --git a/core/src/main/java/feast/core/controller/CoreServiceRestController.java b/core/src/main/java/feast/core/controller/CoreServiceRestController.java index 0549a536cf..f782c172cd 100644 --- a/core/src/main/java/feast/core/controller/CoreServiceRestController.java +++ b/core/src/main/java/feast/core/controller/CoreServiceRestController.java @@ -16,8 +16,6 @@ */ package feast.core.controller; -import com.google.protobuf.InvalidProtocolBufferException; -import com.google.protobuf.Timestamp; import feast.core.config.FeastProperties; import feast.core.model.Project; import feast.core.service.ProjectService; @@ -25,17 +23,11 @@ import feast.proto.core.CoreServiceProto.GetFeastCoreVersionResponse; import feast.proto.core.CoreServiceProto.ListEntitiesRequest; import feast.proto.core.CoreServiceProto.ListEntitiesResponse; -import feast.proto.core.CoreServiceProto.ListFeatureSetsRequest; -import feast.proto.core.CoreServiceProto.ListFeatureSetsResponse; import feast.proto.core.CoreServiceProto.ListFeatureTablesRequest; import feast.proto.core.CoreServiceProto.ListFeatureTablesResponse; import feast.proto.core.CoreServiceProto.ListFeaturesRequest; import feast.proto.core.CoreServiceProto.ListFeaturesResponse; import feast.proto.core.CoreServiceProto.ListProjectsResponse; -import java.time.LocalDate; -import java.time.LocalTime; -import java.time.ZoneOffset; -import java.time.format.DateTimeFormatter; import java.util.Arrays; import java.util.List; import java.util.Optional; @@ -74,34 +66,13 @@ public CoreServiceRestController( * * @return (200 OK) Returns {@link GetFeastCoreVersionResponse} in JSON. */ - @RequestMapping(value = "/v1/version", method = RequestMethod.GET) + @RequestMapping(value = "/v2/version", method = RequestMethod.GET) public GetFeastCoreVersionResponse getVersion() { GetFeastCoreVersionResponse response = GetFeastCoreVersionResponse.newBuilder().setVersion(feastProperties.getVersion()).build(); return response; } - /** - * GET /feature-sets : Retrieve a list of Feature Sets according to filtering parameters of Feast - * project name and feature set name. If none matches, an empty JSON response is returned. - * - * @param project Request Parameter: Name of feast project to search in. If set to "*" - * , all existing projects will be filtered. However, asterisk can NOT be - * combined with other strings (for example "merchant_*") to use as wildcard to - * filter feature sets. - * @param name Request Parameter: Feature set name. If set to "*", filter * all feature sets by - * default. Asterisk can be used as wildcard to filter * feature sets. - * @return (200 OK) Return {@link ListFeatureSetsResponse} in JSON. - */ - @RequestMapping(value = "/v1/feature-sets", method = RequestMethod.GET) - public ListFeatureSetsResponse listFeatureSets( - @RequestParam(defaultValue = Project.DEFAULT_NAME) String project, @RequestParam String name) - throws InvalidProtocolBufferException { - ListFeatureSetsRequest.Filter.Builder filterBuilder = - ListFeatureSetsRequest.Filter.newBuilder().setProject(project).setFeatureSetName(name); - return specService.listFeatureSets(filterBuilder.build()); - } - /** * GET /features : List Features based on project and entities. * @@ -109,7 +80,7 @@ public ListFeatureSetsResponse listFeatureSets( * to. At least one entity is required. For example, if entity1 and entity2 * are given, then all features returned (if any) will belong to BOTH * entities. - * @param project (Optional) Request Parameter: A single project where the feature set of all + * @param project (Optional) Request Parameter: A single project where the feature table of all * features returned is under. If not provided, the default project will be used, usually * default. * @return (200 OK) Return {@link ListFeaturesResponse} in JSON. @@ -128,7 +99,7 @@ public ListFeaturesResponse listFeatures( * * @return (200 OK) Returns {@link ListProjectsResponse} in JSON. */ - @RequestMapping(value = "/v1/projects", method = RequestMethod.GET) + @RequestMapping(value = "/v2/projects", method = RequestMethod.GET) public ListProjectsResponse listProjects() { List projects = projectService.listProjects(); return ListProjectsResponse.newBuilder() @@ -165,11 +136,4 @@ public ListFeatureTablesResponse listFeatureTables( ListFeatureTablesRequest.Filter.newBuilder().setProject(project); return specService.listFeatureTables(filterBuilder.build()); } - - private Timestamp utcTimeStringToTimestamp(String utcTimeString) { - long epochSecond = - LocalDate.parse(utcTimeString, DateTimeFormatter.ISO_DATE) - .toEpochSecond(LocalTime.MIN, ZoneOffset.UTC); - return Timestamp.newBuilder().setSeconds(epochSecond).setNanos(0).build(); - } } diff --git a/core/src/main/java/feast/core/controller/exception/handler/RestResponseEntityExceptionHandler.java b/core/src/main/java/feast/core/controller/exception/handler/RestResponseEntityExceptionHandler.java index 53fe1bcd45..ef27e4aee8 100644 --- a/core/src/main/java/feast/core/controller/exception/handler/RestResponseEntityExceptionHandler.java +++ b/core/src/main/java/feast/core/controller/exception/handler/RestResponseEntityExceptionHandler.java @@ -35,8 +35,8 @@ public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionH /** * Handles the case when a request object (such as {@link - * feast.proto.core.CoreServiceProto.GetFeatureSetRequest}) or a response object (such as {@link - * feast.proto.core.CoreServiceProto.GetFeatureSetResponse} is malformed. + * feast.proto.core.CoreServiceProto.GetFeatureTableRequest}) or a response object (such as {@link + * feast.proto.core.CoreServiceProto.GetFeatureTableResponse} is malformed. * * @param ex the {@link InvalidProtocolBufferException} that occurred. * @param request the {@link WebRequest} that caused this exception. diff --git a/core/src/main/java/feast/core/dao/FeatureSetRepository.java b/core/src/main/java/feast/core/dao/FeatureSetRepository.java deleted file mode 100644 index 38a690b0d6..0000000000 --- a/core/src/main/java/feast/core/dao/FeatureSetRepository.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * Copyright 2018-2019 The Feast Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package feast.core.dao; - -import feast.core.model.FeatureSet; -import feast.proto.core.FeatureSetProto; -import java.util.List; -import org.springframework.data.jpa.repository.JpaRepository; - -/** JPA repository supplying FeatureSet objects keyed by id. */ -public interface FeatureSetRepository extends JpaRepository { - - long count(); - - // Find single feature set by project and name - FeatureSet findFeatureSetByNameAndProject_Name(String name, String project); - - // find all feature sets and order by name - List findAllByOrderByNameAsc(); - - // find all feature sets matching the given name pattern with a specific project. - List findAllByNameLikeAndProject_NameOrderByNameAsc(String name, String project_name); - - // find all feature sets matching the given name pattern and project pattern - List findAllByNameLikeAndProject_NameLikeOrderByNameAsc( - String name, String project_name); - - // find all feature sets matching given status - List findAllByStatus(FeatureSetProto.FeatureSetStatus status); -} diff --git a/core/src/main/java/feast/core/dao/SourceRepository.java b/core/src/main/java/feast/core/dao/SourceRepository.java deleted file mode 100644 index 1cf02dbcf8..0000000000 --- a/core/src/main/java/feast/core/dao/SourceRepository.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * Copyright 2018-2019 The Feast Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package feast.core.dao; - -import feast.core.model.Source; -import feast.proto.core.SourceProto.SourceType; -import org.springframework.data.jpa.repository.JpaRepository; - -/** JPA repository supplying Source objects keyed by id. */ -public interface SourceRepository extends JpaRepository { - Source findFirstByTypeAndConfigOrderByIdAsc(SourceType type, String config); -} diff --git a/core/src/main/java/feast/core/exception/TopicExistsException.java b/core/src/main/java/feast/core/exception/TopicExistsException.java deleted file mode 100644 index abd4937c71..0000000000 --- a/core/src/main/java/feast/core/exception/TopicExistsException.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * Copyright 2018-2019 The Feast Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package feast.core.exception; - -/** Exception thrown when creation of a topic in the stream fails because it already exists. */ -public class TopicExistsException extends RuntimeException { - public TopicExistsException() { - super(); - } - - public TopicExistsException(String message) { - super(message); - } - - public TopicExistsException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/core/src/main/java/feast/core/grpc/CoreServiceImpl.java b/core/src/main/java/feast/core/grpc/CoreServiceImpl.java index 4514ae82c9..efdf0fc778 100644 --- a/core/src/main/java/feast/core/grpc/CoreServiceImpl.java +++ b/core/src/main/java/feast/core/grpc/CoreServiceImpl.java @@ -16,7 +16,6 @@ */ package feast.core.grpc; -import com.google.protobuf.InvalidProtocolBufferException; import feast.common.auth.service.AuthorizationService; import feast.common.logging.interceptors.GrpcMessageInterceptor; import feast.core.config.FeastProperties; @@ -28,7 +27,6 @@ import feast.proto.core.CoreServiceGrpc.CoreServiceImplBase; import feast.proto.core.CoreServiceProto.*; import feast.proto.core.EntityProto.EntitySpecV2; -import feast.proto.core.FeatureSetProto.FeatureSet; import io.grpc.Status; import io.grpc.StatusRuntimeException; import io.grpc.stub.StreamObserver; @@ -79,20 +77,6 @@ public void getFeastCoreVersion( } } - @Override - public void getFeatureSet( - GetFeatureSetRequest request, StreamObserver responseObserver) { - try { - GetFeatureSetResponse response = specService.getFeatureSet(request); - responseObserver.onNext(response); - responseObserver.onCompleted(); - } catch (RetrievalException | StatusRuntimeException | InvalidProtocolBufferException e) { - log.error("Exception has occurred in GetFeatureSet method: ", e); - responseObserver.onError( - Status.INTERNAL.withDescription(e.getMessage()).withCause(e).asRuntimeException()); - } - } - @Override public void getEntity( GetEntityRequest request, StreamObserver responseObserver) { @@ -118,20 +102,6 @@ public void getEntity( } } - @Override - public void listFeatureSets( - ListFeatureSetsRequest request, StreamObserver responseObserver) { - try { - ListFeatureSetsResponse response = specService.listFeatureSets(request.getFilter()); - responseObserver.onNext(response); - responseObserver.onCompleted(); - } catch (RetrievalException | IllegalArgumentException | InvalidProtocolBufferException e) { - log.error("Exception has occurred in ListFeatureSet method: ", e); - responseObserver.onError( - Status.INTERNAL.withDescription(e.getMessage()).withCause(e).asRuntimeException()); - } - } - /** Retrieve a list of features */ @Override public void listFeatures( @@ -184,22 +154,6 @@ public void listEntities( } } - @Override - public void updateFeatureSetStatus( - UpdateFeatureSetStatusRequest request, - StreamObserver responseObserver) { - try { - UpdateFeatureSetStatusResponse response = specService.updateFeatureSetStatus(request); - - responseObserver.onNext(response); - responseObserver.onCompleted(); - } catch (Exception e) { - log.error("Exception has occurred in UpdateFeatureSetStatus method: ", e); - responseObserver.onError( - Status.INTERNAL.withDescription(e.getMessage()).withCause(e).asRuntimeException()); - } - } - @Override public void listStores( ListStoresRequest request, StreamObserver responseObserver) { @@ -249,40 +203,6 @@ public void applyEntity( } } - @Override - public void applyFeatureSet( - ApplyFeatureSetRequest request, StreamObserver responseObserver) { - - String projectId = null; - - try { - FeatureSet featureSet = request.getFeatureSet(); - projectId = SpecService.resolveProjectName(featureSet.getSpec().getProject()); - authorizationService.authorizeRequest(SecurityContextHolder.getContext(), projectId); - ApplyFeatureSetResponse response = specService.applyFeatureSet(featureSet); - responseObserver.onNext(response); - responseObserver.onCompleted(); - } catch (org.hibernate.exception.ConstraintViolationException e) { - log.error( - "Unable to persist this feature set due to a constraint violation. Please ensure that" - + " field names are unique within the project namespace: ", - e); - responseObserver.onError( - Status.ALREADY_EXISTS.withDescription(e.getMessage()).withCause(e).asRuntimeException()); - } catch (AccessDeniedException e) { - log.info(String.format("User prevented from accessing project: %s", projectId)); - responseObserver.onError( - Status.PERMISSION_DENIED - .withDescription(e.getMessage()) - .withCause(e) - .asRuntimeException()); - } catch (Exception e) { - log.error("Exception has occurred in ApplyFeatureSet method: ", e); - responseObserver.onError( - Status.INTERNAL.withDescription(e.getMessage()).withCause(e).asRuntimeException()); - } - } - @Override public void updateStore( UpdateStoreRequest request, StreamObserver responseObserver) { diff --git a/core/src/main/java/feast/core/metrics/collector/FeastResourceCollector.java b/core/src/main/java/feast/core/metrics/collector/FeastResourceCollector.java index b79ea5a3c3..3064a25b8f 100644 --- a/core/src/main/java/feast/core/metrics/collector/FeastResourceCollector.java +++ b/core/src/main/java/feast/core/metrics/collector/FeastResourceCollector.java @@ -16,7 +16,7 @@ */ package feast.core.metrics.collector; -import feast.core.dao.FeatureSetRepository; +import feast.core.dao.FeatureTableRepository; import feast.core.dao.StoreRepository; import io.prometheus.client.Collector; import io.prometheus.client.GaugeMetricFamily; @@ -26,16 +26,16 @@ /** * FeastResourceCollector exports metrics about Feast Resources. * - *

For example: total number of registered feature sets and stores. + *

For example: total number of registered feature tables and stores. */ public class FeastResourceCollector extends Collector { - private final FeatureSetRepository featureSetRepository; + private final FeatureTableRepository featureTableRepository; private final StoreRepository storeRepository; public FeastResourceCollector( - FeatureSetRepository featureSetRepository, StoreRepository storeRepository) { - this.featureSetRepository = featureSetRepository; + FeatureTableRepository featureTableRepository, StoreRepository storeRepository) { + this.featureTableRepository = featureTableRepository; this.storeRepository = storeRepository; } @@ -45,8 +45,8 @@ public List collect() { samples.add( new GaugeMetricFamily( "feast_core_feature_set_total", - "Total number of registered feature sets", - featureSetRepository.count())); + "Total number of registered feature tables", + featureTableRepository.count())); samples.add( new GaugeMetricFamily( "feast_core_store_total", diff --git a/core/src/main/java/feast/core/model/Entity.java b/core/src/main/java/feast/core/model/Entity.java deleted file mode 100644 index a5fd8c1b05..0000000000 --- a/core/src/main/java/feast/core/model/Entity.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * Copyright 2018-2019 The Feast Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package feast.core.model; - -import feast.proto.core.FeatureSetProto.EntitySpec; -import feast.proto.types.ValueProto.ValueType; -import java.util.Objects; -import javax.persistence.*; -import lombok.Getter; -import lombok.Setter; - -/** Feast entity object. Contains name and type of the entity. */ -@Getter -@Setter -@javax.persistence.Entity -@Table( - name = "entities", - uniqueConstraints = @UniqueConstraint(columnNames = {"name", "feature_set_id"})) -public class Entity { - - @Id @GeneratedValue private Long id; - - private String name; - - @ManyToOne(fetch = FetchType.LAZY) - private FeatureSet featureSet; - - /** Data type of the entity. String representation of {@link ValueType} * */ - private String type; - - public Entity() {} - - public Entity(String name, ValueType.Enum type) { - this.setName(name); - this.setType(type.toString()); - } - - public static Entity fromProto(EntitySpec entitySpec) { - Entity entity = new Entity(entitySpec.getName(), entitySpec.getValueType()); - return entity; - } - - public EntitySpec toProto() { - return EntitySpec.newBuilder().setName(name).setValueType(ValueType.Enum.valueOf(type)).build(); - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - Entity entity = (Entity) o; - return getName().equals(entity.getName()) && getType().equals(entity.getType()); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), getName(), getType()); - } -} diff --git a/core/src/main/java/feast/core/model/Feature.java b/core/src/main/java/feast/core/model/Feature.java deleted file mode 100644 index b387f3403b..0000000000 --- a/core/src/main/java/feast/core/model/Feature.java +++ /dev/null @@ -1,298 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * Copyright 2018-2019 The Feast Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package feast.core.model; - -import com.google.protobuf.InvalidProtocolBufferException; -import feast.core.util.TypeConversion; -import feast.proto.core.FeatureSetProto.FeatureSpec; -import feast.proto.core.FeatureSetProto.FeatureSpec.Builder; -import feast.proto.types.ValueProto.ValueType; -import java.util.Arrays; -import java.util.Map; -import java.util.Objects; -import javax.persistence.*; -import javax.persistence.Entity; -import lombok.Getter; -import lombok.Setter; -import org.tensorflow.metadata.v0.*; - -/** - * Feature belonging to a featureset. Contains name, type as well as domain metadata about the - * feature. - */ -@Getter -@Setter -@Entity -@Table( - name = "features", - uniqueConstraints = @UniqueConstraint(columnNames = {"name", "feature_set_id"})) -public class Feature { - - @Id @GeneratedValue private Long id; - - private String name; - - @ManyToOne(fetch = FetchType.LAZY) - private FeatureSet featureSet; - - /** Data type of the feature. String representation of {@link ValueType} * */ - private String type; - - // Labels for this feature - @Column(name = "labels", columnDefinition = "text") - private String labels; - - // Presence constraints (refer to proto feast.core.FeatureSet.FeatureSpec) - // Only one of them can be set. - private byte[] presence; - private byte[] groupPresence; - - // Shape type (refer to proto feast.core.FeatureSet.FeatureSpec) - // Only one of them can be set. - private byte[] shape; - private byte[] valueCount; - - // Domain info for the values (refer to proto feast.core.FeatureSet.FeatureSpec) - // Only one of them can be set. - private String domain; - private byte[] intDomain; - private byte[] floatDomain; - private byte[] stringDomain; - private byte[] boolDomain; - private byte[] structDomain; - private byte[] naturalLanguageDomain; - private byte[] imageDomain; - private byte[] midDomain; - private byte[] urlDomain; - private byte[] timeDomain; - private byte[] timeOfDayDomain; - - public Feature() {} - // Whether this feature has been archived. A archived feature cannot be - // retrieved from or written to. - private boolean archived = false; - - public Feature(String name, ValueType.Enum type) { - this.setName(name); - this.setType(type.toString()); - } - - /** - * Return a boolean to facilitate streaming elements on the basis of given predicate. - * - * @param labelsFilter contain labels that should be attached to Feature - * @return boolean True if Feature contains all labels in the labelsFilter - */ - public boolean hasAllLabels(Map labelsFilter) { - Map featureLabelsMap = this.getLabels(); - for (String key : labelsFilter.keySet()) { - if (!featureLabelsMap.containsKey(key) - || !featureLabelsMap.get(key).equals(labelsFilter.get(key))) { - return false; - } - } - return true; - } - - public static Feature fromProto(FeatureSpec featureSpec) { - Feature feature = new Feature(featureSpec.getName(), featureSpec.getValueType()); - feature.labels = TypeConversion.convertMapToJsonString(featureSpec.getLabelsMap()); - feature.updateSchema(featureSpec); - return feature; - } - - public FeatureSpec toProto() throws InvalidProtocolBufferException { - Builder featureSpecBuilder = - FeatureSpec.newBuilder().setName(getName()).setValueType(ValueType.Enum.valueOf(getType())); - - if (getPresence() != null) { - featureSpecBuilder.setPresence(FeaturePresence.parseFrom(getPresence())); - } else if (getGroupPresence() != null) { - featureSpecBuilder.setGroupPresence(FeaturePresenceWithinGroup.parseFrom(getGroupPresence())); - } - - if (getShape() != null) { - featureSpecBuilder.setShape(FixedShape.parseFrom(getShape())); - } else if (getValueCount() != null) { - featureSpecBuilder.setValueCount(ValueCount.parseFrom(getValueCount())); - } - - if (getDomain() != null) { - featureSpecBuilder.setDomain(getDomain()); - } else if (getIntDomain() != null) { - featureSpecBuilder.setIntDomain(IntDomain.parseFrom(getIntDomain())); - } else if (getFloatDomain() != null) { - featureSpecBuilder.setFloatDomain(FloatDomain.parseFrom(getFloatDomain())); - } else if (getStringDomain() != null) { - featureSpecBuilder.setStringDomain(StringDomain.parseFrom(getStringDomain())); - } else if (getBoolDomain() != null) { - featureSpecBuilder.setBoolDomain(BoolDomain.parseFrom(getBoolDomain())); - } else if (getStructDomain() != null) { - featureSpecBuilder.setStructDomain(StructDomain.parseFrom(getStructDomain())); - } else if (getNaturalLanguageDomain() != null) { - featureSpecBuilder.setNaturalLanguageDomain( - NaturalLanguageDomain.parseFrom(getNaturalLanguageDomain())); - } else if (getImageDomain() != null) { - featureSpecBuilder.setImageDomain(ImageDomain.parseFrom(getImageDomain())); - } else if (getMidDomain() != null) { - featureSpecBuilder.setMidDomain(MIDDomain.parseFrom(getMidDomain())); - } else if (getUrlDomain() != null) { - featureSpecBuilder.setUrlDomain(URLDomain.parseFrom(getUrlDomain())); - } else if (getTimeDomain() != null) { - featureSpecBuilder.setTimeDomain(TimeDomain.parseFrom(getTimeDomain())); - } else if (getTimeOfDayDomain() != null) { - featureSpecBuilder.setTimeOfDayDomain(TimeOfDayDomain.parseFrom(getTimeOfDayDomain())); - } - - if (getLabels() != null) { - featureSpecBuilder.putAllLabels(getLabels()); - } - return featureSpecBuilder.build(); - } - - private void updateSchema(FeatureSpec featureSpec) { - switch (featureSpec.getPresenceConstraintsCase()) { - case PRESENCE: - setPresence(featureSpec.getPresence().toByteArray()); - break; - case GROUP_PRESENCE: - setGroupPresence(featureSpec.getGroupPresence().toByteArray()); - break; - case PRESENCECONSTRAINTS_NOT_SET: - break; - } - - switch (featureSpec.getShapeTypeCase()) { - case SHAPE: - setShape(featureSpec.getShape().toByteArray()); - break; - case VALUE_COUNT: - setValueCount(featureSpec.getValueCount().toByteArray()); - break; - case SHAPETYPE_NOT_SET: - break; - } - - switch (featureSpec.getDomainInfoCase()) { - case DOMAIN: - setDomain(featureSpec.getDomain()); - break; - case INT_DOMAIN: - setIntDomain(featureSpec.getIntDomain().toByteArray()); - break; - case FLOAT_DOMAIN: - setFloatDomain(featureSpec.getFloatDomain().toByteArray()); - break; - case STRING_DOMAIN: - setStringDomain(featureSpec.getStringDomain().toByteArray()); - break; - case BOOL_DOMAIN: - setBoolDomain(featureSpec.getBoolDomain().toByteArray()); - break; - case STRUCT_DOMAIN: - setStructDomain(featureSpec.getStructDomain().toByteArray()); - break; - case NATURAL_LANGUAGE_DOMAIN: - setNaturalLanguageDomain(featureSpec.getNaturalLanguageDomain().toByteArray()); - break; - case IMAGE_DOMAIN: - setImageDomain(featureSpec.getImageDomain().toByteArray()); - break; - case MID_DOMAIN: - setMidDomain(featureSpec.getMidDomain().toByteArray()); - break; - case URL_DOMAIN: - setUrlDomain(featureSpec.getUrlDomain().toByteArray()); - break; - case TIME_DOMAIN: - setTimeDomain(featureSpec.getTimeDomain().toByteArray()); - break; - case TIME_OF_DAY_DOMAIN: - setTimeOfDayDomain(featureSpec.getTimeOfDayDomain().toByteArray()); - break; - case DOMAININFO_NOT_SET: - break; - } - } - - /** Archive this feature. */ - public void archive() { - this.archived = true; - } - - /** - * Update the feature object with a valid feature spec. - * - * @param featureSpec {@link FeatureSpec} containing schema changes. - */ - public void updateFromProto(FeatureSpec featureSpec) { - if (isArchived()) { - throw new IllegalArgumentException( - String.format( - "You are attempting to create a feature %s that was previously archived. This isn't allowed. Please create a new feature with a different name.", - featureSpec.getName())); - } - if (ValueType.Enum.valueOf(type) != featureSpec.getValueType()) { - throw new IllegalArgumentException( - String.format( - "You are attempting to change the type of feature %s from %s to %s. This isn't allowed. Please create a new feature.", - featureSpec.getName(), type, featureSpec.getValueType())); - } - this.setLabels(TypeConversion.convertMapToJsonString(featureSpec.getLabelsMap())); - updateSchema(featureSpec); - } - - public Map getLabels() { - return TypeConversion.convertJsonStringToMap(this.labels); - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - Feature feature = (Feature) o; - return getName().equals(feature.getName()) - && getType().equals(feature.getType()) - && isArchived() == (feature.isArchived()) - && Objects.equals(getLabels(), feature.getLabels()) - && Arrays.equals(getPresence(), feature.getPresence()) - && Arrays.equals(getGroupPresence(), feature.getGroupPresence()) - && Arrays.equals(getShape(), feature.getShape()) - && Arrays.equals(getValueCount(), feature.getValueCount()) - && Objects.equals(getDomain(), feature.getDomain()) - && Arrays.equals(getIntDomain(), feature.getIntDomain()) - && Arrays.equals(getFloatDomain(), feature.getFloatDomain()) - && Arrays.equals(getStringDomain(), feature.getStringDomain()) - && Arrays.equals(getBoolDomain(), feature.getBoolDomain()) - && Arrays.equals(getStructDomain(), feature.getStructDomain()) - && Arrays.equals(getNaturalLanguageDomain(), feature.getNaturalLanguageDomain()) - && Arrays.equals(getImageDomain(), feature.getImageDomain()) - && Arrays.equals(getMidDomain(), feature.getMidDomain()) - && Arrays.equals(getUrlDomain(), feature.getUrlDomain()) - && Arrays.equals(getTimeDomain(), feature.getTimeDomain()) - && Arrays.equals(getTimeDomain(), feature.getTimeOfDayDomain()); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), getName(), getType(), getLabels()); - } -} diff --git a/core/src/main/java/feast/core/model/FeatureSet.java b/core/src/main/java/feast/core/model/FeatureSet.java deleted file mode 100644 index 023708d6a9..0000000000 --- a/core/src/main/java/feast/core/model/FeatureSet.java +++ /dev/null @@ -1,463 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * Copyright 2018-2019 The Feast Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package feast.core.model; - -import com.google.common.collect.Sets; -import com.google.protobuf.Duration; -import com.google.protobuf.InvalidProtocolBufferException; -import com.google.protobuf.Timestamp; -import feast.core.util.TypeConversion; -import feast.proto.core.FeatureSetProto; -import feast.proto.core.FeatureSetProto.*; -import feast.proto.serving.ServingAPIProto.FeatureReference; -import java.util.*; -import java.util.stream.Collectors; -import javax.persistence.*; -import lombok.Getter; -import lombok.Setter; -import org.apache.commons.lang3.builder.HashCodeBuilder; -import org.tensorflow.metadata.v0.*; - -@Getter -@Setter -@javax.persistence.Entity -@Table( - name = "feature_sets", - uniqueConstraints = @UniqueConstraint(columnNames = {"name", "project_name"})) -public class FeatureSet extends AbstractTimestampEntity { - - @Id @GeneratedValue private long id; - - // Name of the featureSet - @Column(name = "name", nullable = false) - private String name; - - // Project that this featureSet belongs to - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "project_name") - private Project project; - - // Max allowed staleness for features in this featureSet. - @Column(name = "max_age") - private long maxAgeSeconds; - - // Entity fields inside this feature set - @OneToMany( - mappedBy = "featureSet", - cascade = CascadeType.ALL, - fetch = FetchType.EAGER, - orphanRemoval = true) - private Set entities; - - // Feature fields inside this feature set - @OneToMany( - mappedBy = "featureSet", - cascade = CascadeType.ALL, - fetch = FetchType.EAGER, - orphanRemoval = true) - private Set features; - - // Source on which feature rows can be found - @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER) - @JoinColumn(name = "source_id", referencedColumnName = "pk") - private Source source; - - @Deprecated - @Column(name = "source") - private String deprecatedSource; - - // Status of the feature set - @Enumerated(EnumType.STRING) - @Column(name = "status") - private FeatureSetStatus status; - - // User defined metadata - @Column(name = "labels", columnDefinition = "text") - private String labels; - - @Column(name = "version", columnDefinition = "integer default 0") - private int version; - - public FeatureSet() { - super(); - } - - public FeatureSet( - String name, - String project, - long maxAgeSeconds, - List entities, - List features, - Source source, - Map labels, - FeatureSetStatus status) { - this.maxAgeSeconds = maxAgeSeconds; - this.source = source; - this.status = status; - this.entities = new HashSet<>(); - this.features = new HashSet<>(); - this.name = name; - this.project = new Project(project); - this.labels = TypeConversion.convertMapToJsonString(labels); - addEntities(entities); - addFeatures(features); - } - - public void setName(String name) { - this.name = name; - } - - private String getProjectName() { - if (getProject() != null) { - return getProject().getName(); - } else { - return ""; - } - } - - /** - * Return a boolean to facilitate streaming elements on the basis of given predicate. - * - * @param entitiesFilter contain entities that should be attached to the FeatureSet - * @return boolean True if FeatureSet contains all entities in the entitiesFilter - */ - public boolean hasAllEntities(List entitiesFilter) { - List allEntitiesName = - this.getEntities().stream().map(entity -> entity.getName()).collect(Collectors.toList()); - return allEntitiesName.equals(entitiesFilter); - } - - /** - * Returns a map of Feature references and Features if FeatureSet's Feature contains all labels in - * the labelsFilter - * - * @param labelsFilter contain labels that should be attached to FeatureSet's features - * @return Map of Feature references and Features - */ - public Map getFeaturesByRef(Map labelsFilter) { - Map validFeaturesMap = new HashMap<>(); - List validFeatures; - if (labelsFilter.size() > 0) { - validFeatures = filterFeaturesByAllLabels(this.getFeatures(), labelsFilter); - for (Feature feature : validFeatures) { - FeatureReference featureRef = - FeatureReference.newBuilder() - .setProject(this.getProjectName()) - .setFeatureSet(this.getName()) - .setName(feature.getName()) - .build(); - validFeaturesMap.put(renderFeatureRef(featureRef), feature); - } - return validFeaturesMap; - } - for (Feature feature : this.getFeatures()) { - FeatureReference featureRef = - FeatureReference.newBuilder() - .setProject(this.getProjectName()) - .setFeatureSet(this.getName()) - .setName(feature.getName()) - .build(); - validFeaturesMap.put(renderFeatureRef(featureRef), feature); - } - return validFeaturesMap; - } - - /** - * Returns a list of Features if FeatureSet's Feature contains all labels in labelsFilter - * - * @param labelsFilter contain labels that should be attached to FeatureSet's features - * @return List of Features - */ - public static List filterFeaturesByAllLabels( - Set features, Map labelsFilter) { - List validFeatures = - features.stream() - .filter(feature -> feature.hasAllLabels(labelsFilter)) - .collect(Collectors.toList()); - - return validFeatures; - } - - /** - * Render a feature reference as string. - * - * @param featureReference to render as string - * @return string representation of feature reference. - */ - public static String renderFeatureRef(FeatureReference featureReference) { - String refStr = - featureReference.getProject() - + "/" - + featureReference.getFeatureSet() - + ":" - + featureReference.getName(); - - return refStr; - } - - /** - * Return a boolean to facilitate streaming elements on the basis of given predicate. - * - * @param labelsFilter labels contain key-value mapping for labels attached to the FeatureSet - * @return boolean True if FeatureSet contains all labels in the labelsFilter - */ - public boolean hasAllLabels(Map labelsFilter) { - Map featureSetLabelsMap = this.getLabelsMap(); - for (String key : labelsFilter.keySet()) { - if (!featureSetLabelsMap.containsKey(key) - || !featureSetLabelsMap.get(key).equals(labelsFilter.get(key))) { - return false; - } - } - return true; - } - - public void setProject(Project project) { - this.project = project; - } - - public int incVersion() { - return ++version; - } - - public static FeatureSet fromProto(FeatureSetProto.FeatureSet featureSetProto) { - FeatureSetSpec featureSetSpec = featureSetProto.getSpec(); - Source source = Source.fromProto(featureSetSpec.getSource()); - - List featureSpecs = new ArrayList<>(); - for (FeatureSpec featureSpec : featureSetSpec.getFeaturesList()) { - featureSpecs.add(Feature.fromProto(featureSpec)); - } - - List entitySpecs = new ArrayList<>(); - for (EntitySpec entitySpec : featureSetSpec.getEntitiesList()) { - entitySpecs.add(Entity.fromProto(entitySpec)); - } - - return new FeatureSet( - featureSetProto.getSpec().getName(), - featureSetProto.getSpec().getProject(), - featureSetSpec.getMaxAge().getSeconds(), - entitySpecs, - featureSpecs, - source, - featureSetProto.getSpec().getLabelsMap(), - featureSetProto.getMeta().getStatus()); - } - - // Updates the existing feature set from a proto. - public void updateFromProto(FeatureSetProto.FeatureSet featureSetProto) - throws InvalidProtocolBufferException { - FeatureSetSpec spec = featureSetProto.getSpec(); - if (this.toProto().getSpec().equals(spec)) { - return; - } - - // 1. validate - // 1a. check no change to identifiers - if (!name.equals(spec.getName())) { - throw new IllegalArgumentException( - String.format("Given feature set name %s does not match name %s.", spec.getName(), name)); - } - if (!project.getName().equals(spec.getProject())) { - throw new IllegalArgumentException( - String.format( - "You are attempting to change the project of feature set %s from %s to %s. This isn't allowed. Please create a new feature set under the desired project.", - spec.getName(), project, spec.getProject())); - } - - Set existingEntities = - entities.stream().map(Entity::toProto).collect(Collectors.toSet()); - - // 1b. check no change to entities - if (!Sets.newHashSet(spec.getEntitiesList()).equals(existingEntities)) { - throw new IllegalArgumentException( - String.format( - "You are attempting to change the entities of this feature set: Given set of entities \n{%s}\n does not match existing set of entities\n {%s}. This isn't allowed. Please create a new feature set. ", - spec.getEntitiesList(), existingEntities)); - } - - // 2. Update max age, source and labels. - this.maxAgeSeconds = spec.getMaxAge().getSeconds(); - this.source = Source.fromProto(spec.getSource()); - this.setLabels(TypeConversion.convertMapToJsonString(spec.getLabelsMap())); - - Map updatedFeatures = - spec.getFeaturesList().stream().collect(Collectors.toMap(FeatureSpec::getName, fs -> fs)); - - // 3. Tombstone features that are gone, update features that have changed - for (Feature existingFeature : features) { - String existingFeatureName = existingFeature.getName(); - FeatureSpec updatedFeatureSpec = updatedFeatures.get(existingFeatureName); - if (updatedFeatureSpec == null) { - existingFeature.archive(); - } else { - existingFeature.updateFromProto(updatedFeatureSpec); - updatedFeatures.remove(existingFeatureName); - } - } - - // 4. Add new features - for (FeatureSpec featureSpec : updatedFeatures.values()) { - Feature newFeature = Feature.fromProto(featureSpec); - addFeature(newFeature); - } - } - - public void addEntities(List entities) { - for (Entity entity : entities) { - addEntity(entity); - } - } - - public void addEntity(Entity entity) { - entity.setFeatureSet(this); - entities.add(entity); - } - - public void addFeatures(List features) { - for (Feature feature : features) { - addFeature(feature); - } - } - - public void addFeature(Feature feature) { - feature.setFeatureSet(this); - features.add(feature); - } - - public FeatureSetProto.FeatureSet toProto() throws InvalidProtocolBufferException { - List entitySpecs = new ArrayList<>(); - for (Entity entityField : entities) { - entitySpecs.add(entityField.toProto()); - } - - List featureSpecs = new ArrayList<>(); - for (Feature featureField : features) { - if (!featureField.isArchived()) { - featureSpecs.add(featureField.toProto()); - } - } - - FeatureSetMeta.Builder meta = - FeatureSetMeta.newBuilder() - .setCreatedTimestamp( - Timestamp.newBuilder().setSeconds(super.getCreated().getTime() / 1000L)) - .setStatus(status); - - FeatureSetSpec.Builder spec = - FeatureSetSpec.newBuilder() - .setName(getName()) - .setProject(project.getName()) - .setMaxAge(Duration.newBuilder().setSeconds(maxAgeSeconds)) - .addAllEntities(entitySpecs) - .addAllFeatures(featureSpecs) - .putAllLabels(TypeConversion.convertJsonStringToMap(labels)) - .setSource(source.toProto()) - .setVersion(version); - - return FeatureSetProto.FeatureSet.newBuilder().setMeta(meta).setSpec(spec).build(); - } - - public Map getLabelsMap() { - return TypeConversion.convertJsonStringToMap(this.getLabels()); - } - - @Override - public int hashCode() { - HashCodeBuilder hcb = new HashCodeBuilder(); - hcb.append(project.getName()); - hcb.append(getName()); - return hcb.toHashCode(); - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (!(obj instanceof FeatureSet)) { - return false; - } - - FeatureSet other = (FeatureSet) obj; - if (!getName().equals(other.getName())) { - return false; - } - - if (!getLabels().equals(other.getLabels())) { - return false; - } - - if (!project.getName().equals(other.project.getName())) { - return false; - } - - if (!source.equalTo(other.getSource())) { - return false; - } - - if (maxAgeSeconds != other.maxAgeSeconds) { - return false; - } - - if (version != other.version) { - return false; - } - - // Create a map of all fields in this feature set - Map entitiesMap = new HashMap<>(); - Map featuresMap = new HashMap<>(); - - for (Entity e : entities) { - entitiesMap.putIfAbsent(e.getName(), e); - } - - for (Feature f : features) { - featuresMap.putIfAbsent(f.getName(), f); - } - - // Ensure map size is consistent with existing fields - if (entitiesMap.size() != other.getEntities().size()) { - return false; - } - if (featuresMap.size() != other.getFeatures().size()) { - return false; - } - - // Ensure the other entities and features exist in the field map - for (Entity e : other.getEntities()) { - if (!entitiesMap.containsKey(e.getName())) { - return false; - } - if (!e.equals(entitiesMap.get(e.getName()))) { - return false; - } - } - - for (Feature f : other.getFeatures()) { - if (!featuresMap.containsKey(f.getName())) { - return false; - } - if (!f.equals(featuresMap.get(f.getName()))) { - return false; - } - } - - return true; - } -} diff --git a/core/src/main/java/feast/core/model/Project.java b/core/src/main/java/feast/core/model/Project.java index e516f5868c..2d60d5e0e0 100644 --- a/core/src/main/java/feast/core/model/Project.java +++ b/core/src/main/java/feast/core/model/Project.java @@ -45,13 +45,6 @@ public class Project { @Column(name = "archived", nullable = false) private boolean archived; - @OneToMany( - cascade = CascadeType.ALL, - fetch = FetchType.EAGER, - orphanRemoval = true, - mappedBy = "project") - private Set featureSets; - @OneToMany( cascade = CascadeType.ALL, fetch = FetchType.EAGER, @@ -72,16 +65,10 @@ public Project() { public Project(String name) { this.name = name; - this.featureSets = new HashSet<>(); this.entities = new HashSet<>(); this.featureTables = new HashSet<>(); } - public void addFeatureSet(FeatureSet featureSet) { - featureSet.setProject(this); - featureSets.add(featureSet); - } - public void addEntity(EntityV2 entity) { entity.setProject(this); entities.add(entity); diff --git a/core/src/main/java/feast/core/model/Source.java b/core/src/main/java/feast/core/model/Source.java deleted file mode 100644 index 9ccbf5d490..0000000000 --- a/core/src/main/java/feast/core/model/Source.java +++ /dev/null @@ -1,208 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * Copyright 2018-2019 The Feast Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package feast.core.model; - -import com.google.protobuf.TextFormat; -import feast.proto.core.SourceProto; -import feast.proto.core.SourceProto.KafkaSourceConfig; -import feast.proto.core.SourceProto.Source.Builder; -import feast.proto.core.SourceProto.SourceType; -import io.grpc.Status; -import java.util.Objects; -import javax.persistence.*; -import javax.persistence.Entity; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.Setter; - -@Entity -@Getter -@Setter -@AllArgsConstructor -@Table(name = "sources") -public class Source { - - /** Source Id. Internal use only, do not use to identify the source. */ - @Id - @GeneratedValue - @Column(name = "pk") - private Integer id; - - @Deprecated - @Column(name = "id") - private String deprecatedId; - - @Deprecated - @Column(name = "bootstrap_servers") - private String bootstrapServers; - - @Deprecated - @Column(name = "topics") - private String topics; - - /** Type of the source */ - @Enumerated(EnumType.STRING) - @Column(name = "type", nullable = false) - private SourceType type; - - /** Configuration object specific to each source type */ - @Column(name = "config") - private String config; - - @Column(name = "is_default") - private boolean isDefault; - - public Source() { - super(); - } - - public String getConfig() { - if ((config == null || config.isEmpty()) && bootstrapServers != null && topics != null) { - config = - KafkaSourceConfig.newBuilder() - .setBootstrapServers(bootstrapServers) - .setTopic(topics) - .build() - .toString(); - } - - return config; - } - - /** - * Construct a source facade object from a given proto object. - * - * @param sourceSpec SourceProto.Source object - * @param isDefault Whether to return the default source object if the source was not defined by - * the user - * @return Source facade object - */ - public static Source fromProto(SourceProto.Source sourceSpec, boolean isDefault) { - - if (sourceSpec.equals(SourceProto.Source.getDefaultInstance())) { - Source source = new Source(); - source.setDefault(true); - return source; - } - - Source source = new Source(); - source.setType(sourceSpec.getType()); - - switch (sourceSpec.getType()) { - case KAFKA: - if (sourceSpec.getKafkaSourceConfig().getBootstrapServers().isEmpty() - || sourceSpec.getKafkaSourceConfig().getTopic().isEmpty()) { - throw Status.INVALID_ARGUMENT - .withDescription( - "Unsupported source options. Kafka source requires bootstrap servers and topic to be specified.") - .asRuntimeException(); - } - source.setConfig(sourceSpec.getKafkaSourceConfig().toString()); - break; - case UNRECOGNIZED: - default: - throw Status.INVALID_ARGUMENT - .withDescription("Unsupported source type. Only [KAFKA] is supported.") - .asRuntimeException(); - } - - source.setDefault(isDefault); - return source; - } - - /** - * Construct a source facade object from a given proto object. - * - * @param sourceSpec SourceProto.Source object - * @return Source facade object - */ - public static Source fromProto(SourceProto.Source sourceSpec) { - return fromProto(sourceSpec, false); - } - - /** - * Convert this object to its equivalent proto object. - * - * @return SourceProto.Source - */ - public SourceProto.Source toProto() { - Builder builder = SourceProto.Source.newBuilder().setType(this.getType()); - - switch (this.getType()) { - case KAFKA: - KafkaSourceConfig.Builder kafkaSourceConfig = KafkaSourceConfig.newBuilder(); - try { - com.google.protobuf.TextFormat.getParser().merge(this.getConfig(), kafkaSourceConfig); - } catch (TextFormat.ParseException e) { - throw new RuntimeException( - String.format( - "Unable to deserialize source configuration from String to KafkaSourceConfig: %s", - this.getConfig()), - e); - } - return builder.setKafkaSourceConfig(kafkaSourceConfig).build(); - case INVALID: - case UNRECOGNIZED: - default: - throw new RuntimeException( - String.format( - "Unable to build Source from configuration and type: %s %s", - this.getConfig(), this.getType())); - } - } - - /** - * Override equality for sources. Sources are compared based on their type and type-specific - * options. - * - * @param other other Source - * @return boolean equal - */ - public boolean equalTo(Source other) { - if ((this.getType() == null || !this.getType().equals(other.getType()))) { - return false; - } - - return this.getConfig().equals(other.getConfig()); - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - Source source = (Source) o; - return this.equalTo(source); - } - - @Override - public int hashCode() { - return Objects.hash(getType(), getConfig()); - } - - /** - * Returns the type of this Source in String format - * - * @return Source type in String format - */ - public String getTypeString() { - return this.getType().getValueDescriptor().getName(); - } -} diff --git a/core/src/main/java/feast/core/service/SpecService.java b/core/src/main/java/feast/core/service/SpecService.java index c9ce7d1b72..4a35d3ef3a 100644 --- a/core/src/main/java/feast/core/service/SpecService.java +++ b/core/src/main/java/feast/core/service/SpecService.java @@ -16,38 +16,28 @@ */ package feast.core.service; -import static feast.common.models.Store.isSubscribedToFeatureSet; import static feast.core.validators.Matchers.checkValidCharacters; import static feast.core.validators.Matchers.checkValidCharactersAllowAsterisk; import com.google.protobuf.InvalidProtocolBufferException; import feast.core.dao.EntityRepository; -import feast.core.dao.FeatureSetRepository; import feast.core.dao.FeatureTableRepository; import feast.core.dao.ProjectRepository; import feast.core.dao.StoreRepository; -import feast.core.exception.RegistrationException; import feast.core.exception.RetrievalException; import feast.core.model.*; import feast.core.validators.EntityValidator; -import feast.core.validators.FeatureSetValidator; import feast.core.validators.FeatureTableValidator; import feast.proto.core.CoreServiceProto.ApplyEntityResponse; -import feast.proto.core.CoreServiceProto.ApplyFeatureSetResponse; -import feast.proto.core.CoreServiceProto.ApplyFeatureSetResponse.Status; import feast.proto.core.CoreServiceProto.ApplyFeatureTableRequest; import feast.proto.core.CoreServiceProto.ApplyFeatureTableResponse; import feast.proto.core.CoreServiceProto.DeleteFeatureTableRequest; import feast.proto.core.CoreServiceProto.GetEntityRequest; import feast.proto.core.CoreServiceProto.GetEntityResponse; -import feast.proto.core.CoreServiceProto.GetFeatureSetRequest; -import feast.proto.core.CoreServiceProto.GetFeatureSetResponse; import feast.proto.core.CoreServiceProto.GetFeatureTableRequest; import feast.proto.core.CoreServiceProto.GetFeatureTableResponse; import feast.proto.core.CoreServiceProto.ListEntitiesRequest; import feast.proto.core.CoreServiceProto.ListEntitiesResponse; -import feast.proto.core.CoreServiceProto.ListFeatureSetsRequest; -import feast.proto.core.CoreServiceProto.ListFeatureSetsResponse; import feast.proto.core.CoreServiceProto.ListFeatureTablesRequest; import feast.proto.core.CoreServiceProto.ListFeatureTablesResponse; import feast.proto.core.CoreServiceProto.ListFeaturesRequest; @@ -55,18 +45,12 @@ import feast.proto.core.CoreServiceProto.ListStoresRequest; import feast.proto.core.CoreServiceProto.ListStoresResponse; import feast.proto.core.CoreServiceProto.ListStoresResponse.Builder; -import feast.proto.core.CoreServiceProto.UpdateFeatureSetStatusRequest; -import feast.proto.core.CoreServiceProto.UpdateFeatureSetStatusResponse; import feast.proto.core.CoreServiceProto.UpdateStoreRequest; import feast.proto.core.CoreServiceProto.UpdateStoreResponse; import feast.proto.core.EntityProto; -import feast.proto.core.FeatureSetProto; -import feast.proto.core.FeatureSetProto.FeatureSetStatus; import feast.proto.core.FeatureTableProto.FeatureTableSpec; -import feast.proto.core.SourceProto; import feast.proto.core.StoreProto; import feast.proto.core.StoreProto.Store.Subscription; -import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.NoSuchElementException; @@ -86,26 +70,20 @@ public class SpecService { private final EntityRepository entityRepository; - private final FeatureSetRepository featureSetRepository; private final FeatureTableRepository tableRepository; private final ProjectRepository projectRepository; private final StoreRepository storeRepository; - private final Source defaultSource; @Autowired public SpecService( EntityRepository entityRepository, - FeatureSetRepository featureSetRepository, FeatureTableRepository tableRepository, StoreRepository storeRepository, - ProjectRepository projectRepository, - Source defaultSource) { + ProjectRepository projectRepository) { this.entityRepository = entityRepository; - this.featureSetRepository = featureSetRepository; this.tableRepository = tableRepository; this.storeRepository = storeRepository; this.projectRepository = projectRepository; - this.defaultSource = defaultSource; } /** @@ -143,142 +121,6 @@ public GetEntityResponse getEntity(GetEntityRequest request) { return response; } - /** - * Get a feature set matching the feature name and version and project. The feature set name and - * project are required, but version can be omitted by providing 0 for its value. If the version - * is omitted, the latest feature set will be provided. If the project is omitted, the default - * would be used. - * - * @param request: GetFeatureSetRequest Request containing filter parameters. - * @return Returns a GetFeatureSetResponse containing a feature set.. - */ - public GetFeatureSetResponse getFeatureSet(GetFeatureSetRequest request) - throws InvalidProtocolBufferException { - FeatureSet featureSet = getFeatureSet(request.getProject(), request.getName()); - - return GetFeatureSetResponse.newBuilder().setFeatureSet(featureSet.toProto()).build(); - } - - private FeatureSet getFeatureSet(String projectName, String featureSetName) { - // Validate input arguments - checkValidCharacters(featureSetName, "featureset"); - - if (featureSetName.isEmpty()) { - throw new IllegalArgumentException("No feature set name provided"); - } - // Autofill default project if project is not specified - if (projectName.isEmpty()) { - projectName = Project.DEFAULT_NAME; - } - - FeatureSet featureSet; - - featureSet = - featureSetRepository.findFeatureSetByNameAndProject_Name(featureSetName, projectName); - - if (featureSet == null) { - throw new RetrievalException( - String.format("Feature set with name \"%s\" could not be found.", featureSetName)); - } - return featureSet; - } - - /** - * Return a list of feature sets matching the feature set name, project and labels provided in the - * filter. All fields are required. Use '*' in feature set name and project, and empty map in - * labels in order to return all feature sets in all projects. - * - *

Project name can be explicitly provided, or an asterisk can be provided to match all - * projects. It is not possible to provide a combination of asterisks/wildcards and text. If the - * project name is omitted, the default project would be used. - * - *

The feature set name in the filter accepts an asterisk as a wildcard. All matching feature - * sets will be returned. Regex is not supported. Explicitly defining a feature set name is not - * possible if a project name is not set explicitly - * - *

The labels in the filter accepts a map. All feature sets which contain every provided label - * will be returned. - * - * @param filter filter containing the desired featureSet name - * @return ListFeatureSetsResponse with list of featureSets found matching the filter - */ - public ListFeatureSetsResponse listFeatureSets(ListFeatureSetsRequest.Filter filter) - throws InvalidProtocolBufferException { - String name = filter.getFeatureSetName(); - String project = filter.getProject(); - Map labelsFilter = filter.getLabelsMap(); - FeatureSetStatus statusFilter = filter.getStatus(); - - if (name.isEmpty()) { - throw new IllegalArgumentException( - "Invalid listFeatureSetRequest, missing arguments. Must provide feature set name:"); - } - - checkValidCharactersAllowAsterisk(name, "featureset"); - checkValidCharactersAllowAsterisk(project, "project"); - - // Autofill default project if project not specified - if (project.isEmpty()) { - project = Project.DEFAULT_NAME; - } - - List featureSets = new ArrayList() {}; - - if (project.contains("*")) { - // Matching a wildcard project - if (name.contains("*")) { - featureSets = - featureSetRepository.findAllByNameLikeAndProject_NameLikeOrderByNameAsc( - name.replace('*', '%'), project.replace('*', '%')); - } else { - throw new IllegalArgumentException( - String.format( - "Invalid listFeatureSetRequest. Feature set name must be set to " - + "\"*\" if the project name and feature set name aren't set explicitly: \n%s", - filter.toString())); - } - } else if (!project.contains("*")) { - // Matching a specific project - if (name.contains("*")) { - // Find all feature sets matching a pattern in a specific project - featureSets = - featureSetRepository.findAllByNameLikeAndProject_NameOrderByNameAsc( - name.replace('*', '%'), project); - - } else if (!name.contains("*")) { - // Find a specific feature set in a specific project - FeatureSet featureSet = - featureSetRepository.findFeatureSetByNameAndProject_Name(name, project); - if (featureSet != null) { - featureSets.add(featureSet); - } - } - } else { - throw new IllegalArgumentException( - String.format( - "Invalid listFeatureSetRequest. Project name cannot be a pattern. It may only be" - + "a specific project name or an asterisk: \n%s", - filter.toString())); - } - - ListFeatureSetsResponse.Builder response = ListFeatureSetsResponse.newBuilder(); - if (featureSets.size() > 0) { - featureSets = - featureSets.stream() - .filter( - featureSet -> - statusFilter.equals(FeatureSetStatus.STATUS_INVALID) - || featureSet.getStatus().equals(statusFilter)) - .filter(featureSet -> featureSet.hasAllLabels(labelsFilter)) - .collect(Collectors.toList()); - for (FeatureSet featureSet : featureSets) { - response.addFeatureSets(featureSet.toProto()); - } - } - - return response.build(); - } - /** * Return a map of feature references and features matching the project, labels and entities * provided in the filter. All fields are required. @@ -376,18 +218,6 @@ public ListEntitiesResponse listEntities(ListEntitiesRequest.Filter filter) { return response.build(); } - /** Update FeatureSet's status by given FeatureSetReference and new status */ - public UpdateFeatureSetStatusResponse updateFeatureSetStatus( - UpdateFeatureSetStatusRequest request) { - FeatureSet featureSet = - getFeatureSet(request.getReference().getProject(), request.getReference().getName()); - - featureSet.setStatus(request.getStatus()); - featureSetRepository.saveAndFlush(featureSet); - - return UpdateFeatureSetStatusResponse.newBuilder().build(); - } - /** * Get stores matching the store name provided in the filter. If the store name is not provided, * the method will return all stores currently registered to Feast. @@ -478,109 +308,6 @@ public ApplyEntityResponse applyEntity( return response; } - /** - * Creates or updates a feature set in the repository. - * - *

This function is idempotent. If no changes are detected in the incoming featureSet's schema, - * this method will update the incoming featureSet spec with the latest version stored in the - * repository, and return that. If project is not specified in the given featureSet, will assign - * the featureSet to the'default' project. - * - * @param newFeatureSet Feature set that will be created or updated. - */ - @Transactional - public ApplyFeatureSetResponse applyFeatureSet(FeatureSetProto.FeatureSet newFeatureSet) - throws InvalidProtocolBufferException { - // Autofill default project if not specified - if (newFeatureSet.getSpec().getProject().isEmpty()) { - newFeatureSet = - newFeatureSet - .toBuilder() - .setSpec(newFeatureSet.getSpec().toBuilder().setProject(Project.DEFAULT_NAME).build()) - .build(); - } - - String projectName = newFeatureSet.getSpec().getProject(); - String featureSetName = newFeatureSet.getSpec().getName(); - List isSubscribedToStores = new ArrayList<>() {}; - for (Store store : storeRepository.findAll()) { - List subscriptionList = store.getSubscriptions(); - boolean isSubscribed = - isSubscribedToFeatureSet(subscriptionList, projectName, featureSetName); - isSubscribedToStores.add(isSubscribed); - } - // Only throw error if FeatureSet is not subscribed by ALL stores - if (!isSubscribedToStores.isEmpty() - && isSubscribedToStores.stream().allMatch(x -> x == false)) { - throw new RegistrationException( - String.format( - "The supplied Project and FeatureSet, %s/%s is either not subscribed or blacklisted and is not available for registration. " - + "Please ask your administrator to update subscription in store configuration on serving layer.", - projectName, featureSetName)); - } - - // Validate incoming feature set - FeatureSetValidator.validateSpec(newFeatureSet); - - // Find project or create new one if it does not exist - String project_name = newFeatureSet.getSpec().getProject(); - Project project = - projectRepository - .findById(newFeatureSet.getSpec().getProject()) - .orElse(new Project(project_name)); - - // Ensure that the project retrieved from repository is not archived - if (project.isArchived()) { - throw new IllegalArgumentException(String.format("Project is archived: %s", project_name)); - } - - // Set source to default if not set in proto - if (newFeatureSet.getSpec().getSource() == SourceProto.Source.getDefaultInstance()) { - newFeatureSet = - newFeatureSet - .toBuilder() - .setSpec( - newFeatureSet.getSpec().toBuilder().setSource(defaultSource.toProto()).build()) - .build(); - } - - // Retrieve existing FeatureSet - FeatureSet featureSet = - featureSetRepository.findFeatureSetByNameAndProject_Name( - newFeatureSet.getSpec().getName(), project_name); - - Status status; - if (featureSet == null) { - // Create new feature set since it doesn't exist - newFeatureSet = newFeatureSet.toBuilder().setSpec(newFeatureSet.getSpec()).build(); - featureSet = FeatureSet.fromProto(newFeatureSet); - status = Status.CREATED; - } else { - // If the featureSet remains unchanged, we do nothing. - if (featureSet.toProto().getSpec().equals(newFeatureSet.getSpec())) { - return ApplyFeatureSetResponse.newBuilder() - .setFeatureSet(featureSet.toProto()) - .setStatus(Status.NO_CHANGE) - .build(); - } - featureSet.updateFromProto(newFeatureSet); - status = Status.UPDATED; - } - - featureSet.incVersion(); - - // Persist the FeatureSet object - featureSet.setStatus(FeatureSetStatus.STATUS_PENDING); - project.addFeatureSet(featureSet); - projectRepository.saveAndFlush(project); - - // Build ApplyFeatureSetResponse - return ApplyFeatureSetResponse.newBuilder() - .setFeatureSet(featureSet.toProto()) - .setStatus(status) - .build(); - } - /** * Resolves the project name by returning name if given, autofilling default project otherwise. * diff --git a/core/src/main/java/feast/core/validators/FeatureSetValidator.java b/core/src/main/java/feast/core/validators/FeatureSetValidator.java deleted file mode 100644 index 8787d75f69..0000000000 --- a/core/src/main/java/feast/core/validators/FeatureSetValidator.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * Copyright 2018-2019 The Feast Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package feast.core.validators; - -import static feast.core.validators.Matchers.checkValidCharacters; - -import com.google.common.collect.Sets; -import feast.proto.core.FeatureSetProto.EntitySpec; -import feast.proto.core.FeatureSetProto.FeatureSet; -import feast.proto.core.FeatureSetProto.FeatureSpec; -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.stream.Collectors; -import org.apache.commons.lang3.StringUtils; - -public class FeatureSetValidator { - - private static List reservedNames = - Arrays.asList("created_timestamp", "event_timestamp", "ingestion_id", "job_id"); - - public static void validateSpec(FeatureSet featureSet) { - if (featureSet.getSpec().getProject().isEmpty()) { - throw new IllegalArgumentException("Project name must be provided"); - } - if (featureSet.getSpec().getName().isEmpty()) { - throw new IllegalArgumentException("Feature set name must be provided"); - } - if (featureSet.getSpec().getLabelsMap().containsKey("")) { - throw new IllegalArgumentException("Feature set label keys must not be empty"); - } - - checkValidCharacters(featureSet.getSpec().getProject(), "project"); - checkValidCharacters(featureSet.getSpec().getName(), "featureset"); - checkUniqueColumns( - featureSet.getSpec().getEntitiesList(), featureSet.getSpec().getFeaturesList()); - checkReservedColumns(featureSet.getSpec().getFeaturesList()); - for (EntitySpec entitySpec : featureSet.getSpec().getEntitiesList()) { - checkValidCharacters(entitySpec.getName(), "entity"); - } - for (FeatureSpec featureSpec : featureSet.getSpec().getFeaturesList()) { - checkValidCharacters(featureSpec.getName(), "feature"); - if (featureSpec.getLabelsMap().containsKey("")) { - throw new IllegalArgumentException("Feature label keys must not be empty"); - } - } - } - - private static void checkUniqueColumns( - List entitySpecs, List featureSpecs) { - List names = entitySpecs.stream().map(EntitySpec::getName).collect(Collectors.toList()); - featureSpecs.stream().map(f -> names.add(f.getName())); - HashSet nameSet = Sets.newHashSet(names); - if (nameSet.size() != names.size()) { - throw new IllegalArgumentException( - String.format("fields within a featureset must be unique.")); - } - } - - private static void checkReservedColumns(List featureSpecs) { - String reservedNamesString = StringUtils.join(reservedNames, ", "); - for (FeatureSpec featureSpec : featureSpecs) { - if (reservedNames.contains(featureSpec.getName())) { - throw new IllegalArgumentException( - String.format( - "Reserved feature names have been used, which are not allowed. These names include %s." - + "You've just used an invalid name, %s.", - reservedNamesString, featureSpec.getName())); - } - } - } -} diff --git a/core/src/test/java/feast/core/controller/CoreServiceRestIT.java b/core/src/test/java/feast/core/controller/CoreServiceRestIT.java index dbad956e5b..f26ce8a343 100644 --- a/core/src/test/java/feast/core/controller/CoreServiceRestIT.java +++ b/core/src/test/java/feast/core/controller/CoreServiceRestIT.java @@ -68,7 +68,7 @@ public static void globalSetUp(@Value("${grpc.server.port}") int port) { @Test public void getVersion() { - String uriString = UriComponentsBuilder.fromPath("/api/v1/version").toUriString(); + String uriString = UriComponentsBuilder.fromPath("/api/v2/version").toUriString(); get(uriString) .then() .log() @@ -82,7 +82,7 @@ public void getVersion() { @Test public void listProjects() { // should get 2 projects - String uriString = UriComponentsBuilder.fromPath("/api/v1/projects").toUriString(); + String uriString = UriComponentsBuilder.fromPath("/api/v2/projects").toUriString(); String responseBody = get(uriString) .then() diff --git a/core/src/test/java/feast/core/service/SpecServiceIT.java b/core/src/test/java/feast/core/service/SpecServiceIT.java index cee48f1dd0..1e52dc7b47 100644 --- a/core/src/test/java/feast/core/service/SpecServiceIT.java +++ b/core/src/test/java/feast/core/service/SpecServiceIT.java @@ -63,7 +63,6 @@ public static void globalSetUp(@Value("${grpc.server.port}") int port) { @BeforeEach public void initState() { - SourceProto.Source source = DataGenerator.getDefaultSource(); EntityProto.EntitySpecV2 entitySpec1 = DataGenerator.createEntitySpecV2( diff --git a/go.mod b/go.mod index de70423b33..6e71e5b637 100644 --- a/go.mod +++ b/go.mod @@ -23,9 +23,8 @@ require ( github.com/woop/protoc-gen-doc v1.3.0 // indirect go.opencensus.io v0.22.3 // indirect golang.org/x/lint v0.0.0-20200302205851-738671d3881b // indirect - golang.org/x/net v0.0.0-20200822124328-c89045814202 - golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9 // indirect - golang.org/x/tools v0.0.0-20201017001424-6003fad69a88 // indirect + golang.org/x/net v0.0.0-20201021035429-f5854403a974 + golang.org/x/tools v0.0.0-20201124005743-911501bfb504 // indirect google.golang.org/grpc v1.29.1 google.golang.org/protobuf v1.25.0 // indirect gopkg.in/russross/blackfriday.v2 v2.0.0 // indirect diff --git a/go.sum b/go.sum index b9ec81936f..bd68e3f863 100644 --- a/go.sum +++ b/go.sum @@ -403,6 +403,7 @@ golang.org/x/net v0.0.0-20200320220750-118fecf932d8/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200513185701-a91f0712d120 h1:EZ3cVSzKOlJxAd8e8YAJ7no8nNypTxexh/YE/xW3ZEY= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -414,6 +415,7 @@ golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -436,6 +438,7 @@ golang.org/x/sys v0.0.0-20200321134203-328b4cd54aae/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9 h1:YTzHMGlqJu67/uEo1lBv0n3wBXhXNeUbB1XfN2vmTm0= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -443,6 +446,7 @@ golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3 golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/time v0.0.0-20161028155119-f51c12702a4d/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -500,6 +504,8 @@ golang.org/x/tools v0.0.0-20201015182029-a5d9e455e9c4 h1:rQWkJiVIyJ3PgiSHL+RXc8x golang.org/x/tools v0.0.0-20201015182029-a5d9e455e9c4/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/tools v0.0.0-20201017001424-6003fad69a88 h1:ZB1XYzdDo7c/O48jzjMkvIjnC120Z9/CwgDWhePjQdQ= golang.org/x/tools v0.0.0-20201017001424-6003fad69a88/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20201124005743-911501bfb504 h1:jOKV2ysikH1GANB7t2LotmhyvkkPvl7HQoEXkV6slJA= +golang.org/x/tools v0.0.0-20201124005743-911501bfb504/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= diff --git a/protos/feast/core/CoreService.proto b/protos/feast/core/CoreService.proto index 8eb13514b4..e9b7b4c43b 100644 --- a/protos/feast/core/CoreService.proto +++ b/protos/feast/core/CoreService.proto @@ -25,29 +25,16 @@ import "google/protobuf/timestamp.proto"; import "tensorflow_metadata/proto/v0/statistics.proto"; import "feast/core/Entity.proto"; import "feast/core/Feature.proto"; -import "feast/core/FeatureSet.proto"; import "feast/core/FeatureTable.proto"; import "feast/core/Store.proto"; -import "feast/core/FeatureSetReference.proto"; service CoreService { // Retrieve version information about this Feast deployment rpc GetFeastCoreVersion (GetFeastCoreVersionRequest) returns (GetFeastCoreVersionResponse); - // Returns a specific feature set - rpc GetFeatureSet (GetFeatureSetRequest) returns (GetFeatureSetResponse); - // Returns a specific entity rpc GetEntity (GetEntityRequest) returns (GetEntityResponse); - // Retrieve feature set details given a filter. - // - // Returns all feature sets matching that filter. If none are found, - // an empty list will be returned. - // If no filter is provided in the request, the response will contain all the feature - // sets currently stored in the registry. - rpc ListFeatureSets (ListFeatureSetsRequest) returns (ListFeatureSetsResponse); - // Returns all feature references and respective features matching that filter. If none are found // an empty map will be returned // If no filter is provided in the request, the response will contain all the features @@ -61,16 +48,6 @@ service CoreService { // stored in the registry. rpc ListStores (ListStoresRequest) returns (ListStoresResponse); - // Create or update and existing feature set. - // - // This function is idempotent - it will not create a new feature set if schema does not change. - // Schema changes will update the feature set if the changes are valid. - // All changes except the following are valid: - // - Changes to feature set id (name, project) - // - Changes to entities - // - Changes to feature name and type - rpc ApplyFeatureSet (ApplyFeatureSetRequest) returns (ApplyFeatureSetResponse); - // Create or update and existing entity. // // This function is idempotent - it will not create a new entity if schema does not change. @@ -93,8 +70,8 @@ service CoreService { rpc UpdateStore (UpdateStoreRequest) returns (UpdateStoreResponse); // Creates a project. Projects serve as namespaces within which resources like features will be - // created. Feature set names as must be unique within a project while field (Feature/Entity) names - // must be unique within a Feature Set. Project names themselves must be globally unique. + // created. Feature table names as must be unique within a project while field (Feature/Entity) names + // must be unique within a Feature Table. 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 @@ -106,9 +83,6 @@ service CoreService { // Lists all projects active projects. rpc ListProjects (ListProjectsRequest) returns (ListProjectsResponse); - // Internal API for Job Controller to update featureSet's status once responsible ingestion job is running - rpc UpdateFeatureSetStatus (UpdateFeatureSetStatusRequest) returns (UpdateFeatureSetStatusResponse); - /* Feature Tables */ // Create or update an existing feature table. // This function is idempotent - it will not create a new feature table if the schema does not change. @@ -134,57 +108,6 @@ service CoreService { } -// Request for a single feature set -message GetFeatureSetRequest { - // Name of project the feature set belongs to. If omitted will default to 'default' project. - string project = 3; - - // Name of feature set (required). - string name = 1; -} - -// Response containing a single feature set -message GetFeatureSetResponse { - feast.core.FeatureSet feature_set = 1; -} - -// Retrieves details for all versions of a specific feature set -message ListFeatureSetsRequest { - Filter filter = 1; - - message Filter { - // Name of project that the feature sets belongs to. This can be one of - // - [project_name] - // - * - // If an asterisk is provided, filtering on projects will be disabled. All projects will - // be matched. It is NOT possible to provide an asterisk with a string in order to do - // pattern matching. - // If unspecified this field will default to the default project 'default'. - string project = 3; - - // Name of the desired feature set. Asterisks can be used as wildcards in the name. - // Matching on names is only permitted if a specific project is defined. It is disallowed - // If the project name is set to "*" - // e.g. - // - * can be used to match all feature sets - // - my-feature-set* can be used to match all features prefixed by "my-feature-set" - // - my-feature-set-6 can be used to select a single feature set - string feature_set_name = 1; - - // User defined metadata for feature set. - // Feature sets with all matching labels will be returned. - map labels = 4; - - // Filter by FeatureSet's current status - // Project and Feature Set name still must be specified (could be "*") - FeatureSetStatus status = 5; - } -} - -message ListFeatureSetsResponse { - repeated feast.core.FeatureSet feature_sets = 1; -} - // Request for a single entity message GetEntityRequest { // Name of entity (required). @@ -226,10 +149,10 @@ message ListFeaturesRequest { map labels = 1; // List of entities contained within the featureSet that the feature belongs to. - // Only feature sets with these entities will be searched for features. + // Only feature tables with these entities will be searched for features. repeated string entities = 2; - // Name of project that the feature sets belongs to. Filtering on projects is disabled. + // Name of project that the feature tables belongs to. Filtering on projects is disabled. // It is NOT possible to provide an asterisk with a string in order to do pattern matching. // If unspecified this field will default to the default project 'default'. string project = 3; @@ -270,33 +193,6 @@ message ApplyEntityResponse { feast.core.Entity entity = 1; } -message ApplyFeatureSetRequest { - // Feature set version - // If project is unspecified, will default to 'default' project. - // If project specified does not exist, the project would be automatically created. - feast.core.FeatureSet feature_set = 1; -} - -message ApplyFeatureSetResponse { - // TODO: 0 should correspond to invalid rather than NO_CHANGE - enum Status { - // Latest feature set is consistent with provided feature set - NO_CHANGE = 0; - - // New feature set created - CREATED = 1; - - // Error occurred while trying to apply changes - ERROR = 2; - - // Changes detected and updated successfully - UPDATED = 3; - } - - feast.core.FeatureSet feature_set = 1; - Status status = 2; -} - message GetFeastCoreVersionRequest { } @@ -350,13 +246,6 @@ message ListProjectsResponse { repeated string projects = 1; } -message UpdateFeatureSetStatusRequest { - // FeatureSetReference of FeatureSet to update - FeatureSetReference reference = 1; - // Target status - FeatureSetStatus status = 2; -} - message UpdateFeatureSetStatusResponse {} message ApplyFeatureTableRequest { diff --git a/protos/feast/core/FeatureSet.proto b/protos/feast/core/FeatureSet.proto deleted file mode 100644 index de22388ce7..0000000000 --- a/protos/feast/core/FeatureSet.proto +++ /dev/null @@ -1,161 +0,0 @@ -// -// * Copyright 2019 The Feast Authors -// * -// * Licensed under the Apache License, Version 2.0 (the "License"); -// * you may not use this file except in compliance with the License. -// * You may obtain a copy of the License at -// * -// * https://www.apache.org/licenses/LICENSE-2.0 -// * -// * Unless required by applicable law or agreed to in writing, software -// * distributed under the License is distributed on an "AS IS" BASIS, -// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// * See the License for the specific language governing permissions and -// * limitations under the License. -// - -syntax = "proto3"; -package feast.core; -option java_package = "feast.proto.core"; -option java_outer_classname = "FeatureSetProto"; -option go_package = "github.com/feast-dev/feast/sdk/go/protos/feast/core"; - -import "feast/types/Value.proto"; -import "feast/core/Source.proto"; -import "google/protobuf/duration.proto"; -import "google/protobuf/timestamp.proto"; -import "tensorflow_metadata/proto/v0/schema.proto"; - -message FeatureSet { - // User-specified specifications of this feature set. - FeatureSetSpec spec = 1; - // System-populated metadata for this feature set. - FeatureSetMeta meta = 2; -} - -message FeatureSetSpec { - // Name of project that this feature set belongs to. - string project = 7; - - // Name of the feature set. Must be unique. - string name = 1; - - // Feature set version was removed in v0.5.0. - reserved 2; - - // List of entities contained within this featureSet. - // This allows the feature to be used during joins between feature sets. - // If the featureSet is ingested into a store that supports keys, this value - // will be made a key. - repeated EntitySpec entities = 3; - - // List of features contained within this featureSet. - repeated FeatureSpec features = 4; - - // Features in this feature set will only be retrieved if they are found - // after [time - max_age]. Missing or older feature values will be returned - // as nulls and indicated to end user - google.protobuf.Duration max_age = 5; - - // Optional. Source on which feature rows can be found. - // If not set, source will be set to the default value configured in Feast Core. - Source source = 6; - - // User defined metadata - map labels = 8; - - // Read-only self-incrementing version that increases monotonically - // when changes are made to a feature set - int32 version = 9; -} - -message EntitySpec { - // Name of the entity. - string name = 1; - - // Value type of the entity. - feast.types.ValueType.Enum value_type = 2; -} - -message FeatureSpec { - // Name of the feature. - string name = 1; - - // Value type of the feature. - feast.types.ValueType.Enum value_type = 2; - - // Reserve field numbers 15 and below for fields that will almost always be set - // https://developers.google.com/protocol-buffers/docs/proto3#assigning-field-numbers - reserved 3 to 15; - - // Labels for user defined metadata on a feature - map labels = 16; - - // Reserved for fundamental future additions less noisy in the schema that TFDV stats fields - reserved 17 to 29; - - // presence_constraints, shape_type and domain_info are referenced from: - // https://github.com/tensorflow/metadata/blob/36f65d1268cbc92cdbcf812ee03dcf47fb53b91e/tensorflow_metadata/proto/v0/schema.proto#L107 - - oneof presence_constraints { - // Constraints on the presence of this feature in the examples. - tensorflow.metadata.v0.FeaturePresence presence = 30; - // Only used in the context of a "group" context, e.g., inside a sequence. - tensorflow.metadata.v0.FeaturePresenceWithinGroup group_presence = 31; - } - - // The shape of the feature which governs the number of values that appear in - // each example. - oneof shape_type { - // The feature has a fixed shape corresponding to a multi-dimensional - // tensor. - tensorflow.metadata.v0.FixedShape shape = 32; - // The feature doesn't have a well defined shape. All we know are limits on - // the minimum and maximum number of values. - tensorflow.metadata.v0.ValueCount value_count = 33; - } - - // Domain for the values of the feature. - oneof domain_info { - // Reference to a domain defined at the schema level. - string domain = 34; - // Inline definitions of domains. - tensorflow.metadata.v0.IntDomain int_domain = 35; - tensorflow.metadata.v0.FloatDomain float_domain = 36; - tensorflow.metadata.v0.StringDomain string_domain = 37; - tensorflow.metadata.v0.BoolDomain bool_domain = 38; - tensorflow.metadata.v0.StructDomain struct_domain = 39; - // Supported semantic domains. - tensorflow.metadata.v0.NaturalLanguageDomain natural_language_domain = 40; - tensorflow.metadata.v0.ImageDomain image_domain = 41; - tensorflow.metadata.v0.MIDDomain mid_domain = 42; - tensorflow.metadata.v0.URLDomain url_domain = 43; - tensorflow.metadata.v0.TimeDomain time_domain = 44; - tensorflow.metadata.v0.TimeOfDayDomain time_of_day_domain = 45; - } -} - -message FeatureSetMeta { - // Created timestamp of this specific feature set. - google.protobuf.Timestamp created_timestamp = 1; - - // Status of the feature set. - // Used to indicate whether the feature set is ready for consumption or ingestion. - // Currently supports 2 states: - // 1) STATUS_PENDING - A feature set is in pending state if Feast has not spun up the jobs - // necessary to push rows for this feature set to stores subscribing to this feature set. - // 2) STATUS_READY - Feature set is ready for consumption or ingestion - FeatureSetStatus status = 2; -} - -enum FeatureSetStatus { - STATUS_INVALID = 0; - STATUS_PENDING = 1; - STATUS_JOB_STARTING = 3; - STATUS_READY = 2; -} - -enum FeatureSetJobDeliveryStatus { - STATUS_IN_PROGRESS = 0; - STATUS_DELIVERED = 1; -} \ No newline at end of file diff --git a/protos/feast/core/FeatureSetReference.proto b/protos/feast/core/FeatureSetReference.proto deleted file mode 100644 index 85762512ca..0000000000 --- a/protos/feast/core/FeatureSetReference.proto +++ /dev/null @@ -1,33 +0,0 @@ -// -// Copyright 2020 The Feast Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -syntax = "proto3"; - -package feast.core; - -option go_package = "github.com/feast-dev/feast/sdk/go/protos/feast/core"; -option java_outer_classname = "FeatureSetReferenceProto"; -option java_package = "feast.proto.core"; - -// Defines a composite key that refers to a unique FeatureSet -message FeatureSetReference { - // Name of the project - string project = 1; - // Name of the FeatureSet - string name = 2; - // Feature set version was removed in v0.5.0. - reserved 3; -} diff --git a/protos/feast/core/FeatureTable.proto b/protos/feast/core/FeatureTable.proto index 279072fccf..13780f0aec 100644 --- a/protos/feast/core/FeatureTable.proto +++ b/protos/feast/core/FeatureTable.proto @@ -37,7 +37,7 @@ message FeatureTable { } message FeatureTableSpec { - // Name of the feature set. Must be unique. Not updated. + // Name of the feature table. Must be unique. Not updated. string name = 1; // List names of entities to associate with the Features defined in this diff --git a/protos/feast/core/Source.proto b/protos/feast/core/Source.proto deleted file mode 100644 index 9dcbf2fa05..0000000000 --- a/protos/feast/core/Source.proto +++ /dev/null @@ -1,53 +0,0 @@ -// -// * Copyright 2019 The Feast Authors -// * -// * Licensed under the Apache License, Version 2.0 (the "License"); -// * you may not use this file except in compliance with the License. -// * You may obtain a copy of the License at -// * -// * https://www.apache.org/licenses/LICENSE-2.0 -// * -// * Unless required by applicable law or agreed to in writing, software -// * distributed under the License is distributed on an "AS IS" BASIS, -// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// * See the License for the specific language governing permissions and -// * limitations under the License. -// - -syntax = "proto3"; -package feast.core; - -option java_package = "feast.proto.core"; -option java_outer_classname = "SourceProto"; -option go_package = "github.com/feast-dev/feast/sdk/go/protos/feast/core"; - - -message Source { - - // The kind of data source Feast should connect to in order to retrieve FeatureRow value - SourceType type = 1; - - // Source specific configuration - oneof source_config { - KafkaSourceConfig kafka_source_config = 2; - } -} - -enum SourceType { - INVALID = 0; - KAFKA = 1; -} - -message KafkaSourceConfig { - // Comma separated list of Kafka bootstrap servers. Used for feature sets without a defined source host[:port]] - string bootstrap_servers = 1; - - // Kafka topic to use for feature sets without user defined topics - string topic = 2; - - // Number of Kafka partitions to to use for managed feature stream. - int32 partitions = 3; - - // Defines the number of copies of managed feature stream Kafka. - int32 replicationFactor = 4; -} \ No newline at end of file diff --git a/protos/feast/core/Store.proto b/protos/feast/core/Store.proto index ed1e4f684d..186b35f007 100644 --- a/protos/feast/core/Store.proto +++ b/protos/feast/core/Store.proto @@ -41,8 +41,8 @@ message Store { // - value: STRING // // Encodings: - // - key: byte array of RedisKey (refer to feast.storage.RedisKey) - // - value: byte array of FeatureRow (refer to feast.types.FeatureRow) + // - key: byte array of RedisKey (refer to feast.storage.RedisKeyV2) + // - value: Redis hashmap // REDIS = 1; diff --git a/protos/feast/serving/ServingService.proto b/protos/feast/serving/ServingService.proto index 9b98c071b8..5ed7c0c55d 100644 --- a/protos/feast/serving/ServingService.proto +++ b/protos/feast/serving/ServingService.proto @@ -30,24 +30,8 @@ service ServingService { // Get information about this Feast serving. rpc GetFeastServingInfo (GetFeastServingInfoRequest) returns (GetFeastServingInfoResponse); - // Get online features synchronously. - rpc GetOnlineFeatures (GetOnlineFeaturesRequest) returns (GetOnlineFeaturesResponse); - // Get online features (v2) synchronously. rpc GetOnlineFeaturesV2 (GetOnlineFeaturesRequestV2) returns (GetOnlineFeaturesResponse); - - // Get batch features asynchronously. - // - // The client should check the status of the returned job periodically by - // calling ReloadJob to determine if the job has completed successfully - // or with an error. If the job completes successfully i.e. - // status = JOB_STATUS_DONE with no error, then the client can check - // the file_uris for the location to download feature values data. - // The client is assumed to have access to these file URIs. - rpc GetBatchFeatures (GetBatchFeaturesRequest) returns (GetBatchFeaturesResponse); - - // Get the latest job status for batch feature retrieval. - rpc GetJob (GetJobRequest) returns (GetJobResponse); } message GetFeastServingInfoRequest {} @@ -65,22 +49,6 @@ message GetFeastServingInfoResponse { string job_staging_location = 10; } -message FeatureReference { - // Project name. This field is optional, if unspecified will default to 'default'. - string project = 1; - - // Feature name - string name = 2; - - // Feature set name specifying the feature set of this referenced feature. - // This field is optional if the feature referenced is unique across the project - // in which case the feature set would be automatically infered - string feature_set = 5; - - // Feature version and max_age was removed in v0.5.0 - reserved 3, 4; -} - message FeatureReferenceV2 { // Name of the Feature Table to retrieve the feature from. string feature_table = 1; @@ -89,34 +57,6 @@ message FeatureReferenceV2 { string name = 2; } -message GetOnlineFeaturesRequest { - // 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 - // rows into a final dataset - repeated EntityRow entity_rows = 2; - - // Option to omit entities from the response. If true, only feature - // values will be returned. - bool omit_entities_in_response = 3; - - // Optional field to specify project name override. If specified, uses the - // given project for retrieval. Overrides the projects specified in - // Feature References if both are specified. - string project = 5; - - message EntityRow { - // Request timestamp of this row. This value will be used, - // together with maxAge, to determine feature staleness. - google.protobuf.Timestamp entity_timestamp = 1; - - // Map containing mapping of entity name to entity value. - map fields = 2; - } -} - message GetOnlineFeaturesRequestV2 { // List of features that are being retrieved repeated FeatureReferenceV2 features = 4; @@ -141,18 +81,6 @@ message GetOnlineFeaturesRequestV2 { } } -message GetBatchFeaturesRequest { - // 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. - DatasetSource dataset_source = 2; - - // Compute statistics for the dataset retrieved - bool compute_statistics = 4; -} - message GetOnlineFeaturesResponse { // Feature values retrieved from feast. repeated FieldValues field_values = 1; @@ -187,18 +115,6 @@ message GetOnlineFeaturesResponse { } } -message GetBatchFeaturesResponse { - Job job = 1; -} - -message GetJobRequest { - Job job = 1; -} - -message GetJobResponse { - Job job = 1; -} - enum FeastServingType { FEAST_SERVING_TYPE_INVALID = 0; // Online serving receives entity data directly and synchronously and will @@ -208,56 +124,3 @@ enum FeastServingType { // retrieval through a staging location. FEAST_SERVING_TYPE_BATCH = 2; } - -enum JobType { - JOB_TYPE_INVALID = 0; - JOB_TYPE_DOWNLOAD = 1; -} - -enum JobStatus { - JOB_STATUS_INVALID = 0; - JOB_STATUS_PENDING = 1; - JOB_STATUS_RUNNING = 2; - JOB_STATUS_DONE = 3; -} - -enum DataFormat { - DATA_FORMAT_INVALID = 0; - DATA_FORMAT_AVRO = 1; -} - -message Job { - string id = 1; - // Output only. The type of the job. - JobType type = 2; - // Output only. Current state of the job. - JobStatus status = 3; - // Output only. If not empty, the job has failed with this error message. - string error = 4; - // Output only. The list of URIs for the files to be downloaded or - // uploaded (depends on the job type) for this particular job. - repeated string file_uris = 5; - // Output only. The data format for all the files. - // For CSV format, the files contain both feature values and a column header. - DataFormat data_format = 6; - // Output only. The statistics computed over - // the retrieved dataset. Only available for BigQuery stores. - tensorflow.metadata.v0.DatasetFeatureStatisticsList dataset_feature_statistics_list = 7; -} - -message DatasetSource { - oneof dataset_source { - // File source to load the dataset from. - FileSource file_source = 1; - } - - message FileSource { - // URIs to retrieve the dataset from, e.g. gs://bucket/directory/object.csv. Wildcards are - // supported. This data must be compatible to be uploaded to the serving store, and also be - // accessible by this serving instance. - repeated string file_uris = 1; - - // Format of the data. Currently only avro is supported. - DataFormat data_format = 2; - } -} diff --git a/protos/feast/storage/Redis.proto b/protos/feast/storage/Redis.proto index fe7d480509..a662e352f4 100644 --- a/protos/feast/storage/Redis.proto +++ b/protos/feast/storage/Redis.proto @@ -25,19 +25,6 @@ option java_outer_classname = "RedisProto"; option java_package = "feast.proto.storage"; option go_package = "github.com/feast-dev/feast/sdk/go/protos/feast/storage"; -message RedisKey { - // Field number 1 is reserved for a future distributing hash if needed - // (for when redis is clustered). - - // FeatureSet this row belongs to, this is defined as featureSetName. - string feature_set = 2; - - // List of fields containing entity names and their respective values - // contained within this feature row. The entities should be sorted - // by the entity name alphabetically in ascending order. - repeated feast.types.Field entities = 3; -} - message RedisKeyV2 { string project = 1; diff --git a/protos/feast/types/FeatureRow.proto b/protos/feast/types/FeatureRow.proto deleted file mode 100644 index fd8a561c7b..0000000000 --- a/protos/feast/types/FeatureRow.proto +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2018 The Feast Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -syntax = "proto3"; - -import "google/protobuf/timestamp.proto"; -import "feast/types/Field.proto"; - -package feast.types; - -option java_package = "feast.proto.types"; -option java_outer_classname = "FeatureRowProto"; -option go_package = "github.com/feast-dev/feast/sdk/go/protos/feast/types"; - -message FeatureRow { - - // Fields in the feature row. - repeated Field fields = 2; - - // Timestamp of the feature row. While the actual definition of this timestamp may vary - // depending on the upstream feature creation pipelines, this is the timestamp that Feast - // will use to perform joins, determine latest values, and coalesce rows. - google.protobuf.Timestamp event_timestamp = 3; - - // Complete reference to the featureSet this featureRow belongs to, in the form of - // /. This value will be used by the feast ingestion job to filter - // rows, and write the values to the correct tables. - string feature_set = 6; - - // Identifier tying this feature row to a specific ingestion job. - string ingestion_id = 7; -} diff --git a/protos/feast/types/FeatureRowExtended.proto b/protos/feast/types/FeatureRowExtended.proto deleted file mode 100644 index f922fe66bf..0000000000 --- a/protos/feast/types/FeatureRowExtended.proto +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 2018 The Feast Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -syntax = "proto3"; - -import "google/protobuf/timestamp.proto"; -import "feast/types/FeatureRow.proto"; - -package feast.types; - -option java_package = "feast.proto.types"; -option java_outer_classname = "FeatureRowExtendedProto"; -option go_package = "github.com/feast-dev/feast/sdk/go/protos/feast/types"; - -message Error { - string cause = 1; // exception class name - string transform = 2; // name of transform where the error occurred - string message = 3; - string stack_trace = 4; -} - -message Attempt { - int32 attempts = 1; - Error error = 2; -} - -message FeatureRowExtended { - FeatureRow row = 1; - Attempt last_attempt = 2; - google.protobuf.Timestamp first_seen = 3; -} diff --git a/sdk/go/mocks/serving_mock.go b/sdk/go/mocks/serving_mock.go index de2020f602..00d2e768ef 100644 --- a/sdk/go/mocks/serving_mock.go +++ b/sdk/go/mocks/serving_mock.go @@ -36,26 +36,6 @@ func (m *MockServingServiceClient) EXPECT() *MockServingServiceClientMockRecorde return m.recorder } -// GetBatchFeatures mocks base method -func (m *MockServingServiceClient) GetBatchFeatures(arg0 context.Context, arg1 *serving.GetBatchFeaturesRequest, arg2 ...grpc.CallOption) (*serving.GetBatchFeaturesResponse, error) { - m.ctrl.T.Helper() - varargs := []interface{}{arg0, arg1} - for _, a := range arg2 { - varargs = append(varargs, a) - } - ret := m.ctrl.Call(m, "GetBatchFeatures", varargs...) - ret0, _ := ret[0].(*serving.GetBatchFeaturesResponse) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetBatchFeatures indicates an expected call of GetBatchFeatures -func (mr *MockServingServiceClientMockRecorder) GetBatchFeatures(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - varargs := append([]interface{}{arg0, arg1}, arg2...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBatchFeatures", reflect.TypeOf((*MockServingServiceClient)(nil).GetBatchFeatures), varargs...) -} - // GetFeastServingInfo mocks base method func (m *MockServingServiceClient) GetFeastServingInfo(arg0 context.Context, arg1 *serving.GetFeastServingInfoRequest, arg2 ...grpc.CallOption) (*serving.GetFeastServingInfoResponse, error) { m.ctrl.T.Helper() @@ -76,46 +56,6 @@ func (mr *MockServingServiceClientMockRecorder) GetFeastServingInfo(arg0, arg1 i return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetFeastServingInfo", reflect.TypeOf((*MockServingServiceClient)(nil).GetFeastServingInfo), varargs...) } -// GetJob mocks base method -func (m *MockServingServiceClient) GetJob(arg0 context.Context, arg1 *serving.GetJobRequest, arg2 ...grpc.CallOption) (*serving.GetJobResponse, error) { - m.ctrl.T.Helper() - varargs := []interface{}{arg0, arg1} - for _, a := range arg2 { - varargs = append(varargs, a) - } - ret := m.ctrl.Call(m, "GetJob", varargs...) - ret0, _ := ret[0].(*serving.GetJobResponse) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetJob indicates an expected call of GetJob -func (mr *MockServingServiceClientMockRecorder) GetJob(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - varargs := append([]interface{}{arg0, arg1}, arg2...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetJob", reflect.TypeOf((*MockServingServiceClient)(nil).GetJob), varargs...) -} - -// GetOnlineFeatures mocks base method -func (m *MockServingServiceClient) GetOnlineFeatures(arg0 context.Context, arg1 *serving.GetOnlineFeaturesRequest, arg2 ...grpc.CallOption) (*serving.GetOnlineFeaturesResponse, error) { - m.ctrl.T.Helper() - varargs := []interface{}{arg0, arg1} - for _, a := range arg2 { - varargs = append(varargs, a) - } - ret := m.ctrl.Call(m, "GetOnlineFeatures", varargs...) - ret0, _ := ret[0].(*serving.GetOnlineFeaturesResponse) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetOnlineFeatures indicates an expected call of GetOnlineFeatures -func (mr *MockServingServiceClientMockRecorder) GetOnlineFeatures(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - varargs := append([]interface{}{arg0, arg1}, arg2...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetOnlineFeatures", reflect.TypeOf((*MockServingServiceClient)(nil).GetOnlineFeatures), varargs...) -} - // GetOnlineFeaturesV2 mocks base method func (m *MockServingServiceClient) GetOnlineFeaturesV2(arg0 context.Context, arg1 *serving.GetOnlineFeaturesRequestV2, arg2 ...grpc.CallOption) (*serving.GetOnlineFeaturesResponse, error) { m.ctrl.T.Helper() diff --git a/sdk/go/protos/feast/core/CoreService.pb.go b/sdk/go/protos/feast/core/CoreService.pb.go index c54a5bc315..2d9b0a8e0a 100644 --- a/sdk/go/protos/feast/core/CoreService.pb.go +++ b/sdk/go/protos/feast/core/CoreService.pb.go @@ -17,16 +17,16 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.10.0 +// protoc v3.12.4 // source: feast/core/CoreService.proto package core import ( context "context" - v0 "github.com/feast-dev/feast/sdk/go/protos/tensorflow_metadata/proto/v0" + _ "github.com/feast-dev/feast/sdk/go/protos/tensorflow_metadata/proto/v0" proto "github.com/golang/protobuf/proto" - timestamp "github.com/golang/protobuf/ptypes/timestamp" + _ "github.com/golang/protobuf/ptypes/timestamp" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" @@ -47,63 +47,6 @@ const ( // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 -// TODO: 0 should correspond to invalid rather than NO_CHANGE -type ApplyFeatureSetResponse_Status int32 - -const ( - // Latest feature set is consistent with provided feature set - ApplyFeatureSetResponse_NO_CHANGE ApplyFeatureSetResponse_Status = 0 - // New feature set created - ApplyFeatureSetResponse_CREATED ApplyFeatureSetResponse_Status = 1 - // Error occurred while trying to apply changes - ApplyFeatureSetResponse_ERROR ApplyFeatureSetResponse_Status = 2 - // Changes detected and updated successfully - ApplyFeatureSetResponse_UPDATED ApplyFeatureSetResponse_Status = 3 -) - -// Enum value maps for ApplyFeatureSetResponse_Status. -var ( - ApplyFeatureSetResponse_Status_name = map[int32]string{ - 0: "NO_CHANGE", - 1: "CREATED", - 2: "ERROR", - 3: "UPDATED", - } - ApplyFeatureSetResponse_Status_value = map[string]int32{ - "NO_CHANGE": 0, - "CREATED": 1, - "ERROR": 2, - "UPDATED": 3, - } -) - -func (x ApplyFeatureSetResponse_Status) Enum() *ApplyFeatureSetResponse_Status { - p := new(ApplyFeatureSetResponse_Status) - *p = x - return p -} - -func (x ApplyFeatureSetResponse_Status) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (ApplyFeatureSetResponse_Status) Descriptor() protoreflect.EnumDescriptor { - return file_feast_core_CoreService_proto_enumTypes[0].Descriptor() -} - -func (ApplyFeatureSetResponse_Status) Type() protoreflect.EnumType { - return &file_feast_core_CoreService_proto_enumTypes[0] -} - -func (x ApplyFeatureSetResponse_Status) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use ApplyFeatureSetResponse_Status.Descriptor instead. -func (ApplyFeatureSetResponse_Status) EnumDescriptor() ([]byte, []int) { - return file_feast_core_CoreService_proto_rawDescGZIP(), []int{15, 0} -} - type UpdateStoreResponse_Status int32 const ( @@ -136,11 +79,11 @@ func (x UpdateStoreResponse_Status) String() string { } func (UpdateStoreResponse_Status) Descriptor() protoreflect.EnumDescriptor { - return file_feast_core_CoreService_proto_enumTypes[1].Descriptor() + return file_feast_core_CoreService_proto_enumTypes[0].Descriptor() } func (UpdateStoreResponse_Status) Type() protoreflect.EnumType { - return &file_feast_core_CoreService_proto_enumTypes[1] + return &file_feast_core_CoreService_proto_enumTypes[0] } func (x UpdateStoreResponse_Status) Number() protoreflect.EnumNumber { @@ -149,208 +92,7 @@ func (x UpdateStoreResponse_Status) Number() protoreflect.EnumNumber { // Deprecated: Use UpdateStoreResponse_Status.Descriptor instead. func (UpdateStoreResponse_Status) EnumDescriptor() ([]byte, []int) { - return file_feast_core_CoreService_proto_rawDescGZIP(), []int{19, 0} -} - -// Request for a single feature set -type GetFeatureSetRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Name of project the feature set belongs to. If omitted will default to 'default' project. - 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"` -} - -func (x *GetFeatureSetRequest) Reset() { - *x = GetFeatureSetRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_feast_core_CoreService_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetFeatureSetRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetFeatureSetRequest) ProtoMessage() {} - -func (x *GetFeatureSetRequest) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_CoreService_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetFeatureSetRequest.ProtoReflect.Descriptor instead. -func (*GetFeatureSetRequest) Descriptor() ([]byte, []int) { - return file_feast_core_CoreService_proto_rawDescGZIP(), []int{0} -} - -func (x *GetFeatureSetRequest) GetProject() string { - if x != nil { - return x.Project - } - return "" -} - -func (x *GetFeatureSetRequest) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -// Response containing a single feature set -type GetFeatureSetResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - FeatureSet *FeatureSet `protobuf:"bytes,1,opt,name=feature_set,json=featureSet,proto3" json:"feature_set,omitempty"` -} - -func (x *GetFeatureSetResponse) Reset() { - *x = GetFeatureSetResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_feast_core_CoreService_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetFeatureSetResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetFeatureSetResponse) ProtoMessage() {} - -func (x *GetFeatureSetResponse) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_CoreService_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetFeatureSetResponse.ProtoReflect.Descriptor instead. -func (*GetFeatureSetResponse) Descriptor() ([]byte, []int) { - return file_feast_core_CoreService_proto_rawDescGZIP(), []int{1} -} - -func (x *GetFeatureSetResponse) GetFeatureSet() *FeatureSet { - if x != nil { - return x.FeatureSet - } - return nil -} - -// Retrieves details for all versions of a specific feature set -type ListFeatureSetsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Filter *ListFeatureSetsRequest_Filter `protobuf:"bytes,1,opt,name=filter,proto3" json:"filter,omitempty"` -} - -func (x *ListFeatureSetsRequest) Reset() { - *x = ListFeatureSetsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_feast_core_CoreService_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ListFeatureSetsRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ListFeatureSetsRequest) ProtoMessage() {} - -func (x *ListFeatureSetsRequest) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_CoreService_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ListFeatureSetsRequest.ProtoReflect.Descriptor instead. -func (*ListFeatureSetsRequest) Descriptor() ([]byte, []int) { - return file_feast_core_CoreService_proto_rawDescGZIP(), []int{2} -} - -func (x *ListFeatureSetsRequest) GetFilter() *ListFeatureSetsRequest_Filter { - if x != nil { - return x.Filter - } - return nil -} - -type ListFeatureSetsResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - FeatureSets []*FeatureSet `protobuf:"bytes,1,rep,name=feature_sets,json=featureSets,proto3" json:"feature_sets,omitempty"` -} - -func (x *ListFeatureSetsResponse) Reset() { - *x = ListFeatureSetsResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_feast_core_CoreService_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ListFeatureSetsResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ListFeatureSetsResponse) ProtoMessage() {} - -func (x *ListFeatureSetsResponse) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_CoreService_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ListFeatureSetsResponse.ProtoReflect.Descriptor instead. -func (*ListFeatureSetsResponse) Descriptor() ([]byte, []int) { - return file_feast_core_CoreService_proto_rawDescGZIP(), []int{3} -} - -func (x *ListFeatureSetsResponse) GetFeatureSets() []*FeatureSet { - if x != nil { - return x.FeatureSets - } - return nil + return file_feast_core_CoreService_proto_rawDescGZIP(), []int{13, 0} } // Request for a single entity @@ -368,7 +110,7 @@ type GetEntityRequest struct { func (x *GetEntityRequest) Reset() { *x = GetEntityRequest{} if protoimpl.UnsafeEnabled { - mi := &file_feast_core_CoreService_proto_msgTypes[4] + mi := &file_feast_core_CoreService_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -381,7 +123,7 @@ func (x *GetEntityRequest) String() string { func (*GetEntityRequest) ProtoMessage() {} func (x *GetEntityRequest) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_CoreService_proto_msgTypes[4] + mi := &file_feast_core_CoreService_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -394,7 +136,7 @@ func (x *GetEntityRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetEntityRequest.ProtoReflect.Descriptor instead. func (*GetEntityRequest) Descriptor() ([]byte, []int) { - return file_feast_core_CoreService_proto_rawDescGZIP(), []int{4} + return file_feast_core_CoreService_proto_rawDescGZIP(), []int{0} } func (x *GetEntityRequest) GetName() string { @@ -423,7 +165,7 @@ type GetEntityResponse struct { func (x *GetEntityResponse) Reset() { *x = GetEntityResponse{} if protoimpl.UnsafeEnabled { - mi := &file_feast_core_CoreService_proto_msgTypes[5] + mi := &file_feast_core_CoreService_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -436,7 +178,7 @@ func (x *GetEntityResponse) String() string { func (*GetEntityResponse) ProtoMessage() {} func (x *GetEntityResponse) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_CoreService_proto_msgTypes[5] + mi := &file_feast_core_CoreService_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -449,7 +191,7 @@ func (x *GetEntityResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetEntityResponse.ProtoReflect.Descriptor instead. func (*GetEntityResponse) Descriptor() ([]byte, []int) { - return file_feast_core_CoreService_proto_rawDescGZIP(), []int{5} + return file_feast_core_CoreService_proto_rawDescGZIP(), []int{1} } func (x *GetEntityResponse) GetEntity() *Entity { @@ -471,7 +213,7 @@ type ListEntitiesRequest struct { func (x *ListEntitiesRequest) Reset() { *x = ListEntitiesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_feast_core_CoreService_proto_msgTypes[6] + mi := &file_feast_core_CoreService_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -484,7 +226,7 @@ func (x *ListEntitiesRequest) String() string { func (*ListEntitiesRequest) ProtoMessage() {} func (x *ListEntitiesRequest) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_CoreService_proto_msgTypes[6] + mi := &file_feast_core_CoreService_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -497,7 +239,7 @@ func (x *ListEntitiesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListEntitiesRequest.ProtoReflect.Descriptor instead. func (*ListEntitiesRequest) Descriptor() ([]byte, []int) { - return file_feast_core_CoreService_proto_rawDescGZIP(), []int{6} + return file_feast_core_CoreService_proto_rawDescGZIP(), []int{2} } func (x *ListEntitiesRequest) GetFilter() *ListEntitiesRequest_Filter { @@ -518,7 +260,7 @@ type ListEntitiesResponse struct { func (x *ListEntitiesResponse) Reset() { *x = ListEntitiesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_feast_core_CoreService_proto_msgTypes[7] + mi := &file_feast_core_CoreService_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -531,7 +273,7 @@ func (x *ListEntitiesResponse) String() string { func (*ListEntitiesResponse) ProtoMessage() {} func (x *ListEntitiesResponse) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_CoreService_proto_msgTypes[7] + mi := &file_feast_core_CoreService_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -544,7 +286,7 @@ func (x *ListEntitiesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListEntitiesResponse.ProtoReflect.Descriptor instead. func (*ListEntitiesResponse) Descriptor() ([]byte, []int) { - return file_feast_core_CoreService_proto_rawDescGZIP(), []int{7} + return file_feast_core_CoreService_proto_rawDescGZIP(), []int{3} } func (x *ListEntitiesResponse) GetEntities() []*Entity { @@ -565,7 +307,7 @@ type ListFeaturesRequest struct { func (x *ListFeaturesRequest) Reset() { *x = ListFeaturesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_feast_core_CoreService_proto_msgTypes[8] + mi := &file_feast_core_CoreService_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -578,7 +320,7 @@ func (x *ListFeaturesRequest) String() string { func (*ListFeaturesRequest) ProtoMessage() {} func (x *ListFeaturesRequest) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_CoreService_proto_msgTypes[8] + mi := &file_feast_core_CoreService_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -591,7 +333,7 @@ func (x *ListFeaturesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListFeaturesRequest.ProtoReflect.Descriptor instead. func (*ListFeaturesRequest) Descriptor() ([]byte, []int) { - return file_feast_core_CoreService_proto_rawDescGZIP(), []int{8} + return file_feast_core_CoreService_proto_rawDescGZIP(), []int{4} } func (x *ListFeaturesRequest) GetFilter() *ListFeaturesRequest_Filter { @@ -606,13 +348,13 @@ type ListFeaturesResponse struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Features map[string]*FeatureSpec `protobuf:"bytes,1,rep,name=features,proto3" json:"features,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Features map[string]*FeatureSpecV2 `protobuf:"bytes,2,rep,name=features,proto3" json:"features,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *ListFeaturesResponse) Reset() { *x = ListFeaturesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_feast_core_CoreService_proto_msgTypes[9] + mi := &file_feast_core_CoreService_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -625,7 +367,7 @@ func (x *ListFeaturesResponse) String() string { func (*ListFeaturesResponse) ProtoMessage() {} func (x *ListFeaturesResponse) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_CoreService_proto_msgTypes[9] + mi := &file_feast_core_CoreService_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -638,10 +380,10 @@ func (x *ListFeaturesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListFeaturesResponse.ProtoReflect.Descriptor instead. func (*ListFeaturesResponse) Descriptor() ([]byte, []int) { - return file_feast_core_CoreService_proto_rawDescGZIP(), []int{9} + return file_feast_core_CoreService_proto_rawDescGZIP(), []int{5} } -func (x *ListFeaturesResponse) GetFeatures() map[string]*FeatureSpec { +func (x *ListFeaturesResponse) GetFeatures() map[string]*FeatureSpecV2 { if x != nil { return x.Features } @@ -659,7 +401,7 @@ type ListStoresRequest struct { func (x *ListStoresRequest) Reset() { *x = ListStoresRequest{} if protoimpl.UnsafeEnabled { - mi := &file_feast_core_CoreService_proto_msgTypes[10] + mi := &file_feast_core_CoreService_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -672,7 +414,7 @@ func (x *ListStoresRequest) String() string { func (*ListStoresRequest) ProtoMessage() {} func (x *ListStoresRequest) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_CoreService_proto_msgTypes[10] + mi := &file_feast_core_CoreService_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -685,7 +427,7 @@ func (x *ListStoresRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListStoresRequest.ProtoReflect.Descriptor instead. func (*ListStoresRequest) Descriptor() ([]byte, []int) { - return file_feast_core_CoreService_proto_rawDescGZIP(), []int{10} + return file_feast_core_CoreService_proto_rawDescGZIP(), []int{6} } func (x *ListStoresRequest) GetFilter() *ListStoresRequest_Filter { @@ -706,7 +448,7 @@ type ListStoresResponse struct { func (x *ListStoresResponse) Reset() { *x = ListStoresResponse{} if protoimpl.UnsafeEnabled { - mi := &file_feast_core_CoreService_proto_msgTypes[11] + mi := &file_feast_core_CoreService_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -719,7 +461,7 @@ func (x *ListStoresResponse) String() string { func (*ListStoresResponse) ProtoMessage() {} func (x *ListStoresResponse) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_CoreService_proto_msgTypes[11] + mi := &file_feast_core_CoreService_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -732,7 +474,7 @@ func (x *ListStoresResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListStoresResponse.ProtoReflect.Descriptor instead. func (*ListStoresResponse) Descriptor() ([]byte, []int) { - return file_feast_core_CoreService_proto_rawDescGZIP(), []int{11} + return file_feast_core_CoreService_proto_rawDescGZIP(), []int{7} } func (x *ListStoresResponse) GetStore() []*Store { @@ -757,7 +499,7 @@ type ApplyEntityRequest struct { func (x *ApplyEntityRequest) Reset() { *x = ApplyEntityRequest{} if protoimpl.UnsafeEnabled { - mi := &file_feast_core_CoreService_proto_msgTypes[12] + mi := &file_feast_core_CoreService_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -770,7 +512,7 @@ func (x *ApplyEntityRequest) String() string { func (*ApplyEntityRequest) ProtoMessage() {} func (x *ApplyEntityRequest) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_CoreService_proto_msgTypes[12] + mi := &file_feast_core_CoreService_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -783,7 +525,7 @@ func (x *ApplyEntityRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ApplyEntityRequest.ProtoReflect.Descriptor instead. func (*ApplyEntityRequest) Descriptor() ([]byte, []int) { - return file_feast_core_CoreService_proto_rawDescGZIP(), []int{12} + return file_feast_core_CoreService_proto_rawDescGZIP(), []int{8} } func (x *ApplyEntityRequest) GetSpec() *EntitySpecV2 { @@ -811,7 +553,7 @@ type ApplyEntityResponse struct { func (x *ApplyEntityResponse) Reset() { *x = ApplyEntityResponse{} if protoimpl.UnsafeEnabled { - mi := &file_feast_core_CoreService_proto_msgTypes[13] + mi := &file_feast_core_CoreService_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -824,7 +566,7 @@ func (x *ApplyEntityResponse) String() string { func (*ApplyEntityResponse) ProtoMessage() {} func (x *ApplyEntityResponse) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_CoreService_proto_msgTypes[13] + mi := &file_feast_core_CoreService_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -837,7 +579,7 @@ func (x *ApplyEntityResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ApplyEntityResponse.ProtoReflect.Descriptor instead. func (*ApplyEntityResponse) Descriptor() ([]byte, []int) { - return file_feast_core_CoreService_proto_rawDescGZIP(), []int{13} + return file_feast_core_CoreService_proto_rawDescGZIP(), []int{9} } func (x *ApplyEntityResponse) GetEntity() *Entity { @@ -847,134 +589,29 @@ func (x *ApplyEntityResponse) GetEntity() *Entity { return nil } -type ApplyFeatureSetRequest struct { +type GetFeastCoreVersionRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - - // Feature set version - // If project is unspecified, will default to 'default' project. - // If project specified does not exist, the project would be automatically created. - FeatureSet *FeatureSet `protobuf:"bytes,1,opt,name=feature_set,json=featureSet,proto3" json:"feature_set,omitempty"` } -func (x *ApplyFeatureSetRequest) Reset() { - *x = ApplyFeatureSetRequest{} +func (x *GetFeastCoreVersionRequest) Reset() { + *x = GetFeastCoreVersionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_feast_core_CoreService_proto_msgTypes[14] + mi := &file_feast_core_CoreService_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ApplyFeatureSetRequest) String() string { +func (x *GetFeastCoreVersionRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ApplyFeatureSetRequest) ProtoMessage() {} - -func (x *ApplyFeatureSetRequest) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_CoreService_proto_msgTypes[14] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ApplyFeatureSetRequest.ProtoReflect.Descriptor instead. -func (*ApplyFeatureSetRequest) Descriptor() ([]byte, []int) { - return file_feast_core_CoreService_proto_rawDescGZIP(), []int{14} -} - -func (x *ApplyFeatureSetRequest) GetFeatureSet() *FeatureSet { - if x != nil { - return x.FeatureSet - } - return nil -} - -type ApplyFeatureSetResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - FeatureSet *FeatureSet `protobuf:"bytes,1,opt,name=feature_set,json=featureSet,proto3" json:"feature_set,omitempty"` - Status ApplyFeatureSetResponse_Status `protobuf:"varint,2,opt,name=status,proto3,enum=feast.core.ApplyFeatureSetResponse_Status" json:"status,omitempty"` -} - -func (x *ApplyFeatureSetResponse) Reset() { - *x = ApplyFeatureSetResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_feast_core_CoreService_proto_msgTypes[15] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ApplyFeatureSetResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ApplyFeatureSetResponse) ProtoMessage() {} - -func (x *ApplyFeatureSetResponse) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_CoreService_proto_msgTypes[15] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ApplyFeatureSetResponse.ProtoReflect.Descriptor instead. -func (*ApplyFeatureSetResponse) Descriptor() ([]byte, []int) { - return file_feast_core_CoreService_proto_rawDescGZIP(), []int{15} -} - -func (x *ApplyFeatureSetResponse) GetFeatureSet() *FeatureSet { - if x != nil { - return x.FeatureSet - } - return nil -} - -func (x *ApplyFeatureSetResponse) GetStatus() ApplyFeatureSetResponse_Status { - if x != nil { - return x.Status - } - return ApplyFeatureSetResponse_NO_CHANGE -} - -type GetFeastCoreVersionRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *GetFeastCoreVersionRequest) Reset() { - *x = GetFeastCoreVersionRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_feast_core_CoreService_proto_msgTypes[16] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetFeastCoreVersionRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetFeastCoreVersionRequest) ProtoMessage() {} +func (*GetFeastCoreVersionRequest) ProtoMessage() {} func (x *GetFeastCoreVersionRequest) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_CoreService_proto_msgTypes[16] + mi := &file_feast_core_CoreService_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -987,7 +624,7 @@ func (x *GetFeastCoreVersionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetFeastCoreVersionRequest.ProtoReflect.Descriptor instead. func (*GetFeastCoreVersionRequest) Descriptor() ([]byte, []int) { - return file_feast_core_CoreService_proto_rawDescGZIP(), []int{16} + return file_feast_core_CoreService_proto_rawDescGZIP(), []int{10} } type GetFeastCoreVersionResponse struct { @@ -1001,7 +638,7 @@ type GetFeastCoreVersionResponse struct { func (x *GetFeastCoreVersionResponse) Reset() { *x = GetFeastCoreVersionResponse{} if protoimpl.UnsafeEnabled { - mi := &file_feast_core_CoreService_proto_msgTypes[17] + mi := &file_feast_core_CoreService_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1014,7 +651,7 @@ func (x *GetFeastCoreVersionResponse) String() string { func (*GetFeastCoreVersionResponse) ProtoMessage() {} func (x *GetFeastCoreVersionResponse) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_CoreService_proto_msgTypes[17] + mi := &file_feast_core_CoreService_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1027,7 +664,7 @@ func (x *GetFeastCoreVersionResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetFeastCoreVersionResponse.ProtoReflect.Descriptor instead. func (*GetFeastCoreVersionResponse) Descriptor() ([]byte, []int) { - return file_feast_core_CoreService_proto_rawDescGZIP(), []int{17} + return file_feast_core_CoreService_proto_rawDescGZIP(), []int{11} } func (x *GetFeastCoreVersionResponse) GetVersion() string { @@ -1048,7 +685,7 @@ type UpdateStoreRequest struct { func (x *UpdateStoreRequest) Reset() { *x = UpdateStoreRequest{} if protoimpl.UnsafeEnabled { - mi := &file_feast_core_CoreService_proto_msgTypes[18] + mi := &file_feast_core_CoreService_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1061,7 +698,7 @@ func (x *UpdateStoreRequest) String() string { func (*UpdateStoreRequest) ProtoMessage() {} func (x *UpdateStoreRequest) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_CoreService_proto_msgTypes[18] + mi := &file_feast_core_CoreService_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1074,7 +711,7 @@ func (x *UpdateStoreRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateStoreRequest.ProtoReflect.Descriptor instead. func (*UpdateStoreRequest) Descriptor() ([]byte, []int) { - return file_feast_core_CoreService_proto_rawDescGZIP(), []int{18} + return file_feast_core_CoreService_proto_rawDescGZIP(), []int{12} } func (x *UpdateStoreRequest) GetStore() *Store { @@ -1096,7 +733,7 @@ type UpdateStoreResponse struct { func (x *UpdateStoreResponse) Reset() { *x = UpdateStoreResponse{} if protoimpl.UnsafeEnabled { - mi := &file_feast_core_CoreService_proto_msgTypes[19] + mi := &file_feast_core_CoreService_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1109,7 +746,7 @@ func (x *UpdateStoreResponse) String() string { func (*UpdateStoreResponse) ProtoMessage() {} func (x *UpdateStoreResponse) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_CoreService_proto_msgTypes[19] + mi := &file_feast_core_CoreService_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1122,7 +759,7 @@ func (x *UpdateStoreResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateStoreResponse.ProtoReflect.Descriptor instead. func (*UpdateStoreResponse) Descriptor() ([]byte, []int) { - return file_feast_core_CoreService_proto_rawDescGZIP(), []int{19} + return file_feast_core_CoreService_proto_rawDescGZIP(), []int{13} } func (x *UpdateStoreResponse) GetStore() *Store { @@ -1152,7 +789,7 @@ type CreateProjectRequest struct { func (x *CreateProjectRequest) Reset() { *x = CreateProjectRequest{} if protoimpl.UnsafeEnabled { - mi := &file_feast_core_CoreService_proto_msgTypes[20] + mi := &file_feast_core_CoreService_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1165,7 +802,7 @@ func (x *CreateProjectRequest) String() string { func (*CreateProjectRequest) ProtoMessage() {} func (x *CreateProjectRequest) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_CoreService_proto_msgTypes[20] + mi := &file_feast_core_CoreService_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1178,7 +815,7 @@ func (x *CreateProjectRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateProjectRequest.ProtoReflect.Descriptor instead. func (*CreateProjectRequest) Descriptor() ([]byte, []int) { - return file_feast_core_CoreService_proto_rawDescGZIP(), []int{20} + return file_feast_core_CoreService_proto_rawDescGZIP(), []int{14} } func (x *CreateProjectRequest) GetName() string { @@ -1198,7 +835,7 @@ type CreateProjectResponse struct { func (x *CreateProjectResponse) Reset() { *x = CreateProjectResponse{} if protoimpl.UnsafeEnabled { - mi := &file_feast_core_CoreService_proto_msgTypes[21] + mi := &file_feast_core_CoreService_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1211,7 +848,7 @@ func (x *CreateProjectResponse) String() string { func (*CreateProjectResponse) ProtoMessage() {} func (x *CreateProjectResponse) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_CoreService_proto_msgTypes[21] + mi := &file_feast_core_CoreService_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1224,7 +861,7 @@ func (x *CreateProjectResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateProjectResponse.ProtoReflect.Descriptor instead. func (*CreateProjectResponse) Descriptor() ([]byte, []int) { - return file_feast_core_CoreService_proto_rawDescGZIP(), []int{21} + return file_feast_core_CoreService_proto_rawDescGZIP(), []int{15} } // Request for the archival of a project @@ -1240,7 +877,7 @@ type ArchiveProjectRequest struct { func (x *ArchiveProjectRequest) Reset() { *x = ArchiveProjectRequest{} if protoimpl.UnsafeEnabled { - mi := &file_feast_core_CoreService_proto_msgTypes[22] + mi := &file_feast_core_CoreService_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1253,7 +890,7 @@ func (x *ArchiveProjectRequest) String() string { func (*ArchiveProjectRequest) ProtoMessage() {} func (x *ArchiveProjectRequest) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_CoreService_proto_msgTypes[22] + mi := &file_feast_core_CoreService_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1266,7 +903,7 @@ func (x *ArchiveProjectRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ArchiveProjectRequest.ProtoReflect.Descriptor instead. func (*ArchiveProjectRequest) Descriptor() ([]byte, []int) { - return file_feast_core_CoreService_proto_rawDescGZIP(), []int{22} + return file_feast_core_CoreService_proto_rawDescGZIP(), []int{16} } func (x *ArchiveProjectRequest) GetName() string { @@ -1286,7 +923,7 @@ type ArchiveProjectResponse struct { func (x *ArchiveProjectResponse) Reset() { *x = ArchiveProjectResponse{} if protoimpl.UnsafeEnabled { - mi := &file_feast_core_CoreService_proto_msgTypes[23] + mi := &file_feast_core_CoreService_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1299,7 +936,7 @@ func (x *ArchiveProjectResponse) String() string { func (*ArchiveProjectResponse) ProtoMessage() {} func (x *ArchiveProjectResponse) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_CoreService_proto_msgTypes[23] + mi := &file_feast_core_CoreService_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1312,7 +949,7 @@ func (x *ArchiveProjectResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ArchiveProjectResponse.ProtoReflect.Descriptor instead. func (*ArchiveProjectResponse) Descriptor() ([]byte, []int) { - return file_feast_core_CoreService_proto_rawDescGZIP(), []int{23} + return file_feast_core_CoreService_proto_rawDescGZIP(), []int{17} } // Request for listing of projects @@ -1325,7 +962,7 @@ type ListProjectsRequest struct { func (x *ListProjectsRequest) Reset() { *x = ListProjectsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_feast_core_CoreService_proto_msgTypes[24] + mi := &file_feast_core_CoreService_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1338,7 +975,7 @@ func (x *ListProjectsRequest) String() string { func (*ListProjectsRequest) ProtoMessage() {} func (x *ListProjectsRequest) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_CoreService_proto_msgTypes[24] + mi := &file_feast_core_CoreService_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1351,7 +988,7 @@ func (x *ListProjectsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListProjectsRequest.ProtoReflect.Descriptor instead. func (*ListProjectsRequest) Descriptor() ([]byte, []int) { - return file_feast_core_CoreService_proto_rawDescGZIP(), []int{24} + return file_feast_core_CoreService_proto_rawDescGZIP(), []int{18} } // Response for listing of projects @@ -1367,7 +1004,7 @@ type ListProjectsResponse struct { func (x *ListProjectsResponse) Reset() { *x = ListProjectsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_feast_core_CoreService_proto_msgTypes[25] + mi := &file_feast_core_CoreService_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1380,7 +1017,7 @@ func (x *ListProjectsResponse) String() string { func (*ListProjectsResponse) ProtoMessage() {} func (x *ListProjectsResponse) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_CoreService_proto_msgTypes[25] + mi := &file_feast_core_CoreService_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1393,7 +1030,7 @@ func (x *ListProjectsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListProjectsResponse.ProtoReflect.Descriptor instead. func (*ListProjectsResponse) Descriptor() ([]byte, []int) { - return file_feast_core_CoreService_proto_rawDescGZIP(), []int{25} + return file_feast_core_CoreService_proto_rawDescGZIP(), []int{19} } func (x *ListProjectsResponse) GetProjects() []string { @@ -1403,32 +1040,29 @@ func (x *ListProjectsResponse) GetProjects() []string { return nil } -// Request for listing ingestion jobs -type ListIngestionJobsRequest struct { +type UpdateFeatureSetStatusResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - - Filter *ListIngestionJobsRequest_Filter `protobuf:"bytes,1,opt,name=filter,proto3" json:"filter,omitempty"` } -func (x *ListIngestionJobsRequest) Reset() { - *x = ListIngestionJobsRequest{} +func (x *UpdateFeatureSetStatusResponse) Reset() { + *x = UpdateFeatureSetStatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_feast_core_CoreService_proto_msgTypes[26] + mi := &file_feast_core_CoreService_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListIngestionJobsRequest) String() string { +func (x *UpdateFeatureSetStatusResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListIngestionJobsRequest) ProtoMessage() {} +func (*UpdateFeatureSetStatusResponse) ProtoMessage() {} -func (x *ListIngestionJobsRequest) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_CoreService_proto_msgTypes[26] +func (x *UpdateFeatureSetStatusResponse) ProtoReflect() protoreflect.Message { + mi := &file_feast_core_CoreService_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1439,44 +1073,40 @@ func (x *ListIngestionJobsRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListIngestionJobsRequest.ProtoReflect.Descriptor instead. -func (*ListIngestionJobsRequest) Descriptor() ([]byte, []int) { - return file_feast_core_CoreService_proto_rawDescGZIP(), []int{26} -} - -func (x *ListIngestionJobsRequest) GetFilter() *ListIngestionJobsRequest_Filter { - if x != nil { - return x.Filter - } - return nil +// Deprecated: Use UpdateFeatureSetStatusResponse.ProtoReflect.Descriptor instead. +func (*UpdateFeatureSetStatusResponse) Descriptor() ([]byte, []int) { + return file_feast_core_CoreService_proto_rawDescGZIP(), []int{20} } -// Response from listing ingestion jobs -type ListIngestionJobsResponse struct { +type ApplyFeatureTableRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Jobs []*IngestionJob `protobuf:"bytes,1,rep,name=jobs,proto3" json:"jobs,omitempty"` + // Optional. Name of the Project to apply the Feature Table to. + // If unspecified, will apply FeatureTable to the default project. + Project string `protobuf:"bytes,1,opt,name=project,proto3" json:"project,omitempty"` + // Feature Table specification to apply + TableSpec *FeatureTableSpec `protobuf:"bytes,2,opt,name=table_spec,json=tableSpec,proto3" json:"table_spec,omitempty"` } -func (x *ListIngestionJobsResponse) Reset() { - *x = ListIngestionJobsResponse{} +func (x *ApplyFeatureTableRequest) Reset() { + *x = ApplyFeatureTableRequest{} if protoimpl.UnsafeEnabled { - mi := &file_feast_core_CoreService_proto_msgTypes[27] + mi := &file_feast_core_CoreService_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListIngestionJobsResponse) String() string { +func (x *ApplyFeatureTableRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListIngestionJobsResponse) ProtoMessage() {} +func (*ApplyFeatureTableRequest) ProtoMessage() {} -func (x *ListIngestionJobsResponse) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_CoreService_proto_msgTypes[27] +func (x *ApplyFeatureTableRequest) ProtoReflect() protoreflect.Message { + mi := &file_feast_core_CoreService_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1487,45 +1117,50 @@ func (x *ListIngestionJobsResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListIngestionJobsResponse.ProtoReflect.Descriptor instead. -func (*ListIngestionJobsResponse) Descriptor() ([]byte, []int) { - return file_feast_core_CoreService_proto_rawDescGZIP(), []int{27} +// Deprecated: Use ApplyFeatureTableRequest.ProtoReflect.Descriptor instead. +func (*ApplyFeatureTableRequest) Descriptor() ([]byte, []int) { + return file_feast_core_CoreService_proto_rawDescGZIP(), []int{21} +} + +func (x *ApplyFeatureTableRequest) GetProject() string { + if x != nil { + return x.Project + } + return "" } -func (x *ListIngestionJobsResponse) GetJobs() []*IngestionJob { +func (x *ApplyFeatureTableRequest) GetTableSpec() *FeatureTableSpec { if x != nil { - return x.Jobs + return x.TableSpec } return nil } -// Request to restart ingestion job -type RestartIngestionJobRequest struct { +type ApplyFeatureTableResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Job ID assigned by Feast - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Table *FeatureTable `protobuf:"bytes,1,opt,name=table,proto3" json:"table,omitempty"` } -func (x *RestartIngestionJobRequest) Reset() { - *x = RestartIngestionJobRequest{} +func (x *ApplyFeatureTableResponse) Reset() { + *x = ApplyFeatureTableResponse{} if protoimpl.UnsafeEnabled { - mi := &file_feast_core_CoreService_proto_msgTypes[28] + mi := &file_feast_core_CoreService_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *RestartIngestionJobRequest) String() string { +func (x *ApplyFeatureTableResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RestartIngestionJobRequest) ProtoMessage() {} +func (*ApplyFeatureTableResponse) ProtoMessage() {} -func (x *RestartIngestionJobRequest) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_CoreService_proto_msgTypes[28] +func (x *ApplyFeatureTableResponse) ProtoReflect() protoreflect.Message { + mi := &file_feast_core_CoreService_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1536,42 +1171,47 @@ func (x *RestartIngestionJobRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RestartIngestionJobRequest.ProtoReflect.Descriptor instead. -func (*RestartIngestionJobRequest) Descriptor() ([]byte, []int) { - return file_feast_core_CoreService_proto_rawDescGZIP(), []int{28} +// Deprecated: Use ApplyFeatureTableResponse.ProtoReflect.Descriptor instead. +func (*ApplyFeatureTableResponse) Descriptor() ([]byte, []int) { + return file_feast_core_CoreService_proto_rawDescGZIP(), []int{22} } -func (x *RestartIngestionJobRequest) GetId() string { +func (x *ApplyFeatureTableResponse) GetTable() *FeatureTable { if x != nil { - return x.Id + return x.Table } - return "" + return nil } -// Response from restartingan injestion job -type RestartIngestionJobResponse struct { +type GetFeatureTableRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + + // Optional. Name of the Project to retrieve the Feature Table from. + // If unspecified, will apply FeatureTable to the default project. + Project string `protobuf:"bytes,1,opt,name=project,proto3" json:"project,omitempty"` + // Name of the FeatureTable to retrieve. + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` } -func (x *RestartIngestionJobResponse) Reset() { - *x = RestartIngestionJobResponse{} +func (x *GetFeatureTableRequest) Reset() { + *x = GetFeatureTableRequest{} if protoimpl.UnsafeEnabled { - mi := &file_feast_core_CoreService_proto_msgTypes[29] + mi := &file_feast_core_CoreService_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *RestartIngestionJobResponse) String() string { +func (x *GetFeatureTableRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RestartIngestionJobResponse) ProtoMessage() {} +func (*GetFeatureTableRequest) ProtoMessage() {} -func (x *RestartIngestionJobResponse) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_CoreService_proto_msgTypes[29] +func (x *GetFeatureTableRequest) ProtoReflect() protoreflect.Message { + mi := &file_feast_core_CoreService_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1582,38 +1222,51 @@ func (x *RestartIngestionJobResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RestartIngestionJobResponse.ProtoReflect.Descriptor instead. -func (*RestartIngestionJobResponse) Descriptor() ([]byte, []int) { - return file_feast_core_CoreService_proto_rawDescGZIP(), []int{29} +// Deprecated: Use GetFeatureTableRequest.ProtoReflect.Descriptor instead. +func (*GetFeatureTableRequest) Descriptor() ([]byte, []int) { + return file_feast_core_CoreService_proto_rawDescGZIP(), []int{23} +} + +func (x *GetFeatureTableRequest) GetProject() string { + if x != nil { + return x.Project + } + return "" +} + +func (x *GetFeatureTableRequest) GetName() string { + if x != nil { + return x.Name + } + return "" } -// Request to stop ingestion job -type StopIngestionJobRequest struct { +type GetFeatureTableResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Job ID assigned by Feast - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + // The Feature Table retrieved. + Table *FeatureTable `protobuf:"bytes,1,opt,name=table,proto3" json:"table,omitempty"` } -func (x *StopIngestionJobRequest) Reset() { - *x = StopIngestionJobRequest{} +func (x *GetFeatureTableResponse) Reset() { + *x = GetFeatureTableResponse{} if protoimpl.UnsafeEnabled { - mi := &file_feast_core_CoreService_proto_msgTypes[30] + mi := &file_feast_core_CoreService_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *StopIngestionJobRequest) String() string { +func (x *GetFeatureTableResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*StopIngestionJobRequest) ProtoMessage() {} +func (*GetFeatureTableResponse) ProtoMessage() {} -func (x *StopIngestionJobRequest) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_CoreService_proto_msgTypes[30] +func (x *GetFeatureTableResponse) ProtoReflect() protoreflect.Message { + mi := &file_feast_core_CoreService_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1624,523 +1277,16 @@ func (x *StopIngestionJobRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use StopIngestionJobRequest.ProtoReflect.Descriptor instead. -func (*StopIngestionJobRequest) Descriptor() ([]byte, []int) { - return file_feast_core_CoreService_proto_rawDescGZIP(), []int{30} +// Deprecated: Use GetFeatureTableResponse.ProtoReflect.Descriptor instead. +func (*GetFeatureTableResponse) Descriptor() ([]byte, []int) { + return file_feast_core_CoreService_proto_rawDescGZIP(), []int{24} } -func (x *StopIngestionJobRequest) GetId() string { +func (x *GetFeatureTableResponse) GetTable() *FeatureTable { if x != nil { - return x.Id + return x.Table } - return "" -} - -// Request from stopping an ingestion job -type StopIngestionJobResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *StopIngestionJobResponse) Reset() { - *x = StopIngestionJobResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_feast_core_CoreService_proto_msgTypes[31] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *StopIngestionJobResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*StopIngestionJobResponse) ProtoMessage() {} - -func (x *StopIngestionJobResponse) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_CoreService_proto_msgTypes[31] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use StopIngestionJobResponse.ProtoReflect.Descriptor instead. -func (*StopIngestionJobResponse) Descriptor() ([]byte, []int) { - return file_feast_core_CoreService_proto_rawDescGZIP(), []int{31} -} - -type GetFeatureStatisticsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Feature set to retrieve the statistics for. A fully qualified feature set - // id in the format of project/feature_set must be provided. - FeatureSetId string `protobuf:"bytes,1,opt,name=feature_set_id,json=featureSetId,proto3" json:"feature_set_id,omitempty"` - // Optional filter which filters returned statistics by selected features. These - // features must be present in the data that is being processed. - Features []string `protobuf:"bytes,2,rep,name=features,proto3" json:"features,omitempty"` - // Optional filter to select store over which the statistics will retrieved. - // Only historical stores are allowed. - Store string `protobuf:"bytes,3,opt,name=store,proto3" json:"store,omitempty"` - // Optional start and end dates over which to filter statistical data - // Start date is inclusive, but end date is not. - // Only dates are supported, not times. - // Cannot be used with dataset_ids. - // If this period spans multiple days, unaggregatable statistics will be dropped. - StartDate *timestamp.Timestamp `protobuf:"bytes,4,opt,name=start_date,json=startDate,proto3" json:"start_date,omitempty"` - EndDate *timestamp.Timestamp `protobuf:"bytes,5,opt,name=end_date,json=endDate,proto3" json:"end_date,omitempty"` - // Optional list of ingestion Ids by which to filter data before - // retrieving statistics. - // Cannot be used with the date ranges - // If multiple dataset ids are provided, unaggregatable statistics will be dropped. - IngestionIds []string `protobuf:"bytes,6,rep,name=ingestion_ids,json=ingestionIds,proto3" json:"ingestion_ids,omitempty"` - // Setting this flag to true will force a recalculation of statistics and overwrite results currently in the - // cache, if any. - ForceRefresh bool `protobuf:"varint,7,opt,name=force_refresh,json=forceRefresh,proto3" json:"force_refresh,omitempty"` -} - -func (x *GetFeatureStatisticsRequest) Reset() { - *x = GetFeatureStatisticsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_feast_core_CoreService_proto_msgTypes[32] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetFeatureStatisticsRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetFeatureStatisticsRequest) ProtoMessage() {} - -func (x *GetFeatureStatisticsRequest) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_CoreService_proto_msgTypes[32] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetFeatureStatisticsRequest.ProtoReflect.Descriptor instead. -func (*GetFeatureStatisticsRequest) Descriptor() ([]byte, []int) { - return file_feast_core_CoreService_proto_rawDescGZIP(), []int{32} -} - -func (x *GetFeatureStatisticsRequest) GetFeatureSetId() string { - if x != nil { - return x.FeatureSetId - } - return "" -} - -func (x *GetFeatureStatisticsRequest) GetFeatures() []string { - if x != nil { - return x.Features - } - return nil -} - -func (x *GetFeatureStatisticsRequest) GetStore() string { - if x != nil { - return x.Store - } - return "" -} - -func (x *GetFeatureStatisticsRequest) GetStartDate() *timestamp.Timestamp { - if x != nil { - return x.StartDate - } - return nil -} - -func (x *GetFeatureStatisticsRequest) GetEndDate() *timestamp.Timestamp { - if x != nil { - return x.EndDate - } - return nil -} - -func (x *GetFeatureStatisticsRequest) GetIngestionIds() []string { - if x != nil { - return x.IngestionIds - } - return nil -} - -func (x *GetFeatureStatisticsRequest) GetForceRefresh() bool { - if x != nil { - return x.ForceRefresh - } - return false -} - -type GetFeatureStatisticsResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Contains statistics for the requested data. - // Due to the limitations of TFDV and Facets, only a single dataset can be returned in, - // despite the message being of list type. - DatasetFeatureStatisticsList *v0.DatasetFeatureStatisticsList `protobuf:"bytes,1,opt,name=dataset_feature_statistics_list,json=datasetFeatureStatisticsList,proto3" json:"dataset_feature_statistics_list,omitempty"` -} - -func (x *GetFeatureStatisticsResponse) Reset() { - *x = GetFeatureStatisticsResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_feast_core_CoreService_proto_msgTypes[33] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetFeatureStatisticsResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetFeatureStatisticsResponse) ProtoMessage() {} - -func (x *GetFeatureStatisticsResponse) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_CoreService_proto_msgTypes[33] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetFeatureStatisticsResponse.ProtoReflect.Descriptor instead. -func (*GetFeatureStatisticsResponse) Descriptor() ([]byte, []int) { - return file_feast_core_CoreService_proto_rawDescGZIP(), []int{33} -} - -func (x *GetFeatureStatisticsResponse) GetDatasetFeatureStatisticsList() *v0.DatasetFeatureStatisticsList { - if x != nil { - return x.DatasetFeatureStatisticsList - } - return nil -} - -type UpdateFeatureSetStatusRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // FeatureSetReference of FeatureSet to update - Reference *FeatureSetReference `protobuf:"bytes,1,opt,name=reference,proto3" json:"reference,omitempty"` - // Target status - Status FeatureSetStatus `protobuf:"varint,2,opt,name=status,proto3,enum=feast.core.FeatureSetStatus" json:"status,omitempty"` -} - -func (x *UpdateFeatureSetStatusRequest) Reset() { - *x = UpdateFeatureSetStatusRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_feast_core_CoreService_proto_msgTypes[34] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *UpdateFeatureSetStatusRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*UpdateFeatureSetStatusRequest) ProtoMessage() {} - -func (x *UpdateFeatureSetStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_CoreService_proto_msgTypes[34] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use UpdateFeatureSetStatusRequest.ProtoReflect.Descriptor instead. -func (*UpdateFeatureSetStatusRequest) Descriptor() ([]byte, []int) { - return file_feast_core_CoreService_proto_rawDescGZIP(), []int{34} -} - -func (x *UpdateFeatureSetStatusRequest) GetReference() *FeatureSetReference { - if x != nil { - return x.Reference - } - return nil -} - -func (x *UpdateFeatureSetStatusRequest) GetStatus() FeatureSetStatus { - if x != nil { - return x.Status - } - return FeatureSetStatus_STATUS_INVALID -} - -type UpdateFeatureSetStatusResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *UpdateFeatureSetStatusResponse) Reset() { - *x = UpdateFeatureSetStatusResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_feast_core_CoreService_proto_msgTypes[35] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *UpdateFeatureSetStatusResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*UpdateFeatureSetStatusResponse) ProtoMessage() {} - -func (x *UpdateFeatureSetStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_CoreService_proto_msgTypes[35] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use UpdateFeatureSetStatusResponse.ProtoReflect.Descriptor instead. -func (*UpdateFeatureSetStatusResponse) Descriptor() ([]byte, []int) { - return file_feast_core_CoreService_proto_rawDescGZIP(), []int{35} -} - -type ApplyFeatureTableRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Optional. Name of the Project to apply the Feature Table to. - // If unspecified, will apply FeatureTable to the default project. - Project string `protobuf:"bytes,1,opt,name=project,proto3" json:"project,omitempty"` - // Feature Table specification to apply - TableSpec *FeatureTableSpec `protobuf:"bytes,2,opt,name=table_spec,json=tableSpec,proto3" json:"table_spec,omitempty"` -} - -func (x *ApplyFeatureTableRequest) Reset() { - *x = ApplyFeatureTableRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_feast_core_CoreService_proto_msgTypes[36] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ApplyFeatureTableRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ApplyFeatureTableRequest) ProtoMessage() {} - -func (x *ApplyFeatureTableRequest) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_CoreService_proto_msgTypes[36] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ApplyFeatureTableRequest.ProtoReflect.Descriptor instead. -func (*ApplyFeatureTableRequest) Descriptor() ([]byte, []int) { - return file_feast_core_CoreService_proto_rawDescGZIP(), []int{36} -} - -func (x *ApplyFeatureTableRequest) GetProject() string { - if x != nil { - return x.Project - } - return "" -} - -func (x *ApplyFeatureTableRequest) GetTableSpec() *FeatureTableSpec { - if x != nil { - return x.TableSpec - } - return nil -} - -type ApplyFeatureTableResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Table *FeatureTable `protobuf:"bytes,1,opt,name=table,proto3" json:"table,omitempty"` -} - -func (x *ApplyFeatureTableResponse) Reset() { - *x = ApplyFeatureTableResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_feast_core_CoreService_proto_msgTypes[37] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ApplyFeatureTableResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ApplyFeatureTableResponse) ProtoMessage() {} - -func (x *ApplyFeatureTableResponse) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_CoreService_proto_msgTypes[37] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ApplyFeatureTableResponse.ProtoReflect.Descriptor instead. -func (*ApplyFeatureTableResponse) Descriptor() ([]byte, []int) { - return file_feast_core_CoreService_proto_rawDescGZIP(), []int{37} -} - -func (x *ApplyFeatureTableResponse) GetTable() *FeatureTable { - if x != nil { - return x.Table - } - return nil -} - -type GetFeatureTableRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Optional. Name of the Project to retrieve the Feature Table from. - // If unspecified, will apply FeatureTable to the default project. - Project string `protobuf:"bytes,1,opt,name=project,proto3" json:"project,omitempty"` - // Name of the FeatureTable to retrieve. - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` -} - -func (x *GetFeatureTableRequest) Reset() { - *x = GetFeatureTableRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_feast_core_CoreService_proto_msgTypes[38] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetFeatureTableRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetFeatureTableRequest) ProtoMessage() {} - -func (x *GetFeatureTableRequest) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_CoreService_proto_msgTypes[38] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetFeatureTableRequest.ProtoReflect.Descriptor instead. -func (*GetFeatureTableRequest) Descriptor() ([]byte, []int) { - return file_feast_core_CoreService_proto_rawDescGZIP(), []int{38} -} - -func (x *GetFeatureTableRequest) GetProject() string { - if x != nil { - return x.Project - } - return "" -} - -func (x *GetFeatureTableRequest) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -type GetFeatureTableResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The Feature Table retrieved. - Table *FeatureTable `protobuf:"bytes,1,opt,name=table,proto3" json:"table,omitempty"` -} - -func (x *GetFeatureTableResponse) Reset() { - *x = GetFeatureTableResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_feast_core_CoreService_proto_msgTypes[39] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetFeatureTableResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetFeatureTableResponse) ProtoMessage() {} - -func (x *GetFeatureTableResponse) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_CoreService_proto_msgTypes[39] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetFeatureTableResponse.ProtoReflect.Descriptor instead. -func (*GetFeatureTableResponse) Descriptor() ([]byte, []int) { - return file_feast_core_CoreService_proto_rawDescGZIP(), []int{39} -} - -func (x *GetFeatureTableResponse) GetTable() *FeatureTable { - if x != nil { - return x.Table - } - return nil + return nil } type ListFeatureTablesRequest struct { @@ -2155,7 +1301,7 @@ type ListFeatureTablesRequest struct { func (x *ListFeatureTablesRequest) Reset() { *x = ListFeatureTablesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_feast_core_CoreService_proto_msgTypes[40] + mi := &file_feast_core_CoreService_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2168,7 +1314,7 @@ func (x *ListFeatureTablesRequest) String() string { func (*ListFeatureTablesRequest) ProtoMessage() {} func (x *ListFeatureTablesRequest) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_CoreService_proto_msgTypes[40] + mi := &file_feast_core_CoreService_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2181,7 +1327,7 @@ func (x *ListFeatureTablesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListFeatureTablesRequest.ProtoReflect.Descriptor instead. func (*ListFeatureTablesRequest) Descriptor() ([]byte, []int) { - return file_feast_core_CoreService_proto_rawDescGZIP(), []int{40} + return file_feast_core_CoreService_proto_rawDescGZIP(), []int{25} } func (x *ListFeatureTablesRequest) GetFilter() *ListFeatureTablesRequest_Filter { @@ -2203,7 +1349,7 @@ type ListFeatureTablesResponse struct { func (x *ListFeatureTablesResponse) Reset() { *x = ListFeatureTablesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_feast_core_CoreService_proto_msgTypes[41] + mi := &file_feast_core_CoreService_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2216,7 +1362,7 @@ func (x *ListFeatureTablesResponse) String() string { func (*ListFeatureTablesResponse) ProtoMessage() {} func (x *ListFeatureTablesResponse) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_CoreService_proto_msgTypes[41] + mi := &file_feast_core_CoreService_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2229,7 +1375,7 @@ func (x *ListFeatureTablesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListFeatureTablesResponse.ProtoReflect.Descriptor instead. func (*ListFeatureTablesResponse) Descriptor() ([]byte, []int) { - return file_feast_core_CoreService_proto_rawDescGZIP(), []int{41} + return file_feast_core_CoreService_proto_rawDescGZIP(), []int{26} } func (x *ListFeatureTablesResponse) GetTables() []*FeatureTable { @@ -2239,52 +1385,35 @@ func (x *ListFeatureTablesResponse) GetTables() []*FeatureTable { return nil } -type ListFeatureSetsRequest_Filter struct { +type DeleteFeatureTableRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Name of project that the feature sets belongs to. This can be one of - // - [project_name] - // - * - // If an asterisk is provided, filtering on projects will be disabled. All projects will - // be matched. It is NOT possible to provide an asterisk with a string in order to do - // pattern matching. - // If unspecified this field will default to the default project 'default'. - Project string `protobuf:"bytes,3,opt,name=project,proto3" json:"project,omitempty"` - // Name of the desired feature set. Asterisks can be used as wildcards in the name. - // Matching on names is only permitted if a specific project is defined. It is disallowed - // If the project name is set to "*" - // e.g. - // - * can be used to match all feature sets - // - my-feature-set* can be used to match all features prefixed by "my-feature-set" - // - my-feature-set-6 can be used to select a single feature set - FeatureSetName string `protobuf:"bytes,1,opt,name=feature_set_name,json=featureSetName,proto3" json:"feature_set_name,omitempty"` - // User defined metadata for feature set. - // Feature sets with all matching labels will be returned. - Labels map[string]string `protobuf:"bytes,4,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - // Filter by FeatureSet's current status - // Project and Feature Set name still must be specified (could be "*") - Status FeatureSetStatus `protobuf:"varint,5,opt,name=status,proto3,enum=feast.core.FeatureSetStatus" json:"status,omitempty"` + // Optional. Name of the Project to delete the Feature Table from. + // If unspecified, will delete FeatureTable from the default project. + Project string `protobuf:"bytes,1,opt,name=project,proto3" json:"project,omitempty"` + // Name of the FeatureTable to delete. + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` } -func (x *ListFeatureSetsRequest_Filter) Reset() { - *x = ListFeatureSetsRequest_Filter{} +func (x *DeleteFeatureTableRequest) Reset() { + *x = DeleteFeatureTableRequest{} if protoimpl.UnsafeEnabled { - mi := &file_feast_core_CoreService_proto_msgTypes[42] + mi := &file_feast_core_CoreService_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListFeatureSetsRequest_Filter) String() string { +func (x *DeleteFeatureTableRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListFeatureSetsRequest_Filter) ProtoMessage() {} +func (*DeleteFeatureTableRequest) ProtoMessage() {} -func (x *ListFeatureSetsRequest_Filter) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_CoreService_proto_msgTypes[42] +func (x *DeleteFeatureTableRequest) ProtoReflect() protoreflect.Message { + mi := &file_feast_core_CoreService_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2295,37 +1424,61 @@ func (x *ListFeatureSetsRequest_Filter) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListFeatureSetsRequest_Filter.ProtoReflect.Descriptor instead. -func (*ListFeatureSetsRequest_Filter) Descriptor() ([]byte, []int) { - return file_feast_core_CoreService_proto_rawDescGZIP(), []int{2, 0} +// Deprecated: Use DeleteFeatureTableRequest.ProtoReflect.Descriptor instead. +func (*DeleteFeatureTableRequest) Descriptor() ([]byte, []int) { + return file_feast_core_CoreService_proto_rawDescGZIP(), []int{27} } -func (x *ListFeatureSetsRequest_Filter) GetProject() string { +func (x *DeleteFeatureTableRequest) GetProject() string { if x != nil { return x.Project } return "" } -func (x *ListFeatureSetsRequest_Filter) GetFeatureSetName() string { +func (x *DeleteFeatureTableRequest) GetName() string { if x != nil { - return x.FeatureSetName + return x.Name } return "" } -func (x *ListFeatureSetsRequest_Filter) GetLabels() map[string]string { - if x != nil { - return x.Labels +type DeleteFeatureTableResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *DeleteFeatureTableResponse) Reset() { + *x = DeleteFeatureTableResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_feast_core_CoreService_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -func (x *ListFeatureSetsRequest_Filter) GetStatus() FeatureSetStatus { - if x != nil { - return x.Status +func (x *DeleteFeatureTableResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteFeatureTableResponse) ProtoMessage() {} + +func (x *DeleteFeatureTableResponse) ProtoReflect() protoreflect.Message { + mi := &file_feast_core_CoreService_proto_msgTypes[28] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return FeatureSetStatus_STATUS_INVALID + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteFeatureTableResponse.ProtoReflect.Descriptor instead. +func (*DeleteFeatureTableResponse) Descriptor() ([]byte, []int) { + return file_feast_core_CoreService_proto_rawDescGZIP(), []int{28} } type ListEntitiesRequest_Filter struct { @@ -2345,7 +1498,7 @@ type ListEntitiesRequest_Filter struct { func (x *ListEntitiesRequest_Filter) Reset() { *x = ListEntitiesRequest_Filter{} if protoimpl.UnsafeEnabled { - mi := &file_feast_core_CoreService_proto_msgTypes[44] + mi := &file_feast_core_CoreService_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2358,7 +1511,7 @@ func (x *ListEntitiesRequest_Filter) String() string { func (*ListEntitiesRequest_Filter) ProtoMessage() {} func (x *ListEntitiesRequest_Filter) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_CoreService_proto_msgTypes[44] + mi := &file_feast_core_CoreService_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2371,7 +1524,7 @@ func (x *ListEntitiesRequest_Filter) ProtoReflect() protoreflect.Message { // Deprecated: Use ListEntitiesRequest_Filter.ProtoReflect.Descriptor instead. func (*ListEntitiesRequest_Filter) Descriptor() ([]byte, []int) { - return file_feast_core_CoreService_proto_rawDescGZIP(), []int{6, 0} + return file_feast_core_CoreService_proto_rawDescGZIP(), []int{2, 0} } func (x *ListEntitiesRequest_Filter) GetProject() string { @@ -2397,9 +1550,9 @@ type ListFeaturesRequest_Filter struct { // Features with all matching labels will be returned. Labels map[string]string `protobuf:"bytes,1,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // List of entities contained within the featureSet that the feature belongs to. - // Only feature sets with these entities will be searched for features. + // Only feature tables with these entities will be searched for features. Entities []string `protobuf:"bytes,2,rep,name=entities,proto3" json:"entities,omitempty"` - // Name of project that the feature sets belongs to. Filtering on projects is disabled. + // Name of project that the feature tables belongs to. Filtering on projects is disabled. // It is NOT possible to provide an asterisk with a string in order to do pattern matching. // If unspecified this field will default to the default project 'default'. Project string `protobuf:"bytes,3,opt,name=project,proto3" json:"project,omitempty"` @@ -2408,7 +1561,7 @@ type ListFeaturesRequest_Filter struct { func (x *ListFeaturesRequest_Filter) Reset() { *x = ListFeaturesRequest_Filter{} if protoimpl.UnsafeEnabled { - mi := &file_feast_core_CoreService_proto_msgTypes[46] + mi := &file_feast_core_CoreService_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2421,7 +1574,7 @@ func (x *ListFeaturesRequest_Filter) String() string { func (*ListFeaturesRequest_Filter) ProtoMessage() {} func (x *ListFeaturesRequest_Filter) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_CoreService_proto_msgTypes[46] + mi := &file_feast_core_CoreService_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2434,108 +1587,56 @@ func (x *ListFeaturesRequest_Filter) ProtoReflect() protoreflect.Message { // Deprecated: Use ListFeaturesRequest_Filter.ProtoReflect.Descriptor instead. func (*ListFeaturesRequest_Filter) Descriptor() ([]byte, []int) { - return file_feast_core_CoreService_proto_rawDescGZIP(), []int{8, 0} + return file_feast_core_CoreService_proto_rawDescGZIP(), []int{4, 0} } func (x *ListFeaturesRequest_Filter) GetLabels() map[string]string { if x != nil { return x.Labels } - return nil -} - -func (x *ListFeaturesRequest_Filter) GetEntities() []string { - if x != nil { - return x.Entities - } - return nil -} - -func (x *ListFeaturesRequest_Filter) GetProject() string { - if x != nil { - return x.Project - } - return "" -} - -type ListStoresRequest_Filter struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Name of desired store. Regex is not supported in this query. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` -} - -func (x *ListStoresRequest_Filter) Reset() { - *x = ListStoresRequest_Filter{} - if protoimpl.UnsafeEnabled { - mi := &file_feast_core_CoreService_proto_msgTypes[49] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ListStoresRequest_Filter) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ListStoresRequest_Filter) ProtoMessage() {} - -func (x *ListStoresRequest_Filter) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_CoreService_proto_msgTypes[49] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) + return nil } -// Deprecated: Use ListStoresRequest_Filter.ProtoReflect.Descriptor instead. -func (*ListStoresRequest_Filter) Descriptor() ([]byte, []int) { - return file_feast_core_CoreService_proto_rawDescGZIP(), []int{10, 0} +func (x *ListFeaturesRequest_Filter) GetEntities() []string { + if x != nil { + return x.Entities + } + return nil } -func (x *ListStoresRequest_Filter) GetName() string { +func (x *ListFeaturesRequest_Filter) GetProject() string { if x != nil { - return x.Name + return x.Project } return "" } -type ListIngestionJobsRequest_Filter struct { +type ListStoresRequest_Filter struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Filter by Job ID assigned by Feast - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - // Filter by ingestion job target feature set. - FeatureSetReference *FeatureSetReference `protobuf:"bytes,2,opt,name=feature_set_reference,json=featureSetReference,proto3" json:"feature_set_reference,omitempty"` - // Filter by Name of store - StoreName string `protobuf:"bytes,3,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + // Name of desired store. Regex is not supported in this query. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` } -func (x *ListIngestionJobsRequest_Filter) Reset() { - *x = ListIngestionJobsRequest_Filter{} +func (x *ListStoresRequest_Filter) Reset() { + *x = ListStoresRequest_Filter{} if protoimpl.UnsafeEnabled { - mi := &file_feast_core_CoreService_proto_msgTypes[50] + mi := &file_feast_core_CoreService_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListIngestionJobsRequest_Filter) String() string { +func (x *ListStoresRequest_Filter) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListIngestionJobsRequest_Filter) ProtoMessage() {} +func (*ListStoresRequest_Filter) ProtoMessage() {} -func (x *ListIngestionJobsRequest_Filter) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_CoreService_proto_msgTypes[50] +func (x *ListStoresRequest_Filter) ProtoReflect() protoreflect.Message { + mi := &file_feast_core_CoreService_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2546,28 +1647,14 @@ func (x *ListIngestionJobsRequest_Filter) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListIngestionJobsRequest_Filter.ProtoReflect.Descriptor instead. -func (*ListIngestionJobsRequest_Filter) Descriptor() ([]byte, []int) { - return file_feast_core_CoreService_proto_rawDescGZIP(), []int{26, 0} -} - -func (x *ListIngestionJobsRequest_Filter) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *ListIngestionJobsRequest_Filter) GetFeatureSetReference() *FeatureSetReference { - if x != nil { - return x.FeatureSetReference - } - return nil +// Deprecated: Use ListStoresRequest_Filter.ProtoReflect.Descriptor instead. +func (*ListStoresRequest_Filter) Descriptor() ([]byte, []int) { + return file_feast_core_CoreService_proto_rawDescGZIP(), []int{6, 0} } -func (x *ListIngestionJobsRequest_Filter) GetStoreName() string { +func (x *ListStoresRequest_Filter) GetName() string { if x != nil { - return x.StoreName + return x.Name } return "" } @@ -2588,7 +1675,7 @@ type ListFeatureTablesRequest_Filter struct { func (x *ListFeatureTablesRequest_Filter) Reset() { *x = ListFeatureTablesRequest_Filter{} if protoimpl.UnsafeEnabled { - mi := &file_feast_core_CoreService_proto_msgTypes[51] + mi := &file_feast_core_CoreService_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2601,7 +1688,7 @@ func (x *ListFeatureTablesRequest_Filter) String() string { func (*ListFeatureTablesRequest_Filter) ProtoMessage() {} func (x *ListFeatureTablesRequest_Filter) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_CoreService_proto_msgTypes[51] + mi := &file_feast_core_CoreService_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2614,7 +1701,7 @@ func (x *ListFeatureTablesRequest_Filter) ProtoReflect() protoreflect.Message { // Deprecated: Use ListFeatureTablesRequest_Filter.ProtoReflect.Descriptor instead. func (*ListFeatureTablesRequest_Filter) Descriptor() ([]byte, []int) { - return file_feast_core_CoreService_proto_rawDescGZIP(), []int{40, 0} + return file_feast_core_CoreService_proto_rawDescGZIP(), []int{25, 0} } func (x *ListFeatureTablesRequest_Filter) GetProject() string { @@ -2643,427 +1730,261 @@ var file_feast_core_CoreService_proto_rawDesc = []byte{ 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x76, 0x30, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, - 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x1a, 0x1d, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x46, 0x65, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, - 0x16, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x53, 0x74, 0x6f, 0x72, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x24, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2f, 0x63, - 0x6f, 0x72, 0x65, 0x2f, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x66, - 0x65, 0x61, 0x73, 0x74, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, - 0x69, 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x44, 0x0a, 0x14, - 0x47, 0x65, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x22, 0x50, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x66, - 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x16, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x46, 0x65, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x52, 0x0a, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x53, 0x65, 0x74, 0x22, 0xea, 0x02, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x41, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x29, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x1a, 0x8c, 0x02, 0x0a, 0x06, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x18, 0x0a, - 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x66, 0x65, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x4d, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x35, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x73, 0x52, 0x65, + 0x6f, 0x74, 0x6f, 0x1a, 0x18, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, + 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x66, + 0x65, 0x61, 0x73, 0x74, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x16, 0x66, 0x65, + 0x61, 0x73, 0x74, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x40, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x3f, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x66, 0x65, + 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, + 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x22, 0x81, 0x02, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, + 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x3e, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x26, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x1a, + 0xa9, 0x01, 0x0a, 0x06, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x12, 0x4a, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, + 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, - 0x12, 0x34, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x1c, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x46, 0x65, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x54, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x53, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x0c, - 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, - 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x52, 0x0b, 0x66, 0x65, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x73, 0x22, 0x40, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x45, 0x6e, - 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x3f, 0x0a, 0x11, 0x47, 0x65, 0x74, - 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, - 0x0a, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, - 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x45, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x52, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x22, 0x81, 0x02, 0x0a, 0x13, 0x4c, - 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x1a, 0xa9, 0x01, 0x0a, 0x06, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x18, 0x0a, - 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x4a, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, - 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, - 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, - 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, 0x61, 0x62, - 0x65, 0x6c, 0x73, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x46, - 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x08, 0x65, 0x6e, - 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x22, 0x9d, 0x02, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x46, - 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3e, - 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, + 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x46, 0x0a, 0x14, 0x4c, + 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, + 0x72, 0x65, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x08, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x69, 0x65, 0x73, 0x22, 0x9d, 0x02, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x06, 0x66, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x66, 0x65, + 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x1a, 0xc5, 0x01, 0x0a, 0x06, + 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x4a, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, + 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x4c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x18, + 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0xc0, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4a, 0x0a, 0x08, + 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, - 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x1a, 0xc5, - 0x01, 0x0a, 0x06, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x4a, 0x0a, 0x06, 0x6c, 0x61, 0x62, - 0x65, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x66, 0x65, 0x61, 0x73, - 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, + 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, + 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x1a, 0x56, 0x0a, 0x0d, 0x46, 0x65, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x66, 0x65, 0x61, + 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, + 0x70, 0x65, 0x63, 0x56, 0x32, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x22, 0x6f, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, + 0x6f, 0x72, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x06, 0x66, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x66, 0x65, + 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, - 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, - 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, - 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb8, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x46, - 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x4a, 0x0a, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2e, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x1a, 0x54, 0x0a, 0x0d, 0x46, - 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x6f, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, - 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, 0x66, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x1a, 0x1c, 0x0a, 0x06, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x22, 0x3d, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x05, 0x73, 0x74, 0x6f, 0x72, - 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, - 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x05, 0x73, 0x74, 0x6f, 0x72, - 0x65, 0x22, 0x5c, 0x0a, 0x12, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, - 0x72, 0x65, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x53, 0x70, 0x65, 0x63, 0x56, 0x32, 0x52, - 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, - 0x41, 0x0a, 0x13, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, - 0x6f, 0x72, 0x65, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x06, 0x65, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x22, 0x51, 0x0a, 0x16, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x46, 0x65, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x0b, - 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x16, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x46, - 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x52, 0x0a, 0x66, 0x65, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x53, 0x65, 0x74, 0x22, 0xd4, 0x01, 0x0a, 0x17, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x46, - 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x73, 0x65, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, - 0x6f, 0x72, 0x65, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x52, 0x0a, - 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x12, 0x42, 0x0a, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x66, 0x65, 0x61, - 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x46, 0x65, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x3c, + 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x1a, 0x1c, 0x0a, 0x06, 0x46, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3d, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x53, + 0x74, 0x6f, 0x72, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, + 0x05, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x66, + 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, + 0x05, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x22, 0x5c, 0x0a, 0x12, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x45, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x04, + 0x73, 0x70, 0x65, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x66, 0x65, 0x61, + 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x53, 0x70, + 0x65, 0x63, 0x56, 0x32, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x22, 0x41, 0x0a, 0x13, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x45, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x66, 0x65, + 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, + 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x22, 0x1c, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x46, 0x65, + 0x61, 0x73, 0x74, 0x43, 0x6f, 0x72, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x37, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x46, 0x65, 0x61, 0x73, + 0x74, 0x43, 0x6f, 0x72, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3d, + 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x05, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x05, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x22, 0xa4, 0x01, + 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x05, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, + 0x65, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x05, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x3e, + 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, + 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x24, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x4f, 0x5f, 0x43, - 0x48, 0x41, 0x4e, 0x47, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x52, 0x45, 0x41, 0x54, - 0x45, 0x44, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x02, 0x12, - 0x0b, 0x0a, 0x07, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, 0x03, 0x22, 0x1c, 0x0a, 0x1a, - 0x47, 0x65, 0x74, 0x46, 0x65, 0x61, 0x73, 0x74, 0x43, 0x6f, 0x72, 0x65, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x37, 0x0a, 0x1b, 0x47, 0x65, - 0x74, 0x46, 0x65, 0x61, 0x73, 0x74, 0x43, 0x6f, 0x72, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x22, 0x3d, 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, - 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x05, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x05, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x22, 0xa4, 0x01, 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, - 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x05, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x66, 0x65, 0x61, 0x73, - 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x05, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x12, 0x3e, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x22, 0x24, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0d, 0x0a, - 0x09, 0x4e, 0x4f, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, - 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, 0x01, 0x22, 0x2a, 0x0a, 0x14, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x17, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, - 0x0a, 0x15, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x18, 0x0a, 0x16, 0x41, - 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x32, 0x0a, 0x14, - 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, - 0x22, 0xee, 0x01, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, - 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x43, 0x0a, - 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, - 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, - 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x1a, 0x8c, 0x01, 0x0a, 0x06, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x53, 0x0a, - 0x15, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x72, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x66, + 0x48, 0x41, 0x4e, 0x47, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x50, 0x44, 0x41, 0x54, + 0x45, 0x44, 0x10, 0x01, 0x22, 0x2a, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0x17, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x0a, 0x15, 0x41, 0x72, 0x63, + 0x68, 0x69, 0x76, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x18, 0x0a, 0x16, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, + 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x15, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x32, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x50, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, 0x20, 0x0a, 0x1e, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x71, 0x0a, + 0x18, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x12, 0x3b, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x70, 0x65, + 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, + 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, + 0x22, 0x4b, 0x0a, 0x19, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, + 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x13, 0x66, - 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, - 0x65, 0x22, 0x49, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, - 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, - 0x0a, 0x04, 0x6a, 0x6f, 0x62, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x66, - 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, - 0x69, 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x52, 0x04, 0x6a, 0x6f, 0x62, 0x73, 0x22, 0x2c, 0x0a, 0x1a, - 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, - 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x1d, 0x0a, 0x1b, 0x52, 0x65, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x6f, - 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x0a, 0x17, 0x53, 0x74, 0x6f, - 0x70, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x22, 0x1a, 0x0a, 0x18, 0x53, 0x74, 0x6f, 0x70, 0x49, 0x6e, 0x67, 0x65, - 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0xb1, 0x02, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, - 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x24, 0x0a, 0x0e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x53, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x44, - 0x61, 0x74, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x44, 0x61, 0x74, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, - 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x12, - 0x23, 0x0a, 0x0d, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, - 0x72, 0x65, 0x73, 0x68, 0x22, 0x9b, 0x01, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x46, 0x65, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7b, 0x0a, 0x1f, 0x64, 0x61, 0x74, 0x61, 0x73, 0x65, 0x74, - 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, - 0x69, 0x63, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, - 0x2e, 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x6d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x30, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x73, 0x65, 0x74, 0x46, - 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x1c, 0x64, 0x61, 0x74, 0x61, 0x73, 0x65, 0x74, 0x46, 0x65, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x4c, 0x69, - 0x73, 0x74, 0x22, 0x94, 0x01, 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x65, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x3d, 0x0a, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, - 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x52, - 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x12, 0x34, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x20, 0x0a, 0x1e, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x71, 0x0a, 0x18, 0x41, - 0x70, 0x70, 0x6c, 0x79, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x46, 0x0a, + 0x16, 0x47, 0x65, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x12, 0x3b, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, - 0x72, 0x65, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x53, - 0x70, 0x65, 0x63, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 0x22, 0x4b, - 0x0a, 0x19, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x66, 0x65, 0x61, - 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x46, 0x0a, 0x16, 0x47, - 0x65, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x22, 0x49, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, - 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x90, - 0x02, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x43, 0x0a, 0x06, 0x66, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x66, 0x65, - 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x1a, 0xae, 0x01, 0x0a, 0x06, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x4f, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, - 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, - 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x4d, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, - 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x46, 0x65, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, - 0x32, 0xde, 0x0c, 0x0a, 0x0b, 0x43, 0x6f, 0x72, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x12, 0x66, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x46, 0x65, 0x61, 0x73, 0x74, 0x43, 0x6f, 0x72, 0x65, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, - 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x61, 0x73, 0x74, 0x43, 0x6f, 0x72, - 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x27, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, - 0x46, 0x65, 0x61, 0x73, 0x74, 0x43, 0x6f, 0x72, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x54, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x46, - 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x12, 0x20, 0x2e, 0x66, 0x65, 0x61, 0x73, - 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x66, 0x65, - 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, - 0x0a, 0x09, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x2e, 0x66, 0x65, - 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x65, 0x61, 0x73, - 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5a, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, - 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x73, 0x12, 0x22, 0x2e, 0x66, 0x65, - 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x23, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x51, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x73, 0x12, 0x1f, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, - 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, - 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x69, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x46, 0x65, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, - 0x27, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, - 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x4b, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x73, - 0x12, 0x1d, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1e, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x5a, 0x0a, 0x0f, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, - 0x65, 0x74, 0x12, 0x22, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, - 0x41, 0x70, 0x70, 0x6c, 0x79, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, - 0x6f, 0x72, 0x65, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x0b, 0x41, - 0x70, 0x70, 0x6c, 0x79, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x1e, 0x2e, 0x66, 0x65, 0x61, - 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x45, 0x6e, 0x74, - 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x66, 0x65, 0x61, - 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x45, 0x6e, 0x74, - 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x51, 0x0a, 0x0c, 0x4c, - 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x1f, 0x2e, 0x66, 0x65, - 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, - 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x66, - 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, - 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, - 0x0a, 0x0b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x1e, 0x2e, - 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, - 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x54, - 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, - 0x20, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x21, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x57, 0x0a, 0x0e, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x50, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x21, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, - 0x6f, 0x72, 0x65, 0x2e, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x66, 0x65, 0x61, 0x73, - 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x50, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x51, 0x0a, - 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x1f, 0x2e, - 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x49, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x46, 0x65, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x18, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x46, 0x65, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x22, 0x90, 0x02, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x43, 0x0a, + 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, + 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, + 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x1a, 0xae, 0x01, 0x0a, 0x06, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x18, 0x0a, + 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x4f, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, + 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0x4d, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x30, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x18, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x46, 0x65, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x73, 0x22, 0x49, 0x0a, 0x19, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x65, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1c, 0x0a, + 0x1a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xd9, 0x09, 0x0a, 0x0b, + 0x43, 0x6f, 0x72, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x66, 0x0a, 0x13, 0x47, + 0x65, 0x74, 0x46, 0x65, 0x61, 0x73, 0x74, 0x43, 0x6f, 0x72, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x47, 0x65, 0x74, 0x46, 0x65, 0x61, 0x73, 0x74, 0x43, 0x6f, 0x72, 0x65, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x66, 0x65, 0x61, + 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x61, 0x73, 0x74, + 0x43, 0x6f, 0x72, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x12, 0x1c, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x47, 0x65, + 0x74, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, + 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x45, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x51, 0x0a, + 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x1f, 0x2e, + 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, + 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, + 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x4b, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x1d, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x6f, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x29, 0x2e, 0x66, 0x65, 0x61, - 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x65, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, - 0x72, 0x65, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x60, 0x0a, 0x11, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x24, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, - 0x6f, 0x72, 0x65, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x66, - 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x46, - 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x60, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, + 0x53, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, + 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, + 0x74, 0x6f, 0x72, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, + 0x0b, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x1e, 0x2e, 0x66, + 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x45, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x66, + 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x45, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x51, 0x0a, + 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x1f, 0x2e, + 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, + 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5a, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x46, 0x65, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x22, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x66, - 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x32, 0xbf, 0x02, 0x0a, 0x14, 0x4a, 0x6f, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x6c, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x60, 0x0a, 0x11, 0x4c, 0x69, - 0x73, 0x74, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x73, 0x12, - 0x24, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, - 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, - 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x66, 0x0a, 0x13, - 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, - 0x4a, 0x6f, 0x62, 0x12, 0x26, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, - 0x6e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x66, 0x65, - 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5d, 0x0a, 0x10, 0x53, 0x74, 0x6f, 0x70, 0x49, 0x6e, 0x67, 0x65, - 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x12, 0x23, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, - 0x69, 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, - 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x49, - 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x42, 0x59, 0x0a, 0x10, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x42, 0x10, 0x43, 0x6f, 0x72, 0x65, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2d, 0x64, 0x65, 0x76, 0x2f, - 0x66, 0x65, 0x61, 0x73, 0x74, 0x2f, 0x73, 0x64, 0x6b, 0x2f, 0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x73, 0x2f, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x4e, 0x0a, 0x0b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x12, + 0x1e, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1f, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x54, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x12, 0x20, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x57, 0x0a, 0x0e, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, + 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x21, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, + 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x50, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x66, 0x65, + 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, + 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x51, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, + 0x1f, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x20, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x60, 0x0a, 0x11, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x46, 0x65, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x24, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, + 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, + 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, + 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x60, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x66, 0x65, 0x61, 0x73, + 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x25, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5a, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x46, 0x65, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x22, 0x2e, 0x66, 0x65, 0x61, 0x73, + 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, + 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x65, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x63, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x65, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x25, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, + 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x65, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x26, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x59, 0x0a, 0x10, 0x66, 0x65, 0x61, 0x73, 0x74, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x42, 0x10, 0x43, 0x6f, 0x72, + 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x5a, 0x33, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2d, + 0x64, 0x65, 0x76, 0x2f, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2f, 0x73, 0x64, 0x6b, 0x2f, 0x67, 0x6f, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2f, 0x63, 0x6f, + 0x72, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -3078,162 +1999,109 @@ func file_feast_core_CoreService_proto_rawDescGZIP() []byte { return file_feast_core_CoreService_proto_rawDescData } -var file_feast_core_CoreService_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_feast_core_CoreService_proto_msgTypes = make([]protoimpl.MessageInfo, 53) +var file_feast_core_CoreService_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_feast_core_CoreService_proto_msgTypes = make([]protoimpl.MessageInfo, 37) var file_feast_core_CoreService_proto_goTypes = []interface{}{ - (ApplyFeatureSetResponse_Status)(0), // 0: feast.core.ApplyFeatureSetResponse.Status - (UpdateStoreResponse_Status)(0), // 1: feast.core.UpdateStoreResponse.Status - (*GetFeatureSetRequest)(nil), // 2: feast.core.GetFeatureSetRequest - (*GetFeatureSetResponse)(nil), // 3: feast.core.GetFeatureSetResponse - (*ListFeatureSetsRequest)(nil), // 4: feast.core.ListFeatureSetsRequest - (*ListFeatureSetsResponse)(nil), // 5: feast.core.ListFeatureSetsResponse - (*GetEntityRequest)(nil), // 6: feast.core.GetEntityRequest - (*GetEntityResponse)(nil), // 7: feast.core.GetEntityResponse - (*ListEntitiesRequest)(nil), // 8: feast.core.ListEntitiesRequest - (*ListEntitiesResponse)(nil), // 9: feast.core.ListEntitiesResponse - (*ListFeaturesRequest)(nil), // 10: feast.core.ListFeaturesRequest - (*ListFeaturesResponse)(nil), // 11: feast.core.ListFeaturesResponse - (*ListStoresRequest)(nil), // 12: feast.core.ListStoresRequest - (*ListStoresResponse)(nil), // 13: feast.core.ListStoresResponse - (*ApplyEntityRequest)(nil), // 14: feast.core.ApplyEntityRequest - (*ApplyEntityResponse)(nil), // 15: feast.core.ApplyEntityResponse - (*ApplyFeatureSetRequest)(nil), // 16: feast.core.ApplyFeatureSetRequest - (*ApplyFeatureSetResponse)(nil), // 17: feast.core.ApplyFeatureSetResponse - (*GetFeastCoreVersionRequest)(nil), // 18: feast.core.GetFeastCoreVersionRequest - (*GetFeastCoreVersionResponse)(nil), // 19: feast.core.GetFeastCoreVersionResponse - (*UpdateStoreRequest)(nil), // 20: feast.core.UpdateStoreRequest - (*UpdateStoreResponse)(nil), // 21: feast.core.UpdateStoreResponse - (*CreateProjectRequest)(nil), // 22: feast.core.CreateProjectRequest - (*CreateProjectResponse)(nil), // 23: feast.core.CreateProjectResponse - (*ArchiveProjectRequest)(nil), // 24: feast.core.ArchiveProjectRequest - (*ArchiveProjectResponse)(nil), // 25: feast.core.ArchiveProjectResponse - (*ListProjectsRequest)(nil), // 26: feast.core.ListProjectsRequest - (*ListProjectsResponse)(nil), // 27: feast.core.ListProjectsResponse - (*ListIngestionJobsRequest)(nil), // 28: feast.core.ListIngestionJobsRequest - (*ListIngestionJobsResponse)(nil), // 29: feast.core.ListIngestionJobsResponse - (*RestartIngestionJobRequest)(nil), // 30: feast.core.RestartIngestionJobRequest - (*RestartIngestionJobResponse)(nil), // 31: feast.core.RestartIngestionJobResponse - (*StopIngestionJobRequest)(nil), // 32: feast.core.StopIngestionJobRequest - (*StopIngestionJobResponse)(nil), // 33: feast.core.StopIngestionJobResponse - (*GetFeatureStatisticsRequest)(nil), // 34: feast.core.GetFeatureStatisticsRequest - (*GetFeatureStatisticsResponse)(nil), // 35: feast.core.GetFeatureStatisticsResponse - (*UpdateFeatureSetStatusRequest)(nil), // 36: feast.core.UpdateFeatureSetStatusRequest - (*UpdateFeatureSetStatusResponse)(nil), // 37: feast.core.UpdateFeatureSetStatusResponse - (*ApplyFeatureTableRequest)(nil), // 38: feast.core.ApplyFeatureTableRequest - (*ApplyFeatureTableResponse)(nil), // 39: feast.core.ApplyFeatureTableResponse - (*GetFeatureTableRequest)(nil), // 40: feast.core.GetFeatureTableRequest - (*GetFeatureTableResponse)(nil), // 41: feast.core.GetFeatureTableResponse - (*ListFeatureTablesRequest)(nil), // 42: feast.core.ListFeatureTablesRequest - (*ListFeatureTablesResponse)(nil), // 43: feast.core.ListFeatureTablesResponse - (*ListFeatureSetsRequest_Filter)(nil), // 44: feast.core.ListFeatureSetsRequest.Filter - nil, // 45: feast.core.ListFeatureSetsRequest.Filter.LabelsEntry - (*ListEntitiesRequest_Filter)(nil), // 46: feast.core.ListEntitiesRequest.Filter - nil, // 47: feast.core.ListEntitiesRequest.Filter.LabelsEntry - (*ListFeaturesRequest_Filter)(nil), // 48: feast.core.ListFeaturesRequest.Filter - nil, // 49: feast.core.ListFeaturesRequest.Filter.LabelsEntry - nil, // 50: feast.core.ListFeaturesResponse.FeaturesEntry - (*ListStoresRequest_Filter)(nil), // 51: feast.core.ListStoresRequest.Filter - (*ListIngestionJobsRequest_Filter)(nil), // 52: feast.core.ListIngestionJobsRequest.Filter - (*ListFeatureTablesRequest_Filter)(nil), // 53: feast.core.ListFeatureTablesRequest.Filter - nil, // 54: feast.core.ListFeatureTablesRequest.Filter.LabelsEntry - (*FeatureSet)(nil), // 55: feast.core.FeatureSet - (*Entity)(nil), // 56: feast.core.Entity - (*Store)(nil), // 57: feast.core.Store - (*EntitySpecV2)(nil), // 58: feast.core.EntitySpecV2 - (*IngestionJob)(nil), // 59: feast.core.IngestionJob - (*timestamp.Timestamp)(nil), // 60: google.protobuf.Timestamp - (*v0.DatasetFeatureStatisticsList)(nil), // 61: tensorflow.metadata.v0.DatasetFeatureStatisticsList - (*FeatureSetReference)(nil), // 62: feast.core.FeatureSetReference - (FeatureSetStatus)(0), // 63: feast.core.FeatureSetStatus - (*FeatureTableSpec)(nil), // 64: feast.core.FeatureTableSpec - (*FeatureTable)(nil), // 65: feast.core.FeatureTable - (*FeatureSpec)(nil), // 66: feast.core.FeatureSpec + (UpdateStoreResponse_Status)(0), // 0: feast.core.UpdateStoreResponse.Status + (*GetEntityRequest)(nil), // 1: feast.core.GetEntityRequest + (*GetEntityResponse)(nil), // 2: feast.core.GetEntityResponse + (*ListEntitiesRequest)(nil), // 3: feast.core.ListEntitiesRequest + (*ListEntitiesResponse)(nil), // 4: feast.core.ListEntitiesResponse + (*ListFeaturesRequest)(nil), // 5: feast.core.ListFeaturesRequest + (*ListFeaturesResponse)(nil), // 6: feast.core.ListFeaturesResponse + (*ListStoresRequest)(nil), // 7: feast.core.ListStoresRequest + (*ListStoresResponse)(nil), // 8: feast.core.ListStoresResponse + (*ApplyEntityRequest)(nil), // 9: feast.core.ApplyEntityRequest + (*ApplyEntityResponse)(nil), // 10: feast.core.ApplyEntityResponse + (*GetFeastCoreVersionRequest)(nil), // 11: feast.core.GetFeastCoreVersionRequest + (*GetFeastCoreVersionResponse)(nil), // 12: feast.core.GetFeastCoreVersionResponse + (*UpdateStoreRequest)(nil), // 13: feast.core.UpdateStoreRequest + (*UpdateStoreResponse)(nil), // 14: feast.core.UpdateStoreResponse + (*CreateProjectRequest)(nil), // 15: feast.core.CreateProjectRequest + (*CreateProjectResponse)(nil), // 16: feast.core.CreateProjectResponse + (*ArchiveProjectRequest)(nil), // 17: feast.core.ArchiveProjectRequest + (*ArchiveProjectResponse)(nil), // 18: feast.core.ArchiveProjectResponse + (*ListProjectsRequest)(nil), // 19: feast.core.ListProjectsRequest + (*ListProjectsResponse)(nil), // 20: feast.core.ListProjectsResponse + (*UpdateFeatureSetStatusResponse)(nil), // 21: feast.core.UpdateFeatureSetStatusResponse + (*ApplyFeatureTableRequest)(nil), // 22: feast.core.ApplyFeatureTableRequest + (*ApplyFeatureTableResponse)(nil), // 23: feast.core.ApplyFeatureTableResponse + (*GetFeatureTableRequest)(nil), // 24: feast.core.GetFeatureTableRequest + (*GetFeatureTableResponse)(nil), // 25: feast.core.GetFeatureTableResponse + (*ListFeatureTablesRequest)(nil), // 26: feast.core.ListFeatureTablesRequest + (*ListFeatureTablesResponse)(nil), // 27: feast.core.ListFeatureTablesResponse + (*DeleteFeatureTableRequest)(nil), // 28: feast.core.DeleteFeatureTableRequest + (*DeleteFeatureTableResponse)(nil), // 29: feast.core.DeleteFeatureTableResponse + (*ListEntitiesRequest_Filter)(nil), // 30: feast.core.ListEntitiesRequest.Filter + nil, // 31: feast.core.ListEntitiesRequest.Filter.LabelsEntry + (*ListFeaturesRequest_Filter)(nil), // 32: feast.core.ListFeaturesRequest.Filter + nil, // 33: feast.core.ListFeaturesRequest.Filter.LabelsEntry + nil, // 34: feast.core.ListFeaturesResponse.FeaturesEntry + (*ListStoresRequest_Filter)(nil), // 35: feast.core.ListStoresRequest.Filter + (*ListFeatureTablesRequest_Filter)(nil), // 36: feast.core.ListFeatureTablesRequest.Filter + nil, // 37: feast.core.ListFeatureTablesRequest.Filter.LabelsEntry + (*Entity)(nil), // 38: feast.core.Entity + (*Store)(nil), // 39: feast.core.Store + (*EntitySpecV2)(nil), // 40: feast.core.EntitySpecV2 + (*FeatureTableSpec)(nil), // 41: feast.core.FeatureTableSpec + (*FeatureTable)(nil), // 42: feast.core.FeatureTable + (*FeatureSpecV2)(nil), // 43: feast.core.FeatureSpecV2 } var file_feast_core_CoreService_proto_depIdxs = []int32{ - 55, // 0: feast.core.GetFeatureSetResponse.feature_set:type_name -> feast.core.FeatureSet - 44, // 1: feast.core.ListFeatureSetsRequest.filter:type_name -> feast.core.ListFeatureSetsRequest.Filter - 55, // 2: feast.core.ListFeatureSetsResponse.feature_sets:type_name -> feast.core.FeatureSet - 56, // 3: feast.core.GetEntityResponse.entity:type_name -> feast.core.Entity - 46, // 4: feast.core.ListEntitiesRequest.filter:type_name -> feast.core.ListEntitiesRequest.Filter - 56, // 5: feast.core.ListEntitiesResponse.entities:type_name -> feast.core.Entity - 48, // 6: feast.core.ListFeaturesRequest.filter:type_name -> feast.core.ListFeaturesRequest.Filter - 50, // 7: feast.core.ListFeaturesResponse.features:type_name -> feast.core.ListFeaturesResponse.FeaturesEntry - 51, // 8: feast.core.ListStoresRequest.filter:type_name -> feast.core.ListStoresRequest.Filter - 57, // 9: feast.core.ListStoresResponse.store:type_name -> feast.core.Store - 58, // 10: feast.core.ApplyEntityRequest.spec:type_name -> feast.core.EntitySpecV2 - 56, // 11: feast.core.ApplyEntityResponse.entity:type_name -> feast.core.Entity - 55, // 12: feast.core.ApplyFeatureSetRequest.feature_set:type_name -> feast.core.FeatureSet - 55, // 13: feast.core.ApplyFeatureSetResponse.feature_set:type_name -> feast.core.FeatureSet - 0, // 14: feast.core.ApplyFeatureSetResponse.status:type_name -> feast.core.ApplyFeatureSetResponse.Status - 57, // 15: feast.core.UpdateStoreRequest.store:type_name -> feast.core.Store - 57, // 16: feast.core.UpdateStoreResponse.store:type_name -> feast.core.Store - 1, // 17: feast.core.UpdateStoreResponse.status:type_name -> feast.core.UpdateStoreResponse.Status - 52, // 18: feast.core.ListIngestionJobsRequest.filter:type_name -> feast.core.ListIngestionJobsRequest.Filter - 59, // 19: feast.core.ListIngestionJobsResponse.jobs:type_name -> feast.core.IngestionJob - 60, // 20: feast.core.GetFeatureStatisticsRequest.start_date:type_name -> google.protobuf.Timestamp - 60, // 21: feast.core.GetFeatureStatisticsRequest.end_date:type_name -> google.protobuf.Timestamp - 61, // 22: feast.core.GetFeatureStatisticsResponse.dataset_feature_statistics_list:type_name -> tensorflow.metadata.v0.DatasetFeatureStatisticsList - 62, // 23: feast.core.UpdateFeatureSetStatusRequest.reference:type_name -> feast.core.FeatureSetReference - 63, // 24: feast.core.UpdateFeatureSetStatusRequest.status:type_name -> feast.core.FeatureSetStatus - 64, // 25: feast.core.ApplyFeatureTableRequest.table_spec:type_name -> feast.core.FeatureTableSpec - 65, // 26: feast.core.ApplyFeatureTableResponse.table:type_name -> feast.core.FeatureTable - 65, // 27: feast.core.GetFeatureTableResponse.table:type_name -> feast.core.FeatureTable - 53, // 28: feast.core.ListFeatureTablesRequest.filter:type_name -> feast.core.ListFeatureTablesRequest.Filter - 65, // 29: feast.core.ListFeatureTablesResponse.tables:type_name -> feast.core.FeatureTable - 45, // 30: feast.core.ListFeatureSetsRequest.Filter.labels:type_name -> feast.core.ListFeatureSetsRequest.Filter.LabelsEntry - 63, // 31: feast.core.ListFeatureSetsRequest.Filter.status:type_name -> feast.core.FeatureSetStatus - 47, // 32: feast.core.ListEntitiesRequest.Filter.labels:type_name -> feast.core.ListEntitiesRequest.Filter.LabelsEntry - 49, // 33: feast.core.ListFeaturesRequest.Filter.labels:type_name -> feast.core.ListFeaturesRequest.Filter.LabelsEntry - 66, // 34: feast.core.ListFeaturesResponse.FeaturesEntry.value:type_name -> feast.core.FeatureSpec - 62, // 35: feast.core.ListIngestionJobsRequest.Filter.feature_set_reference:type_name -> feast.core.FeatureSetReference - 54, // 36: feast.core.ListFeatureTablesRequest.Filter.labels:type_name -> feast.core.ListFeatureTablesRequest.Filter.LabelsEntry - 18, // 37: feast.core.CoreService.GetFeastCoreVersion:input_type -> feast.core.GetFeastCoreVersionRequest - 2, // 38: feast.core.CoreService.GetFeatureSet:input_type -> feast.core.GetFeatureSetRequest - 6, // 39: feast.core.CoreService.GetEntity:input_type -> feast.core.GetEntityRequest - 4, // 40: feast.core.CoreService.ListFeatureSets:input_type -> feast.core.ListFeatureSetsRequest - 10, // 41: feast.core.CoreService.ListFeatures:input_type -> feast.core.ListFeaturesRequest - 34, // 42: feast.core.CoreService.GetFeatureStatistics:input_type -> feast.core.GetFeatureStatisticsRequest - 12, // 43: feast.core.CoreService.ListStores:input_type -> feast.core.ListStoresRequest - 16, // 44: feast.core.CoreService.ApplyFeatureSet:input_type -> feast.core.ApplyFeatureSetRequest - 14, // 45: feast.core.CoreService.ApplyEntity:input_type -> feast.core.ApplyEntityRequest - 8, // 46: feast.core.CoreService.ListEntities:input_type -> feast.core.ListEntitiesRequest - 20, // 47: feast.core.CoreService.UpdateStore:input_type -> feast.core.UpdateStoreRequest - 22, // 48: feast.core.CoreService.CreateProject:input_type -> feast.core.CreateProjectRequest - 24, // 49: feast.core.CoreService.ArchiveProject:input_type -> feast.core.ArchiveProjectRequest - 26, // 50: feast.core.CoreService.ListProjects:input_type -> feast.core.ListProjectsRequest - 36, // 51: feast.core.CoreService.UpdateFeatureSetStatus:input_type -> feast.core.UpdateFeatureSetStatusRequest - 38, // 52: feast.core.CoreService.ApplyFeatureTable:input_type -> feast.core.ApplyFeatureTableRequest - 42, // 53: feast.core.CoreService.ListFeatureTables:input_type -> feast.core.ListFeatureTablesRequest - 40, // 54: feast.core.CoreService.GetFeatureTable:input_type -> feast.core.GetFeatureTableRequest - 28, // 55: feast.core.JobControllerService.ListIngestionJobs:input_type -> feast.core.ListIngestionJobsRequest - 30, // 56: feast.core.JobControllerService.RestartIngestionJob:input_type -> feast.core.RestartIngestionJobRequest - 32, // 57: feast.core.JobControllerService.StopIngestionJob:input_type -> feast.core.StopIngestionJobRequest - 19, // 58: feast.core.CoreService.GetFeastCoreVersion:output_type -> feast.core.GetFeastCoreVersionResponse - 3, // 59: feast.core.CoreService.GetFeatureSet:output_type -> feast.core.GetFeatureSetResponse - 7, // 60: feast.core.CoreService.GetEntity:output_type -> feast.core.GetEntityResponse - 5, // 61: feast.core.CoreService.ListFeatureSets:output_type -> feast.core.ListFeatureSetsResponse - 11, // 62: feast.core.CoreService.ListFeatures:output_type -> feast.core.ListFeaturesResponse - 35, // 63: feast.core.CoreService.GetFeatureStatistics:output_type -> feast.core.GetFeatureStatisticsResponse - 13, // 64: feast.core.CoreService.ListStores:output_type -> feast.core.ListStoresResponse - 17, // 65: feast.core.CoreService.ApplyFeatureSet:output_type -> feast.core.ApplyFeatureSetResponse - 15, // 66: feast.core.CoreService.ApplyEntity:output_type -> feast.core.ApplyEntityResponse - 9, // 67: feast.core.CoreService.ListEntities:output_type -> feast.core.ListEntitiesResponse - 21, // 68: feast.core.CoreService.UpdateStore:output_type -> feast.core.UpdateStoreResponse - 23, // 69: feast.core.CoreService.CreateProject:output_type -> feast.core.CreateProjectResponse - 25, // 70: feast.core.CoreService.ArchiveProject:output_type -> feast.core.ArchiveProjectResponse - 27, // 71: feast.core.CoreService.ListProjects:output_type -> feast.core.ListProjectsResponse - 37, // 72: feast.core.CoreService.UpdateFeatureSetStatus:output_type -> feast.core.UpdateFeatureSetStatusResponse - 39, // 73: feast.core.CoreService.ApplyFeatureTable:output_type -> feast.core.ApplyFeatureTableResponse - 43, // 74: feast.core.CoreService.ListFeatureTables:output_type -> feast.core.ListFeatureTablesResponse - 41, // 75: feast.core.CoreService.GetFeatureTable:output_type -> feast.core.GetFeatureTableResponse - 29, // 76: feast.core.JobControllerService.ListIngestionJobs:output_type -> feast.core.ListIngestionJobsResponse - 31, // 77: feast.core.JobControllerService.RestartIngestionJob:output_type -> feast.core.RestartIngestionJobResponse - 33, // 78: feast.core.JobControllerService.StopIngestionJob:output_type -> feast.core.StopIngestionJobResponse - 58, // [58:79] is the sub-list for method output_type - 37, // [37:58] is the sub-list for method input_type - 37, // [37:37] is the sub-list for extension type_name - 37, // [37:37] is the sub-list for extension extendee - 0, // [0:37] is the sub-list for field type_name + 38, // 0: feast.core.GetEntityResponse.entity:type_name -> feast.core.Entity + 30, // 1: feast.core.ListEntitiesRequest.filter:type_name -> feast.core.ListEntitiesRequest.Filter + 38, // 2: feast.core.ListEntitiesResponse.entities:type_name -> feast.core.Entity + 32, // 3: feast.core.ListFeaturesRequest.filter:type_name -> feast.core.ListFeaturesRequest.Filter + 34, // 4: feast.core.ListFeaturesResponse.features:type_name -> feast.core.ListFeaturesResponse.FeaturesEntry + 35, // 5: feast.core.ListStoresRequest.filter:type_name -> feast.core.ListStoresRequest.Filter + 39, // 6: feast.core.ListStoresResponse.store:type_name -> feast.core.Store + 40, // 7: feast.core.ApplyEntityRequest.spec:type_name -> feast.core.EntitySpecV2 + 38, // 8: feast.core.ApplyEntityResponse.entity:type_name -> feast.core.Entity + 39, // 9: feast.core.UpdateStoreRequest.store:type_name -> feast.core.Store + 39, // 10: feast.core.UpdateStoreResponse.store:type_name -> feast.core.Store + 0, // 11: feast.core.UpdateStoreResponse.status:type_name -> feast.core.UpdateStoreResponse.Status + 41, // 12: feast.core.ApplyFeatureTableRequest.table_spec:type_name -> feast.core.FeatureTableSpec + 42, // 13: feast.core.ApplyFeatureTableResponse.table:type_name -> feast.core.FeatureTable + 42, // 14: feast.core.GetFeatureTableResponse.table:type_name -> feast.core.FeatureTable + 36, // 15: feast.core.ListFeatureTablesRequest.filter:type_name -> feast.core.ListFeatureTablesRequest.Filter + 42, // 16: feast.core.ListFeatureTablesResponse.tables:type_name -> feast.core.FeatureTable + 31, // 17: feast.core.ListEntitiesRequest.Filter.labels:type_name -> feast.core.ListEntitiesRequest.Filter.LabelsEntry + 33, // 18: feast.core.ListFeaturesRequest.Filter.labels:type_name -> feast.core.ListFeaturesRequest.Filter.LabelsEntry + 43, // 19: feast.core.ListFeaturesResponse.FeaturesEntry.value:type_name -> feast.core.FeatureSpecV2 + 37, // 20: feast.core.ListFeatureTablesRequest.Filter.labels:type_name -> feast.core.ListFeatureTablesRequest.Filter.LabelsEntry + 11, // 21: feast.core.CoreService.GetFeastCoreVersion:input_type -> feast.core.GetFeastCoreVersionRequest + 1, // 22: feast.core.CoreService.GetEntity:input_type -> feast.core.GetEntityRequest + 5, // 23: feast.core.CoreService.ListFeatures:input_type -> feast.core.ListFeaturesRequest + 7, // 24: feast.core.CoreService.ListStores:input_type -> feast.core.ListStoresRequest + 9, // 25: feast.core.CoreService.ApplyEntity:input_type -> feast.core.ApplyEntityRequest + 3, // 26: feast.core.CoreService.ListEntities:input_type -> feast.core.ListEntitiesRequest + 13, // 27: feast.core.CoreService.UpdateStore:input_type -> feast.core.UpdateStoreRequest + 15, // 28: feast.core.CoreService.CreateProject:input_type -> feast.core.CreateProjectRequest + 17, // 29: feast.core.CoreService.ArchiveProject:input_type -> feast.core.ArchiveProjectRequest + 19, // 30: feast.core.CoreService.ListProjects:input_type -> feast.core.ListProjectsRequest + 22, // 31: feast.core.CoreService.ApplyFeatureTable:input_type -> feast.core.ApplyFeatureTableRequest + 26, // 32: feast.core.CoreService.ListFeatureTables:input_type -> feast.core.ListFeatureTablesRequest + 24, // 33: feast.core.CoreService.GetFeatureTable:input_type -> feast.core.GetFeatureTableRequest + 28, // 34: feast.core.CoreService.DeleteFeatureTable:input_type -> feast.core.DeleteFeatureTableRequest + 12, // 35: feast.core.CoreService.GetFeastCoreVersion:output_type -> feast.core.GetFeastCoreVersionResponse + 2, // 36: feast.core.CoreService.GetEntity:output_type -> feast.core.GetEntityResponse + 6, // 37: feast.core.CoreService.ListFeatures:output_type -> feast.core.ListFeaturesResponse + 8, // 38: feast.core.CoreService.ListStores:output_type -> feast.core.ListStoresResponse + 10, // 39: feast.core.CoreService.ApplyEntity:output_type -> feast.core.ApplyEntityResponse + 4, // 40: feast.core.CoreService.ListEntities:output_type -> feast.core.ListEntitiesResponse + 14, // 41: feast.core.CoreService.UpdateStore:output_type -> feast.core.UpdateStoreResponse + 16, // 42: feast.core.CoreService.CreateProject:output_type -> feast.core.CreateProjectResponse + 18, // 43: feast.core.CoreService.ArchiveProject:output_type -> feast.core.ArchiveProjectResponse + 20, // 44: feast.core.CoreService.ListProjects:output_type -> feast.core.ListProjectsResponse + 23, // 45: feast.core.CoreService.ApplyFeatureTable:output_type -> feast.core.ApplyFeatureTableResponse + 27, // 46: feast.core.CoreService.ListFeatureTables:output_type -> feast.core.ListFeatureTablesResponse + 25, // 47: feast.core.CoreService.GetFeatureTable:output_type -> feast.core.GetFeatureTableResponse + 29, // 48: feast.core.CoreService.DeleteFeatureTable:output_type -> feast.core.DeleteFeatureTableResponse + 35, // [35:49] is the sub-list for method output_type + 21, // [21:35] is the sub-list for method input_type + 21, // [21:21] is the sub-list for extension type_name + 21, // [21:21] is the sub-list for extension extendee + 0, // [0:21] is the sub-list for field type_name } func init() { file_feast_core_CoreService_proto_init() } @@ -3242,61 +2110,11 @@ func file_feast_core_CoreService_proto_init() { return } file_feast_core_Entity_proto_init() - file_feast_core_FeatureSet_proto_init() + file_feast_core_Feature_proto_init() file_feast_core_FeatureTable_proto_init() file_feast_core_Store_proto_init() - file_feast_core_FeatureSetReference_proto_init() - file_feast_core_IngestionJob_proto_init() if !protoimpl.UnsafeEnabled { file_feast_core_CoreService_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetFeatureSetRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_feast_core_CoreService_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetFeatureSetResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_feast_core_CoreService_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListFeatureSetsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_feast_core_CoreService_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListFeatureSetsResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_feast_core_CoreService_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetEntityRequest); i { case 0: return &v.state @@ -3308,7 +2126,7 @@ func file_feast_core_CoreService_proto_init() { return nil } } - file_feast_core_CoreService_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_feast_core_CoreService_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetEntityResponse); i { case 0: return &v.state @@ -3320,7 +2138,7 @@ func file_feast_core_CoreService_proto_init() { return nil } } - file_feast_core_CoreService_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_feast_core_CoreService_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListEntitiesRequest); i { case 0: return &v.state @@ -3332,7 +2150,7 @@ func file_feast_core_CoreService_proto_init() { return nil } } - file_feast_core_CoreService_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_feast_core_CoreService_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListEntitiesResponse); i { case 0: return &v.state @@ -3344,7 +2162,7 @@ func file_feast_core_CoreService_proto_init() { return nil } } - file_feast_core_CoreService_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_feast_core_CoreService_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListFeaturesRequest); i { case 0: return &v.state @@ -3356,7 +2174,7 @@ func file_feast_core_CoreService_proto_init() { return nil } } - file_feast_core_CoreService_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + file_feast_core_CoreService_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListFeaturesResponse); i { case 0: return &v.state @@ -3368,7 +2186,7 @@ func file_feast_core_CoreService_proto_init() { return nil } } - file_feast_core_CoreService_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + file_feast_core_CoreService_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListStoresRequest); i { case 0: return &v.state @@ -3380,7 +2198,7 @@ func file_feast_core_CoreService_proto_init() { return nil } } - file_feast_core_CoreService_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + file_feast_core_CoreService_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListStoresResponse); i { case 0: return &v.state @@ -3392,7 +2210,7 @@ func file_feast_core_CoreService_proto_init() { return nil } } - file_feast_core_CoreService_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + file_feast_core_CoreService_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ApplyEntityRequest); i { case 0: return &v.state @@ -3404,7 +2222,7 @@ func file_feast_core_CoreService_proto_init() { return nil } } - file_feast_core_CoreService_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + file_feast_core_CoreService_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ApplyEntityResponse); i { case 0: return &v.state @@ -3416,31 +2234,7 @@ func file_feast_core_CoreService_proto_init() { return nil } } - file_feast_core_CoreService_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ApplyFeatureSetRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_feast_core_CoreService_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ApplyFeatureSetResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_feast_core_CoreService_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + file_feast_core_CoreService_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetFeastCoreVersionRequest); i { case 0: return &v.state @@ -3452,7 +2246,7 @@ func file_feast_core_CoreService_proto_init() { return nil } } - file_feast_core_CoreService_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + file_feast_core_CoreService_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetFeastCoreVersionResponse); i { case 0: return &v.state @@ -3464,7 +2258,7 @@ func file_feast_core_CoreService_proto_init() { return nil } } - file_feast_core_CoreService_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + file_feast_core_CoreService_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UpdateStoreRequest); i { case 0: return &v.state @@ -3476,7 +2270,7 @@ func file_feast_core_CoreService_proto_init() { return nil } } - file_feast_core_CoreService_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + file_feast_core_CoreService_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UpdateStoreResponse); i { case 0: return &v.state @@ -3488,7 +2282,7 @@ func file_feast_core_CoreService_proto_init() { return nil } } - file_feast_core_CoreService_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + file_feast_core_CoreService_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CreateProjectRequest); i { case 0: return &v.state @@ -3500,7 +2294,7 @@ func file_feast_core_CoreService_proto_init() { return nil } } - file_feast_core_CoreService_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + file_feast_core_CoreService_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CreateProjectResponse); i { case 0: return &v.state @@ -3512,116 +2306,8 @@ func file_feast_core_CoreService_proto_init() { return nil } } - file_feast_core_CoreService_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ArchiveProjectRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_feast_core_CoreService_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ArchiveProjectResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_feast_core_CoreService_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListProjectsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_feast_core_CoreService_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListProjectsResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_feast_core_CoreService_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListIngestionJobsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_feast_core_CoreService_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListIngestionJobsResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_feast_core_CoreService_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RestartIngestionJobRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_feast_core_CoreService_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RestartIngestionJobResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_feast_core_CoreService_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StopIngestionJobRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_feast_core_CoreService_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StopIngestionJobResponse); i { + file_feast_core_CoreService_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ArchiveProjectRequest); i { case 0: return &v.state case 1: @@ -3632,8 +2318,8 @@ func file_feast_core_CoreService_proto_init() { return nil } } - file_feast_core_CoreService_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetFeatureStatisticsRequest); i { + file_feast_core_CoreService_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ArchiveProjectResponse); i { case 0: return &v.state case 1: @@ -3644,8 +2330,8 @@ func file_feast_core_CoreService_proto_init() { return nil } } - file_feast_core_CoreService_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetFeatureStatisticsResponse); i { + file_feast_core_CoreService_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListProjectsRequest); i { case 0: return &v.state case 1: @@ -3656,8 +2342,8 @@ func file_feast_core_CoreService_proto_init() { return nil } } - file_feast_core_CoreService_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateFeatureSetStatusRequest); i { + file_feast_core_CoreService_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListProjectsResponse); i { case 0: return &v.state case 1: @@ -3668,7 +2354,7 @@ func file_feast_core_CoreService_proto_init() { return nil } } - file_feast_core_CoreService_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + file_feast_core_CoreService_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UpdateFeatureSetStatusResponse); i { case 0: return &v.state @@ -3680,7 +2366,7 @@ func file_feast_core_CoreService_proto_init() { return nil } } - file_feast_core_CoreService_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { + file_feast_core_CoreService_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ApplyFeatureTableRequest); i { case 0: return &v.state @@ -3692,7 +2378,7 @@ func file_feast_core_CoreService_proto_init() { return nil } } - file_feast_core_CoreService_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { + file_feast_core_CoreService_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ApplyFeatureTableResponse); i { case 0: return &v.state @@ -3704,7 +2390,7 @@ func file_feast_core_CoreService_proto_init() { return nil } } - file_feast_core_CoreService_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { + file_feast_core_CoreService_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetFeatureTableRequest); i { case 0: return &v.state @@ -3716,7 +2402,7 @@ func file_feast_core_CoreService_proto_init() { return nil } } - file_feast_core_CoreService_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { + file_feast_core_CoreService_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetFeatureTableResponse); i { case 0: return &v.state @@ -3728,7 +2414,7 @@ func file_feast_core_CoreService_proto_init() { return nil } } - file_feast_core_CoreService_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { + file_feast_core_CoreService_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListFeatureTablesRequest); i { case 0: return &v.state @@ -3740,7 +2426,7 @@ func file_feast_core_CoreService_proto_init() { return nil } } - file_feast_core_CoreService_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { + file_feast_core_CoreService_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListFeatureTablesResponse); i { case 0: return &v.state @@ -3752,8 +2438,8 @@ func file_feast_core_CoreService_proto_init() { return nil } } - file_feast_core_CoreService_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListFeatureSetsRequest_Filter); i { + file_feast_core_CoreService_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteFeatureTableRequest); i { case 0: return &v.state case 1: @@ -3764,8 +2450,8 @@ func file_feast_core_CoreService_proto_init() { return nil } } - file_feast_core_CoreService_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListEntitiesRequest_Filter); i { + file_feast_core_CoreService_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteFeatureTableResponse); i { case 0: return &v.state case 1: @@ -3776,8 +2462,8 @@ func file_feast_core_CoreService_proto_init() { return nil } } - file_feast_core_CoreService_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListFeaturesRequest_Filter); i { + file_feast_core_CoreService_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListEntitiesRequest_Filter); i { case 0: return &v.state case 1: @@ -3788,8 +2474,8 @@ func file_feast_core_CoreService_proto_init() { return nil } } - file_feast_core_CoreService_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListStoresRequest_Filter); i { + file_feast_core_CoreService_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListFeaturesRequest_Filter); i { case 0: return &v.state case 1: @@ -3800,8 +2486,8 @@ func file_feast_core_CoreService_proto_init() { return nil } } - file_feast_core_CoreService_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListIngestionJobsRequest_Filter); i { + file_feast_core_CoreService_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListStoresRequest_Filter); i { case 0: return &v.state case 1: @@ -3812,7 +2498,7 @@ func file_feast_core_CoreService_proto_init() { return nil } } - file_feast_core_CoreService_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + file_feast_core_CoreService_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListFeatureTablesRequest_Filter); i { case 0: return &v.state @@ -3830,10 +2516,10 @@ func file_feast_core_CoreService_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_feast_core_CoreService_proto_rawDesc, - NumEnums: 2, - NumMessages: 53, + NumEnums: 1, + NumMessages: 37, NumExtensions: 0, - NumServices: 2, + NumServices: 1, }, GoTypes: file_feast_core_CoreService_proto_goTypes, DependencyIndexes: file_feast_core_CoreService_proto_depIdxs, @@ -3860,41 +2546,19 @@ const _ = grpc.SupportPackageIsVersion6 type CoreServiceClient interface { // Retrieve version information about this Feast deployment GetFeastCoreVersion(ctx context.Context, in *GetFeastCoreVersionRequest, opts ...grpc.CallOption) (*GetFeastCoreVersionResponse, error) - // Returns a specific feature set - GetFeatureSet(ctx context.Context, in *GetFeatureSetRequest, opts ...grpc.CallOption) (*GetFeatureSetResponse, error) // Returns a specific entity GetEntity(ctx context.Context, in *GetEntityRequest, opts ...grpc.CallOption) (*GetEntityResponse, error) - // Retrieve feature set details given a filter. - // - // Returns all feature sets matching that filter. If none are found, - // an empty list will be returned. - // If no filter is provided in the request, the response will contain all the feature - // sets currently stored in the registry. - ListFeatureSets(ctx context.Context, in *ListFeatureSetsRequest, opts ...grpc.CallOption) (*ListFeatureSetsResponse, error) // Returns all feature references and respective features matching that filter. If none are found // an empty map will be returned // If no filter is provided in the request, the response will contain all the features // currently stored in the default project. ListFeatures(ctx context.Context, in *ListFeaturesRequest, opts ...grpc.CallOption) (*ListFeaturesResponse, error) - // Get feature statistics computed over the data in the batch stores. - // - // Returns a dataset containing TFDV statistics mapped to each valid historical store. - GetFeatureStatistics(ctx context.Context, in *GetFeatureStatisticsRequest, opts ...grpc.CallOption) (*GetFeatureStatisticsResponse, error) // Retrieve store details given a filter. // // Returns all stores matching that filter. If none are found, an empty list will be returned. // If no filter is provided in the request, the response will contain all the stores currently // stored in the registry. ListStores(ctx context.Context, in *ListStoresRequest, opts ...grpc.CallOption) (*ListStoresResponse, error) - // Create or update and existing feature set. - // - // This function is idempotent - it will not create a new feature set if schema does not change. - // Schema changes will update the feature set if the changes are valid. - // All changes except the following are valid: - // - Changes to feature set id (name, project) - // - Changes to entities - // - Changes to feature name and type - ApplyFeatureSet(ctx context.Context, in *ApplyFeatureSetRequest, opts ...grpc.CallOption) (*ApplyFeatureSetResponse, error) // Create or update and existing entity. // // This function is idempotent - it will not create a new entity if schema does not change. @@ -3914,8 +2578,8 @@ type CoreServiceClient interface { // 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. Feature set names as must be unique within a project while field (Feature/Entity) names - // must be unique within a Feature Set. Project names themselves must be globally unique. + // created. Feature table names as must be unique within a project while field (Feature/Entity) names + // must be unique within a Feature Table. 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, @@ -3924,8 +2588,6 @@ type CoreServiceClient interface { 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) - // Internal API for Job Controller to update featureSet's status once responsible ingestion job is running - UpdateFeatureSetStatus(ctx context.Context, in *UpdateFeatureSetStatusRequest, opts ...grpc.CallOption) (*UpdateFeatureSetStatusResponse, error) // Create or update an existing feature table. // This function is idempotent - it will not create a new feature table if the schema does not change. // Schema changes will update the feature table if the changes are valid. @@ -3942,6 +2604,8 @@ type CoreServiceClient interface { ListFeatureTables(ctx context.Context, in *ListFeatureTablesRequest, opts ...grpc.CallOption) (*ListFeatureTablesResponse, error) // Returns a specific feature table GetFeatureTable(ctx context.Context, in *GetFeatureTableRequest, opts ...grpc.CallOption) (*GetFeatureTableResponse, error) + // Delete a specific feature table + DeleteFeatureTable(ctx context.Context, in *DeleteFeatureTableRequest, opts ...grpc.CallOption) (*DeleteFeatureTableResponse, error) } type coreServiceClient struct { @@ -3961,15 +2625,6 @@ func (c *coreServiceClient) GetFeastCoreVersion(ctx context.Context, in *GetFeas return out, nil } -func (c *coreServiceClient) GetFeatureSet(ctx context.Context, in *GetFeatureSetRequest, opts ...grpc.CallOption) (*GetFeatureSetResponse, error) { - out := new(GetFeatureSetResponse) - err := c.cc.Invoke(ctx, "/feast.core.CoreService/GetFeatureSet", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *coreServiceClient) GetEntity(ctx context.Context, in *GetEntityRequest, opts ...grpc.CallOption) (*GetEntityResponse, error) { out := new(GetEntityResponse) err := c.cc.Invoke(ctx, "/feast.core.CoreService/GetEntity", in, out, opts...) @@ -3979,15 +2634,6 @@ func (c *coreServiceClient) GetEntity(ctx context.Context, in *GetEntityRequest, return out, nil } -func (c *coreServiceClient) ListFeatureSets(ctx context.Context, in *ListFeatureSetsRequest, opts ...grpc.CallOption) (*ListFeatureSetsResponse, error) { - out := new(ListFeatureSetsResponse) - err := c.cc.Invoke(ctx, "/feast.core.CoreService/ListFeatureSets", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *coreServiceClient) ListFeatures(ctx context.Context, in *ListFeaturesRequest, opts ...grpc.CallOption) (*ListFeaturesResponse, error) { out := new(ListFeaturesResponse) err := c.cc.Invoke(ctx, "/feast.core.CoreService/ListFeatures", in, out, opts...) @@ -3997,15 +2643,6 @@ func (c *coreServiceClient) ListFeatures(ctx context.Context, in *ListFeaturesRe return out, nil } -func (c *coreServiceClient) GetFeatureStatistics(ctx context.Context, in *GetFeatureStatisticsRequest, opts ...grpc.CallOption) (*GetFeatureStatisticsResponse, error) { - out := new(GetFeatureStatisticsResponse) - err := c.cc.Invoke(ctx, "/feast.core.CoreService/GetFeatureStatistics", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *coreServiceClient) ListStores(ctx context.Context, in *ListStoresRequest, opts ...grpc.CallOption) (*ListStoresResponse, error) { out := new(ListStoresResponse) err := c.cc.Invoke(ctx, "/feast.core.CoreService/ListStores", in, out, opts...) @@ -4015,15 +2652,6 @@ func (c *coreServiceClient) ListStores(ctx context.Context, in *ListStoresReques return out, nil } -func (c *coreServiceClient) ApplyFeatureSet(ctx context.Context, in *ApplyFeatureSetRequest, opts ...grpc.CallOption) (*ApplyFeatureSetResponse, error) { - out := new(ApplyFeatureSetResponse) - err := c.cc.Invoke(ctx, "/feast.core.CoreService/ApplyFeatureSet", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *coreServiceClient) ApplyEntity(ctx context.Context, in *ApplyEntityRequest, opts ...grpc.CallOption) (*ApplyEntityResponse, error) { out := new(ApplyEntityResponse) err := c.cc.Invoke(ctx, "/feast.core.CoreService/ApplyEntity", in, out, opts...) @@ -4078,15 +2706,6 @@ func (c *coreServiceClient) ListProjects(ctx context.Context, in *ListProjectsRe return out, nil } -func (c *coreServiceClient) UpdateFeatureSetStatus(ctx context.Context, in *UpdateFeatureSetStatusRequest, opts ...grpc.CallOption) (*UpdateFeatureSetStatusResponse, error) { - out := new(UpdateFeatureSetStatusResponse) - err := c.cc.Invoke(ctx, "/feast.core.CoreService/UpdateFeatureSetStatus", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *coreServiceClient) ApplyFeatureTable(ctx context.Context, in *ApplyFeatureTableRequest, opts ...grpc.CallOption) (*ApplyFeatureTableResponse, error) { out := new(ApplyFeatureTableResponse) err := c.cc.Invoke(ctx, "/feast.core.CoreService/ApplyFeatureTable", in, out, opts...) @@ -4114,45 +2733,32 @@ func (c *coreServiceClient) GetFeatureTable(ctx context.Context, in *GetFeatureT return out, nil } +func (c *coreServiceClient) DeleteFeatureTable(ctx context.Context, in *DeleteFeatureTableRequest, opts ...grpc.CallOption) (*DeleteFeatureTableResponse, error) { + out := new(DeleteFeatureTableResponse) + err := c.cc.Invoke(ctx, "/feast.core.CoreService/DeleteFeatureTable", 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 GetFeastCoreVersion(context.Context, *GetFeastCoreVersionRequest) (*GetFeastCoreVersionResponse, error) - // Returns a specific feature set - GetFeatureSet(context.Context, *GetFeatureSetRequest) (*GetFeatureSetResponse, error) // Returns a specific entity GetEntity(context.Context, *GetEntityRequest) (*GetEntityResponse, error) - // Retrieve feature set details given a filter. - // - // Returns all feature sets matching that filter. If none are found, - // an empty list will be returned. - // If no filter is provided in the request, the response will contain all the feature - // sets currently stored in the registry. - ListFeatureSets(context.Context, *ListFeatureSetsRequest) (*ListFeatureSetsResponse, error) // Returns all feature references and respective features matching that filter. If none are found // an empty map will be returned // If no filter is provided in the request, the response will contain all the features // currently stored in the default project. ListFeatures(context.Context, *ListFeaturesRequest) (*ListFeaturesResponse, error) - // Get feature statistics computed over the data in the batch stores. - // - // Returns a dataset containing TFDV statistics mapped to each valid historical store. - GetFeatureStatistics(context.Context, *GetFeatureStatisticsRequest) (*GetFeatureStatisticsResponse, error) // Retrieve store details given a filter. // // Returns all stores matching that filter. If none are found, an empty list will be returned. // If no filter is provided in the request, the response will contain all the stores currently // stored in the registry. ListStores(context.Context, *ListStoresRequest) (*ListStoresResponse, error) - // Create or update and existing feature set. - // - // This function is idempotent - it will not create a new feature set if schema does not change. - // Schema changes will update the feature set if the changes are valid. - // All changes except the following are valid: - // - Changes to feature set id (name, project) - // - Changes to entities - // - Changes to feature name and type - ApplyFeatureSet(context.Context, *ApplyFeatureSetRequest) (*ApplyFeatureSetResponse, error) // Create or update and existing entity. // // This function is idempotent - it will not create a new entity if schema does not change. @@ -4172,8 +2778,8 @@ type CoreServiceServer interface { // 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. Feature set names as must be unique within a project while field (Feature/Entity) names - // must be unique within a Feature Set. Project names themselves must be globally unique. + // created. Feature table names as must be unique within a project while field (Feature/Entity) names + // must be unique within a Feature Table. 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, @@ -4182,8 +2788,6 @@ type CoreServiceServer interface { ArchiveProject(context.Context, *ArchiveProjectRequest) (*ArchiveProjectResponse, error) // Lists all projects active projects. ListProjects(context.Context, *ListProjectsRequest) (*ListProjectsResponse, error) - // Internal API for Job Controller to update featureSet's status once responsible ingestion job is running - UpdateFeatureSetStatus(context.Context, *UpdateFeatureSetStatusRequest) (*UpdateFeatureSetStatusResponse, error) // Create or update an existing feature table. // This function is idempotent - it will not create a new feature table if the schema does not change. // Schema changes will update the feature table if the changes are valid. @@ -4200,6 +2804,8 @@ type CoreServiceServer interface { ListFeatureTables(context.Context, *ListFeatureTablesRequest) (*ListFeatureTablesResponse, error) // Returns a specific feature table GetFeatureTable(context.Context, *GetFeatureTableRequest) (*GetFeatureTableResponse, error) + // Delete a specific feature table + DeleteFeatureTable(context.Context, *DeleteFeatureTableRequest) (*DeleteFeatureTableResponse, error) } // UnimplementedCoreServiceServer can be embedded to have forward compatible implementations. @@ -4209,27 +2815,15 @@ type UnimplementedCoreServiceServer struct { func (*UnimplementedCoreServiceServer) GetFeastCoreVersion(context.Context, *GetFeastCoreVersionRequest) (*GetFeastCoreVersionResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetFeastCoreVersion not implemented") } -func (*UnimplementedCoreServiceServer) GetFeatureSet(context.Context, *GetFeatureSetRequest) (*GetFeatureSetResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetFeatureSet not implemented") -} func (*UnimplementedCoreServiceServer) GetEntity(context.Context, *GetEntityRequest) (*GetEntityResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetEntity not implemented") } -func (*UnimplementedCoreServiceServer) ListFeatureSets(context.Context, *ListFeatureSetsRequest) (*ListFeatureSetsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListFeatureSets not implemented") -} func (*UnimplementedCoreServiceServer) ListFeatures(context.Context, *ListFeaturesRequest) (*ListFeaturesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListFeatures not implemented") } -func (*UnimplementedCoreServiceServer) GetFeatureStatistics(context.Context, *GetFeatureStatisticsRequest) (*GetFeatureStatisticsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetFeatureStatistics not implemented") -} func (*UnimplementedCoreServiceServer) ListStores(context.Context, *ListStoresRequest) (*ListStoresResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListStores not implemented") } -func (*UnimplementedCoreServiceServer) ApplyFeatureSet(context.Context, *ApplyFeatureSetRequest) (*ApplyFeatureSetResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ApplyFeatureSet not implemented") -} func (*UnimplementedCoreServiceServer) ApplyEntity(context.Context, *ApplyEntityRequest) (*ApplyEntityResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ApplyEntity not implemented") } @@ -4248,9 +2842,6 @@ func (*UnimplementedCoreServiceServer) ArchiveProject(context.Context, *ArchiveP func (*UnimplementedCoreServiceServer) ListProjects(context.Context, *ListProjectsRequest) (*ListProjectsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListProjects not implemented") } -func (*UnimplementedCoreServiceServer) UpdateFeatureSetStatus(context.Context, *UpdateFeatureSetStatusRequest) (*UpdateFeatureSetStatusResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method UpdateFeatureSetStatus not implemented") -} func (*UnimplementedCoreServiceServer) ApplyFeatureTable(context.Context, *ApplyFeatureTableRequest) (*ApplyFeatureTableResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ApplyFeatureTable not implemented") } @@ -4260,6 +2851,9 @@ func (*UnimplementedCoreServiceServer) ListFeatureTables(context.Context, *ListF func (*UnimplementedCoreServiceServer) GetFeatureTable(context.Context, *GetFeatureTableRequest) (*GetFeatureTableResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetFeatureTable not implemented") } +func (*UnimplementedCoreServiceServer) DeleteFeatureTable(context.Context, *DeleteFeatureTableRequest) (*DeleteFeatureTableResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteFeatureTable not implemented") +} func RegisterCoreServiceServer(s *grpc.Server, srv CoreServiceServer) { s.RegisterService(&_CoreService_serviceDesc, srv) @@ -4283,24 +2877,6 @@ func _CoreService_GetFeastCoreVersion_Handler(srv interface{}, ctx context.Conte return interceptor(ctx, in, info, handler) } -func _CoreService_GetFeatureSet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetFeatureSetRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(CoreServiceServer).GetFeatureSet(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/feast.core.CoreService/GetFeatureSet", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(CoreServiceServer).GetFeatureSet(ctx, req.(*GetFeatureSetRequest)) - } - return interceptor(ctx, in, info, handler) -} - func _CoreService_GetEntity_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetEntityRequest) if err := dec(in); err != nil { @@ -4319,24 +2895,6 @@ func _CoreService_GetEntity_Handler(srv interface{}, ctx context.Context, dec fu return interceptor(ctx, in, info, handler) } -func _CoreService_ListFeatureSets_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListFeatureSetsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(CoreServiceServer).ListFeatureSets(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/feast.core.CoreService/ListFeatureSets", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(CoreServiceServer).ListFeatureSets(ctx, req.(*ListFeatureSetsRequest)) - } - return interceptor(ctx, in, info, handler) -} - func _CoreService_ListFeatures_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ListFeaturesRequest) if err := dec(in); err != nil { @@ -4355,24 +2913,6 @@ func _CoreService_ListFeatures_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } -func _CoreService_GetFeatureStatistics_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetFeatureStatisticsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(CoreServiceServer).GetFeatureStatistics(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/feast.core.CoreService/GetFeatureStatistics", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(CoreServiceServer).GetFeatureStatistics(ctx, req.(*GetFeatureStatisticsRequest)) - } - return interceptor(ctx, in, info, handler) -} - func _CoreService_ListStores_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ListStoresRequest) if err := dec(in); err != nil { @@ -4391,24 +2931,6 @@ func _CoreService_ListStores_Handler(srv interface{}, ctx context.Context, dec f return interceptor(ctx, in, info, handler) } -func _CoreService_ApplyFeatureSet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ApplyFeatureSetRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(CoreServiceServer).ApplyFeatureSet(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/feast.core.CoreService/ApplyFeatureSet", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(CoreServiceServer).ApplyFeatureSet(ctx, req.(*ApplyFeatureSetRequest)) - } - return interceptor(ctx, in, info, handler) -} - func _CoreService_ApplyEntity_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ApplyEntityRequest) if err := dec(in); err != nil { @@ -4517,24 +3039,6 @@ func _CoreService_ListProjects_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } -func _CoreService_UpdateFeatureSetStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(UpdateFeatureSetStatusRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(CoreServiceServer).UpdateFeatureSetStatus(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/feast.core.CoreService/UpdateFeatureSetStatus", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(CoreServiceServer).UpdateFeatureSetStatus(ctx, req.(*UpdateFeatureSetStatusRequest)) - } - return interceptor(ctx, in, info, handler) -} - func _CoreService_ApplyFeatureTable_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ApplyFeatureTableRequest) if err := dec(in); err != nil { @@ -4589,6 +3093,24 @@ func _CoreService_GetFeatureTable_Handler(srv interface{}, ctx context.Context, return interceptor(ctx, in, info, handler) } +func _CoreService_DeleteFeatureTable_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteFeatureTableRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(CoreServiceServer).DeleteFeatureTable(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/feast.core.CoreService/DeleteFeatureTable", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(CoreServiceServer).DeleteFeatureTable(ctx, req.(*DeleteFeatureTableRequest)) + } + return interceptor(ctx, in, info, handler) +} + var _CoreService_serviceDesc = grpc.ServiceDesc{ ServiceName: "feast.core.CoreService", HandlerType: (*CoreServiceServer)(nil), @@ -4597,34 +3119,18 @@ var _CoreService_serviceDesc = grpc.ServiceDesc{ MethodName: "GetFeastCoreVersion", Handler: _CoreService_GetFeastCoreVersion_Handler, }, - { - MethodName: "GetFeatureSet", - Handler: _CoreService_GetFeatureSet_Handler, - }, { MethodName: "GetEntity", Handler: _CoreService_GetEntity_Handler, }, - { - MethodName: "ListFeatureSets", - Handler: _CoreService_ListFeatureSets_Handler, - }, { MethodName: "ListFeatures", Handler: _CoreService_ListFeatures_Handler, }, - { - MethodName: "GetFeatureStatistics", - Handler: _CoreService_GetFeatureStatistics_Handler, - }, { MethodName: "ListStores", Handler: _CoreService_ListStores_Handler, }, - { - MethodName: "ApplyFeatureSet", - Handler: _CoreService_ApplyFeatureSet_Handler, - }, { MethodName: "ApplyEntity", Handler: _CoreService_ApplyEntity_Handler, @@ -4649,10 +3155,6 @@ var _CoreService_serviceDesc = grpc.ServiceDesc{ MethodName: "ListProjects", Handler: _CoreService_ListProjects_Handler, }, - { - MethodName: "UpdateFeatureSetStatus", - Handler: _CoreService_UpdateFeatureSetStatus_Handler, - }, { MethodName: "ApplyFeatureTable", Handler: _CoreService_ApplyFeatureTable_Handler, @@ -4665,171 +3167,9 @@ var _CoreService_serviceDesc = grpc.ServiceDesc{ MethodName: "GetFeatureTable", Handler: _CoreService_GetFeatureTable_Handler, }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "feast/core/CoreService.proto", -} - -// JobControllerServiceClient is the client API for JobControllerService service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type JobControllerServiceClient interface { - // List Ingestion Jobs given an optional filter. - // Returns allow ingestions matching the given request filter. - // Returns all ingestion jobs if no filter is provided. - // Returns an empty list if no ingestion jobs match the filter. - ListIngestionJobs(ctx context.Context, in *ListIngestionJobsRequest, opts ...grpc.CallOption) (*ListIngestionJobsResponse, error) - // Restart an Ingestion Job. Restarts the ingestion job with the given job id. - // NOTE: Data might be lost during the restart for some job runners. - // Does not support stopping a job in a transitional (ie pending, suspending, aborting), - // terminal state (ie suspended or aborted) or unknown status - RestartIngestionJob(ctx context.Context, in *RestartIngestionJobRequest, opts ...grpc.CallOption) (*RestartIngestionJobResponse, error) - // Stop an Ingestion Job. Stop (Aborts) the ingestion job with the given job id. - // Does nothing if the target job if already in a terminal state (ie suspended or aborted). - // Does not support stopping a job in a transitional (ie pending, suspending, aborting) or unknown status - StopIngestionJob(ctx context.Context, in *StopIngestionJobRequest, opts ...grpc.CallOption) (*StopIngestionJobResponse, error) -} - -type jobControllerServiceClient struct { - cc grpc.ClientConnInterface -} - -func NewJobControllerServiceClient(cc grpc.ClientConnInterface) JobControllerServiceClient { - return &jobControllerServiceClient{cc} -} - -func (c *jobControllerServiceClient) ListIngestionJobs(ctx context.Context, in *ListIngestionJobsRequest, opts ...grpc.CallOption) (*ListIngestionJobsResponse, error) { - out := new(ListIngestionJobsResponse) - err := c.cc.Invoke(ctx, "/feast.core.JobControllerService/ListIngestionJobs", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *jobControllerServiceClient) RestartIngestionJob(ctx context.Context, in *RestartIngestionJobRequest, opts ...grpc.CallOption) (*RestartIngestionJobResponse, error) { - out := new(RestartIngestionJobResponse) - err := c.cc.Invoke(ctx, "/feast.core.JobControllerService/RestartIngestionJob", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *jobControllerServiceClient) StopIngestionJob(ctx context.Context, in *StopIngestionJobRequest, opts ...grpc.CallOption) (*StopIngestionJobResponse, error) { - out := new(StopIngestionJobResponse) - err := c.cc.Invoke(ctx, "/feast.core.JobControllerService/StopIngestionJob", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// JobControllerServiceServer is the server API for JobControllerService service. -type JobControllerServiceServer interface { - // List Ingestion Jobs given an optional filter. - // Returns allow ingestions matching the given request filter. - // Returns all ingestion jobs if no filter is provided. - // Returns an empty list if no ingestion jobs match the filter. - ListIngestionJobs(context.Context, *ListIngestionJobsRequest) (*ListIngestionJobsResponse, error) - // Restart an Ingestion Job. Restarts the ingestion job with the given job id. - // NOTE: Data might be lost during the restart for some job runners. - // Does not support stopping a job in a transitional (ie pending, suspending, aborting), - // terminal state (ie suspended or aborted) or unknown status - RestartIngestionJob(context.Context, *RestartIngestionJobRequest) (*RestartIngestionJobResponse, error) - // Stop an Ingestion Job. Stop (Aborts) the ingestion job with the given job id. - // Does nothing if the target job if already in a terminal state (ie suspended or aborted). - // Does not support stopping a job in a transitional (ie pending, suspending, aborting) or unknown status - StopIngestionJob(context.Context, *StopIngestionJobRequest) (*StopIngestionJobResponse, error) -} - -// UnimplementedJobControllerServiceServer can be embedded to have forward compatible implementations. -type UnimplementedJobControllerServiceServer struct { -} - -func (*UnimplementedJobControllerServiceServer) ListIngestionJobs(context.Context, *ListIngestionJobsRequest) (*ListIngestionJobsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListIngestionJobs not implemented") -} -func (*UnimplementedJobControllerServiceServer) RestartIngestionJob(context.Context, *RestartIngestionJobRequest) (*RestartIngestionJobResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method RestartIngestionJob not implemented") -} -func (*UnimplementedJobControllerServiceServer) StopIngestionJob(context.Context, *StopIngestionJobRequest) (*StopIngestionJobResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method StopIngestionJob not implemented") -} - -func RegisterJobControllerServiceServer(s *grpc.Server, srv JobControllerServiceServer) { - s.RegisterService(&_JobControllerService_serviceDesc, srv) -} - -func _JobControllerService_ListIngestionJobs_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListIngestionJobsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(JobControllerServiceServer).ListIngestionJobs(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/feast.core.JobControllerService/ListIngestionJobs", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(JobControllerServiceServer).ListIngestionJobs(ctx, req.(*ListIngestionJobsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _JobControllerService_RestartIngestionJob_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RestartIngestionJobRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(JobControllerServiceServer).RestartIngestionJob(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/feast.core.JobControllerService/RestartIngestionJob", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(JobControllerServiceServer).RestartIngestionJob(ctx, req.(*RestartIngestionJobRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _JobControllerService_StopIngestionJob_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(StopIngestionJobRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(JobControllerServiceServer).StopIngestionJob(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/feast.core.JobControllerService/StopIngestionJob", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(JobControllerServiceServer).StopIngestionJob(ctx, req.(*StopIngestionJobRequest)) - } - return interceptor(ctx, in, info, handler) -} - -var _JobControllerService_serviceDesc = grpc.ServiceDesc{ - ServiceName: "feast.core.JobControllerService", - HandlerType: (*JobControllerServiceServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "ListIngestionJobs", - Handler: _JobControllerService_ListIngestionJobs_Handler, - }, - { - MethodName: "RestartIngestionJob", - Handler: _JobControllerService_RestartIngestionJob_Handler, - }, { - MethodName: "StopIngestionJob", - Handler: _JobControllerService_StopIngestionJob_Handler, + MethodName: "DeleteFeatureTable", + Handler: _CoreService_DeleteFeatureTable_Handler, }, }, Streams: []grpc.StreamDesc{}, diff --git a/sdk/go/protos/feast/core/DataFormat.pb.go b/sdk/go/protos/feast/core/DataFormat.pb.go index ac6d88f9c7..4a766cc8f9 100644 --- a/sdk/go/protos/feast/core/DataFormat.pb.go +++ b/sdk/go/protos/feast/core/DataFormat.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.10.0 +// protoc v3.12.4 // source: feast/core/DataFormat.proto package core diff --git a/sdk/go/protos/feast/core/DataSource.pb.go b/sdk/go/protos/feast/core/DataSource.pb.go index 4dd43d5196..1b43972d32 100644 --- a/sdk/go/protos/feast/core/DataSource.pb.go +++ b/sdk/go/protos/feast/core/DataSource.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.10.0 +// protoc v3.12.4 // source: feast/core/DataSource.proto package core diff --git a/sdk/go/protos/feast/core/Entity.pb.go b/sdk/go/protos/feast/core/Entity.pb.go index f5a2c0d06a..0aed913325 100644 --- a/sdk/go/protos/feast/core/Entity.pb.go +++ b/sdk/go/protos/feast/core/Entity.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.10.0 +// protoc v3.12.4 // source: feast/core/Entity.proto package core diff --git a/sdk/go/protos/feast/core/Feature.pb.go b/sdk/go/protos/feast/core/Feature.pb.go index 9c2690e0f9..1ad93ef8a1 100644 --- a/sdk/go/protos/feast/core/Feature.pb.go +++ b/sdk/go/protos/feast/core/Feature.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.10.0 +// protoc v3.12.4 // source: feast/core/Feature.proto package core diff --git a/sdk/go/protos/feast/core/FeatureTable.pb.go b/sdk/go/protos/feast/core/FeatureTable.pb.go index 48aef52950..0c4fa1b1f0 100644 --- a/sdk/go/protos/feast/core/FeatureTable.pb.go +++ b/sdk/go/protos/feast/core/FeatureTable.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.10.0 +// protoc v3.12.4 // source: feast/core/FeatureTable.proto package core @@ -105,7 +105,7 @@ type FeatureTableSpec struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Name of the feature set. Must be unique. Not updated. + // Name of the feature table. Must be unique. Not updated. Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // List names of entities to associate with the Features defined in this // Feature Table. Not updatable. @@ -221,6 +221,9 @@ type FeatureTableMeta struct { LastUpdatedTimestamp *timestamp.Timestamp `protobuf:"bytes,2,opt,name=last_updated_timestamp,json=lastUpdatedTimestamp,proto3" json:"last_updated_timestamp,omitempty"` // Auto incrementing revision no. of this Feature Table Revision int64 `protobuf:"varint,3,opt,name=revision,proto3" json:"revision,omitempty"` + // Hash entities, features, batch_source and stream_source to inform JobService if + // jobs should be restarted should hash change + Hash string `protobuf:"bytes,4,opt,name=hash,proto3" json:"hash,omitempty"` } func (x *FeatureTableMeta) Reset() { @@ -276,6 +279,13 @@ func (x *FeatureTableMeta) GetRevision() int64 { return 0 } +func (x *FeatureTableMeta) GetHash() string { + if x != nil { + return x.Hash + } + return "" +} + var File_feast_core_FeatureTable_proto protoreflect.FileDescriptor var file_feast_core_FeatureTable_proto_rawDesc = []byte{ @@ -322,7 +332,7 @@ var file_feast_core_FeatureTable_proto_rawDesc = []byte{ 0x65, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc9, 0x01, 0x0a, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xdd, 0x01, 0x0a, 0x10, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x47, 0x0a, 0x11, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, @@ -335,13 +345,14 @@ var file_feast_core_FeatureTable_proto_rawDesc = []byte{ 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x14, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x5a, 0x0a, 0x10, 0x66, 0x65, 0x61, 0x73, - 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x42, 0x11, 0x46, 0x65, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x5a, - 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x66, 0x65, 0x61, 0x73, - 0x74, 0x2d, 0x64, 0x65, 0x76, 0x2f, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2f, 0x73, 0x64, 0x6b, 0x2f, - 0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2f, - 0x63, 0x6f, 0x72, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x42, 0x5a, 0x0a, 0x10, + 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x72, 0x65, + 0x42, 0x11, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x72, + 0x6f, 0x74, 0x6f, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x66, 0x65, 0x61, 0x73, 0x74, 0x2d, 0x64, 0x65, 0x76, 0x2f, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2f, + 0x73, 0x64, 0x6b, 0x2f, 0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x66, 0x65, + 0x61, 0x73, 0x74, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/sdk/go/protos/feast/core/JobService.pb.go b/sdk/go/protos/feast/core/JobService.pb.go new file mode 100644 index 0000000000..221c530bb3 --- /dev/null +++ b/sdk/go/protos/feast/core/JobService.pb.go @@ -0,0 +1,1789 @@ +// +// Copyright 2018 The Feast Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.25.0 +// protoc v3.12.4 +// source: feast/core/JobService.proto + +package core + +import ( + context "context" + proto "github.com/golang/protobuf/proto" + timestamp "github.com/golang/protobuf/ptypes/timestamp" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 + +type JobType int32 + +const ( + JobType_INVALID_JOB JobType = 0 + JobType_BATCH_INGESTION_JOB JobType = 1 + JobType_STREAM_INGESTION_JOB JobType = 2 + JobType_RETRIEVAL_JOB JobType = 4 +) + +// Enum value maps for JobType. +var ( + JobType_name = map[int32]string{ + 0: "INVALID_JOB", + 1: "BATCH_INGESTION_JOB", + 2: "STREAM_INGESTION_JOB", + 4: "RETRIEVAL_JOB", + } + JobType_value = map[string]int32{ + "INVALID_JOB": 0, + "BATCH_INGESTION_JOB": 1, + "STREAM_INGESTION_JOB": 2, + "RETRIEVAL_JOB": 4, + } +) + +func (x JobType) Enum() *JobType { + p := new(JobType) + *p = x + return p +} + +func (x JobType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (JobType) Descriptor() protoreflect.EnumDescriptor { + return file_feast_core_JobService_proto_enumTypes[0].Descriptor() +} + +func (JobType) Type() protoreflect.EnumType { + return &file_feast_core_JobService_proto_enumTypes[0] +} + +func (x JobType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use JobType.Descriptor instead. +func (JobType) EnumDescriptor() ([]byte, []int) { + return file_feast_core_JobService_proto_rawDescGZIP(), []int{0} +} + +type JobStatus int32 + +const ( + JobStatus_JOB_STATUS_INVALID JobStatus = 0 + // The Job has be registered and waiting to get scheduled to run + JobStatus_JOB_STATUS_PENDING JobStatus = 1 + // The Job is currently processing its task + JobStatus_JOB_STATUS_RUNNING JobStatus = 2 + // The Job has successfully completed its task + JobStatus_JOB_STATUS_DONE JobStatus = 3 + // The Job has encountered an error while processing its task + JobStatus_JOB_STATUS_ERROR JobStatus = 4 +) + +// Enum value maps for JobStatus. +var ( + JobStatus_name = map[int32]string{ + 0: "JOB_STATUS_INVALID", + 1: "JOB_STATUS_PENDING", + 2: "JOB_STATUS_RUNNING", + 3: "JOB_STATUS_DONE", + 4: "JOB_STATUS_ERROR", + } + JobStatus_value = map[string]int32{ + "JOB_STATUS_INVALID": 0, + "JOB_STATUS_PENDING": 1, + "JOB_STATUS_RUNNING": 2, + "JOB_STATUS_DONE": 3, + "JOB_STATUS_ERROR": 4, + } +) + +func (x JobStatus) Enum() *JobStatus { + p := new(JobStatus) + *p = x + return p +} + +func (x JobStatus) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (JobStatus) Descriptor() protoreflect.EnumDescriptor { + return file_feast_core_JobService_proto_enumTypes[1].Descriptor() +} + +func (JobStatus) Type() protoreflect.EnumType { + return &file_feast_core_JobService_proto_enumTypes[1] +} + +func (x JobStatus) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use JobStatus.Descriptor instead. +func (JobStatus) EnumDescriptor() ([]byte, []int) { + return file_feast_core_JobService_proto_rawDescGZIP(), []int{1} +} + +type Job struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Identifier of the Job + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + // Type of the Job + Type JobType `protobuf:"varint,2,opt,name=type,proto3,enum=feast.core.JobType" json:"type,omitempty"` + // Current job status + Status JobStatus `protobuf:"varint,3,opt,name=status,proto3,enum=feast.core.JobStatus" json:"status,omitempty"` + // Deterministic hash of the Job + Hash string `protobuf:"bytes,8,opt,name=hash,proto3" json:"hash,omitempty"` + // JobType specific metadata on the job + // + // Types that are assignable to Meta: + // *Job_Retrieval + // *Job_BatchIngestion + // *Job_StreamIngestion + Meta isJob_Meta `protobuf_oneof:"meta"` +} + +func (x *Job) Reset() { + *x = Job{} + if protoimpl.UnsafeEnabled { + mi := &file_feast_core_JobService_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Job) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Job) ProtoMessage() {} + +func (x *Job) ProtoReflect() protoreflect.Message { + mi := &file_feast_core_JobService_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Job.ProtoReflect.Descriptor instead. +func (*Job) Descriptor() ([]byte, []int) { + return file_feast_core_JobService_proto_rawDescGZIP(), []int{0} +} + +func (x *Job) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *Job) GetType() JobType { + if x != nil { + return x.Type + } + return JobType_INVALID_JOB +} + +func (x *Job) GetStatus() JobStatus { + if x != nil { + return x.Status + } + return JobStatus_JOB_STATUS_INVALID +} + +func (x *Job) GetHash() string { + if x != nil { + return x.Hash + } + return "" +} + +func (m *Job) GetMeta() isJob_Meta { + if m != nil { + return m.Meta + } + return nil +} + +func (x *Job) GetRetrieval() *Job_RetrievalJobMeta { + if x, ok := x.GetMeta().(*Job_Retrieval); ok { + return x.Retrieval + } + return nil +} + +func (x *Job) GetBatchIngestion() *Job_OfflineToOnlineMeta { + if x, ok := x.GetMeta().(*Job_BatchIngestion); ok { + return x.BatchIngestion + } + return nil +} + +func (x *Job) GetStreamIngestion() *Job_StreamToOnlineMeta { + if x, ok := x.GetMeta().(*Job_StreamIngestion); ok { + return x.StreamIngestion + } + return nil +} + +type isJob_Meta interface { + isJob_Meta() +} + +type Job_Retrieval struct { + Retrieval *Job_RetrievalJobMeta `protobuf:"bytes,5,opt,name=retrieval,proto3,oneof"` +} + +type Job_BatchIngestion struct { + BatchIngestion *Job_OfflineToOnlineMeta `protobuf:"bytes,6,opt,name=batch_ingestion,json=batchIngestion,proto3,oneof"` +} + +type Job_StreamIngestion struct { + StreamIngestion *Job_StreamToOnlineMeta `protobuf:"bytes,7,opt,name=stream_ingestion,json=streamIngestion,proto3,oneof"` +} + +func (*Job_Retrieval) isJob_Meta() {} + +func (*Job_BatchIngestion) isJob_Meta() {} + +func (*Job_StreamIngestion) isJob_Meta() {} + +// Ingest data from offline store into online store +type StartOfflineToOnlineIngestionJobRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Feature table to ingest + Project string `protobuf:"bytes,1,opt,name=project,proto3" json:"project,omitempty"` + TableName string `protobuf:"bytes,2,opt,name=table_name,json=tableName,proto3" json:"table_name,omitempty"` + // Start of time range for source data from offline store + StartDate *timestamp.Timestamp `protobuf:"bytes,3,opt,name=start_date,json=startDate,proto3" json:"start_date,omitempty"` + // End of time range for source data from offline store + EndDate *timestamp.Timestamp `protobuf:"bytes,4,opt,name=end_date,json=endDate,proto3" json:"end_date,omitempty"` +} + +func (x *StartOfflineToOnlineIngestionJobRequest) Reset() { + *x = StartOfflineToOnlineIngestionJobRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_feast_core_JobService_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StartOfflineToOnlineIngestionJobRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StartOfflineToOnlineIngestionJobRequest) ProtoMessage() {} + +func (x *StartOfflineToOnlineIngestionJobRequest) ProtoReflect() protoreflect.Message { + mi := &file_feast_core_JobService_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StartOfflineToOnlineIngestionJobRequest.ProtoReflect.Descriptor instead. +func (*StartOfflineToOnlineIngestionJobRequest) Descriptor() ([]byte, []int) { + return file_feast_core_JobService_proto_rawDescGZIP(), []int{1} +} + +func (x *StartOfflineToOnlineIngestionJobRequest) GetProject() string { + if x != nil { + return x.Project + } + return "" +} + +func (x *StartOfflineToOnlineIngestionJobRequest) GetTableName() string { + if x != nil { + return x.TableName + } + return "" +} + +func (x *StartOfflineToOnlineIngestionJobRequest) GetStartDate() *timestamp.Timestamp { + if x != nil { + return x.StartDate + } + return nil +} + +func (x *StartOfflineToOnlineIngestionJobRequest) GetEndDate() *timestamp.Timestamp { + if x != nil { + return x.EndDate + } + return nil +} + +type StartOfflineToOnlineIngestionJobResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Job ID assigned by Feast + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` +} + +func (x *StartOfflineToOnlineIngestionJobResponse) Reset() { + *x = StartOfflineToOnlineIngestionJobResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_feast_core_JobService_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StartOfflineToOnlineIngestionJobResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StartOfflineToOnlineIngestionJobResponse) ProtoMessage() {} + +func (x *StartOfflineToOnlineIngestionJobResponse) ProtoReflect() protoreflect.Message { + mi := &file_feast_core_JobService_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StartOfflineToOnlineIngestionJobResponse.ProtoReflect.Descriptor instead. +func (*StartOfflineToOnlineIngestionJobResponse) Descriptor() ([]byte, []int) { + return file_feast_core_JobService_proto_rawDescGZIP(), []int{2} +} + +func (x *StartOfflineToOnlineIngestionJobResponse) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +type GetHistoricalFeaturesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // List of feature references that are being retrieved + FeatureRefs []string `protobuf:"bytes,1,rep,name=feature_refs,json=featureRefs,proto3" json:"feature_refs,omitempty"` + // Batch DataSource that can be used to obtain entity values for historical retrieval. + // For each entity value, a feature value will be retrieved for that value/timestamp + // Only 'BATCH_*' source types are supported. + // Currently only BATCH_FILE source type is supported. + EntitySource *DataSource `protobuf:"bytes,2,opt,name=entity_source,json=entitySource,proto3" json:"entity_source,omitempty"` + // Optional field to specify project name override. If specified, uses the + // given project for retrieval. Overrides the projects specified in + // Feature References if both are specified. + Project string `protobuf:"bytes,3,opt,name=project,proto3" json:"project,omitempty"` + // Specifies the path in a bucket to write the exported feature data files + // Export to AWS S3 - s3://path/to/features + // Export to GCP GCS - gs://path/to/features + OutputLocation string `protobuf:"bytes,4,opt,name=output_location,json=outputLocation,proto3" json:"output_location,omitempty"` + // Specify format name for output, eg. parquet + OutputFormat string `protobuf:"bytes,5,opt,name=output_format,json=outputFormat,proto3" json:"output_format,omitempty"` +} + +func (x *GetHistoricalFeaturesRequest) Reset() { + *x = GetHistoricalFeaturesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_feast_core_JobService_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetHistoricalFeaturesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetHistoricalFeaturesRequest) ProtoMessage() {} + +func (x *GetHistoricalFeaturesRequest) ProtoReflect() protoreflect.Message { + mi := &file_feast_core_JobService_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetHistoricalFeaturesRequest.ProtoReflect.Descriptor instead. +func (*GetHistoricalFeaturesRequest) Descriptor() ([]byte, []int) { + return file_feast_core_JobService_proto_rawDescGZIP(), []int{3} +} + +func (x *GetHistoricalFeaturesRequest) GetFeatureRefs() []string { + if x != nil { + return x.FeatureRefs + } + return nil +} + +func (x *GetHistoricalFeaturesRequest) GetEntitySource() *DataSource { + if x != nil { + return x.EntitySource + } + return nil +} + +func (x *GetHistoricalFeaturesRequest) GetProject() string { + if x != nil { + return x.Project + } + return "" +} + +func (x *GetHistoricalFeaturesRequest) GetOutputLocation() string { + if x != nil { + return x.OutputLocation + } + return "" +} + +func (x *GetHistoricalFeaturesRequest) GetOutputFormat() string { + if x != nil { + return x.OutputFormat + } + return "" +} + +type GetHistoricalFeaturesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Export Job with ID assigned by Feast + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + OutputFileUri string `protobuf:"bytes,2,opt,name=output_file_uri,json=outputFileUri,proto3" json:"output_file_uri,omitempty"` +} + +func (x *GetHistoricalFeaturesResponse) Reset() { + *x = GetHistoricalFeaturesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_feast_core_JobService_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetHistoricalFeaturesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetHistoricalFeaturesResponse) ProtoMessage() {} + +func (x *GetHistoricalFeaturesResponse) ProtoReflect() protoreflect.Message { + mi := &file_feast_core_JobService_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetHistoricalFeaturesResponse.ProtoReflect.Descriptor instead. +func (*GetHistoricalFeaturesResponse) Descriptor() ([]byte, []int) { + return file_feast_core_JobService_proto_rawDescGZIP(), []int{4} +} + +func (x *GetHistoricalFeaturesResponse) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *GetHistoricalFeaturesResponse) GetOutputFileUri() string { + if x != nil { + return x.OutputFileUri + } + return "" +} + +type StartStreamToOnlineIngestionJobRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Feature table to ingest + Project string `protobuf:"bytes,1,opt,name=project,proto3" json:"project,omitempty"` + TableName string `protobuf:"bytes,2,opt,name=table_name,json=tableName,proto3" json:"table_name,omitempty"` +} + +func (x *StartStreamToOnlineIngestionJobRequest) Reset() { + *x = StartStreamToOnlineIngestionJobRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_feast_core_JobService_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StartStreamToOnlineIngestionJobRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StartStreamToOnlineIngestionJobRequest) ProtoMessage() {} + +func (x *StartStreamToOnlineIngestionJobRequest) ProtoReflect() protoreflect.Message { + mi := &file_feast_core_JobService_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StartStreamToOnlineIngestionJobRequest.ProtoReflect.Descriptor instead. +func (*StartStreamToOnlineIngestionJobRequest) Descriptor() ([]byte, []int) { + return file_feast_core_JobService_proto_rawDescGZIP(), []int{5} +} + +func (x *StartStreamToOnlineIngestionJobRequest) GetProject() string { + if x != nil { + return x.Project + } + return "" +} + +func (x *StartStreamToOnlineIngestionJobRequest) GetTableName() string { + if x != nil { + return x.TableName + } + return "" +} + +type StartStreamToOnlineIngestionJobResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Job ID assigned by Feast + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` +} + +func (x *StartStreamToOnlineIngestionJobResponse) Reset() { + *x = StartStreamToOnlineIngestionJobResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_feast_core_JobService_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StartStreamToOnlineIngestionJobResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StartStreamToOnlineIngestionJobResponse) ProtoMessage() {} + +func (x *StartStreamToOnlineIngestionJobResponse) ProtoReflect() protoreflect.Message { + mi := &file_feast_core_JobService_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StartStreamToOnlineIngestionJobResponse.ProtoReflect.Descriptor instead. +func (*StartStreamToOnlineIngestionJobResponse) Descriptor() ([]byte, []int) { + return file_feast_core_JobService_proto_rawDescGZIP(), []int{6} +} + +func (x *StartStreamToOnlineIngestionJobResponse) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +type ListJobsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + IncludeTerminated bool `protobuf:"varint,1,opt,name=include_terminated,json=includeTerminated,proto3" json:"include_terminated,omitempty"` +} + +func (x *ListJobsRequest) Reset() { + *x = ListJobsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_feast_core_JobService_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListJobsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListJobsRequest) ProtoMessage() {} + +func (x *ListJobsRequest) ProtoReflect() protoreflect.Message { + mi := &file_feast_core_JobService_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListJobsRequest.ProtoReflect.Descriptor instead. +func (*ListJobsRequest) Descriptor() ([]byte, []int) { + return file_feast_core_JobService_proto_rawDescGZIP(), []int{7} +} + +func (x *ListJobsRequest) GetIncludeTerminated() bool { + if x != nil { + return x.IncludeTerminated + } + return false +} + +type ListJobsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Jobs []*Job `protobuf:"bytes,1,rep,name=jobs,proto3" json:"jobs,omitempty"` +} + +func (x *ListJobsResponse) Reset() { + *x = ListJobsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_feast_core_JobService_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListJobsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListJobsResponse) ProtoMessage() {} + +func (x *ListJobsResponse) ProtoReflect() protoreflect.Message { + mi := &file_feast_core_JobService_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListJobsResponse.ProtoReflect.Descriptor instead. +func (*ListJobsResponse) Descriptor() ([]byte, []int) { + return file_feast_core_JobService_proto_rawDescGZIP(), []int{8} +} + +func (x *ListJobsResponse) GetJobs() []*Job { + if x != nil { + return x.Jobs + } + return nil +} + +type GetJobRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + JobId string `protobuf:"bytes,1,opt,name=job_id,json=jobId,proto3" json:"job_id,omitempty"` +} + +func (x *GetJobRequest) Reset() { + *x = GetJobRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_feast_core_JobService_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetJobRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetJobRequest) ProtoMessage() {} + +func (x *GetJobRequest) ProtoReflect() protoreflect.Message { + mi := &file_feast_core_JobService_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetJobRequest.ProtoReflect.Descriptor instead. +func (*GetJobRequest) Descriptor() ([]byte, []int) { + return file_feast_core_JobService_proto_rawDescGZIP(), []int{9} +} + +func (x *GetJobRequest) GetJobId() string { + if x != nil { + return x.JobId + } + return "" +} + +type GetJobResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Job *Job `protobuf:"bytes,1,opt,name=job,proto3" json:"job,omitempty"` +} + +func (x *GetJobResponse) Reset() { + *x = GetJobResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_feast_core_JobService_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetJobResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetJobResponse) ProtoMessage() {} + +func (x *GetJobResponse) ProtoReflect() protoreflect.Message { + mi := &file_feast_core_JobService_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetJobResponse.ProtoReflect.Descriptor instead. +func (*GetJobResponse) Descriptor() ([]byte, []int) { + return file_feast_core_JobService_proto_rawDescGZIP(), []int{10} +} + +func (x *GetJobResponse) GetJob() *Job { + if x != nil { + return x.Job + } + return nil +} + +type CancelJobRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + JobId string `protobuf:"bytes,1,opt,name=job_id,json=jobId,proto3" json:"job_id,omitempty"` +} + +func (x *CancelJobRequest) Reset() { + *x = CancelJobRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_feast_core_JobService_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CancelJobRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CancelJobRequest) ProtoMessage() {} + +func (x *CancelJobRequest) ProtoReflect() protoreflect.Message { + mi := &file_feast_core_JobService_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CancelJobRequest.ProtoReflect.Descriptor instead. +func (*CancelJobRequest) Descriptor() ([]byte, []int) { + return file_feast_core_JobService_proto_rawDescGZIP(), []int{11} +} + +func (x *CancelJobRequest) GetJobId() string { + if x != nil { + return x.JobId + } + return "" +} + +type CancelJobResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *CancelJobResponse) Reset() { + *x = CancelJobResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_feast_core_JobService_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CancelJobResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CancelJobResponse) ProtoMessage() {} + +func (x *CancelJobResponse) ProtoReflect() protoreflect.Message { + mi := &file_feast_core_JobService_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CancelJobResponse.ProtoReflect.Descriptor instead. +func (*CancelJobResponse) Descriptor() ([]byte, []int) { + return file_feast_core_JobService_proto_rawDescGZIP(), []int{12} +} + +type Job_RetrievalJobMeta struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + OutputLocation string `protobuf:"bytes,4,opt,name=output_location,json=outputLocation,proto3" json:"output_location,omitempty"` +} + +func (x *Job_RetrievalJobMeta) Reset() { + *x = Job_RetrievalJobMeta{} + if protoimpl.UnsafeEnabled { + mi := &file_feast_core_JobService_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Job_RetrievalJobMeta) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Job_RetrievalJobMeta) ProtoMessage() {} + +func (x *Job_RetrievalJobMeta) ProtoReflect() protoreflect.Message { + mi := &file_feast_core_JobService_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Job_RetrievalJobMeta.ProtoReflect.Descriptor instead. +func (*Job_RetrievalJobMeta) Descriptor() ([]byte, []int) { + return file_feast_core_JobService_proto_rawDescGZIP(), []int{0, 0} +} + +func (x *Job_RetrievalJobMeta) GetOutputLocation() string { + if x != nil { + return x.OutputLocation + } + return "" +} + +type Job_OfflineToOnlineMeta struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *Job_OfflineToOnlineMeta) Reset() { + *x = Job_OfflineToOnlineMeta{} + if protoimpl.UnsafeEnabled { + mi := &file_feast_core_JobService_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Job_OfflineToOnlineMeta) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Job_OfflineToOnlineMeta) ProtoMessage() {} + +func (x *Job_OfflineToOnlineMeta) ProtoReflect() protoreflect.Message { + mi := &file_feast_core_JobService_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Job_OfflineToOnlineMeta.ProtoReflect.Descriptor instead. +func (*Job_OfflineToOnlineMeta) Descriptor() ([]byte, []int) { + return file_feast_core_JobService_proto_rawDescGZIP(), []int{0, 1} +} + +type Job_StreamToOnlineMeta struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *Job_StreamToOnlineMeta) Reset() { + *x = Job_StreamToOnlineMeta{} + if protoimpl.UnsafeEnabled { + mi := &file_feast_core_JobService_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Job_StreamToOnlineMeta) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Job_StreamToOnlineMeta) ProtoMessage() {} + +func (x *Job_StreamToOnlineMeta) ProtoReflect() protoreflect.Message { + mi := &file_feast_core_JobService_proto_msgTypes[15] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Job_StreamToOnlineMeta.ProtoReflect.Descriptor instead. +func (*Job_StreamToOnlineMeta) Descriptor() ([]byte, []int) { + return file_feast_core_JobService_proto_rawDescGZIP(), []int{0, 2} +} + +var File_feast_core_JobService_proto protoreflect.FileDescriptor + +var file_feast_core_JobService_proto_rawDesc = []byte{ + 0x0a, 0x1b, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x4a, 0x6f, 0x62, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x66, + 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x66, 0x65, 0x61, 0x73, + 0x74, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xd6, 0x03, 0x0a, 0x03, 0x4a, 0x6f, 0x62, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x27, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, + 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x2d, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, + 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x40, 0x0a, 0x09, 0x72, + 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, + 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4a, 0x6f, 0x62, 0x2e, + 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x61, 0x6c, 0x4a, 0x6f, 0x62, 0x4d, 0x65, 0x74, 0x61, + 0x48, 0x00, 0x52, 0x09, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x61, 0x6c, 0x12, 0x4e, 0x0a, + 0x0f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, + 0x6f, 0x72, 0x65, 0x2e, 0x4a, 0x6f, 0x62, 0x2e, 0x4f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x54, + 0x6f, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x48, 0x00, 0x52, 0x0e, 0x62, + 0x61, 0x74, 0x63, 0x68, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, + 0x10, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, + 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4a, 0x6f, 0x62, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, + 0x6f, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x48, 0x00, 0x52, 0x0f, 0x73, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x3b, + 0x0a, 0x10, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x61, 0x6c, 0x4a, 0x6f, 0x62, 0x4d, 0x65, + 0x74, 0x61, 0x12, 0x27, 0x0a, 0x0f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x6c, 0x6f, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x15, 0x0a, 0x13, 0x4f, + 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x4d, 0x65, + 0x74, 0x61, 0x1a, 0x14, 0x0a, 0x12, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x6f, 0x4f, 0x6e, + 0x6c, 0x69, 0x6e, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x42, 0x06, 0x0a, 0x04, 0x6d, 0x65, 0x74, 0x61, + 0x22, 0xd4, 0x01, 0x0a, 0x27, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x66, 0x6c, 0x69, 0x6e, + 0x65, 0x54, 0x6f, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, + 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, + 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, + 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x44, 0x61, 0x74, 0x65, + 0x12, 0x35, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, + 0x65, 0x6e, 0x64, 0x44, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x0a, 0x28, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x4f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x49, + 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x22, 0xe6, 0x01, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x48, 0x69, 0x73, 0x74, 0x6f, + 0x72, 0x69, 0x63, 0x61, 0x6c, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, + 0x72, 0x65, 0x66, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x65, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x52, 0x65, 0x66, 0x73, 0x12, 0x3b, 0x0a, 0x0d, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x44, 0x61, 0x74, 0x61, + 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0c, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x53, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x27, + 0x0a, 0x0f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x4c, + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x6f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x57, 0x0a, 0x1d, + 0x47, 0x65, 0x74, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x46, 0x65, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x26, 0x0a, + 0x0f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x75, 0x72, 0x69, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x69, + 0x6c, 0x65, 0x55, 0x72, 0x69, 0x22, 0x61, 0x0a, 0x26, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x54, 0x6f, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x6e, 0x67, 0x65, + 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x39, 0x0a, 0x27, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x6f, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x49, + 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x22, 0x40, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, + 0x6e, 0x61, 0x74, 0x65, 0x64, 0x22, 0x37, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x62, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x04, 0x6a, 0x6f, 0x62, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, + 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x04, 0x6a, 0x6f, 0x62, 0x73, 0x22, 0x26, + 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x22, 0x33, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x03, 0x6a, 0x6f, 0x62, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, + 0x72, 0x65, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x03, 0x6a, 0x6f, 0x62, 0x22, 0x29, 0x0a, 0x10, 0x43, + 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x22, 0x13, 0x0a, 0x11, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, + 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x60, 0x0a, 0x07, 0x4a, + 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, + 0x44, 0x5f, 0x4a, 0x4f, 0x42, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x42, 0x41, 0x54, 0x43, 0x48, + 0x5f, 0x49, 0x4e, 0x47, 0x45, 0x53, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4a, 0x4f, 0x42, 0x10, 0x01, + 0x12, 0x18, 0x0a, 0x14, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x49, 0x4e, 0x47, 0x45, 0x53, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4a, 0x4f, 0x42, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x52, 0x45, + 0x54, 0x52, 0x49, 0x45, 0x56, 0x41, 0x4c, 0x5f, 0x4a, 0x4f, 0x42, 0x10, 0x04, 0x2a, 0x7e, 0x0a, + 0x09, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x12, 0x4a, 0x4f, + 0x42, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, + 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x4a, 0x4f, 0x42, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, + 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x4a, 0x4f, + 0x42, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, + 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x4a, 0x4f, 0x42, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, + 0x5f, 0x44, 0x4f, 0x4e, 0x45, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, 0x4a, 0x4f, 0x42, 0x5f, 0x53, + 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x04, 0x32, 0xe9, 0x04, + 0x0a, 0x0a, 0x4a, 0x6f, 0x62, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x8d, 0x01, 0x0a, + 0x20, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x4f, + 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x6f, + 0x62, 0x12, 0x33, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x4f, 0x6e, 0x6c, + 0x69, 0x6e, 0x65, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, + 0x6f, 0x72, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, + 0x54, 0x6f, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, + 0x6e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6c, 0x0a, 0x15, + 0x47, 0x65, 0x74, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x46, 0x65, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x28, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, + 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, + 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x29, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, + 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8a, 0x01, 0x0a, 0x1f, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x6f, 0x4f, 0x6e, 0x6c, 0x69, + 0x6e, 0x65, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x12, 0x32, + 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x6f, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x49, + 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x6f, 0x4f, 0x6e, 0x6c, + 0x69, 0x6e, 0x65, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x45, 0x0a, 0x08, 0x4c, 0x69, 0x73, 0x74, 0x4a, + 0x6f, 0x62, 0x73, 0x12, 0x1b, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1c, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, + 0x0a, 0x09, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4a, 0x6f, 0x62, 0x12, 0x1c, 0x2e, 0x66, 0x65, + 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4a, + 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x65, 0x61, 0x73, + 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4a, 0x6f, 0x62, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x4a, + 0x6f, 0x62, 0x12, 0x19, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, + 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, + 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x58, 0x0a, 0x10, 0x66, 0x65, 0x61, + 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x42, 0x0f, 0x4a, + 0x6f, 0x62, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x5a, 0x33, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x66, 0x65, 0x61, 0x73, 0x74, + 0x2d, 0x64, 0x65, 0x76, 0x2f, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2f, 0x73, 0x64, 0x6b, 0x2f, 0x67, + 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2f, 0x63, + 0x6f, 0x72, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_feast_core_JobService_proto_rawDescOnce sync.Once + file_feast_core_JobService_proto_rawDescData = file_feast_core_JobService_proto_rawDesc +) + +func file_feast_core_JobService_proto_rawDescGZIP() []byte { + file_feast_core_JobService_proto_rawDescOnce.Do(func() { + file_feast_core_JobService_proto_rawDescData = protoimpl.X.CompressGZIP(file_feast_core_JobService_proto_rawDescData) + }) + return file_feast_core_JobService_proto_rawDescData +} + +var file_feast_core_JobService_proto_enumTypes = make([]protoimpl.EnumInfo, 2) +var file_feast_core_JobService_proto_msgTypes = make([]protoimpl.MessageInfo, 16) +var file_feast_core_JobService_proto_goTypes = []interface{}{ + (JobType)(0), // 0: feast.core.JobType + (JobStatus)(0), // 1: feast.core.JobStatus + (*Job)(nil), // 2: feast.core.Job + (*StartOfflineToOnlineIngestionJobRequest)(nil), // 3: feast.core.StartOfflineToOnlineIngestionJobRequest + (*StartOfflineToOnlineIngestionJobResponse)(nil), // 4: feast.core.StartOfflineToOnlineIngestionJobResponse + (*GetHistoricalFeaturesRequest)(nil), // 5: feast.core.GetHistoricalFeaturesRequest + (*GetHistoricalFeaturesResponse)(nil), // 6: feast.core.GetHistoricalFeaturesResponse + (*StartStreamToOnlineIngestionJobRequest)(nil), // 7: feast.core.StartStreamToOnlineIngestionJobRequest + (*StartStreamToOnlineIngestionJobResponse)(nil), // 8: feast.core.StartStreamToOnlineIngestionJobResponse + (*ListJobsRequest)(nil), // 9: feast.core.ListJobsRequest + (*ListJobsResponse)(nil), // 10: feast.core.ListJobsResponse + (*GetJobRequest)(nil), // 11: feast.core.GetJobRequest + (*GetJobResponse)(nil), // 12: feast.core.GetJobResponse + (*CancelJobRequest)(nil), // 13: feast.core.CancelJobRequest + (*CancelJobResponse)(nil), // 14: feast.core.CancelJobResponse + (*Job_RetrievalJobMeta)(nil), // 15: feast.core.Job.RetrievalJobMeta + (*Job_OfflineToOnlineMeta)(nil), // 16: feast.core.Job.OfflineToOnlineMeta + (*Job_StreamToOnlineMeta)(nil), // 17: feast.core.Job.StreamToOnlineMeta + (*timestamp.Timestamp)(nil), // 18: google.protobuf.Timestamp + (*DataSource)(nil), // 19: feast.core.DataSource +} +var file_feast_core_JobService_proto_depIdxs = []int32{ + 0, // 0: feast.core.Job.type:type_name -> feast.core.JobType + 1, // 1: feast.core.Job.status:type_name -> feast.core.JobStatus + 15, // 2: feast.core.Job.retrieval:type_name -> feast.core.Job.RetrievalJobMeta + 16, // 3: feast.core.Job.batch_ingestion:type_name -> feast.core.Job.OfflineToOnlineMeta + 17, // 4: feast.core.Job.stream_ingestion:type_name -> feast.core.Job.StreamToOnlineMeta + 18, // 5: feast.core.StartOfflineToOnlineIngestionJobRequest.start_date:type_name -> google.protobuf.Timestamp + 18, // 6: feast.core.StartOfflineToOnlineIngestionJobRequest.end_date:type_name -> google.protobuf.Timestamp + 19, // 7: feast.core.GetHistoricalFeaturesRequest.entity_source:type_name -> feast.core.DataSource + 2, // 8: feast.core.ListJobsResponse.jobs:type_name -> feast.core.Job + 2, // 9: feast.core.GetJobResponse.job:type_name -> feast.core.Job + 3, // 10: feast.core.JobService.StartOfflineToOnlineIngestionJob:input_type -> feast.core.StartOfflineToOnlineIngestionJobRequest + 5, // 11: feast.core.JobService.GetHistoricalFeatures:input_type -> feast.core.GetHistoricalFeaturesRequest + 7, // 12: feast.core.JobService.StartStreamToOnlineIngestionJob:input_type -> feast.core.StartStreamToOnlineIngestionJobRequest + 9, // 13: feast.core.JobService.ListJobs:input_type -> feast.core.ListJobsRequest + 13, // 14: feast.core.JobService.CancelJob:input_type -> feast.core.CancelJobRequest + 11, // 15: feast.core.JobService.GetJob:input_type -> feast.core.GetJobRequest + 4, // 16: feast.core.JobService.StartOfflineToOnlineIngestionJob:output_type -> feast.core.StartOfflineToOnlineIngestionJobResponse + 6, // 17: feast.core.JobService.GetHistoricalFeatures:output_type -> feast.core.GetHistoricalFeaturesResponse + 8, // 18: feast.core.JobService.StartStreamToOnlineIngestionJob:output_type -> feast.core.StartStreamToOnlineIngestionJobResponse + 10, // 19: feast.core.JobService.ListJobs:output_type -> feast.core.ListJobsResponse + 14, // 20: feast.core.JobService.CancelJob:output_type -> feast.core.CancelJobResponse + 12, // 21: feast.core.JobService.GetJob:output_type -> feast.core.GetJobResponse + 16, // [16:22] is the sub-list for method output_type + 10, // [10:16] is the sub-list for method input_type + 10, // [10:10] is the sub-list for extension type_name + 10, // [10:10] is the sub-list for extension extendee + 0, // [0:10] is the sub-list for field type_name +} + +func init() { file_feast_core_JobService_proto_init() } +func file_feast_core_JobService_proto_init() { + if File_feast_core_JobService_proto != nil { + return + } + file_feast_core_DataSource_proto_init() + if !protoimpl.UnsafeEnabled { + file_feast_core_JobService_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Job); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_feast_core_JobService_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StartOfflineToOnlineIngestionJobRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_feast_core_JobService_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StartOfflineToOnlineIngestionJobResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_feast_core_JobService_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetHistoricalFeaturesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_feast_core_JobService_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetHistoricalFeaturesResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_feast_core_JobService_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StartStreamToOnlineIngestionJobRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_feast_core_JobService_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StartStreamToOnlineIngestionJobResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_feast_core_JobService_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListJobsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_feast_core_JobService_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListJobsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_feast_core_JobService_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetJobRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_feast_core_JobService_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetJobResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_feast_core_JobService_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CancelJobRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_feast_core_JobService_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CancelJobResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_feast_core_JobService_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Job_RetrievalJobMeta); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_feast_core_JobService_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Job_OfflineToOnlineMeta); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_feast_core_JobService_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Job_StreamToOnlineMeta); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_feast_core_JobService_proto_msgTypes[0].OneofWrappers = []interface{}{ + (*Job_Retrieval)(nil), + (*Job_BatchIngestion)(nil), + (*Job_StreamIngestion)(nil), + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_feast_core_JobService_proto_rawDesc, + NumEnums: 2, + NumMessages: 16, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_feast_core_JobService_proto_goTypes, + DependencyIndexes: file_feast_core_JobService_proto_depIdxs, + EnumInfos: file_feast_core_JobService_proto_enumTypes, + MessageInfos: file_feast_core_JobService_proto_msgTypes, + }.Build() + File_feast_core_JobService_proto = out.File + file_feast_core_JobService_proto_rawDesc = nil + file_feast_core_JobService_proto_goTypes = nil + file_feast_core_JobService_proto_depIdxs = nil +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConnInterface + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion6 + +// JobServiceClient is the client API for JobService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type JobServiceClient interface { + // Start job to ingest data from offline store into online store + StartOfflineToOnlineIngestionJob(ctx context.Context, in *StartOfflineToOnlineIngestionJobRequest, opts ...grpc.CallOption) (*StartOfflineToOnlineIngestionJobResponse, error) + // Produce a training dataset, return a job id that will provide a file reference + GetHistoricalFeatures(ctx context.Context, in *GetHistoricalFeaturesRequest, opts ...grpc.CallOption) (*GetHistoricalFeaturesResponse, error) + // Start job to ingest data from stream into online store + StartStreamToOnlineIngestionJob(ctx context.Context, in *StartStreamToOnlineIngestionJobRequest, opts ...grpc.CallOption) (*StartStreamToOnlineIngestionJobResponse, error) + // List all types of jobs + ListJobs(ctx context.Context, in *ListJobsRequest, opts ...grpc.CallOption) (*ListJobsResponse, error) + // Cancel a single job + CancelJob(ctx context.Context, in *CancelJobRequest, opts ...grpc.CallOption) (*CancelJobResponse, error) + // Get details of a single job + GetJob(ctx context.Context, in *GetJobRequest, opts ...grpc.CallOption) (*GetJobResponse, error) +} + +type jobServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewJobServiceClient(cc grpc.ClientConnInterface) JobServiceClient { + return &jobServiceClient{cc} +} + +func (c *jobServiceClient) StartOfflineToOnlineIngestionJob(ctx context.Context, in *StartOfflineToOnlineIngestionJobRequest, opts ...grpc.CallOption) (*StartOfflineToOnlineIngestionJobResponse, error) { + out := new(StartOfflineToOnlineIngestionJobResponse) + err := c.cc.Invoke(ctx, "/feast.core.JobService/StartOfflineToOnlineIngestionJob", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *jobServiceClient) GetHistoricalFeatures(ctx context.Context, in *GetHistoricalFeaturesRequest, opts ...grpc.CallOption) (*GetHistoricalFeaturesResponse, error) { + out := new(GetHistoricalFeaturesResponse) + err := c.cc.Invoke(ctx, "/feast.core.JobService/GetHistoricalFeatures", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *jobServiceClient) StartStreamToOnlineIngestionJob(ctx context.Context, in *StartStreamToOnlineIngestionJobRequest, opts ...grpc.CallOption) (*StartStreamToOnlineIngestionJobResponse, error) { + out := new(StartStreamToOnlineIngestionJobResponse) + err := c.cc.Invoke(ctx, "/feast.core.JobService/StartStreamToOnlineIngestionJob", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *jobServiceClient) ListJobs(ctx context.Context, in *ListJobsRequest, opts ...grpc.CallOption) (*ListJobsResponse, error) { + out := new(ListJobsResponse) + err := c.cc.Invoke(ctx, "/feast.core.JobService/ListJobs", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *jobServiceClient) CancelJob(ctx context.Context, in *CancelJobRequest, opts ...grpc.CallOption) (*CancelJobResponse, error) { + out := new(CancelJobResponse) + err := c.cc.Invoke(ctx, "/feast.core.JobService/CancelJob", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *jobServiceClient) GetJob(ctx context.Context, in *GetJobRequest, opts ...grpc.CallOption) (*GetJobResponse, error) { + out := new(GetJobResponse) + err := c.cc.Invoke(ctx, "/feast.core.JobService/GetJob", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// JobServiceServer is the server API for JobService service. +type JobServiceServer interface { + // Start job to ingest data from offline store into online store + StartOfflineToOnlineIngestionJob(context.Context, *StartOfflineToOnlineIngestionJobRequest) (*StartOfflineToOnlineIngestionJobResponse, error) + // Produce a training dataset, return a job id that will provide a file reference + GetHistoricalFeatures(context.Context, *GetHistoricalFeaturesRequest) (*GetHistoricalFeaturesResponse, error) + // Start job to ingest data from stream into online store + StartStreamToOnlineIngestionJob(context.Context, *StartStreamToOnlineIngestionJobRequest) (*StartStreamToOnlineIngestionJobResponse, error) + // List all types of jobs + ListJobs(context.Context, *ListJobsRequest) (*ListJobsResponse, error) + // Cancel a single job + CancelJob(context.Context, *CancelJobRequest) (*CancelJobResponse, error) + // Get details of a single job + GetJob(context.Context, *GetJobRequest) (*GetJobResponse, error) +} + +// UnimplementedJobServiceServer can be embedded to have forward compatible implementations. +type UnimplementedJobServiceServer struct { +} + +func (*UnimplementedJobServiceServer) StartOfflineToOnlineIngestionJob(context.Context, *StartOfflineToOnlineIngestionJobRequest) (*StartOfflineToOnlineIngestionJobResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method StartOfflineToOnlineIngestionJob not implemented") +} +func (*UnimplementedJobServiceServer) GetHistoricalFeatures(context.Context, *GetHistoricalFeaturesRequest) (*GetHistoricalFeaturesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetHistoricalFeatures not implemented") +} +func (*UnimplementedJobServiceServer) StartStreamToOnlineIngestionJob(context.Context, *StartStreamToOnlineIngestionJobRequest) (*StartStreamToOnlineIngestionJobResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method StartStreamToOnlineIngestionJob not implemented") +} +func (*UnimplementedJobServiceServer) ListJobs(context.Context, *ListJobsRequest) (*ListJobsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListJobs not implemented") +} +func (*UnimplementedJobServiceServer) CancelJob(context.Context, *CancelJobRequest) (*CancelJobResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CancelJob not implemented") +} +func (*UnimplementedJobServiceServer) GetJob(context.Context, *GetJobRequest) (*GetJobResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetJob not implemented") +} + +func RegisterJobServiceServer(s *grpc.Server, srv JobServiceServer) { + s.RegisterService(&_JobService_serviceDesc, srv) +} + +func _JobService_StartOfflineToOnlineIngestionJob_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(StartOfflineToOnlineIngestionJobRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(JobServiceServer).StartOfflineToOnlineIngestionJob(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/feast.core.JobService/StartOfflineToOnlineIngestionJob", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(JobServiceServer).StartOfflineToOnlineIngestionJob(ctx, req.(*StartOfflineToOnlineIngestionJobRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _JobService_GetHistoricalFeatures_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetHistoricalFeaturesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(JobServiceServer).GetHistoricalFeatures(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/feast.core.JobService/GetHistoricalFeatures", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(JobServiceServer).GetHistoricalFeatures(ctx, req.(*GetHistoricalFeaturesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _JobService_StartStreamToOnlineIngestionJob_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(StartStreamToOnlineIngestionJobRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(JobServiceServer).StartStreamToOnlineIngestionJob(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/feast.core.JobService/StartStreamToOnlineIngestionJob", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(JobServiceServer).StartStreamToOnlineIngestionJob(ctx, req.(*StartStreamToOnlineIngestionJobRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _JobService_ListJobs_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListJobsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(JobServiceServer).ListJobs(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/feast.core.JobService/ListJobs", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(JobServiceServer).ListJobs(ctx, req.(*ListJobsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _JobService_CancelJob_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CancelJobRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(JobServiceServer).CancelJob(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/feast.core.JobService/CancelJob", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(JobServiceServer).CancelJob(ctx, req.(*CancelJobRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _JobService_GetJob_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetJobRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(JobServiceServer).GetJob(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/feast.core.JobService/GetJob", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(JobServiceServer).GetJob(ctx, req.(*GetJobRequest)) + } + return interceptor(ctx, in, info, handler) +} + +var _JobService_serviceDesc = grpc.ServiceDesc{ + ServiceName: "feast.core.JobService", + HandlerType: (*JobServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "StartOfflineToOnlineIngestionJob", + Handler: _JobService_StartOfflineToOnlineIngestionJob_Handler, + }, + { + MethodName: "GetHistoricalFeatures", + Handler: _JobService_GetHistoricalFeatures_Handler, + }, + { + MethodName: "StartStreamToOnlineIngestionJob", + Handler: _JobService_StartStreamToOnlineIngestionJob_Handler, + }, + { + MethodName: "ListJobs", + Handler: _JobService_ListJobs_Handler, + }, + { + MethodName: "CancelJob", + Handler: _JobService_CancelJob_Handler, + }, + { + MethodName: "GetJob", + Handler: _JobService_GetJob_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "feast/core/JobService.proto", +} diff --git a/sdk/go/protos/feast/core/Store.pb.go b/sdk/go/protos/feast/core/Store.pb.go index b5ffae9326..9498c6a40c 100644 --- a/sdk/go/protos/feast/core/Store.pb.go +++ b/sdk/go/protos/feast/core/Store.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.10.0 +// protoc v3.12.4 // source: feast/core/Store.proto package core @@ -52,59 +52,10 @@ const ( // - value: STRING // // Encodings: - // - key: byte array of RedisKey (refer to feast.storage.RedisKey) - // - value: byte array of FeatureRow (refer to feast.types.FeatureRow) + // - key: byte array of RedisKey (refer to feast.storage.RedisKeyV2) + // - value: Redis hashmap // - Store_REDIS Store_StoreType = 1 - // BigQuery stores a FeatureRow element as a row in a BigQuery table. - // - // Table name is derived is the same as the feature set name. - // - // The entities and features in a FeatureSetSpec corresponds to the - // fields in the BigQuery table (these make up the BigQuery schema). - // The name of the entity spec and feature spec corresponds to the column - // names, and the value_type of entity spec and feature spec corresponds - // to BigQuery standard SQL data type of the column. - // - // The following BigQuery fields are reserved for Feast internal use. - // Ingestion of entity or feature spec with names identical - // to the following field names will raise an exception during ingestion. - // - // column_name | column_data_type | description - // ====================|==================|================================ - // - event_timestamp | TIMESTAMP | event time of the FeatureRow - // - created_timestamp | TIMESTAMP | processing time of the ingestion of the FeatureRow - // - ingestion_id | STRING | unique id identifying groups of rows that have been ingested together - // - job_id | STRING | identifier for the job that writes the FeatureRow to the corresponding BigQuery table - // - // BigQuery table created will be partitioned by the field "event_timestamp" - // of the FeatureRow (https://cloud.google.com/bigquery/docs/partitioned-tables). - // - // The following table shows how ValueType in Feast is mapped to - // BigQuery Standard SQL data types - // (https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types): - // - // BYTES : BYTES - // STRING : STRING - // INT32 : INT64 - // INT64 : IN64 - // DOUBLE : FLOAT64 - // FLOAT : FLOAT64 - // BOOL : BOOL - // BYTES_LIST : ARRAY - // STRING_LIST : ARRAY - // INT32_LIST : ARRAY - // INT64_LIST : ARRAY - // DOUBLE_LIST : ARRAY - // FLOAT_LIST : ARRAY - // BOOL_LIST : ARRAY - // - // The column mode in BigQuery is set to "Nullable" such that unset Value - // in a FeatureRow corresponds to NULL value in BigQuery. - // - Store_BIGQUERY Store_StoreType = 2 - // Unsupported in Feast 0.3 - Store_CASSANDRA Store_StoreType = 3 + Store_REDIS Store_StoreType = 1 Store_REDIS_CLUSTER Store_StoreType = 4 ) @@ -113,15 +64,11 @@ var ( Store_StoreType_name = map[int32]string{ 0: "INVALID", 1: "REDIS", - 2: "BIGQUERY", - 3: "CASSANDRA", 4: "REDIS_CLUSTER", } Store_StoreType_value = map[string]int32{ "INVALID": 0, "REDIS": 1, - "BIGQUERY": 2, - "CASSANDRA": 3, "REDIS_CLUSTER": 4, } ) @@ -158,9 +105,6 @@ func (Store_StoreType) EnumDescriptor() ([]byte, []int) { // The way FeatureRow is encoded and decoded when it is written to and read from // the Store depends on the type of the Store. // -// For example, a FeatureRow will materialize as a row in a table in -// BigQuery but it will materialize as a key, value pair element in Redis. -// type Store struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -176,8 +120,6 @@ type Store struct { // // Types that are assignable to Config: // *Store_RedisConfig_ - // *Store_BigqueryConfig - // *Store_CassandraConfig_ // *Store_RedisClusterConfig_ Config isStore_Config `protobuf_oneof:"config"` } @@ -249,20 +191,6 @@ func (x *Store) GetRedisConfig() *Store_RedisConfig { return nil } -func (x *Store) GetBigqueryConfig() *Store_BigQueryConfig { - if x, ok := x.GetConfig().(*Store_BigqueryConfig); ok { - return x.BigqueryConfig - } - return nil -} - -func (x *Store) GetCassandraConfig() *Store_CassandraConfig { - if x, ok := x.GetConfig().(*Store_CassandraConfig_); ok { - return x.CassandraConfig - } - return nil -} - func (x *Store) GetRedisClusterConfig() *Store_RedisClusterConfig { if x, ok := x.GetConfig().(*Store_RedisClusterConfig_); ok { return x.RedisClusterConfig @@ -278,24 +206,12 @@ type Store_RedisConfig_ struct { RedisConfig *Store_RedisConfig `protobuf:"bytes,11,opt,name=redis_config,json=redisConfig,proto3,oneof"` } -type Store_BigqueryConfig struct { - BigqueryConfig *Store_BigQueryConfig `protobuf:"bytes,12,opt,name=bigquery_config,json=bigqueryConfig,proto3,oneof"` -} - -type Store_CassandraConfig_ struct { - CassandraConfig *Store_CassandraConfig `protobuf:"bytes,13,opt,name=cassandra_config,json=cassandraConfig,proto3,oneof"` -} - type Store_RedisClusterConfig_ struct { RedisClusterConfig *Store_RedisClusterConfig `protobuf:"bytes,14,opt,name=redis_cluster_config,json=redisClusterConfig,proto3,oneof"` } func (*Store_RedisConfig_) isStore_Config() {} -func (*Store_BigqueryConfig) isStore_Config() {} - -func (*Store_CassandraConfig_) isStore_Config() {} - func (*Store_RedisClusterConfig_) isStore_Config() {} type Store_RedisConfig struct { @@ -312,6 +228,8 @@ type Store_RedisConfig struct { MaxRetries int32 `protobuf:"varint,4,opt,name=max_retries,json=maxRetries,proto3" json:"max_retries,omitempty"` // Optional. How often flush data to redis FlushFrequencySeconds int32 `protobuf:"varint,5,opt,name=flush_frequency_seconds,json=flushFrequencySeconds,proto3" json:"flush_frequency_seconds,omitempty"` + // Optional. Connect over SSL. + Ssl bool `protobuf:"varint,6,opt,name=ssl,proto3" json:"ssl,omitempty"` } func (x *Store_RedisConfig) Reset() { @@ -381,147 +299,11 @@ func (x *Store_RedisConfig) GetFlushFrequencySeconds() int32 { return 0 } -type Store_BigQueryConfig struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ProjectId string `protobuf:"bytes,1,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` - DatasetId string `protobuf:"bytes,2,opt,name=dataset_id,json=datasetId,proto3" json:"dataset_id,omitempty"` - StagingLocation string `protobuf:"bytes,3,opt,name=staging_location,json=stagingLocation,proto3" json:"staging_location,omitempty"` - InitialRetryDelaySeconds int32 `protobuf:"varint,4,opt,name=initial_retry_delay_seconds,json=initialRetryDelaySeconds,proto3" json:"initial_retry_delay_seconds,omitempty"` - TotalTimeoutSeconds int32 `protobuf:"varint,5,opt,name=total_timeout_seconds,json=totalTimeoutSeconds,proto3" json:"total_timeout_seconds,omitempty"` - // Required. Frequency of running BQ load job and flushing all collected rows to BQ table - WriteTriggeringFrequencySeconds int32 `protobuf:"varint,6,opt,name=write_triggering_frequency_seconds,json=writeTriggeringFrequencySeconds,proto3" json:"write_triggering_frequency_seconds,omitempty"` -} - -func (x *Store_BigQueryConfig) Reset() { - *x = Store_BigQueryConfig{} - if protoimpl.UnsafeEnabled { - mi := &file_feast_core_Store_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Store_BigQueryConfig) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Store_BigQueryConfig) ProtoMessage() {} - -func (x *Store_BigQueryConfig) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_Store_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Store_BigQueryConfig.ProtoReflect.Descriptor instead. -func (*Store_BigQueryConfig) Descriptor() ([]byte, []int) { - return file_feast_core_Store_proto_rawDescGZIP(), []int{0, 1} -} - -func (x *Store_BigQueryConfig) GetProjectId() string { - if x != nil { - return x.ProjectId - } - return "" -} - -func (x *Store_BigQueryConfig) GetDatasetId() string { - if x != nil { - return x.DatasetId - } - return "" -} - -func (x *Store_BigQueryConfig) GetStagingLocation() string { - if x != nil { - return x.StagingLocation - } - return "" -} - -func (x *Store_BigQueryConfig) GetInitialRetryDelaySeconds() int32 { - if x != nil { - return x.InitialRetryDelaySeconds - } - return 0 -} - -func (x *Store_BigQueryConfig) GetTotalTimeoutSeconds() int32 { - if x != nil { - return x.TotalTimeoutSeconds - } - return 0 -} - -func (x *Store_BigQueryConfig) GetWriteTriggeringFrequencySeconds() int32 { - if x != nil { - return x.WriteTriggeringFrequencySeconds - } - return 0 -} - -type Store_CassandraConfig struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Host string `protobuf:"bytes,1,opt,name=host,proto3" json:"host,omitempty"` - Port int32 `protobuf:"varint,2,opt,name=port,proto3" json:"port,omitempty"` -} - -func (x *Store_CassandraConfig) Reset() { - *x = Store_CassandraConfig{} - if protoimpl.UnsafeEnabled { - mi := &file_feast_core_Store_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Store_CassandraConfig) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Store_CassandraConfig) ProtoMessage() {} - -func (x *Store_CassandraConfig) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_Store_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Store_CassandraConfig.ProtoReflect.Descriptor instead. -func (*Store_CassandraConfig) Descriptor() ([]byte, []int) { - return file_feast_core_Store_proto_rawDescGZIP(), []int{0, 2} -} - -func (x *Store_CassandraConfig) GetHost() string { +func (x *Store_RedisConfig) GetSsl() bool { if x != nil { - return x.Host + return x.Ssl } - return "" -} - -func (x *Store_CassandraConfig) GetPort() int32 { - if x != nil { - return x.Port - } - return 0 + return false } type Store_RedisClusterConfig struct { @@ -547,7 +329,7 @@ type Store_RedisClusterConfig struct { func (x *Store_RedisClusterConfig) Reset() { *x = Store_RedisClusterConfig{} if protoimpl.UnsafeEnabled { - mi := &file_feast_core_Store_proto_msgTypes[4] + mi := &file_feast_core_Store_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -560,7 +342,7 @@ func (x *Store_RedisClusterConfig) String() string { func (*Store_RedisClusterConfig) ProtoMessage() {} func (x *Store_RedisClusterConfig) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_Store_proto_msgTypes[4] + mi := &file_feast_core_Store_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -573,7 +355,7 @@ func (x *Store_RedisClusterConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use Store_RedisClusterConfig.ProtoReflect.Descriptor instead. func (*Store_RedisClusterConfig) Descriptor() ([]byte, []int) { - return file_feast_core_Store_proto_rawDescGZIP(), []int{0, 3} + return file_feast_core_Store_proto_rawDescGZIP(), []int{0, 1} } func (x *Store_RedisClusterConfig) GetConnectionString() string { @@ -652,7 +434,7 @@ type Store_Subscription struct { func (x *Store_Subscription) Reset() { *x = Store_Subscription{} if protoimpl.UnsafeEnabled { - mi := &file_feast_core_Store_proto_msgTypes[5] + mi := &file_feast_core_Store_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -665,7 +447,7 @@ func (x *Store_Subscription) String() string { func (*Store_Subscription) ProtoMessage() {} func (x *Store_Subscription) ProtoReflect() protoreflect.Message { - mi := &file_feast_core_Store_proto_msgTypes[5] + mi := &file_feast_core_Store_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -678,7 +460,7 @@ func (x *Store_Subscription) ProtoReflect() protoreflect.Message { // Deprecated: Use Store_Subscription.ProtoReflect.Descriptor instead. func (*Store_Subscription) Descriptor() ([]byte, []int) { - return file_feast_core_Store_proto_rawDescGZIP(), []int{0, 4} + return file_feast_core_Store_proto_rawDescGZIP(), []int{0, 2} } func (x *Store_Subscription) GetProject() string { @@ -707,7 +489,7 @@ var File_feast_core_Store_proto protoreflect.FileDescriptor var file_feast_core_Store_proto_rawDesc = []byte{ 0x0a, 0x16, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, - 0x63, 0x6f, 0x72, 0x65, 0x22, 0xfc, 0x0b, 0x0a, 0x05, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x12, + 0x63, 0x6f, 0x72, 0x65, 0x22, 0xf5, 0x07, 0x0a, 0x05, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x53, 0x74, @@ -720,95 +502,63 @@ var file_feast_core_Store_proto_rawDesc = []byte{ 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x52, 0x65, 0x64, 0x69, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, - 0x52, 0x0b, 0x72, 0x65, 0x64, 0x69, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x4b, 0x0a, - 0x0f, 0x62, 0x69, 0x67, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, - 0x6f, 0x72, 0x65, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x42, 0x69, 0x67, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x0e, 0x62, 0x69, 0x67, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x4e, 0x0a, 0x10, 0x63, 0x61, - 0x73, 0x73, 0x61, 0x6e, 0x64, 0x72, 0x61, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0d, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, - 0x65, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x43, 0x61, 0x73, 0x73, 0x61, 0x6e, 0x64, 0x72, - 0x61, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x0f, 0x63, 0x61, 0x73, 0x73, 0x61, - 0x6e, 0x64, 0x72, 0x61, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x58, 0x0a, 0x14, 0x72, 0x65, - 0x64, 0x69, 0x73, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x52, 0x65, 0x64, 0x69, - 0x73, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, - 0x52, 0x12, 0x72, 0x65, 0x64, 0x69, 0x73, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x1a, 0xbc, 0x01, 0x0a, 0x0b, 0x52, 0x65, 0x64, 0x69, 0x73, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x2c, 0x0a, 0x12, + 0x52, 0x0b, 0x72, 0x65, 0x64, 0x69, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x58, 0x0a, + 0x14, 0x72, 0x65, 0x64, 0x69, 0x73, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x66, 0x65, + 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x52, + 0x65, 0x64, 0x69, 0x73, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x48, 0x00, 0x52, 0x12, 0x72, 0x65, 0x64, 0x69, 0x73, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0xce, 0x01, 0x0a, 0x0b, 0x52, 0x65, 0x64, 0x69, + 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, + 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, + 0x2c, 0x0a, 0x12, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x6f, + 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x69, 0x6e, 0x69, + 0x74, 0x69, 0x61, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x6f, 0x66, 0x66, 0x4d, 0x73, 0x12, 0x1f, 0x0a, + 0x0b, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x36, + 0x0a, 0x17, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x5f, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, + 0x79, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x15, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x53, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x73, 0x6c, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x03, 0x73, 0x73, 0x6c, 0x1a, 0xb9, 0x02, 0x0a, 0x12, 0x52, 0x65, 0x64, + 0x69, 0x73, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, + 0x2b, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x2c, 0x0a, 0x12, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x6f, 0x66, 0x66, 0x5f, - 0x6d, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, + 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x6f, 0x66, 0x66, 0x4d, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x61, - 0x78, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x78, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x36, 0x0a, 0x17, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x5f, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x73, - 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x66, 0x6c, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x53, 0x65, 0x63, 0x6f, - 0x6e, 0x64, 0x73, 0x1a, 0xb9, 0x02, 0x0a, 0x0e, 0x42, 0x69, 0x67, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x73, 0x65, 0x74, - 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x73, - 0x65, 0x74, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x73, 0x74, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, - 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, - 0x73, 0x74, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x3d, 0x0a, 0x1b, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x79, - 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x18, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x74, - 0x72, 0x79, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x32, - 0x0a, 0x15, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x5f, - 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x74, - 0x6f, 0x74, 0x61, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x53, 0x65, 0x63, 0x6f, 0x6e, - 0x64, 0x73, 0x12, 0x4b, 0x0a, 0x22, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x74, 0x72, 0x69, 0x67, - 0x67, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, - 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x1f, - 0x77, 0x72, 0x69, 0x74, 0x65, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x46, - 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x1a, - 0x39, 0x0a, 0x0f, 0x43, 0x61, 0x73, 0x73, 0x61, 0x6e, 0x64, 0x72, 0x61, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x1a, 0xb9, 0x02, 0x0a, 0x12, 0x52, - 0x65, 0x64, 0x69, 0x73, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x2c, - 0x0a, 0x12, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x6f, 0x66, - 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x69, 0x6e, 0x69, 0x74, - 0x69, 0x61, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x6f, 0x66, 0x66, 0x4d, 0x73, 0x12, 0x1f, 0x0a, 0x0b, - 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x36, 0x0a, - 0x17, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x5f, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, - 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, - 0x66, 0x6c, 0x75, 0x73, 0x68, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x53, 0x65, - 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x6b, 0x65, 0x79, 0x5f, 0x70, 0x72, 0x65, - 0x66, 0x69, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6b, 0x65, 0x79, 0x50, 0x72, - 0x65, 0x66, 0x69, 0x78, 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x66, - 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x46, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x27, 0x0a, - 0x0f, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, - 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x1a, 0x5c, 0x0a, 0x0c, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4a, 0x04, - 0x08, 0x02, 0x10, 0x03, 0x22, 0x53, 0x0a, 0x09, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x09, - 0x0a, 0x05, 0x52, 0x45, 0x44, 0x49, 0x53, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x42, 0x49, 0x47, - 0x51, 0x55, 0x45, 0x52, 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x41, 0x53, 0x53, 0x41, - 0x4e, 0x44, 0x52, 0x41, 0x10, 0x03, 0x12, 0x11, 0x0a, 0x0d, 0x52, 0x45, 0x44, 0x49, 0x53, 0x5f, - 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x10, 0x04, 0x42, 0x08, 0x0a, 0x06, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x42, 0x53, 0x0a, 0x10, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x42, 0x0a, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x66, 0x65, 0x61, 0x73, 0x74, 0x2d, 0x64, 0x65, 0x76, 0x2f, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2f, - 0x73, 0x64, 0x6b, 0x2f, 0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x66, 0x65, - 0x61, 0x73, 0x74, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6e, 0x64, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x6b, 0x65, 0x79, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, + 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6b, 0x65, 0x79, 0x50, 0x72, 0x65, 0x66, + 0x69, 0x78, 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x66, 0x61, 0x6c, + 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x46, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x27, 0x0a, 0x0f, 0x66, + 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x50, 0x72, + 0x65, 0x66, 0x69, 0x78, 0x1a, 0x5c, 0x0a, 0x0c, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4a, 0x04, 0x08, 0x02, + 0x10, 0x03, 0x22, 0x4e, 0x0a, 0x09, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, + 0x52, 0x45, 0x44, 0x49, 0x53, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x52, 0x45, 0x44, 0x49, 0x53, + 0x5f, 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x10, 0x04, 0x22, 0x04, 0x08, 0x02, 0x10, 0x02, + 0x22, 0x04, 0x08, 0x03, 0x10, 0x03, 0x22, 0x04, 0x08, 0x0c, 0x10, 0x0c, 0x22, 0x04, 0x08, 0x0d, + 0x10, 0x0d, 0x42, 0x08, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x53, 0x0a, 0x10, + 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x72, 0x65, + 0x42, 0x0a, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x5a, 0x33, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2d, 0x64, + 0x65, 0x76, 0x2f, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2f, 0x73, 0x64, 0x6b, 0x2f, 0x67, 0x6f, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2f, 0x63, 0x6f, 0x72, + 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -824,28 +574,24 @@ func file_feast_core_Store_proto_rawDescGZIP() []byte { } var file_feast_core_Store_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_feast_core_Store_proto_msgTypes = make([]protoimpl.MessageInfo, 6) +var file_feast_core_Store_proto_msgTypes = make([]protoimpl.MessageInfo, 4) var file_feast_core_Store_proto_goTypes = []interface{}{ (Store_StoreType)(0), // 0: feast.core.Store.StoreType (*Store)(nil), // 1: feast.core.Store (*Store_RedisConfig)(nil), // 2: feast.core.Store.RedisConfig - (*Store_BigQueryConfig)(nil), // 3: feast.core.Store.BigQueryConfig - (*Store_CassandraConfig)(nil), // 4: feast.core.Store.CassandraConfig - (*Store_RedisClusterConfig)(nil), // 5: feast.core.Store.RedisClusterConfig - (*Store_Subscription)(nil), // 6: feast.core.Store.Subscription + (*Store_RedisClusterConfig)(nil), // 3: feast.core.Store.RedisClusterConfig + (*Store_Subscription)(nil), // 4: feast.core.Store.Subscription } var file_feast_core_Store_proto_depIdxs = []int32{ 0, // 0: feast.core.Store.type:type_name -> feast.core.Store.StoreType - 6, // 1: feast.core.Store.subscriptions:type_name -> feast.core.Store.Subscription + 4, // 1: feast.core.Store.subscriptions:type_name -> feast.core.Store.Subscription 2, // 2: feast.core.Store.redis_config:type_name -> feast.core.Store.RedisConfig - 3, // 3: feast.core.Store.bigquery_config:type_name -> feast.core.Store.BigQueryConfig - 4, // 4: feast.core.Store.cassandra_config:type_name -> feast.core.Store.CassandraConfig - 5, // 5: feast.core.Store.redis_cluster_config:type_name -> feast.core.Store.RedisClusterConfig - 6, // [6:6] is the sub-list for method output_type - 6, // [6:6] is the sub-list for method input_type - 6, // [6:6] is the sub-list for extension type_name - 6, // [6:6] is the sub-list for extension extendee - 0, // [0:6] is the sub-list for field type_name + 3, // 3: feast.core.Store.redis_cluster_config:type_name -> feast.core.Store.RedisClusterConfig + 4, // [4:4] is the sub-list for method output_type + 4, // [4:4] is the sub-list for method input_type + 4, // [4:4] is the sub-list for extension type_name + 4, // [4:4] is the sub-list for extension extendee + 0, // [0:4] is the sub-list for field type_name } func init() { file_feast_core_Store_proto_init() } @@ -879,30 +625,6 @@ func file_feast_core_Store_proto_init() { } } file_feast_core_Store_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Store_BigQueryConfig); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_feast_core_Store_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Store_CassandraConfig); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_feast_core_Store_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Store_RedisClusterConfig); i { case 0: return &v.state @@ -914,7 +636,7 @@ func file_feast_core_Store_proto_init() { return nil } } - file_feast_core_Store_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_feast_core_Store_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Store_Subscription); i { case 0: return &v.state @@ -929,8 +651,6 @@ func file_feast_core_Store_proto_init() { } file_feast_core_Store_proto_msgTypes[0].OneofWrappers = []interface{}{ (*Store_RedisConfig_)(nil), - (*Store_BigqueryConfig)(nil), - (*Store_CassandraConfig_)(nil), (*Store_RedisClusterConfig_)(nil), } type x struct{} @@ -939,7 +659,7 @@ func file_feast_core_Store_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_feast_core_Store_proto_rawDesc, NumEnums: 1, - NumMessages: 6, + NumMessages: 4, NumExtensions: 0, NumServices: 0, }, diff --git a/sdk/go/protos/feast/serving/ServingService.pb.go b/sdk/go/protos/feast/serving/ServingService.pb.go index f77930562e..7d40fa45d5 100644 --- a/sdk/go/protos/feast/serving/ServingService.pb.go +++ b/sdk/go/protos/feast/serving/ServingService.pb.go @@ -16,7 +16,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.10.0 +// protoc v3.12.4 // source: feast/serving/ServingService.proto package serving @@ -24,7 +24,7 @@ package serving import ( context "context" types "github.com/feast-dev/feast/sdk/go/protos/feast/types" - v0 "github.com/feast-dev/feast/sdk/go/protos/tensorflow_metadata/proto/v0" + _ "github.com/feast-dev/feast/sdk/go/protos/tensorflow_metadata/proto/v0" proto "github.com/golang/protobuf/proto" timestamp "github.com/golang/protobuf/ptypes/timestamp" grpc "google.golang.org/grpc" @@ -100,150 +100,6 @@ func (FeastServingType) EnumDescriptor() ([]byte, []int) { return file_feast_serving_ServingService_proto_rawDescGZIP(), []int{0} } -type JobType int32 - -const ( - JobType_JOB_TYPE_INVALID JobType = 0 - JobType_JOB_TYPE_DOWNLOAD JobType = 1 -) - -// Enum value maps for JobType. -var ( - JobType_name = map[int32]string{ - 0: "JOB_TYPE_INVALID", - 1: "JOB_TYPE_DOWNLOAD", - } - JobType_value = map[string]int32{ - "JOB_TYPE_INVALID": 0, - "JOB_TYPE_DOWNLOAD": 1, - } -) - -func (x JobType) Enum() *JobType { - p := new(JobType) - *p = x - return p -} - -func (x JobType) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (JobType) Descriptor() protoreflect.EnumDescriptor { - return file_feast_serving_ServingService_proto_enumTypes[1].Descriptor() -} - -func (JobType) Type() protoreflect.EnumType { - return &file_feast_serving_ServingService_proto_enumTypes[1] -} - -func (x JobType) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use JobType.Descriptor instead. -func (JobType) EnumDescriptor() ([]byte, []int) { - return file_feast_serving_ServingService_proto_rawDescGZIP(), []int{1} -} - -type JobStatus int32 - -const ( - JobStatus_JOB_STATUS_INVALID JobStatus = 0 - JobStatus_JOB_STATUS_PENDING JobStatus = 1 - JobStatus_JOB_STATUS_RUNNING JobStatus = 2 - JobStatus_JOB_STATUS_DONE JobStatus = 3 -) - -// Enum value maps for JobStatus. -var ( - JobStatus_name = map[int32]string{ - 0: "JOB_STATUS_INVALID", - 1: "JOB_STATUS_PENDING", - 2: "JOB_STATUS_RUNNING", - 3: "JOB_STATUS_DONE", - } - JobStatus_value = map[string]int32{ - "JOB_STATUS_INVALID": 0, - "JOB_STATUS_PENDING": 1, - "JOB_STATUS_RUNNING": 2, - "JOB_STATUS_DONE": 3, - } -) - -func (x JobStatus) Enum() *JobStatus { - p := new(JobStatus) - *p = x - return p -} - -func (x JobStatus) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (JobStatus) Descriptor() protoreflect.EnumDescriptor { - return file_feast_serving_ServingService_proto_enumTypes[2].Descriptor() -} - -func (JobStatus) Type() protoreflect.EnumType { - return &file_feast_serving_ServingService_proto_enumTypes[2] -} - -func (x JobStatus) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use JobStatus.Descriptor instead. -func (JobStatus) EnumDescriptor() ([]byte, []int) { - return file_feast_serving_ServingService_proto_rawDescGZIP(), []int{2} -} - -type DataFormat int32 - -const ( - DataFormat_DATA_FORMAT_INVALID DataFormat = 0 - DataFormat_DATA_FORMAT_AVRO DataFormat = 1 -) - -// Enum value maps for DataFormat. -var ( - DataFormat_name = map[int32]string{ - 0: "DATA_FORMAT_INVALID", - 1: "DATA_FORMAT_AVRO", - } - DataFormat_value = map[string]int32{ - "DATA_FORMAT_INVALID": 0, - "DATA_FORMAT_AVRO": 1, - } -) - -func (x DataFormat) Enum() *DataFormat { - p := new(DataFormat) - *p = x - return p -} - -func (x DataFormat) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (DataFormat) Descriptor() protoreflect.EnumDescriptor { - return file_feast_serving_ServingService_proto_enumTypes[3].Descriptor() -} - -func (DataFormat) Type() protoreflect.EnumType { - return &file_feast_serving_ServingService_proto_enumTypes[3] -} - -func (x DataFormat) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use DataFormat.Descriptor instead. -func (DataFormat) EnumDescriptor() ([]byte, []int) { - return file_feast_serving_ServingService_proto_rawDescGZIP(), []int{3} -} - type GetOnlineFeaturesResponse_FieldStatus int32 const ( @@ -292,11 +148,11 @@ func (x GetOnlineFeaturesResponse_FieldStatus) String() string { } func (GetOnlineFeaturesResponse_FieldStatus) Descriptor() protoreflect.EnumDescriptor { - return file_feast_serving_ServingService_proto_enumTypes[4].Descriptor() + return file_feast_serving_ServingService_proto_enumTypes[1].Descriptor() } func (GetOnlineFeaturesResponse_FieldStatus) Type() protoreflect.EnumType { - return &file_feast_serving_ServingService_proto_enumTypes[4] + return &file_feast_serving_ServingService_proto_enumTypes[1] } func (x GetOnlineFeaturesResponse_FieldStatus) Number() protoreflect.EnumNumber { @@ -305,7 +161,7 @@ func (x GetOnlineFeaturesResponse_FieldStatus) Number() protoreflect.EnumNumber // Deprecated: Use GetOnlineFeaturesResponse_FieldStatus.Descriptor instead. func (GetOnlineFeaturesResponse_FieldStatus) EnumDescriptor() ([]byte, []int) { - return file_feast_serving_ServingService_proto_rawDescGZIP(), []int{7, 0} + return file_feast_serving_ServingService_proto_rawDescGZIP(), []int{4, 0} } type GetFeastServingInfoRequest struct { @@ -414,74 +270,6 @@ func (x *GetFeastServingInfoResponse) GetJobStagingLocation() string { return "" } -type FeatureReference struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Project name. This field is optional, if unspecified will default to 'default'. - 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 set name specifying the feature set of this referenced feature. - // This field is optional if the feature referenced is unique across the project - // in which case the feature set would be automatically infered - FeatureSet string `protobuf:"bytes,5,opt,name=feature_set,json=featureSet,proto3" json:"feature_set,omitempty"` -} - -func (x *FeatureReference) Reset() { - *x = FeatureReference{} - if protoimpl.UnsafeEnabled { - mi := &file_feast_serving_ServingService_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *FeatureReference) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*FeatureReference) ProtoMessage() {} - -func (x *FeatureReference) ProtoReflect() protoreflect.Message { - mi := &file_feast_serving_ServingService_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use FeatureReference.ProtoReflect.Descriptor instead. -func (*FeatureReference) Descriptor() ([]byte, []int) { - return file_feast_serving_ServingService_proto_rawDescGZIP(), []int{2} -} - -func (x *FeatureReference) GetProject() string { - if x != nil { - return x.Project - } - return "" -} - -func (x *FeatureReference) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *FeatureReference) GetFeatureSet() string { - if x != nil { - return x.FeatureSet - } - return "" -} - type FeatureReferenceV2 struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -496,7 +284,7 @@ type FeatureReferenceV2 struct { func (x *FeatureReferenceV2) Reset() { *x = FeatureReferenceV2{} if protoimpl.UnsafeEnabled { - mi := &file_feast_serving_ServingService_proto_msgTypes[3] + mi := &file_feast_serving_ServingService_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -509,7 +297,7 @@ func (x *FeatureReferenceV2) String() string { func (*FeatureReferenceV2) ProtoMessage() {} func (x *FeatureReferenceV2) ProtoReflect() protoreflect.Message { - mi := &file_feast_serving_ServingService_proto_msgTypes[3] + mi := &file_feast_serving_ServingService_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -522,7 +310,7 @@ func (x *FeatureReferenceV2) ProtoReflect() protoreflect.Message { // Deprecated: Use FeatureReferenceV2.ProtoReflect.Descriptor instead. func (*FeatureReferenceV2) Descriptor() ([]byte, []int) { - return file_feast_serving_ServingService_proto_rawDescGZIP(), []int{3} + return file_feast_serving_ServingService_proto_rawDescGZIP(), []int{2} } func (x *FeatureReferenceV2) GetFeatureTable() string { @@ -539,86 +327,6 @@ func (x *FeatureReferenceV2) GetName() string { return "" } -type GetOnlineFeaturesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // 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 - EntityRows []*GetOnlineFeaturesRequest_EntityRow `protobuf:"bytes,2,rep,name=entity_rows,json=entityRows,proto3" json:"entity_rows,omitempty"` - // Option to omit entities from the response. If true, only feature - // values will be returned. - OmitEntitiesInResponse bool `protobuf:"varint,3,opt,name=omit_entities_in_response,json=omitEntitiesInResponse,proto3" json:"omit_entities_in_response,omitempty"` - // Optional field to specify project name override. If specified, uses the - // given project for retrieval. Overrides the projects specified in - // Feature References if both are specified. - Project string `protobuf:"bytes,5,opt,name=project,proto3" json:"project,omitempty"` -} - -func (x *GetOnlineFeaturesRequest) Reset() { - *x = GetOnlineFeaturesRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_feast_serving_ServingService_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetOnlineFeaturesRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetOnlineFeaturesRequest) ProtoMessage() {} - -func (x *GetOnlineFeaturesRequest) ProtoReflect() protoreflect.Message { - mi := &file_feast_serving_ServingService_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetOnlineFeaturesRequest.ProtoReflect.Descriptor instead. -func (*GetOnlineFeaturesRequest) Descriptor() ([]byte, []int) { - return file_feast_serving_ServingService_proto_rawDescGZIP(), []int{4} -} - -func (x *GetOnlineFeaturesRequest) GetFeatures() []*FeatureReference { - if x != nil { - return x.Features - } - return nil -} - -func (x *GetOnlineFeaturesRequest) GetEntityRows() []*GetOnlineFeaturesRequest_EntityRow { - if x != nil { - return x.EntityRows - } - return nil -} - -func (x *GetOnlineFeaturesRequest) GetOmitEntitiesInResponse() bool { - if x != nil { - return x.OmitEntitiesInResponse - } - return false -} - -func (x *GetOnlineFeaturesRequest) GetProject() string { - if x != nil { - return x.Project - } - return "" -} - type GetOnlineFeaturesRequestV2 struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -639,7 +347,7 @@ type GetOnlineFeaturesRequestV2 struct { func (x *GetOnlineFeaturesRequestV2) Reset() { *x = GetOnlineFeaturesRequestV2{} if protoimpl.UnsafeEnabled { - mi := &file_feast_serving_ServingService_proto_msgTypes[5] + mi := &file_feast_serving_ServingService_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -652,7 +360,7 @@ func (x *GetOnlineFeaturesRequestV2) String() string { func (*GetOnlineFeaturesRequestV2) ProtoMessage() {} func (x *GetOnlineFeaturesRequestV2) ProtoReflect() protoreflect.Message { - mi := &file_feast_serving_ServingService_proto_msgTypes[5] + mi := &file_feast_serving_ServingService_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -665,7 +373,7 @@ func (x *GetOnlineFeaturesRequestV2) ProtoReflect() protoreflect.Message { // Deprecated: Use GetOnlineFeaturesRequestV2.ProtoReflect.Descriptor instead. func (*GetOnlineFeaturesRequestV2) Descriptor() ([]byte, []int) { - return file_feast_serving_ServingService_proto_rawDescGZIP(), []int{5} + return file_feast_serving_ServingService_proto_rawDescGZIP(), []int{3} } func (x *GetOnlineFeaturesRequestV2) GetFeatures() []*FeatureReferenceV2 { @@ -689,462 +397,32 @@ func (x *GetOnlineFeaturesRequestV2) GetProject() string { return "" } -type GetBatchFeaturesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // List of features that are being retrieved - Features []*FeatureReference `protobuf:"bytes,3,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"` - // Compute statistics for the dataset retrieved - ComputeStatistics bool `protobuf:"varint,4,opt,name=compute_statistics,json=computeStatistics,proto3" json:"compute_statistics,omitempty"` -} - -func (x *GetBatchFeaturesRequest) Reset() { - *x = GetBatchFeaturesRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_feast_serving_ServingService_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetBatchFeaturesRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetBatchFeaturesRequest) ProtoMessage() {} - -func (x *GetBatchFeaturesRequest) ProtoReflect() protoreflect.Message { - mi := &file_feast_serving_ServingService_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetBatchFeaturesRequest.ProtoReflect.Descriptor instead. -func (*GetBatchFeaturesRequest) Descriptor() ([]byte, []int) { - return file_feast_serving_ServingService_proto_rawDescGZIP(), []int{6} -} - -func (x *GetBatchFeaturesRequest) GetFeatures() []*FeatureReference { - if x != nil { - return x.Features - } - return nil -} - -func (x *GetBatchFeaturesRequest) GetDatasetSource() *DatasetSource { - if x != nil { - return x.DatasetSource - } - return nil -} - -func (x *GetBatchFeaturesRequest) GetComputeStatistics() bool { - if x != nil { - return x.ComputeStatistics - } - return false -} - type GetOnlineFeaturesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Feature values retrieved from feast. - FieldValues []*GetOnlineFeaturesResponse_FieldValues `protobuf:"bytes,1,rep,name=field_values,json=fieldValues,proto3" json:"field_values,omitempty"` -} - -func (x *GetOnlineFeaturesResponse) Reset() { - *x = GetOnlineFeaturesResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_feast_serving_ServingService_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetOnlineFeaturesResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetOnlineFeaturesResponse) ProtoMessage() {} - -func (x *GetOnlineFeaturesResponse) ProtoReflect() protoreflect.Message { - mi := &file_feast_serving_ServingService_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetOnlineFeaturesResponse.ProtoReflect.Descriptor instead. -func (*GetOnlineFeaturesResponse) Descriptor() ([]byte, []int) { - return file_feast_serving_ServingService_proto_rawDescGZIP(), []int{7} -} - -func (x *GetOnlineFeaturesResponse) GetFieldValues() []*GetOnlineFeaturesResponse_FieldValues { - if x != nil { - return x.FieldValues - } - return nil -} - -type GetBatchFeaturesResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Job *Job `protobuf:"bytes,1,opt,name=job,proto3" json:"job,omitempty"` -} - -func (x *GetBatchFeaturesResponse) Reset() { - *x = GetBatchFeaturesResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_feast_serving_ServingService_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetBatchFeaturesResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetBatchFeaturesResponse) ProtoMessage() {} - -func (x *GetBatchFeaturesResponse) ProtoReflect() protoreflect.Message { - mi := &file_feast_serving_ServingService_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetBatchFeaturesResponse.ProtoReflect.Descriptor instead. -func (*GetBatchFeaturesResponse) Descriptor() ([]byte, []int) { - return file_feast_serving_ServingService_proto_rawDescGZIP(), []int{8} -} - -func (x *GetBatchFeaturesResponse) GetJob() *Job { - if x != nil { - return x.Job - } - return nil -} - -type GetJobRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Job *Job `protobuf:"bytes,1,opt,name=job,proto3" json:"job,omitempty"` -} - -func (x *GetJobRequest) Reset() { - *x = GetJobRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_feast_serving_ServingService_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetJobRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetJobRequest) ProtoMessage() {} - -func (x *GetJobRequest) ProtoReflect() protoreflect.Message { - mi := &file_feast_serving_ServingService_proto_msgTypes[9] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetJobRequest.ProtoReflect.Descriptor instead. -func (*GetJobRequest) Descriptor() ([]byte, []int) { - return file_feast_serving_ServingService_proto_rawDescGZIP(), []int{9} -} - -func (x *GetJobRequest) GetJob() *Job { - if x != nil { - return x.Job - } - return nil -} - -type GetJobResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Job *Job `protobuf:"bytes,1,opt,name=job,proto3" json:"job,omitempty"` -} - -func (x *GetJobResponse) Reset() { - *x = GetJobResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_feast_serving_ServingService_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetJobResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetJobResponse) ProtoMessage() {} - -func (x *GetJobResponse) ProtoReflect() protoreflect.Message { - mi := &file_feast_serving_ServingService_proto_msgTypes[10] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetJobResponse.ProtoReflect.Descriptor instead. -func (*GetJobResponse) Descriptor() ([]byte, []int) { - return file_feast_serving_ServingService_proto_rawDescGZIP(), []int{10} -} - -func (x *GetJobResponse) GetJob() *Job { - if x != nil { - return x.Job - } - return nil -} - -type Job struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - // Output only. The type of the job. - Type JobType `protobuf:"varint,2,opt,name=type,proto3,enum=feast.serving.JobType" json:"type,omitempty"` - // Output only. Current state of the job. - Status JobStatus `protobuf:"varint,3,opt,name=status,proto3,enum=feast.serving.JobStatus" json:"status,omitempty"` - // Output only. If not empty, the job has failed with this error message. - Error string `protobuf:"bytes,4,opt,name=error,proto3" json:"error,omitempty"` - // Output only. The list of URIs for the files to be downloaded or - // uploaded (depends on the job type) for this particular job. - FileUris []string `protobuf:"bytes,5,rep,name=file_uris,json=fileUris,proto3" json:"file_uris,omitempty"` - // Output only. The data format for all the files. - // For CSV format, the files contain both feature values and a column header. - DataFormat DataFormat `protobuf:"varint,6,opt,name=data_format,json=dataFormat,proto3,enum=feast.serving.DataFormat" json:"data_format,omitempty"` - // Output only. The statistics computed over - // the retrieved dataset. Only available for BigQuery stores. - DatasetFeatureStatisticsList *v0.DatasetFeatureStatisticsList `protobuf:"bytes,7,opt,name=dataset_feature_statistics_list,json=datasetFeatureStatisticsList,proto3" json:"dataset_feature_statistics_list,omitempty"` -} - -func (x *Job) Reset() { - *x = Job{} - if protoimpl.UnsafeEnabled { - mi := &file_feast_serving_ServingService_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Job) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Job) ProtoMessage() {} - -func (x *Job) ProtoReflect() protoreflect.Message { - mi := &file_feast_serving_ServingService_proto_msgTypes[11] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Job.ProtoReflect.Descriptor instead. -func (*Job) Descriptor() ([]byte, []int) { - return file_feast_serving_ServingService_proto_rawDescGZIP(), []int{11} -} - -func (x *Job) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *Job) GetType() JobType { - if x != nil { - return x.Type - } - return JobType_JOB_TYPE_INVALID -} - -func (x *Job) GetStatus() JobStatus { - if x != nil { - return x.Status - } - return JobStatus_JOB_STATUS_INVALID -} - -func (x *Job) GetError() string { - if x != nil { - return x.Error - } - return "" -} - -func (x *Job) GetFileUris() []string { - if x != nil { - return x.FileUris - } - return nil -} - -func (x *Job) GetDataFormat() DataFormat { - if x != nil { - return x.DataFormat - } - return DataFormat_DATA_FORMAT_INVALID -} - -func (x *Job) GetDatasetFeatureStatisticsList() *v0.DatasetFeatureStatisticsList { - if x != nil { - return x.DatasetFeatureStatisticsList - } - return nil -} - -type DatasetSource struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Types that are assignable to DatasetSource: - // *DatasetSource_FileSource_ - DatasetSource isDatasetSource_DatasetSource `protobuf_oneof:"dataset_source"` -} - -func (x *DatasetSource) Reset() { - *x = DatasetSource{} - if protoimpl.UnsafeEnabled { - mi := &file_feast_serving_ServingService_proto_msgTypes[12] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DatasetSource) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DatasetSource) ProtoMessage() {} - -func (x *DatasetSource) ProtoReflect() protoreflect.Message { - mi := &file_feast_serving_ServingService_proto_msgTypes[12] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use DatasetSource.ProtoReflect.Descriptor instead. -func (*DatasetSource) Descriptor() ([]byte, []int) { - return file_feast_serving_ServingService_proto_rawDescGZIP(), []int{12} -} - -func (m *DatasetSource) GetDatasetSource() isDatasetSource_DatasetSource { - if m != nil { - return m.DatasetSource - } - return nil -} - -func (x *DatasetSource) GetFileSource() *DatasetSource_FileSource { - if x, ok := x.GetDatasetSource().(*DatasetSource_FileSource_); ok { - return x.FileSource - } - return nil -} - -type isDatasetSource_DatasetSource interface { - isDatasetSource_DatasetSource() -} - -type DatasetSource_FileSource_ struct { - // File source to load the dataset from. - FileSource *DatasetSource_FileSource `protobuf:"bytes,1,opt,name=file_source,json=fileSource,proto3,oneof"` -} - -func (*DatasetSource_FileSource_) isDatasetSource_DatasetSource() {} - -type GetOnlineFeaturesRequest_EntityRow struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Request timestamp of this row. This value will be used, - // together with maxAge, to determine feature staleness. - EntityTimestamp *timestamp.Timestamp `protobuf:"bytes,1,opt,name=entity_timestamp,json=entityTimestamp,proto3" json:"entity_timestamp,omitempty"` - // Map containing mapping of entity name to entity value. - Fields map[string]*types.Value `protobuf:"bytes,2,rep,name=fields,proto3" json:"fields,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // Feature values retrieved from feast. + FieldValues []*GetOnlineFeaturesResponse_FieldValues `protobuf:"bytes,1,rep,name=field_values,json=fieldValues,proto3" json:"field_values,omitempty"` } -func (x *GetOnlineFeaturesRequest_EntityRow) Reset() { - *x = GetOnlineFeaturesRequest_EntityRow{} +func (x *GetOnlineFeaturesResponse) Reset() { + *x = GetOnlineFeaturesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_feast_serving_ServingService_proto_msgTypes[13] + mi := &file_feast_serving_ServingService_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetOnlineFeaturesRequest_EntityRow) String() string { +func (x *GetOnlineFeaturesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetOnlineFeaturesRequest_EntityRow) ProtoMessage() {} +func (*GetOnlineFeaturesResponse) ProtoMessage() {} -func (x *GetOnlineFeaturesRequest_EntityRow) ProtoReflect() protoreflect.Message { - mi := &file_feast_serving_ServingService_proto_msgTypes[13] +func (x *GetOnlineFeaturesResponse) ProtoReflect() protoreflect.Message { + mi := &file_feast_serving_ServingService_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1155,21 +433,14 @@ func (x *GetOnlineFeaturesRequest_EntityRow) ProtoReflect() protoreflect.Message return mi.MessageOf(x) } -// Deprecated: Use GetOnlineFeaturesRequest_EntityRow.ProtoReflect.Descriptor instead. -func (*GetOnlineFeaturesRequest_EntityRow) Descriptor() ([]byte, []int) { - return file_feast_serving_ServingService_proto_rawDescGZIP(), []int{4, 0} -} - -func (x *GetOnlineFeaturesRequest_EntityRow) GetEntityTimestamp() *timestamp.Timestamp { - if x != nil { - return x.EntityTimestamp - } - return nil +// Deprecated: Use GetOnlineFeaturesResponse.ProtoReflect.Descriptor instead. +func (*GetOnlineFeaturesResponse) Descriptor() ([]byte, []int) { + return file_feast_serving_ServingService_proto_rawDescGZIP(), []int{4} } -func (x *GetOnlineFeaturesRequest_EntityRow) GetFields() map[string]*types.Value { +func (x *GetOnlineFeaturesResponse) GetFieldValues() []*GetOnlineFeaturesResponse_FieldValues { if x != nil { - return x.Fields + return x.FieldValues } return nil } @@ -1189,7 +460,7 @@ type GetOnlineFeaturesRequestV2_EntityRow struct { func (x *GetOnlineFeaturesRequestV2_EntityRow) Reset() { *x = GetOnlineFeaturesRequestV2_EntityRow{} if protoimpl.UnsafeEnabled { - mi := &file_feast_serving_ServingService_proto_msgTypes[15] + mi := &file_feast_serving_ServingService_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1202,7 +473,7 @@ func (x *GetOnlineFeaturesRequestV2_EntityRow) String() string { func (*GetOnlineFeaturesRequestV2_EntityRow) ProtoMessage() {} func (x *GetOnlineFeaturesRequestV2_EntityRow) ProtoReflect() protoreflect.Message { - mi := &file_feast_serving_ServingService_proto_msgTypes[15] + mi := &file_feast_serving_ServingService_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1215,7 +486,7 @@ func (x *GetOnlineFeaturesRequestV2_EntityRow) ProtoReflect() protoreflect.Messa // Deprecated: Use GetOnlineFeaturesRequestV2_EntityRow.ProtoReflect.Descriptor instead. func (*GetOnlineFeaturesRequestV2_EntityRow) Descriptor() ([]byte, []int) { - return file_feast_serving_ServingService_proto_rawDescGZIP(), []int{5, 0} + return file_feast_serving_ServingService_proto_rawDescGZIP(), []int{3, 0} } func (x *GetOnlineFeaturesRequestV2_EntityRow) GetTimestamp() *timestamp.Timestamp { @@ -1247,7 +518,7 @@ type GetOnlineFeaturesResponse_FieldValues struct { func (x *GetOnlineFeaturesResponse_FieldValues) Reset() { *x = GetOnlineFeaturesResponse_FieldValues{} if protoimpl.UnsafeEnabled { - mi := &file_feast_serving_ServingService_proto_msgTypes[17] + mi := &file_feast_serving_ServingService_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1260,7 +531,7 @@ func (x *GetOnlineFeaturesResponse_FieldValues) String() string { func (*GetOnlineFeaturesResponse_FieldValues) ProtoMessage() {} func (x *GetOnlineFeaturesResponse_FieldValues) ProtoReflect() protoreflect.Message { - mi := &file_feast_serving_ServingService_proto_msgTypes[17] + mi := &file_feast_serving_ServingService_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1273,7 +544,7 @@ func (x *GetOnlineFeaturesResponse_FieldValues) ProtoReflect() protoreflect.Mess // Deprecated: Use GetOnlineFeaturesResponse_FieldValues.ProtoReflect.Descriptor instead. func (*GetOnlineFeaturesResponse_FieldValues) Descriptor() ([]byte, []int) { - return file_feast_serving_ServingService_proto_rawDescGZIP(), []int{7, 0} + return file_feast_serving_ServingService_proto_rawDescGZIP(), []int{4, 0} } func (x *GetOnlineFeaturesResponse_FieldValues) GetFields() map[string]*types.Value { @@ -1290,65 +561,6 @@ func (x *GetOnlineFeaturesResponse_FieldValues) GetStatuses() map[string]GetOnli return nil } -type DatasetSource_FileSource struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // URIs to retrieve the dataset from, e.g. gs://bucket/directory/object.csv. Wildcards are - // supported. This data must be compatible to be uploaded to the serving store, and also be - // accessible by this serving instance. - FileUris []string `protobuf:"bytes,1,rep,name=file_uris,json=fileUris,proto3" json:"file_uris,omitempty"` - // Format of the data. Currently only avro is supported. - DataFormat DataFormat `protobuf:"varint,2,opt,name=data_format,json=dataFormat,proto3,enum=feast.serving.DataFormat" json:"data_format,omitempty"` -} - -func (x *DatasetSource_FileSource) Reset() { - *x = DatasetSource_FileSource{} - if protoimpl.UnsafeEnabled { - mi := &file_feast_serving_ServingService_proto_msgTypes[20] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DatasetSource_FileSource) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DatasetSource_FileSource) ProtoMessage() {} - -func (x *DatasetSource_FileSource) ProtoReflect() protoreflect.Message { - mi := &file_feast_serving_ServingService_proto_msgTypes[20] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use DatasetSource_FileSource.ProtoReflect.Descriptor instead. -func (*DatasetSource_FileSource) Descriptor() ([]byte, []int) { - return file_feast_serving_ServingService_proto_rawDescGZIP(), []int{12, 0} -} - -func (x *DatasetSource_FileSource) GetFileUris() []string { - if x != nil { - return x.FileUris - } - return nil -} - -func (x *DatasetSource_FileSource) GetDataFormat() DataFormat { - if x != nil { - return x.DataFormat - } - return DataFormat_DATA_FORMAT_INVALID -} - var File_feast_serving_ServingService_proto protoreflect.FileDescriptor var file_feast_serving_ServingService_proto_rawDesc = []byte{ @@ -1373,236 +585,106 @@ var file_feast_serving_ServingService_proto_rawDesc = []byte{ 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x6a, 0x6f, 0x62, 0x5f, 0x73, 0x74, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x67, - 0x69, 0x6e, 0x67, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x6d, 0x0a, 0x10, 0x46, - 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, - 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, - 0x0b, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x4a, 0x04, - 0x08, 0x03, 0x10, 0x04, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x22, 0x4d, 0x0a, 0x12, 0x46, 0x65, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x32, - 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xfb, 0x03, 0x0a, 0x18, 0x47, 0x65, - 0x74, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3b, 0x0a, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, - 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x73, 0x12, 0x52, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x72, 0x6f, - 0x77, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, - 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x6e, 0x6c, 0x69, - 0x6e, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x6f, 0x77, 0x52, 0x0a, 0x65, 0x6e, 0x74, - 0x69, 0x74, 0x79, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x39, 0x0a, 0x19, 0x6f, 0x6d, 0x69, 0x74, 0x5f, - 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x5f, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x6f, 0x6d, 0x69, 0x74, - 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x49, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x1a, 0xf8, 0x01, 0x0a, - 0x09, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x6f, 0x77, 0x12, 0x45, 0x0a, 0x10, 0x65, 0x6e, - 0x74, 0x69, 0x74, 0x79, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x0f, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x12, 0x55, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x3d, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, - 0x67, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, - 0x79, 0x52, 0x6f, 0x77, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x1a, 0x4d, 0x0a, 0x0b, 0x46, 0x69, 0x65, 0x6c, - 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x28, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, - 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbb, 0x03, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x4f, - 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, 0x12, 0x3d, 0x0a, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, - 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x32, 0x52, 0x08, 0x66, 0x65, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x54, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, - 0x72, 0x6f, 0x77, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x66, 0x65, 0x61, - 0x73, 0x74, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x6e, - 0x6c, 0x69, 0x6e, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x56, 0x32, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x6f, 0x77, 0x52, - 0x0a, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x1a, 0xed, 0x01, 0x0a, 0x09, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, - 0x52, 0x6f, 0x77, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x57, 0x0a, - 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, + 0x69, 0x6e, 0x67, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x4d, 0x0a, 0x12, 0x46, + 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, + 0x32, 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xbb, 0x03, 0x0a, 0x1a, 0x47, + 0x65, 0x74, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, 0x12, 0x3d, 0x0a, 0x08, 0x66, 0x65, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x66, 0x65, + 0x61, 0x73, 0x74, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x2e, 0x46, 0x65, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x32, 0x52, 0x08, + 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x54, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, - 0x6f, 0x77, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, - 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x1a, 0x4d, 0x0a, 0x0b, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x28, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x74, - 0x79, 0x70, 0x65, 0x73, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xca, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x42, 0x61, 0x74, - 0x63, 0x68, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x3b, 0x0a, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x6e, 0x67, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x52, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x43, - 0x0a, 0x0e, 0x64, 0x61, 0x74, 0x61, 0x73, 0x65, 0x74, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x73, 0x65, 0x74, 0x53, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x52, 0x0d, 0x64, 0x61, 0x74, 0x61, 0x73, 0x65, 0x74, 0x53, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x12, 0x2d, 0x0a, 0x12, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x5f, 0x73, - 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x11, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, - 0x63, 0x73, 0x22, 0xdd, 0x04, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, - 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x57, 0x0a, 0x0c, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, - 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x0b, 0x66, 0x69, - 0x65, 0x6c, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x1a, 0x89, 0x03, 0x0a, 0x0b, 0x46, 0x69, - 0x65, 0x6c, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x58, 0x0a, 0x06, 0x66, 0x69, 0x65, - 0x6c, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x66, 0x65, 0x61, 0x73, - 0x74, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x6e, 0x6c, - 0x69, 0x6e, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2e, - 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x66, 0x69, 0x65, - 0x6c, 0x64, 0x73, 0x12, 0x5e, 0x0a, 0x08, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x6e, 0x67, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x46, - 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, - 0x46, 0x69, 0x65, 0x6c, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x65, 0x73, 0x1a, 0x4d, 0x0a, 0x0b, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x28, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x74, 0x79, 0x70, 0x65, - 0x73, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x1a, 0x71, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x4a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x34, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x6e, 0x67, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x46, 0x65, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x46, - 0x69, 0x65, 0x6c, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x5b, 0x0a, 0x0b, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, - 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x52, 0x45, 0x53, 0x45, 0x4e, 0x54, 0x10, 0x01, 0x12, 0x0e, - 0x0a, 0x0a, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x02, 0x12, 0x0d, - 0x0a, 0x09, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x03, 0x12, 0x13, 0x0a, - 0x0f, 0x4f, 0x55, 0x54, 0x53, 0x49, 0x44, 0x45, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x41, 0x47, 0x45, - 0x10, 0x04, 0x22, 0x40, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x42, 0x61, 0x74, 0x63, 0x68, 0x46, 0x65, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, - 0x0a, 0x03, 0x6a, 0x6f, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x66, 0x65, - 0x61, 0x73, 0x74, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x2e, 0x4a, 0x6f, 0x62, 0x52, - 0x03, 0x6a, 0x6f, 0x62, 0x22, 0x35, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x03, 0x6a, 0x6f, 0x62, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x6e, 0x67, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x03, 0x6a, 0x6f, 0x62, 0x22, 0x36, 0x0a, 0x0e, 0x47, - 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, - 0x03, 0x6a, 0x6f, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x66, 0x65, 0x61, - 0x73, 0x74, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x03, - 0x6a, 0x6f, 0x62, 0x22, 0xdf, 0x02, 0x0a, 0x03, 0x4a, 0x6f, 0x62, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x66, 0x65, 0x61, 0x73, - 0x74, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, - 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x30, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, - 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x75, 0x72, 0x69, 0x73, 0x18, 0x05, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x55, 0x72, 0x69, 0x73, 0x12, 0x3a, 0x0a, 0x0b, - 0x64, 0x61, 0x74, 0x61, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x19, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, - 0x67, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x0a, 0x64, 0x61, - 0x74, 0x61, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x7b, 0x0a, 0x1f, 0x64, 0x61, 0x74, 0x61, - 0x73, 0x65, 0x74, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, - 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x34, 0x2e, 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x30, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x73, - 0x65, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, - 0x69, 0x63, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x1c, 0x64, 0x61, 0x74, 0x61, 0x73, 0x65, 0x74, - 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, - 0x73, 0x4c, 0x69, 0x73, 0x74, 0x22, 0xd4, 0x01, 0x0a, 0x0d, 0x44, 0x61, 0x74, 0x61, 0x73, 0x65, - 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x4a, 0x0a, 0x0b, 0x66, 0x69, 0x6c, 0x65, 0x5f, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x66, - 0x65, 0x61, 0x73, 0x74, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x2e, 0x44, 0x61, 0x74, - 0x61, 0x73, 0x65, 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x53, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x00, 0x52, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x1a, 0x65, 0x0a, 0x0a, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x75, 0x72, 0x69, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x55, 0x72, 0x69, 0x73, 0x12, 0x3a, - 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x6e, 0x67, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x0a, - 0x64, 0x61, 0x74, 0x61, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x42, 0x10, 0x0a, 0x0e, 0x64, 0x61, - 0x74, 0x61, 0x73, 0x65, 0x74, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2a, 0x6f, 0x0a, 0x10, - 0x46, 0x65, 0x61, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x1e, 0x0a, 0x1a, 0x46, 0x45, 0x41, 0x53, 0x54, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x4e, - 0x47, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, - 0x12, 0x1d, 0x0a, 0x19, 0x46, 0x45, 0x41, 0x53, 0x54, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x4e, - 0x47, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4f, 0x4e, 0x4c, 0x49, 0x4e, 0x45, 0x10, 0x01, 0x12, - 0x1c, 0x0a, 0x18, 0x46, 0x45, 0x41, 0x53, 0x54, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x4e, 0x47, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x41, 0x54, 0x43, 0x48, 0x10, 0x02, 0x2a, 0x36, 0x0a, - 0x07, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x4a, 0x4f, 0x42, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x15, - 0x0a, 0x11, 0x4a, 0x4f, 0x42, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x4f, 0x57, 0x4e, 0x4c, - 0x4f, 0x41, 0x44, 0x10, 0x01, 0x2a, 0x68, 0x0a, 0x09, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x16, 0x0a, 0x12, 0x4a, 0x4f, 0x42, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, - 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x4a, 0x4f, - 0x42, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, - 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x4a, 0x4f, 0x42, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, - 0x5f, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x4a, 0x4f, - 0x42, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x44, 0x4f, 0x4e, 0x45, 0x10, 0x03, 0x2a, - 0x3b, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x17, 0x0a, - 0x13, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x49, 0x4e, 0x56, - 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x46, - 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x41, 0x56, 0x52, 0x4f, 0x10, 0x01, 0x32, 0xfe, 0x03, 0x0a, - 0x0e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, - 0x6c, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x46, 0x65, 0x61, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x6e, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x29, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x61, 0x73, 0x74, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2a, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, - 0x67, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x61, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, - 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x66, 0x0a, - 0x11, 0x47, 0x65, 0x74, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x73, 0x12, 0x27, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x6e, 0x67, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x46, 0x65, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x66, 0x65, + 0x6f, 0x77, 0x52, 0x0a, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x18, + 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x1a, 0xed, 0x01, 0x0a, 0x09, 0x45, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x52, 0x6f, 0x77, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x12, 0x57, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x3f, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, + 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, 0x2e, 0x45, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x52, 0x6f, 0x77, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x1a, 0x4d, 0x0a, 0x0b, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x28, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x66, 0x65, 0x61, 0x73, + 0x74, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xdd, 0x04, 0x0a, 0x19, 0x47, 0x65, 0x74, + 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x57, 0x0a, 0x0c, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x66, + 0x65, 0x61, 0x73, 0x74, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x2e, 0x47, 0x65, 0x74, + 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x52, 0x0b, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x1a, + 0x89, 0x03, 0x0a, 0x0b, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, + 0x58, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x40, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x2e, + 0x47, 0x65, 0x74, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x5e, 0x0a, 0x08, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4f, 0x6e, 0x6c, 0x69, - 0x6e, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x56, 0x32, 0x12, 0x29, 0x2e, 0x66, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x08, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x1a, 0x4d, 0x0a, 0x0b, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x28, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x66, 0x65, 0x61, 0x73, + 0x74, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x71, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x4a, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x34, 0x2e, 0x66, 0x65, 0x61, + 0x73, 0x74, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x6e, + 0x6c, 0x69, 0x6e, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x5b, 0x0a, 0x0b, 0x46, + 0x69, 0x65, 0x6c, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, + 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x52, 0x45, 0x53, 0x45, + 0x4e, 0x54, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x56, 0x41, 0x4c, + 0x55, 0x45, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, + 0x44, 0x10, 0x03, 0x12, 0x13, 0x0a, 0x0f, 0x4f, 0x55, 0x54, 0x53, 0x49, 0x44, 0x45, 0x5f, 0x4d, + 0x41, 0x58, 0x5f, 0x41, 0x47, 0x45, 0x10, 0x04, 0x2a, 0x6f, 0x0a, 0x10, 0x46, 0x65, 0x61, 0x73, + 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1e, 0x0a, 0x1a, + 0x46, 0x45, 0x41, 0x53, 0x54, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x4e, 0x47, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x1d, 0x0a, 0x19, + 0x46, 0x45, 0x41, 0x53, 0x54, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x4e, 0x47, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x4f, 0x4e, 0x4c, 0x49, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x1c, 0x0a, 0x18, 0x46, + 0x45, 0x41, 0x53, 0x54, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x4e, 0x47, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x42, 0x41, 0x54, 0x43, 0x48, 0x10, 0x02, 0x32, 0xea, 0x01, 0x0a, 0x0e, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x6c, 0x0a, 0x13, + 0x47, 0x65, 0x74, 0x46, 0x65, 0x61, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x29, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x6e, 0x67, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x61, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, + 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x2e, 0x47, + 0x65, 0x74, 0x46, 0x65, 0x61, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x13, 0x47, 0x65, + 0x74, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x56, + 0x32, 0x12, 0x29, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, + 0x67, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, 0x1a, 0x28, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, 0x1a, 0x28, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, - 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x63, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x42, 0x61, 0x74, 0x63, 0x68, 0x46, 0x65, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x6e, 0x67, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x61, 0x74, 0x63, 0x68, 0x46, 0x65, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, - 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x2e, 0x47, 0x65, - 0x74, 0x42, 0x61, 0x74, 0x63, 0x68, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x45, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, - 0x12, 0x1c, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, - 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, - 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x2e, 0x47, - 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x5e, 0x0a, - 0x13, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x6e, 0x67, 0x42, 0x0f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x41, 0x50, 0x49, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x5a, 0x36, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2d, 0x64, 0x65, 0x76, 0x2f, 0x66, 0x65, 0x61, 0x73, - 0x74, 0x2f, 0x73, 0x64, 0x6b, 0x2f, 0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, - 0x66, 0x65, 0x61, 0x73, 0x74, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x5e, 0x0a, 0x13, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x42, 0x0f, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x41, 0x50, 0x49, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x5a, 0x36, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x66, 0x65, 0x61, 0x73, 0x74, + 0x2d, 0x64, 0x65, 0x76, 0x2f, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2f, 0x73, 0x64, 0x6b, 0x2f, 0x67, + 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2f, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1617,82 +699,45 @@ func file_feast_serving_ServingService_proto_rawDescGZIP() []byte { return file_feast_serving_ServingService_proto_rawDescData } -var file_feast_serving_ServingService_proto_enumTypes = make([]protoimpl.EnumInfo, 5) -var file_feast_serving_ServingService_proto_msgTypes = make([]protoimpl.MessageInfo, 21) +var file_feast_serving_ServingService_proto_enumTypes = make([]protoimpl.EnumInfo, 2) +var file_feast_serving_ServingService_proto_msgTypes = make([]protoimpl.MessageInfo, 10) var file_feast_serving_ServingService_proto_goTypes = []interface{}{ - (FeastServingType)(0), // 0: feast.serving.FeastServingType - (JobType)(0), // 1: feast.serving.JobType - (JobStatus)(0), // 2: feast.serving.JobStatus - (DataFormat)(0), // 3: feast.serving.DataFormat - (GetOnlineFeaturesResponse_FieldStatus)(0), // 4: feast.serving.GetOnlineFeaturesResponse.FieldStatus - (*GetFeastServingInfoRequest)(nil), // 5: feast.serving.GetFeastServingInfoRequest - (*GetFeastServingInfoResponse)(nil), // 6: feast.serving.GetFeastServingInfoResponse - (*FeatureReference)(nil), // 7: feast.serving.FeatureReference - (*FeatureReferenceV2)(nil), // 8: feast.serving.FeatureReferenceV2 - (*GetOnlineFeaturesRequest)(nil), // 9: feast.serving.GetOnlineFeaturesRequest - (*GetOnlineFeaturesRequestV2)(nil), // 10: feast.serving.GetOnlineFeaturesRequestV2 - (*GetBatchFeaturesRequest)(nil), // 11: feast.serving.GetBatchFeaturesRequest - (*GetOnlineFeaturesResponse)(nil), // 12: feast.serving.GetOnlineFeaturesResponse - (*GetBatchFeaturesResponse)(nil), // 13: feast.serving.GetBatchFeaturesResponse - (*GetJobRequest)(nil), // 14: feast.serving.GetJobRequest - (*GetJobResponse)(nil), // 15: feast.serving.GetJobResponse - (*Job)(nil), // 16: feast.serving.Job - (*DatasetSource)(nil), // 17: feast.serving.DatasetSource - (*GetOnlineFeaturesRequest_EntityRow)(nil), // 18: feast.serving.GetOnlineFeaturesRequest.EntityRow - nil, // 19: feast.serving.GetOnlineFeaturesRequest.EntityRow.FieldsEntry - (*GetOnlineFeaturesRequestV2_EntityRow)(nil), // 20: feast.serving.GetOnlineFeaturesRequestV2.EntityRow - nil, // 21: feast.serving.GetOnlineFeaturesRequestV2.EntityRow.FieldsEntry - (*GetOnlineFeaturesResponse_FieldValues)(nil), // 22: feast.serving.GetOnlineFeaturesResponse.FieldValues - nil, // 23: feast.serving.GetOnlineFeaturesResponse.FieldValues.FieldsEntry - nil, // 24: feast.serving.GetOnlineFeaturesResponse.FieldValues.StatusesEntry - (*DatasetSource_FileSource)(nil), // 25: feast.serving.DatasetSource.FileSource - (*v0.DatasetFeatureStatisticsList)(nil), // 26: tensorflow.metadata.v0.DatasetFeatureStatisticsList - (*timestamp.Timestamp)(nil), // 27: google.protobuf.Timestamp - (*types.Value)(nil), // 28: feast.types.Value + (FeastServingType)(0), // 0: feast.serving.FeastServingType + (GetOnlineFeaturesResponse_FieldStatus)(0), // 1: feast.serving.GetOnlineFeaturesResponse.FieldStatus + (*GetFeastServingInfoRequest)(nil), // 2: feast.serving.GetFeastServingInfoRequest + (*GetFeastServingInfoResponse)(nil), // 3: feast.serving.GetFeastServingInfoResponse + (*FeatureReferenceV2)(nil), // 4: feast.serving.FeatureReferenceV2 + (*GetOnlineFeaturesRequestV2)(nil), // 5: feast.serving.GetOnlineFeaturesRequestV2 + (*GetOnlineFeaturesResponse)(nil), // 6: feast.serving.GetOnlineFeaturesResponse + (*GetOnlineFeaturesRequestV2_EntityRow)(nil), // 7: feast.serving.GetOnlineFeaturesRequestV2.EntityRow + nil, // 8: feast.serving.GetOnlineFeaturesRequestV2.EntityRow.FieldsEntry + (*GetOnlineFeaturesResponse_FieldValues)(nil), // 9: feast.serving.GetOnlineFeaturesResponse.FieldValues + nil, // 10: feast.serving.GetOnlineFeaturesResponse.FieldValues.FieldsEntry + nil, // 11: feast.serving.GetOnlineFeaturesResponse.FieldValues.StatusesEntry + (*timestamp.Timestamp)(nil), // 12: google.protobuf.Timestamp + (*types.Value)(nil), // 13: feast.types.Value } var file_feast_serving_ServingService_proto_depIdxs = []int32{ 0, // 0: feast.serving.GetFeastServingInfoResponse.type:type_name -> feast.serving.FeastServingType - 7, // 1: feast.serving.GetOnlineFeaturesRequest.features:type_name -> feast.serving.FeatureReference - 18, // 2: feast.serving.GetOnlineFeaturesRequest.entity_rows:type_name -> feast.serving.GetOnlineFeaturesRequest.EntityRow - 8, // 3: feast.serving.GetOnlineFeaturesRequestV2.features:type_name -> feast.serving.FeatureReferenceV2 - 20, // 4: feast.serving.GetOnlineFeaturesRequestV2.entity_rows:type_name -> feast.serving.GetOnlineFeaturesRequestV2.EntityRow - 7, // 5: feast.serving.GetBatchFeaturesRequest.features:type_name -> feast.serving.FeatureReference - 17, // 6: feast.serving.GetBatchFeaturesRequest.dataset_source:type_name -> feast.serving.DatasetSource - 22, // 7: feast.serving.GetOnlineFeaturesResponse.field_values:type_name -> feast.serving.GetOnlineFeaturesResponse.FieldValues - 16, // 8: feast.serving.GetBatchFeaturesResponse.job:type_name -> feast.serving.Job - 16, // 9: feast.serving.GetJobRequest.job:type_name -> feast.serving.Job - 16, // 10: feast.serving.GetJobResponse.job:type_name -> feast.serving.Job - 1, // 11: feast.serving.Job.type:type_name -> feast.serving.JobType - 2, // 12: feast.serving.Job.status:type_name -> feast.serving.JobStatus - 3, // 13: feast.serving.Job.data_format:type_name -> feast.serving.DataFormat - 26, // 14: feast.serving.Job.dataset_feature_statistics_list:type_name -> tensorflow.metadata.v0.DatasetFeatureStatisticsList - 25, // 15: feast.serving.DatasetSource.file_source:type_name -> feast.serving.DatasetSource.FileSource - 27, // 16: feast.serving.GetOnlineFeaturesRequest.EntityRow.entity_timestamp:type_name -> google.protobuf.Timestamp - 19, // 17: feast.serving.GetOnlineFeaturesRequest.EntityRow.fields:type_name -> feast.serving.GetOnlineFeaturesRequest.EntityRow.FieldsEntry - 28, // 18: feast.serving.GetOnlineFeaturesRequest.EntityRow.FieldsEntry.value:type_name -> feast.types.Value - 27, // 19: feast.serving.GetOnlineFeaturesRequestV2.EntityRow.timestamp:type_name -> google.protobuf.Timestamp - 21, // 20: feast.serving.GetOnlineFeaturesRequestV2.EntityRow.fields:type_name -> feast.serving.GetOnlineFeaturesRequestV2.EntityRow.FieldsEntry - 28, // 21: feast.serving.GetOnlineFeaturesRequestV2.EntityRow.FieldsEntry.value:type_name -> feast.types.Value - 23, // 22: feast.serving.GetOnlineFeaturesResponse.FieldValues.fields:type_name -> feast.serving.GetOnlineFeaturesResponse.FieldValues.FieldsEntry - 24, // 23: feast.serving.GetOnlineFeaturesResponse.FieldValues.statuses:type_name -> feast.serving.GetOnlineFeaturesResponse.FieldValues.StatusesEntry - 28, // 24: feast.serving.GetOnlineFeaturesResponse.FieldValues.FieldsEntry.value:type_name -> feast.types.Value - 4, // 25: feast.serving.GetOnlineFeaturesResponse.FieldValues.StatusesEntry.value:type_name -> feast.serving.GetOnlineFeaturesResponse.FieldStatus - 3, // 26: feast.serving.DatasetSource.FileSource.data_format:type_name -> feast.serving.DataFormat - 5, // 27: feast.serving.ServingService.GetFeastServingInfo:input_type -> feast.serving.GetFeastServingInfoRequest - 9, // 28: feast.serving.ServingService.GetOnlineFeatures:input_type -> feast.serving.GetOnlineFeaturesRequest - 10, // 29: feast.serving.ServingService.GetOnlineFeaturesV2:input_type -> feast.serving.GetOnlineFeaturesRequestV2 - 11, // 30: feast.serving.ServingService.GetBatchFeatures:input_type -> feast.serving.GetBatchFeaturesRequest - 14, // 31: feast.serving.ServingService.GetJob:input_type -> feast.serving.GetJobRequest - 6, // 32: feast.serving.ServingService.GetFeastServingInfo:output_type -> feast.serving.GetFeastServingInfoResponse - 12, // 33: feast.serving.ServingService.GetOnlineFeatures:output_type -> feast.serving.GetOnlineFeaturesResponse - 12, // 34: feast.serving.ServingService.GetOnlineFeaturesV2:output_type -> feast.serving.GetOnlineFeaturesResponse - 13, // 35: feast.serving.ServingService.GetBatchFeatures:output_type -> feast.serving.GetBatchFeaturesResponse - 15, // 36: feast.serving.ServingService.GetJob:output_type -> feast.serving.GetJobResponse - 32, // [32:37] is the sub-list for method output_type - 27, // [27:32] is the sub-list for method input_type - 27, // [27:27] is the sub-list for extension type_name - 27, // [27:27] is the sub-list for extension extendee - 0, // [0:27] is the sub-list for field type_name + 4, // 1: feast.serving.GetOnlineFeaturesRequestV2.features:type_name -> feast.serving.FeatureReferenceV2 + 7, // 2: feast.serving.GetOnlineFeaturesRequestV2.entity_rows:type_name -> feast.serving.GetOnlineFeaturesRequestV2.EntityRow + 9, // 3: feast.serving.GetOnlineFeaturesResponse.field_values:type_name -> feast.serving.GetOnlineFeaturesResponse.FieldValues + 12, // 4: feast.serving.GetOnlineFeaturesRequestV2.EntityRow.timestamp:type_name -> google.protobuf.Timestamp + 8, // 5: feast.serving.GetOnlineFeaturesRequestV2.EntityRow.fields:type_name -> feast.serving.GetOnlineFeaturesRequestV2.EntityRow.FieldsEntry + 13, // 6: feast.serving.GetOnlineFeaturesRequestV2.EntityRow.FieldsEntry.value:type_name -> feast.types.Value + 10, // 7: feast.serving.GetOnlineFeaturesResponse.FieldValues.fields:type_name -> feast.serving.GetOnlineFeaturesResponse.FieldValues.FieldsEntry + 11, // 8: feast.serving.GetOnlineFeaturesResponse.FieldValues.statuses:type_name -> feast.serving.GetOnlineFeaturesResponse.FieldValues.StatusesEntry + 13, // 9: feast.serving.GetOnlineFeaturesResponse.FieldValues.FieldsEntry.value:type_name -> feast.types.Value + 1, // 10: feast.serving.GetOnlineFeaturesResponse.FieldValues.StatusesEntry.value:type_name -> feast.serving.GetOnlineFeaturesResponse.FieldStatus + 2, // 11: feast.serving.ServingService.GetFeastServingInfo:input_type -> feast.serving.GetFeastServingInfoRequest + 5, // 12: feast.serving.ServingService.GetOnlineFeaturesV2:input_type -> feast.serving.GetOnlineFeaturesRequestV2 + 3, // 13: feast.serving.ServingService.GetFeastServingInfo:output_type -> feast.serving.GetFeastServingInfoResponse + 6, // 14: feast.serving.ServingService.GetOnlineFeaturesV2:output_type -> feast.serving.GetOnlineFeaturesResponse + 13, // [13:15] is the sub-list for method output_type + 11, // [11:13] is the sub-list for method input_type + 11, // [11:11] is the sub-list for extension type_name + 11, // [11:11] is the sub-list for extension extendee + 0, // [0:11] is the sub-list for field type_name } func init() { file_feast_serving_ServingService_proto_init() } @@ -1726,18 +771,6 @@ func file_feast_serving_ServingService_proto_init() { } } file_feast_serving_ServingService_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FeatureReference); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_feast_serving_ServingService_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FeatureReferenceV2); i { case 0: return &v.state @@ -1749,19 +782,7 @@ func file_feast_serving_ServingService_proto_init() { return nil } } - file_feast_serving_ServingService_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetOnlineFeaturesRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_feast_serving_ServingService_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_feast_serving_ServingService_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetOnlineFeaturesRequestV2); i { case 0: return &v.state @@ -1773,19 +794,7 @@ func file_feast_serving_ServingService_proto_init() { return nil } } - file_feast_serving_ServingService_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetBatchFeaturesRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_feast_serving_ServingService_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_feast_serving_ServingService_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetOnlineFeaturesResponse); i { case 0: return &v.state @@ -1797,79 +806,7 @@ func file_feast_serving_ServingService_proto_init() { return nil } } - file_feast_serving_ServingService_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetBatchFeaturesResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_feast_serving_ServingService_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetJobRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_feast_serving_ServingService_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetJobResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_feast_serving_ServingService_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Job); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_feast_serving_ServingService_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DatasetSource); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_feast_serving_ServingService_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetOnlineFeaturesRequest_EntityRow); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_feast_serving_ServingService_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + file_feast_serving_ServingService_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetOnlineFeaturesRequestV2_EntityRow); i { case 0: return &v.state @@ -1881,7 +818,7 @@ func file_feast_serving_ServingService_proto_init() { return nil } } - file_feast_serving_ServingService_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + file_feast_serving_ServingService_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetOnlineFeaturesResponse_FieldValues); i { case 0: return &v.state @@ -1893,29 +830,14 @@ func file_feast_serving_ServingService_proto_init() { return nil } } - file_feast_serving_ServingService_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DatasetSource_FileSource); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - file_feast_serving_ServingService_proto_msgTypes[12].OneofWrappers = []interface{}{ - (*DatasetSource_FileSource_)(nil), } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_feast_serving_ServingService_proto_rawDesc, - NumEnums: 5, - NumMessages: 21, + NumEnums: 2, + NumMessages: 10, NumExtensions: 0, NumServices: 1, }, @@ -1944,21 +866,8 @@ const _ = grpc.SupportPackageIsVersion6 type ServingServiceClient interface { // Get information about this Feast serving. GetFeastServingInfo(ctx context.Context, in *GetFeastServingInfoRequest, opts ...grpc.CallOption) (*GetFeastServingInfoResponse, error) - // Get online features synchronously. - GetOnlineFeatures(ctx context.Context, in *GetOnlineFeaturesRequest, opts ...grpc.CallOption) (*GetOnlineFeaturesResponse, error) // Get online features (v2) synchronously. GetOnlineFeaturesV2(ctx context.Context, in *GetOnlineFeaturesRequestV2, opts ...grpc.CallOption) (*GetOnlineFeaturesResponse, error) - // Get batch features asynchronously. - // - // The client should check the status of the returned job periodically by - // calling ReloadJob to determine if the job has completed successfully - // or with an error. If the job completes successfully i.e. - // status = JOB_STATUS_DONE with no error, then the client can check - // the file_uris for the location to download feature values data. - // The client is assumed to have access to these file URIs. - GetBatchFeatures(ctx context.Context, in *GetBatchFeaturesRequest, opts ...grpc.CallOption) (*GetBatchFeaturesResponse, error) - // Get the latest job status for batch feature retrieval. - GetJob(ctx context.Context, in *GetJobRequest, opts ...grpc.CallOption) (*GetJobResponse, error) } type servingServiceClient struct { @@ -1978,15 +887,6 @@ func (c *servingServiceClient) GetFeastServingInfo(ctx context.Context, in *GetF return out, nil } -func (c *servingServiceClient) GetOnlineFeatures(ctx context.Context, in *GetOnlineFeaturesRequest, opts ...grpc.CallOption) (*GetOnlineFeaturesResponse, error) { - out := new(GetOnlineFeaturesResponse) - err := c.cc.Invoke(ctx, "/feast.serving.ServingService/GetOnlineFeatures", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *servingServiceClient) GetOnlineFeaturesV2(ctx context.Context, in *GetOnlineFeaturesRequestV2, opts ...grpc.CallOption) (*GetOnlineFeaturesResponse, error) { out := new(GetOnlineFeaturesResponse) err := c.cc.Invoke(ctx, "/feast.serving.ServingService/GetOnlineFeaturesV2", in, out, opts...) @@ -1996,43 +896,12 @@ func (c *servingServiceClient) GetOnlineFeaturesV2(ctx context.Context, in *GetO return out, nil } -func (c *servingServiceClient) GetBatchFeatures(ctx context.Context, in *GetBatchFeaturesRequest, opts ...grpc.CallOption) (*GetBatchFeaturesResponse, error) { - out := new(GetBatchFeaturesResponse) - err := c.cc.Invoke(ctx, "/feast.serving.ServingService/GetBatchFeatures", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *servingServiceClient) GetJob(ctx context.Context, in *GetJobRequest, opts ...grpc.CallOption) (*GetJobResponse, error) { - out := new(GetJobResponse) - err := c.cc.Invoke(ctx, "/feast.serving.ServingService/GetJob", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - // ServingServiceServer is the server API for ServingService service. type ServingServiceServer interface { // Get information about this Feast serving. GetFeastServingInfo(context.Context, *GetFeastServingInfoRequest) (*GetFeastServingInfoResponse, error) - // Get online features synchronously. - GetOnlineFeatures(context.Context, *GetOnlineFeaturesRequest) (*GetOnlineFeaturesResponse, error) // Get online features (v2) synchronously. GetOnlineFeaturesV2(context.Context, *GetOnlineFeaturesRequestV2) (*GetOnlineFeaturesResponse, error) - // Get batch features asynchronously. - // - // The client should check the status of the returned job periodically by - // calling ReloadJob to determine if the job has completed successfully - // or with an error. If the job completes successfully i.e. - // status = JOB_STATUS_DONE with no error, then the client can check - // the file_uris for the location to download feature values data. - // The client is assumed to have access to these file URIs. - GetBatchFeatures(context.Context, *GetBatchFeaturesRequest) (*GetBatchFeaturesResponse, error) - // Get the latest job status for batch feature retrieval. - GetJob(context.Context, *GetJobRequest) (*GetJobResponse, error) } // UnimplementedServingServiceServer can be embedded to have forward compatible implementations. @@ -2042,18 +911,9 @@ type UnimplementedServingServiceServer struct { func (*UnimplementedServingServiceServer) GetFeastServingInfo(context.Context, *GetFeastServingInfoRequest) (*GetFeastServingInfoResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetFeastServingInfo not implemented") } -func (*UnimplementedServingServiceServer) GetOnlineFeatures(context.Context, *GetOnlineFeaturesRequest) (*GetOnlineFeaturesResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetOnlineFeatures not implemented") -} func (*UnimplementedServingServiceServer) GetOnlineFeaturesV2(context.Context, *GetOnlineFeaturesRequestV2) (*GetOnlineFeaturesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetOnlineFeaturesV2 not implemented") } -func (*UnimplementedServingServiceServer) GetBatchFeatures(context.Context, *GetBatchFeaturesRequest) (*GetBatchFeaturesResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetBatchFeatures not implemented") -} -func (*UnimplementedServingServiceServer) GetJob(context.Context, *GetJobRequest) (*GetJobResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetJob not implemented") -} func RegisterServingServiceServer(s *grpc.Server, srv ServingServiceServer) { s.RegisterService(&_ServingService_serviceDesc, srv) @@ -2077,24 +937,6 @@ func _ServingService_GetFeastServingInfo_Handler(srv interface{}, ctx context.Co return interceptor(ctx, in, info, handler) } -func _ServingService_GetOnlineFeatures_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetOnlineFeaturesRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ServingServiceServer).GetOnlineFeatures(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/feast.serving.ServingService/GetOnlineFeatures", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ServingServiceServer).GetOnlineFeatures(ctx, req.(*GetOnlineFeaturesRequest)) - } - return interceptor(ctx, in, info, handler) -} - func _ServingService_GetOnlineFeaturesV2_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetOnlineFeaturesRequestV2) if err := dec(in); err != nil { @@ -2113,42 +955,6 @@ func _ServingService_GetOnlineFeaturesV2_Handler(srv interface{}, ctx context.Co return interceptor(ctx, in, info, handler) } -func _ServingService_GetBatchFeatures_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetBatchFeaturesRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ServingServiceServer).GetBatchFeatures(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/feast.serving.ServingService/GetBatchFeatures", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ServingServiceServer).GetBatchFeatures(ctx, req.(*GetBatchFeaturesRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ServingService_GetJob_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetJobRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ServingServiceServer).GetJob(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/feast.serving.ServingService/GetJob", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ServingServiceServer).GetJob(ctx, req.(*GetJobRequest)) - } - return interceptor(ctx, in, info, handler) -} - var _ServingService_serviceDesc = grpc.ServiceDesc{ ServiceName: "feast.serving.ServingService", HandlerType: (*ServingServiceServer)(nil), @@ -2157,22 +963,10 @@ var _ServingService_serviceDesc = grpc.ServiceDesc{ MethodName: "GetFeastServingInfo", Handler: _ServingService_GetFeastServingInfo_Handler, }, - { - MethodName: "GetOnlineFeatures", - Handler: _ServingService_GetOnlineFeatures_Handler, - }, { MethodName: "GetOnlineFeaturesV2", Handler: _ServingService_GetOnlineFeaturesV2_Handler, }, - { - MethodName: "GetBatchFeatures", - Handler: _ServingService_GetBatchFeatures_Handler, - }, - { - MethodName: "GetJob", - Handler: _ServingService_GetJob_Handler, - }, }, Streams: []grpc.StreamDesc{}, Metadata: "feast/serving/ServingService.proto", diff --git a/sdk/go/protos/feast/storage/Redis.pb.go b/sdk/go/protos/feast/storage/Redis.pb.go index 7b3a3f6a77..761bf2bb6e 100644 --- a/sdk/go/protos/feast/storage/Redis.pb.go +++ b/sdk/go/protos/feast/storage/Redis.pb.go @@ -16,7 +16,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.10.0 +// protoc v3.12.4 // source: feast/storage/Redis.proto package storage @@ -41,65 +41,6 @@ const ( // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 -type RedisKey struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // FeatureSet this row belongs to, this is defined as featureSetName. - FeatureSet string `protobuf:"bytes,2,opt,name=feature_set,json=featureSet,proto3" json:"feature_set,omitempty"` - // List of fields containing entity names and their respective values - // contained within this feature row. The entities should be sorted - // by the entity name alphabetically in ascending order. - Entities []*types.Field `protobuf:"bytes,3,rep,name=entities,proto3" json:"entities,omitempty"` -} - -func (x *RedisKey) Reset() { - *x = RedisKey{} - if protoimpl.UnsafeEnabled { - mi := &file_feast_storage_Redis_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *RedisKey) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*RedisKey) ProtoMessage() {} - -func (x *RedisKey) ProtoReflect() protoreflect.Message { - mi := &file_feast_storage_Redis_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use RedisKey.ProtoReflect.Descriptor instead. -func (*RedisKey) Descriptor() ([]byte, []int) { - return file_feast_storage_Redis_proto_rawDescGZIP(), []int{0} -} - -func (x *RedisKey) GetFeatureSet() string { - if x != nil { - return x.FeatureSet - } - return "" -} - -func (x *RedisKey) GetEntities() []*types.Field { - if x != nil { - return x.Entities - } - return nil -} - type RedisKeyV2 struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -113,7 +54,7 @@ type RedisKeyV2 struct { func (x *RedisKeyV2) Reset() { *x = RedisKeyV2{} if protoimpl.UnsafeEnabled { - mi := &file_feast_storage_Redis_proto_msgTypes[1] + mi := &file_feast_storage_Redis_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -126,7 +67,7 @@ func (x *RedisKeyV2) String() string { func (*RedisKeyV2) ProtoMessage() {} func (x *RedisKeyV2) ProtoReflect() protoreflect.Message { - mi := &file_feast_storage_Redis_proto_msgTypes[1] + mi := &file_feast_storage_Redis_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -139,7 +80,7 @@ func (x *RedisKeyV2) ProtoReflect() protoreflect.Message { // Deprecated: Use RedisKeyV2.ProtoReflect.Descriptor instead. func (*RedisKeyV2) Descriptor() ([]byte, []int) { - return file_feast_storage_Redis_proto_rawDescGZIP(), []int{1} + return file_feast_storage_Redis_proto_rawDescGZIP(), []int{0} } func (x *RedisKeyV2) GetProject() string { @@ -171,28 +112,22 @@ var file_feast_storage_Redis_proto_rawDesc = []byte{ 0x73, 0x74, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x1a, 0x17, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, - 0x2f, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x5b, 0x0a, 0x08, - 0x52, 0x65, 0x64, 0x69, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x65, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, - 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x12, 0x2e, 0x0a, 0x08, 0x65, 0x6e, 0x74, - 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x66, 0x65, - 0x61, 0x73, 0x74, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, - 0x08, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x22, 0x82, 0x01, 0x0a, 0x0a, 0x52, 0x65, - 0x64, 0x69, 0x73, 0x4b, 0x65, 0x79, 0x56, 0x32, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, - 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x37, 0x0a, 0x0d, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x66, - 0x65, 0x61, 0x73, 0x74, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x52, 0x0c, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x42, 0x59, - 0x0a, 0x13, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x73, 0x74, - 0x6f, 0x72, 0x61, 0x67, 0x65, 0x42, 0x0a, 0x52, 0x65, 0x64, 0x69, 0x73, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x5a, 0x36, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x66, 0x65, - 0x61, 0x73, 0x74, 0x2d, 0x64, 0x65, 0x76, 0x2f, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2f, 0x73, 0x64, - 0x6b, 0x2f, 0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x66, 0x65, 0x61, 0x73, - 0x74, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x2f, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x82, 0x01, 0x0a, + 0x0a, 0x52, 0x65, 0x64, 0x69, 0x73, 0x4b, 0x65, 0x79, 0x56, 0x32, 0x12, 0x18, 0x0a, 0x07, 0x70, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x37, 0x0a, 0x0d, 0x65, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x52, 0x0c, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x42, 0x59, 0x0a, 0x13, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x42, 0x0a, 0x52, 0x65, 0x64, 0x69, 0x73, 0x50, + 0x72, 0x6f, 0x74, 0x6f, 0x5a, 0x36, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2d, 0x64, 0x65, 0x76, 0x2f, 0x66, 0x65, 0x61, 0x73, 0x74, + 0x2f, 0x73, 0x64, 0x6b, 0x2f, 0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x66, + 0x65, 0x61, 0x73, 0x74, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -207,21 +142,18 @@ func file_feast_storage_Redis_proto_rawDescGZIP() []byte { return file_feast_storage_Redis_proto_rawDescData } -var file_feast_storage_Redis_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_feast_storage_Redis_proto_msgTypes = make([]protoimpl.MessageInfo, 1) var file_feast_storage_Redis_proto_goTypes = []interface{}{ - (*RedisKey)(nil), // 0: feast.storage.RedisKey - (*RedisKeyV2)(nil), // 1: feast.storage.RedisKeyV2 - (*types.Field)(nil), // 2: feast.types.Field - (*types.Value)(nil), // 3: feast.types.Value + (*RedisKeyV2)(nil), // 0: feast.storage.RedisKeyV2 + (*types.Value)(nil), // 1: feast.types.Value } var file_feast_storage_Redis_proto_depIdxs = []int32{ - 2, // 0: feast.storage.RedisKey.entities:type_name -> feast.types.Field - 3, // 1: feast.storage.RedisKeyV2.entity_values:type_name -> feast.types.Value - 2, // [2:2] is the sub-list for method output_type - 2, // [2:2] is the sub-list for method input_type - 2, // [2:2] is the sub-list for extension type_name - 2, // [2:2] is the sub-list for extension extendee - 0, // [0:2] is the sub-list for field type_name + 1, // 0: feast.storage.RedisKeyV2.entity_values:type_name -> feast.types.Value + 1, // [1:1] is the sub-list for method output_type + 1, // [1:1] is the sub-list for method input_type + 1, // [1:1] is the sub-list for extension type_name + 1, // [1:1] is the sub-list for extension extendee + 0, // [0:1] is the sub-list for field type_name } func init() { file_feast_storage_Redis_proto_init() } @@ -231,18 +163,6 @@ func file_feast_storage_Redis_proto_init() { } if !protoimpl.UnsafeEnabled { file_feast_storage_Redis_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RedisKey); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_feast_storage_Redis_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RedisKeyV2); i { case 0: return &v.state @@ -261,7 +181,7 @@ func file_feast_storage_Redis_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_feast_storage_Redis_proto_rawDesc, NumEnums: 0, - NumMessages: 2, + NumMessages: 1, NumExtensions: 0, NumServices: 0, }, diff --git a/sdk/go/protos/feast/types/Field.pb.go b/sdk/go/protos/feast/types/Field.pb.go index f2562b72d9..9dad77cdb9 100644 --- a/sdk/go/protos/feast/types/Field.pb.go +++ b/sdk/go/protos/feast/types/Field.pb.go @@ -16,7 +16,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.10.0 +// protoc v3.12.4 // source: feast/types/Field.proto package types diff --git a/sdk/go/protos/feast/types/Value.pb.go b/sdk/go/protos/feast/types/Value.pb.go index 3625cef1a5..3b19435633 100644 --- a/sdk/go/protos/feast/types/Value.pb.go +++ b/sdk/go/protos/feast/types/Value.pb.go @@ -16,7 +16,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.10.0 +// protoc v3.12.4 // source: feast/types/Value.proto package types diff --git a/sdk/go/protos/tensorflow_metadata/proto/v0/path.pb.go b/sdk/go/protos/tensorflow_metadata/proto/v0/path.pb.go index a1e5137c72..1daa7687f9 100644 --- a/sdk/go/protos/tensorflow_metadata/proto/v0/path.pb.go +++ b/sdk/go/protos/tensorflow_metadata/proto/v0/path.pb.go @@ -16,7 +16,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.10.0 +// protoc v3.12.4 // source: tensorflow_metadata/proto/v0/path.proto package v0 diff --git a/sdk/go/protos/tensorflow_metadata/proto/v0/schema.pb.go b/sdk/go/protos/tensorflow_metadata/proto/v0/schema.pb.go index 25bf40bc7f..940779a191 100644 --- a/sdk/go/protos/tensorflow_metadata/proto/v0/schema.pb.go +++ b/sdk/go/protos/tensorflow_metadata/proto/v0/schema.pb.go @@ -16,7 +16,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.10.0 +// protoc v3.12.4 // source: tensorflow_metadata/proto/v0/schema.proto package v0 diff --git a/sdk/go/protos/tensorflow_metadata/proto/v0/statistics.pb.go b/sdk/go/protos/tensorflow_metadata/proto/v0/statistics.pb.go index 6a102a28af..fbf6247a1d 100644 --- a/sdk/go/protos/tensorflow_metadata/proto/v0/statistics.pb.go +++ b/sdk/go/protos/tensorflow_metadata/proto/v0/statistics.pb.go @@ -20,7 +20,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.10.0 +// protoc v3.12.4 // source: tensorflow_metadata/proto/v0/statistics.proto package v0 diff --git a/sdk/python/feast/field.py b/sdk/python/feast/field.py deleted file mode 100644 index 2f54e82d6f..0000000000 --- a/sdk/python/feast/field.py +++ /dev/null @@ -1,468 +0,0 @@ -# Copyright 2019 The Feast Authors -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -from collections import OrderedDict -from typing import MutableMapping, Optional, Union - -from feast.core.FeatureSet_pb2 import FeatureSpec -from feast.value_type import ValueType -from tensorflow_metadata.proto.v0 import schema_pb2 - - -class Field: - """ - High level field type. This is the parent type to both entities and - features. - """ - - def __init__( - self, - name: str, - dtype: ValueType, - labels: Optional[MutableMapping[str, str]] = None, - ): - self._name = name - if not isinstance(dtype, ValueType): - raise ValueError("dtype is not a valid ValueType") - self._dtype = dtype - if labels is None: - self._labels = OrderedDict() # type: MutableMapping - else: - self._labels = labels - self._presence: Optional[schema_pb2.FeaturePresence] = None - self._group_presence: Optional[schema_pb2.FeaturePresenceWithinGroup] = None - self._shape: Optional[schema_pb2.FixedShape] = None - self._value_count: Optional[schema_pb2.ValueCount] = None - self._domain: Optional[str] = None - self._int_domain: Optional[schema_pb2.IntDomain] = None - self._float_domain: Optional[schema_pb2.FloatDomain] = None - self._string_domain: Optional[schema_pb2.StringDomain] = None - self._bool_domain: Optional[schema_pb2.BoolDomain] = None - self._struct_domain: Optional[schema_pb2.StructDomain] = None - self._natural_language_domain: Optional[schema_pb2.NaturalLanguageDomain] = None - self._image_domain: Optional[schema_pb2.ImageDomain] = None - self._mid_domain: Optional[schema_pb2.MIDDomain] = None - self._url_domain: Optional[schema_pb2.URLDomain] = None - self._time_domain: Optional[schema_pb2.TimeDomain] = None - self._time_of_day_domain: Optional[schema_pb2.TimeOfDayDomain] = None - - def __eq__(self, other): - if ( - self.name != other.name - or self.dtype != other.dtype - or self.labels != other.labels - ): - return False - return True - - @property - def name(self): - """ - Getter for name of this field - """ - return self._name - - @property - def dtype(self) -> ValueType: - """ - Getter for data type of this field - """ - return self._dtype - - @property - def labels(self) -> MutableMapping[str, str]: - """ - Getter for labels of this field - """ - return self._labels - - @property - def presence(self) -> Optional[schema_pb2.FeaturePresence]: - """ - Getter for presence of this field - """ - return self._presence - - @presence.setter - def presence(self, presence: schema_pb2.FeaturePresence): - """ - Setter for presence of this field - """ - if not isinstance(presence, schema_pb2.FeaturePresence): - raise TypeError("presence must be of FeaturePresence type") - self._clear_presence_constraints() - self._presence = presence - - @property - def group_presence(self) -> Optional[schema_pb2.FeaturePresenceWithinGroup]: - """ - Getter for group_presence of this field - """ - return self._group_presence - - @group_presence.setter - def group_presence(self, group_presence: schema_pb2.FeaturePresenceWithinGroup): - """ - Setter for group_presence of this field - """ - if not isinstance(group_presence, schema_pb2.FeaturePresenceWithinGroup): - raise TypeError("group_presence must be of FeaturePresenceWithinGroup type") - self._clear_presence_constraints() - self._group_presence = group_presence - - @property - def shape(self) -> Optional[schema_pb2.FixedShape]: - """ - Getter for shape of this field - """ - return self._shape - - @shape.setter - def shape(self, shape: schema_pb2.FixedShape): - """ - Setter for shape of this field - """ - if not isinstance(shape, schema_pb2.FixedShape): - raise TypeError("shape must be of FixedShape type") - self._clear_shape_type() - self._shape = shape - - @property - def value_count(self) -> Optional[schema_pb2.ValueCount]: - """ - Getter for value_count of this field - """ - return self._value_count - - @value_count.setter - def value_count(self, value_count: schema_pb2.ValueCount): - """ - Setter for value_count of this field - """ - if not isinstance(value_count, schema_pb2.ValueCount): - raise TypeError("value_count must be of ValueCount type") - self._clear_shape_type() - self._value_count = value_count - - @property - def domain(self) -> Optional[str]: - """ - Getter for domain of this field - """ - return self._domain - - @domain.setter - def domain(self, domain: str): - """ - Setter for domain of this field - """ - if not isinstance(domain, str): - raise TypeError("domain must be of str type") - self._clear_domain_info() - self._domain = domain - - @property - def int_domain(self) -> Optional[schema_pb2.IntDomain]: - """ - Getter for int_domain of this field - """ - return self._int_domain - - @int_domain.setter - def int_domain(self, int_domain: schema_pb2.IntDomain): - """ - Setter for int_domain of this field - """ - if not isinstance(int_domain, schema_pb2.IntDomain): - raise TypeError("int_domain must be of IntDomain type") - self._clear_domain_info() - self._int_domain = int_domain - - @property - def float_domain(self) -> Optional[schema_pb2.FloatDomain]: - """ - Getter for float_domain of this field - """ - return self._float_domain - - @float_domain.setter - def float_domain(self, float_domain: schema_pb2.FloatDomain): - """ - Setter for float_domain of this field - """ - if not isinstance(float_domain, schema_pb2.FloatDomain): - raise TypeError("float_domain must be of FloatDomain type") - self._clear_domain_info() - self._float_domain = float_domain - - @property - def string_domain(self) -> Optional[schema_pb2.StringDomain]: - """ - Getter for string_domain of this field - """ - return self._string_domain - - @string_domain.setter - def string_domain(self, string_domain: schema_pb2.StringDomain): - """ - Setter for string_domain of this field - """ - if not isinstance(string_domain, schema_pb2.StringDomain): - raise TypeError("string_domain must be of StringDomain type") - self._clear_domain_info() - self._string_domain = string_domain - - @property - def bool_domain(self) -> Optional[schema_pb2.BoolDomain]: - """ - Getter for bool_domain of this field - """ - return self._bool_domain - - @bool_domain.setter - def bool_domain(self, bool_domain: schema_pb2.BoolDomain): - """ - Setter for bool_domain of this field - """ - if not isinstance(bool_domain, schema_pb2.BoolDomain): - raise TypeError("bool_domain must be of BoolDomain type") - self._clear_domain_info() - self._bool_domain = bool_domain - - @property - def struct_domain(self) -> Optional[schema_pb2.StructDomain]: - """ - Getter for struct_domain of this field - """ - return self._struct_domain - - @struct_domain.setter - def struct_domain(self, struct_domain: schema_pb2.StructDomain): - """ - Setter for struct_domain of this field - """ - if not isinstance(struct_domain, schema_pb2.StructDomain): - raise TypeError("struct_domain must be of StructDomain type") - self._clear_domain_info() - self._struct_domain = struct_domain - - @property - def natural_language_domain(self) -> Optional[schema_pb2.NaturalLanguageDomain]: - """ - Getter for natural_language_domain of this field - """ - return self._natural_language_domain - - @natural_language_domain.setter - def natural_language_domain( - self, natural_language_domain: schema_pb2.NaturalLanguageDomain - ): - """ - Setter for natural_language_domin of this field - """ - if not isinstance(natural_language_domain, schema_pb2.NaturalLanguageDomain): - raise TypeError( - "natural_language_domain must be of NaturalLanguageDomain type" - ) - self._clear_domain_info() - self._natural_language_domain = natural_language_domain - - @property - def image_domain(self) -> Optional[schema_pb2.ImageDomain]: - """ - Getter for image_domain of this field - """ - return self._image_domain - - @image_domain.setter - def image_domain(self, image_domain: schema_pb2.ImageDomain): - """ - Setter for image_domain of this field - """ - if not isinstance(image_domain, schema_pb2.ImageDomain): - raise TypeError("image_domain must be of ImageDomain type") - self._clear_domain_info() - self._image_domain = image_domain - - @property - def mid_domain(self) -> Optional[schema_pb2.MIDDomain]: - """ - Getter for mid_domain of this field - """ - return self._mid_domain - - @mid_domain.setter - def mid_domain(self, mid_domain: schema_pb2.MIDDomain): - """ - Setter for mid_domain of this field - """ - if not isinstance(mid_domain, schema_pb2.MIDDomain): - raise TypeError("mid_domain must be of MIDDomain type") - self._clear_domain_info() - self._mid_domain = mid_domain - - @property - def url_domain(self) -> Optional[schema_pb2.URLDomain]: - """ - Getter for url_domain of this field - """ - return self._url_domain - - @url_domain.setter - def url_domain(self, url_domain: schema_pb2.URLDomain): - """ - Setter for url_domain of this field - """ - if not isinstance(url_domain, schema_pb2.URLDomain): - raise TypeError("url_domain must be of URLDomain type") - self._clear_domain_info() - self.url_domain = url_domain - - @property - def time_domain(self) -> Optional[schema_pb2.TimeDomain]: - """ - Getter for time_domain of this field - """ - return self._time_domain - - @time_domain.setter - def time_domain(self, time_domain: schema_pb2.TimeDomain): - """ - Setter for time_domain of this field - """ - if not isinstance(time_domain, schema_pb2.TimeDomain): - raise TypeError("time_domain must be of TimeDomain type") - self._clear_domain_info() - self._time_domain = time_domain - - @property - def time_of_day_domain(self) -> Optional[schema_pb2.TimeOfDayDomain]: - """ - Getter for time_of_day_domain of this field - """ - return self._time_of_day_domain - - @time_of_day_domain.setter - def time_of_day_domain(self, time_of_day_domain): - """ - Setter for time_of_day_domain of this field - """ - if not isinstance(time_of_day_domain, schema_pb2.TimeOfDayDomain): - raise TypeError("time_of_day_domain must be of TimeOfDayDomain type") - self._clear_domain_info() - self._time_of_day_domain = time_of_day_domain - - def update_presence_constraints( - self, feature: Union[schema_pb2.Feature, FeatureSpec] - ) -> None: - """ - Update the presence constraints in this field from Tensorflow Feature or - Feast FeatureSpec - - Args: - feature: Tensorflow Feature or Feast FeatureSpec - - Returns: None - """ - presence_constraints_case = feature.WhichOneof("presence_constraints") - if presence_constraints_case == "presence": - self.presence = feature.presence - elif presence_constraints_case == "group_presence": - self.group_presence = feature.group_presence - - def update_shape_type( - self, feature: Union[schema_pb2.Feature, FeatureSpec] - ) -> None: - """ - Update the shape type in this field from Tensorflow Feature or - Feast FeatureSpec - - Args: - feature: Tensorflow Feature or Feast FeatureSpec - - Returns: None - """ - shape_type_case = feature.WhichOneof("shape_type") - if shape_type_case == "shape": - self.shape = feature.shape - elif shape_type_case == "value_count": - self.value_count = feature.value_count - - def update_domain_info( - self, feature: Union[schema_pb2.Feature, FeatureSpec] - ) -> None: - """ - Update the domain info in this field from Tensorflow Feature or Feast FeatureSpec - - Args: - feature: Tensorflow Feature or Feast FeatureSpec - - Returns: None - """ - domain_info_case = feature.WhichOneof("domain_info") - if domain_info_case == "int_domain": - self.int_domain = feature.int_domain - elif domain_info_case == "float_domain": - self.float_domain = feature.float_domain - elif domain_info_case == "string_domain": - self.string_domain = feature.string_domain - elif domain_info_case == "bool_domain": - self.bool_domain = feature.bool_domain - elif domain_info_case == "struct_domain": - self.struct_domain = feature.struct_domain - elif domain_info_case == "natural_language_domain": - self.natural_language_domain = feature.natural_language_domain - elif domain_info_case == "image_domain": - self.image_domain = feature.image_domain - elif domain_info_case == "mid_domain": - self.mid_domain = feature.mid_domain - elif domain_info_case == "url_domain": - self.url_domain = feature.url_domain - elif domain_info_case == "time_domain": - self.time_domain = feature.time_domain - elif domain_info_case == "time_of_day_domain": - self.time_of_day_domain = feature.time_of_day_domain - - def to_proto(self): - """ - Unimplemented to_proto method for a field. This should be extended. - """ - pass - - def from_proto(self, proto): - """ - Unimplemented from_proto method for a field. This should be extended. - """ - pass - - def _clear_presence_constraints(self): - self._presence = None - self._group_presence = None - - def _clear_shape_type(self): - self._shape = None - self._value_count = None - - def _clear_domain_info(self): - self._domain = None - self._int_domain = None - self._float_domain = None - self._string_domain = None - self._bool_domain = None - self._struct_domain = None - self._natural_language_domain = None - self._image_domain = None - self._mid_domain = None - self._url_domain = None - self._time_domain = None - self._time_of_day_domain = None diff --git a/serving/src/main/java/feast/serving/config/ServingServiceConfig.java b/serving/src/main/java/feast/serving/config/ServingServiceConfig.java deleted file mode 100644 index b7efb2b321..0000000000 --- a/serving/src/main/java/feast/serving/config/ServingServiceConfig.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * Copyright 2018-2019 The Feast Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package feast.serving.config; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.google.protobuf.InvalidProtocolBufferException; -import feast.proto.core.StoreProto; -import feast.serving.service.OnlineServingService; -import feast.serving.service.ServingService; -import feast.serving.specs.CachedSpecService; -import feast.storage.api.retriever.OnlineRetriever; -import feast.storage.connectors.redis.retriever.RedisClusterOnlineRetriever; -import feast.storage.connectors.redis.retriever.RedisOnlineRetriever; -import io.opentracing.Tracer; -import java.util.Map; -import org.slf4j.Logger; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -public class ServingServiceConfig { - - private static final Logger log = org.slf4j.LoggerFactory.getLogger(ServingServiceConfig.class); - - @Bean - public ServingService servingService( - FeastProperties feastProperties, CachedSpecService specService, Tracer tracer) - throws InvalidProtocolBufferException, JsonProcessingException { - ServingService servingService = null; - FeastProperties.Store store = feastProperties.getActiveStore(); - StoreProto.Store.StoreType storeType = store.toProto().getType(); - Map config = store.getConfig(); - - switch (storeType) { - case REDIS_CLUSTER: - OnlineRetriever redisClusterRetriever = RedisClusterOnlineRetriever.create(config); - servingService = new OnlineServingService(redisClusterRetriever, specService, tracer); - break; - case REDIS: - OnlineRetriever redisRetriever = RedisOnlineRetriever.create(config); - servingService = new OnlineServingService(redisRetriever, specService, tracer); - break; - case UNRECOGNIZED: - case INVALID: - throw new IllegalArgumentException( - String.format( - "Unsupported store type '%s' for store name '%s'", - store.getType(), store.getName())); - } - - return servingService; - } -} diff --git a/serving/src/main/java/feast/serving/controller/HealthServiceController.java b/serving/src/main/java/feast/serving/controller/HealthServiceController.java index 97a5fd9f93..6615cf56eb 100644 --- a/serving/src/main/java/feast/serving/controller/HealthServiceController.java +++ b/serving/src/main/java/feast/serving/controller/HealthServiceController.java @@ -19,7 +19,7 @@ import feast.proto.core.StoreProto.Store; import feast.proto.serving.ServingAPIProto.GetFeastServingInfoRequest; import feast.serving.interceptors.GrpcMonitoringInterceptor; -import feast.serving.service.ServingService; +import feast.serving.service.ServingServiceV2; import feast.serving.specs.CachedSpecService; import io.grpc.health.v1.HealthGrpc.HealthImplBase; import io.grpc.health.v1.HealthProto.HealthCheckRequest; @@ -34,10 +34,10 @@ @GrpcService(interceptors = {GrpcMonitoringInterceptor.class}) public class HealthServiceController extends HealthImplBase { private CachedSpecService specService; - private ServingService servingService; + private ServingServiceV2 servingService; @Autowired - public HealthServiceController(CachedSpecService specService, ServingService servingService) { + public HealthServiceController(CachedSpecService specService, ServingServiceV2 servingService) { this.specService = specService; this.servingService = servingService; } @@ -45,9 +45,10 @@ public HealthServiceController(CachedSpecService specService, ServingService ser @Override public void check( HealthCheckRequest request, StreamObserver responseObserver) { - // TODO: Implement proper logic to determine if ServingService is healthy e.g. - // if it's online service check that it the service can retrieve dummy/random feature set. - // Implement similary for batch service. + // TODO: Implement proper logic to determine if ServingServiceV2 is healthy e.g. + // if it's online service check that it the service can retrieve dummy/random + // feature table. + // Implement similary for batch service. try { Store store = specService.getStore(); diff --git a/serving/src/main/java/feast/serving/controller/ServingServiceGRpcController.java b/serving/src/main/java/feast/serving/controller/ServingServiceGRpcController.java index 4b94862257..f0dd4302d3 100644 --- a/serving/src/main/java/feast/serving/controller/ServingServiceGRpcController.java +++ b/serving/src/main/java/feast/serving/controller/ServingServiceGRpcController.java @@ -19,16 +19,13 @@ import feast.common.auth.service.AuthorizationService; import feast.common.logging.interceptors.GrpcMessageInterceptor; import feast.proto.serving.ServingAPIProto; -import feast.proto.serving.ServingAPIProto.FeatureReference; import feast.proto.serving.ServingAPIProto.GetFeastServingInfoRequest; import feast.proto.serving.ServingAPIProto.GetFeastServingInfoResponse; -import feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest; import feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse; import feast.proto.serving.ServingServiceGrpc.ServingServiceImplBase; import feast.serving.config.FeastProperties; import feast.serving.exception.SpecRetrievalException; import feast.serving.interceptors.GrpcMonitoringInterceptor; -import feast.serving.service.ServingService; import feast.serving.service.ServingServiceV2; import feast.serving.util.RequestHelper; import io.grpc.Status; @@ -36,9 +33,6 @@ import io.opentracing.Scope; import io.opentracing.Span; import io.opentracing.Tracer; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; import net.devh.boot.grpc.server.service.GrpcService; import org.slf4j.Logger; import org.springframework.beans.factory.annotation.Autowired; @@ -50,7 +44,6 @@ public class ServingServiceGRpcController extends ServingServiceImplBase { private static final Logger log = org.slf4j.LoggerFactory.getLogger(ServingServiceGRpcController.class); - private final ServingService servingService; private final ServingServiceV2 servingServiceV2; private final String version; private final Tracer tracer; @@ -59,12 +52,10 @@ public class ServingServiceGRpcController extends ServingServiceImplBase { @Autowired public ServingServiceGRpcController( AuthorizationService authorizationService, - ServingService servingService, ServingServiceV2 servingServiceV2, FeastProperties feastProperties, Tracer tracer) { this.authorizationService = authorizationService; - this.servingService = servingService; this.servingServiceV2 = servingServiceV2; this.version = feastProperties.getVersion(); this.tracer = tracer; @@ -74,65 +65,12 @@ public ServingServiceGRpcController( public void getFeastServingInfo( GetFeastServingInfoRequest request, StreamObserver responseObserver) { - GetFeastServingInfoResponse feastServingInfo = servingService.getFeastServingInfo(request); + GetFeastServingInfoResponse feastServingInfo = servingServiceV2.getFeastServingInfo(request); feastServingInfo = feastServingInfo.toBuilder().setVersion(version).build(); responseObserver.onNext(feastServingInfo); responseObserver.onCompleted(); } - @Override - public void getOnlineFeatures( - GetOnlineFeaturesRequest request, - StreamObserver responseObserver) { - Span span = tracer.buildSpan("getOnlineFeatures").start(); - try (Scope scope = tracer.scopeManager().activate(span, false)) { - // authorize for the project in request object. - if (request.getProject() != null && !request.getProject().isEmpty()) { - // project set at root level overrides the project set at feature set level - this.authorizationService.authorizeRequest( - SecurityContextHolder.getContext(), request.getProject()); - } else { - // authorize for projects set in feature list, backward compatibility for - // <=v0.5.X - this.checkProjectAccess(request.getFeaturesList()); - } - RequestHelper.validateOnlineRequest(request); - GetOnlineFeaturesResponse onlineFeatures = servingService.getOnlineFeatures(request); - responseObserver.onNext(onlineFeatures); - responseObserver.onCompleted(); - } catch (SpecRetrievalException e) { - log.error("Failed to retrieve specs in SpecService", e); - responseObserver.onError( - Status.NOT_FOUND.withDescription(e.getMessage()).withCause(e).asException()); - } catch (AccessDeniedException e) { - log.info(String.format("User prevented from accessing one of the projects in request")); - responseObserver.onError( - Status.PERMISSION_DENIED - .withDescription(e.getMessage()) - .withCause(e) - .asRuntimeException()); - } catch (Exception e) { - log.warn("Failed to get Online Features", e); - responseObserver.onError(e); - } - span.finish(); - } - - private void checkProjectAccess(List featureList) { - Set projectList = - featureList.stream().map(FeatureReference::getProject).collect(Collectors.toSet()); - if (projectList.isEmpty()) { - authorizationService.authorizeRequest(SecurityContextHolder.getContext(), "default"); - } else { - projectList.stream() - .forEach( - project -> { - this.authorizationService.authorizeRequest( - SecurityContextHolder.getContext(), project); - }); - } - } - @Override public void getOnlineFeaturesV2( ServingAPIProto.GetOnlineFeaturesRequestV2 request, diff --git a/serving/src/main/java/feast/serving/controller/ServingServiceRestController.java b/serving/src/main/java/feast/serving/controller/ServingServiceRestController.java index df71112ef7..8a198a8201 100644 --- a/serving/src/main/java/feast/serving/controller/ServingServiceRestController.java +++ b/serving/src/main/java/feast/serving/controller/ServingServiceRestController.java @@ -20,12 +20,11 @@ import feast.proto.serving.ServingAPIProto.GetFeastServingInfoRequest; import feast.proto.serving.ServingAPIProto.GetFeastServingInfoResponse; -import feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest; +import feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2; import feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse; import feast.serving.config.FeastProperties; -import feast.serving.service.ServingService; +import feast.serving.service.ServingServiceV2; import feast.serving.util.RequestHelper; -import io.opentracing.Tracer; import java.util.List; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; @@ -36,16 +35,14 @@ @RestController public class ServingServiceRestController { - private final ServingService servingService; + private final ServingServiceV2 servingService; private final String version; - private final Tracer tracer; @Autowired public ServingServiceRestController( - ServingService servingService, FeastProperties feastProperties, Tracer tracer) { + ServingServiceV2 servingService, FeastProperties feastProperties) { this.servingService = servingService; this.version = feastProperties.getVersion(); - this.tracer = tracer; } @RequestMapping(value = "/api/v1/info", produces = "application/json") @@ -60,7 +57,7 @@ public GetFeastServingInfoResponse getInfo() { produces = "application/json", consumes = "application/json") public List> getOnlineFeatures( - @RequestBody GetOnlineFeaturesRequest request) { + @RequestBody GetOnlineFeaturesRequestV2 request) { RequestHelper.validateOnlineRequest(request); GetOnlineFeaturesResponse onlineFeatures = servingService.getOnlineFeatures(request); return mapGetOnlineFeaturesResponse(onlineFeatures); diff --git a/serving/src/main/java/feast/serving/service/OnlineServingService.java b/serving/src/main/java/feast/serving/service/OnlineServingService.java deleted file mode 100644 index a7d9d284aa..0000000000 --- a/serving/src/main/java/feast/serving/service/OnlineServingService.java +++ /dev/null @@ -1,326 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * Copyright 2018-2019 The Feast Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package feast.serving.service; - -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Streams; -import com.google.protobuf.Duration; -import feast.common.models.Feature; -import feast.common.models.FeatureSet; -import feast.proto.serving.ServingAPIProto.*; -import feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest.EntityRow; -import feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FieldStatus; -import feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FieldValues; -import feast.proto.types.FeatureRowProto.FeatureRow; -import feast.proto.types.FieldProto.Field; -import feast.proto.types.ValueProto.Value; -import feast.serving.specs.CachedSpecService; -import feast.serving.util.Metrics; -import feast.storage.api.retriever.FeatureSetRequest; -import feast.storage.api.retriever.OnlineRetriever; -import io.grpc.Status; -import io.opentracing.Scope; -import io.opentracing.Tracer; -import java.util.*; -import java.util.stream.Collectors; -import org.apache.commons.lang3.tuple.Pair; -import org.slf4j.Logger; - -public class OnlineServingService implements ServingService { - - private static final Logger log = org.slf4j.LoggerFactory.getLogger(OnlineServingService.class); - private final CachedSpecService specService; - private final Tracer tracer; - private final OnlineRetriever retriever; - - public OnlineServingService( - OnlineRetriever retriever, CachedSpecService specService, Tracer tracer) { - this.retriever = retriever; - this.specService = specService; - this.tracer = tracer; - } - - /** {@inheritDoc} */ - @Override - public GetFeastServingInfoResponse getFeastServingInfo( - GetFeastServingInfoRequest getFeastServingInfoRequest) { - return GetFeastServingInfoResponse.newBuilder() - .setType(FeastServingType.FEAST_SERVING_TYPE_ONLINE) - .build(); - } - - /** {@inheritDoc} */ - @Override - public GetOnlineFeaturesResponse getOnlineFeatures(GetOnlineFeaturesRequest request) { - try (Scope scope = tracer.buildSpan("getOnlineFeatures").startActive(true)) { - List entityRows = request.getEntityRowsList(); - // Collect the feature/entity value for each entity row in entityValueMap - Map> entityValuesMap = - entityRows.stream().collect(Collectors.toMap(row -> row, row -> new HashMap<>())); - // Collect the feature/entity status metadata for each entity row in entityValueMap - Map> entityStatusesMap = - entityRows.stream().collect(Collectors.toMap(row -> row, row -> new HashMap<>())); - // Collect featureRows retrieved for logging/tracing - List>> logFeatureRows = new LinkedList<>(); - - if (!request.getOmitEntitiesInResponse()) { - // Add entity row's fields as response fields - entityRows.forEach( - entityRow -> { - Map valueMap = entityRow.getFieldsMap(); - entityValuesMap.get(entityRow).putAll(valueMap); - entityStatusesMap.get(entityRow).putAll(getMetadataMap(valueMap, false, false)); - }); - } - - List featureSetRequests = - specService.getFeatureSets(request.getFeaturesList(), request.getProject()); - for (FeatureSetRequest featureSetRequest : featureSetRequests) { - // Pull feature rows for given entity rows from the feature/featureset specified in feature - // set request. - // from the configured online - List> featureRows = - retriever.getOnlineFeatures(entityRows, featureSetRequest); - // Check that feature row returned corresponds to a given entity row. - if (featureRows.size() != entityRows.size()) { - throw Status.INTERNAL - .withDescription( - "The no. of FeatureRow obtained from OnlineRetriever" - + "does not match no. of entityRow passed.") - .asRuntimeException(); - } - - Streams.zip(entityRows.stream(), featureRows.stream(), Pair::of) - .forEach( - entityFeaturePair -> { - EntityRow entityRow = entityFeaturePair.getLeft(); - Optional featureRow = entityFeaturePair.getRight(); - // Unpack feature field values and merge into entityValueMap - boolean isOutsideMaxAge = - checkOutsideMaxAge(featureSetRequest, entityRow, featureRow); - Map valueMap = - unpackValueMap(featureRow, featureSetRequest, isOutsideMaxAge); - entityValuesMap.get(entityRow).putAll(valueMap); - - // Generate metadata for feature values and merge into entityFieldsMap - boolean isNotFound = featureRow.isEmpty(); - Map statusMap = - getMetadataMap(valueMap, isNotFound, isOutsideMaxAge); - entityStatusesMap.get(entityRow).putAll(statusMap); - - // Populate metrics/log request - populateCountMetrics(statusMap, featureSetRequest); - }); - populateRequestCountMetrics(featureSetRequest); - logFeatureRows.add(featureRows); - } - if (scope != null) { - logFeatureRowsTrace(scope, logFeatureRows, featureSetRequests); - } - - // Build response field values from entityValuesMap and entityStatusesMap - // Reponse field values should be in the same order as the entityRows provided by the user. - List fieldValuesList = - entityRows.stream() - .map( - entityRow -> { - return FieldValues.newBuilder() - .putAllFields(entityValuesMap.get(entityRow)) - .putAllStatuses(entityStatusesMap.get(entityRow)) - .build(); - }) - .collect(Collectors.toList()); - return GetOnlineFeaturesResponse.newBuilder().addAllFieldValues(fieldValuesList).build(); - } - } - - /** - * Unpack feature values using data from the given feature row for features specified in the given - * feature set request. - * - * @param featureRow optional to unpack for feature values. - * @param featureSetRequest feature set request for which the feature row is retrieved for. - * @param isOutsideMaxAge whether which the feature row contains values that is outside max age. - * @return valueMap mapping string feature name to feature value for the given feature set - * request. - */ - private static Map unpackValueMap( - Optional featureRow, - FeatureSetRequest featureSetRequest, - boolean isOutsideMaxAge) { - Map valueMap = new HashMap<>(); - // In order to return values containing the same feature references provided by the user, - // we reuse the feature references in the request as the keys in field builder map - Map nameRefMap = featureSetRequest.getFeatureRefsByName(); - - if (featureRow.isPresent()) { - // unpack feature row's feature values and populate value map - Map featureValueMap = - featureRow.get().getFieldsList().stream() - .filter(featureRowField -> nameRefMap.containsKey(featureRowField.getName())) - .collect( - Collectors.toMap( - featureRowField -> { - FeatureReference featureRef = nameRefMap.get(featureRowField.getName()); - return Feature.getFeatureStringWithProjectRef(featureRef); - }, - featureRowField -> { - // drop feature values with an age outside feature set's max age. - return (isOutsideMaxAge) - ? Value.newBuilder().build() - : featureRowField.getValue(); - })); - valueMap.putAll(featureValueMap); - } - // create empty values for features specified in request but not present in feature row. - Set missingFeatures = - nameRefMap.values().stream() - .map(ref -> Feature.getFeatureStringWithProjectRef(ref)) - .collect(Collectors.toSet()); - missingFeatures.removeAll(valueMap.keySet()); - missingFeatures.forEach(refString -> valueMap.put(refString, Value.newBuilder().build())); - - return valueMap; - } - - /** - * Generate Field level Status metadata for the given valueMap. - * - * @param valueMap map of field name to value to generate metadata for. - * @param isNotFound whether the given valueMap represents values that were not found in the - * online retriever. - * @param isOutsideMaxAge whether the given valueMap contains values with age outside feature - * set's max age. - * @return a 1:1 map keyed by field name containing field status metadata instead of values in the - * given valueMap. - */ - private static Map getMetadataMap( - Map valueMap, boolean isNotFound, boolean isOutsideMaxAge) { - return valueMap.entrySet().stream() - .collect( - Collectors.toMap( - es -> es.getKey(), - es -> { - Value fieldValue = es.getValue(); - if (isNotFound) { - return FieldStatus.NOT_FOUND; - } else if (isOutsideMaxAge) { - return FieldStatus.OUTSIDE_MAX_AGE; - } else if (fieldValue.getValCase().equals(Value.ValCase.VAL_NOT_SET)) { - return FieldStatus.NULL_VALUE; - } - return FieldStatus.PRESENT; - })); - } - - /** - * Determine if the feature data in the given feature row is outside maxAge. Data is outside - * maxAge to be when the difference ingestion time set in feature row and the retrieval time set - * in entity row exceeds featureset max age. - * - * @param featureSetRequest contains the spec where feature's max age is extracted. - * @param entityRow contains the retrieval timing of when features are pulled. - * @param featureRow contains the ingestion timing and feature data. - */ - private static boolean checkOutsideMaxAge( - FeatureSetRequest featureSetRequest, EntityRow entityRow, Optional featureRow) { - Duration maxAge = featureSetRequest.getSpec().getMaxAge(); - if (featureRow.isEmpty()) { // no data to consider - return false; - } - if (maxAge.equals(Duration.getDefaultInstance())) { // max age is not set - return false; - } - - long givenTimestamp = entityRow.getEntityTimestamp().getSeconds(); - if (givenTimestamp == 0) { - givenTimestamp = System.currentTimeMillis() / 1000; - } - long timeDifference = givenTimestamp - featureRow.get().getEventTimestamp().getSeconds(); - return timeDifference > maxAge.getSeconds(); - } - - private void logFeatureRowsTrace( - Scope scope, - List>> logFeatureRows, - List featureSetRequests) { - List> loggableFeatureRows = - Streams.zip( - logFeatureRows.stream(), - featureSetRequests.stream(), - (featureRows, featureSetRequest) -> { - FeatureRow.Builder nullFeatureRowBuilder = - FeatureRow.newBuilder() - .setFeatureSet( - FeatureSet.getFeatureSetStringRef(featureSetRequest.getSpec())); - for (FeatureReference featureReference : - featureSetRequest.getFeatureReferences()) { - nullFeatureRowBuilder.addFields( - Field.newBuilder().setName(featureReference.getName())); - } - - // log null feature row when feature row is empty - return featureRows.stream() - .map( - featureRow -> { - return (featureRow.isEmpty()) - ? nullFeatureRowBuilder.build() - : featureRow.get(); - }) - .collect(Collectors.toList()); - }) - .collect(Collectors.toList()); - - scope.span().log(ImmutableMap.of("event", "featureRows", "value", loggableFeatureRows)); - } - - private void populateCountMetrics( - Map statusMap, FeatureSetRequest featureSetRequest) { - String project = featureSetRequest.getSpec().getProject(); - statusMap - .entrySet() - .forEach( - es -> { - String featureRefString = es.getKey(); - FieldStatus status = es.getValue(); - if (status == FieldStatus.NOT_FOUND) { - Metrics.notFoundKeyCount.labels(project, featureRefString).inc(); - } - if (status == FieldStatus.OUTSIDE_MAX_AGE) { - Metrics.staleKeyCount.labels(project, featureRefString).inc(); - } - }); - } - - private void populateRequestCountMetrics(FeatureSetRequest featureSetRequest) { - String project = featureSetRequest.getSpec().getProject(); - featureSetRequest - .getFeatureReferences() - .parallelStream() - .forEach(ref -> Metrics.requestCount.labels(project, ref.getName()).inc()); - } - - @Override - public GetBatchFeaturesResponse getBatchFeatures(GetBatchFeaturesRequest getFeaturesRequest) { - throw Status.UNIMPLEMENTED.withDescription("Method not implemented").asRuntimeException(); - } - - @Override - public GetJobResponse getJob(GetJobRequest getJobRequest) { - throw Status.UNIMPLEMENTED.withDescription("Method not implemented").asRuntimeException(); - } -} diff --git a/serving/src/main/java/feast/serving/service/OnlineServingServiceV2.java b/serving/src/main/java/feast/serving/service/OnlineServingServiceV2.java index dca3159ce8..39478d0c64 100644 --- a/serving/src/main/java/feast/serving/service/OnlineServingServiceV2.java +++ b/serving/src/main/java/feast/serving/service/OnlineServingServiceV2.java @@ -20,7 +20,10 @@ import feast.common.models.FeatureV2; import feast.proto.core.FeatureProto; import feast.proto.core.FeatureTableProto.FeatureTableSpec; +import feast.proto.serving.ServingAPIProto.FeastServingType; import feast.proto.serving.ServingAPIProto.FeatureReferenceV2; +import feast.proto.serving.ServingAPIProto.GetFeastServingInfoRequest; +import feast.proto.serving.ServingAPIProto.GetFeastServingInfoResponse; import feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2; import feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse; import feast.proto.types.ValueProto; @@ -37,7 +40,7 @@ public class OnlineServingServiceV2 implements ServingServiceV2 { - private static final Logger log = org.slf4j.LoggerFactory.getLogger(OnlineServingService.class); + private static final Logger log = org.slf4j.LoggerFactory.getLogger(OnlineServingServiceV2.class); private final CachedSpecService specService; private final Tracer tracer; private final OnlineRetrieverV2 retriever; @@ -49,6 +52,15 @@ public OnlineServingServiceV2( this.tracer = tracer; } + /** {@inheritDoc} */ + @Override + public GetFeastServingInfoResponse getFeastServingInfo( + GetFeastServingInfoRequest getFeastServingInfoRequest) { + return GetFeastServingInfoResponse.newBuilder() + .setType(FeastServingType.FEAST_SERVING_TYPE_ONLINE) + .build(); + } + @Override public GetOnlineFeaturesResponse getOnlineFeatures(GetOnlineFeaturesRequestV2 request) { String projectName = request.getProject(); diff --git a/serving/src/main/java/feast/serving/service/ServingService.java b/serving/src/main/java/feast/serving/service/ServingService.java deleted file mode 100644 index 1fe9840d59..0000000000 --- a/serving/src/main/java/feast/serving/service/ServingService.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * Copyright 2018-2019 The Feast Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package feast.serving.service; - -import feast.proto.serving.ServingAPIProto.GetBatchFeaturesRequest; -import feast.proto.serving.ServingAPIProto.GetBatchFeaturesResponse; -import feast.proto.serving.ServingAPIProto.GetFeastServingInfoRequest; -import feast.proto.serving.ServingAPIProto.GetFeastServingInfoResponse; -import feast.proto.serving.ServingAPIProto.GetJobRequest; -import feast.proto.serving.ServingAPIProto.GetJobResponse; -import feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest; -import feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse; - -public interface ServingService { - /** - * Get information about the Feast serving deployment. - * - *

For Bigquery deployments, this includes the default job staging location to load - * intermediate files to. Otherwise, this method only returns the current Feast Serving backing - * store type. - * - * @param getFeastServingInfoRequest {@link GetFeastServingInfoRequest} - * @return {@link GetFeastServingInfoResponse} - */ - GetFeastServingInfoResponse getFeastServingInfo( - GetFeastServingInfoRequest getFeastServingInfoRequest); - - /** - * Get features from an online serving store, given a list of {@link - * feast.proto.serving.ServingAPIProto.FeatureReference}s to retrieve, and list of {@link - * feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest.EntityRow}s to join the retrieved - * values to. - * - *

Features can be queried across feature sets, but each {@link - * feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest.EntityRow} must contain all - * entities for all feature sets included in the request. - * - *

This request is fulfilled synchronously. - * - * @param getFeaturesRequest {@link GetOnlineFeaturesRequest} containing list of {@link - * feast.proto.serving.ServingAPIProto.FeatureReference}s to retrieve and list of {@link - * feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest.EntityRow}s to join the - * retrieved values to. - * @return {@link GetOnlineFeaturesResponse} with list of {@link - * feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FieldValues} for each {@link - * feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest.EntityRow} supplied. - */ - GetOnlineFeaturesResponse getOnlineFeatures(GetOnlineFeaturesRequest getFeaturesRequest); - - /** - * Get features from a batch serving store, given a list of {@link - * feast.proto.serving.ServingAPIProto.FeatureReference}s to retrieve, and {@link - * feast.proto.serving.ServingAPIProto.DatasetSource} pointing to remote location of dataset to - * join retrieved features to. All columns in the provided dataset will be preserved in the output - * dataset. - * - *

Due to the potential size of batch retrieval requests, this request is fulfilled - * asynchronously, and returns a retrieval job id, which when supplied to {@link - * #getJob(GetJobRequest)} will return the status of the retrieval job. - * - * @param getFeaturesRequest {@link GetBatchFeaturesRequest} containing a list of {@link - * feast.proto.serving.ServingAPIProto.FeatureReference}s to retrieve, and {@link - * feast.proto.serving.ServingAPIProto.DatasetSource} pointing to remote location of dataset - * to join retrieved features to. - * @return {@link GetBatchFeaturesResponse} containing reference to a retrieval {@link - * feast.proto.serving.ServingAPIProto.Job}. - */ - GetBatchFeaturesResponse getBatchFeatures(GetBatchFeaturesRequest getFeaturesRequest); - - /** - * Get the status of a retrieval job from a batch serving store. - * - *

The client should check the status of the returned job periodically by calling ReloadJob to - * determine if the job has completed successfully or with an error. If the job completes - * successfully i.e. status = JOB_STATUS_DONE with no error, then the client can check the - * file_uris for the location to download feature values data. The client is assumed to have - * access to these file URIs. - * - *

If an error occurred during retrieval, the {@link GetJobResponse} will also contain the - * error that resulted in termination. - * - * @param getJobRequest {@link GetJobRequest} containing reference to a retrieval job - * @return {@link GetJobResponse} - */ - GetJobResponse getJob(GetJobRequest getJobRequest); -} diff --git a/serving/src/main/java/feast/serving/service/ServingServiceV2.java b/serving/src/main/java/feast/serving/service/ServingServiceV2.java index 6164b93eb5..05acb31b78 100644 --- a/serving/src/main/java/feast/serving/service/ServingServiceV2.java +++ b/serving/src/main/java/feast/serving/service/ServingServiceV2.java @@ -16,19 +16,33 @@ */ package feast.serving.service; +import feast.proto.serving.ServingAPIProto; import feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2; import feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse; public interface ServingServiceV2 { + /** + * Get information about the Feast serving deployment. + * + *

For Bigquery deployments, this includes the default job staging location to load + * intermediate files to. Otherwise, this method only returns the current Feast Serving backing + * store type. + * + * @param getFeastServingInfoRequest {@link ServingAPIProto.GetFeastServingInfoRequest} + * @return {@link ServingAPIProto.GetFeastServingInfoResponse} + */ + ServingAPIProto.GetFeastServingInfoResponse getFeastServingInfo( + ServingAPIProto.GetFeastServingInfoRequest getFeastServingInfoRequest); + /** * Get features from an online serving store, given a list of {@link * feast.proto.serving.ServingAPIProto.FeatureReferenceV2}s to retrieve, and list of {@link * feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow}s to join the * retrieved values to. * - *

Features can be queried across feature sets, but each {@link + *

Features can be queried across feature tables, but each {@link * feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow} must contain all - * entities for all feature sets included in the request. + * entities for all feature tables included in the request. * *

This request is fulfilled synchronously. * diff --git a/serving/src/main/java/feast/serving/specs/CachedSpecService.java b/serving/src/main/java/feast/serving/specs/CachedSpecService.java index bf7f106eed..85f0a1ebef 100644 --- a/serving/src/main/java/feast/serving/specs/CachedSpecService.java +++ b/serving/src/main/java/feast/serving/specs/CachedSpecService.java @@ -16,44 +16,28 @@ */ package feast.serving.specs; -import static feast.common.models.Feature.getFeatureStringWithProjectRef; -import static feast.common.models.FeatureSet.getFeatureSetStringRef; import static feast.common.models.FeatureTable.getFeatureTableStringRef; -import static java.util.stream.Collectors.groupingBy; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; -import feast.proto.core.CoreServiceProto.ListFeatureSetsRequest; -import feast.proto.core.CoreServiceProto.ListFeatureSetsResponse; import feast.proto.core.CoreServiceProto.ListFeatureTablesRequest; import feast.proto.core.CoreServiceProto.ListFeatureTablesResponse; import feast.proto.core.CoreServiceProto.ListProjectsRequest; import feast.proto.core.FeatureProto; -import feast.proto.core.FeatureSetProto.FeatureSet; -import feast.proto.core.FeatureSetProto.FeatureSetSpec; -import feast.proto.core.FeatureSetProto.FeatureSpec; import feast.proto.core.FeatureTableProto.FeatureTable; import feast.proto.core.FeatureTableProto.FeatureTableSpec; import feast.proto.core.StoreProto; import feast.proto.core.StoreProto.Store; -import feast.proto.core.StoreProto.Store.Subscription; import feast.proto.serving.ServingAPIProto; -import feast.proto.serving.ServingAPIProto.FeatureReference; import feast.serving.exception.SpecRetrievalException; -import feast.storage.api.retriever.FeatureSetRequest; import io.grpc.StatusRuntimeException; import io.prometheus.client.Gauge; -import java.util.ArrayList; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutionException; -import java.util.stream.Collectors; import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; import org.slf4j.Logger; /** In-memory cache of specs hosted in Feast Core. */ @@ -62,23 +46,10 @@ public class CachedSpecService { private static final int MAX_SPEC_COUNT = 1000; private static final Logger log = org.slf4j.LoggerFactory.getLogger(CachedSpecService.class); private static final String DEFAULT_PROJECT_NAME = "default"; - // flag to signal that multiple featuresets match a specific - // string feature reference in the feature to featureset mapping. - private static final String FEATURE_SET_CONFLICT_FLAG = "##CONFLICT##"; private final CoreSpecService coreService; - - private Map featureToFeatureSetMapping; - - private final LoadingCache featureSetCache; private Store store; - private static Gauge featureSetsCount = - Gauge.build() - .name("feature_set_count") - .subsystem("feast_serving") - .help("number of feature sets served by this instance") - .register(); private static Gauge cacheLastUpdated = Gauge.build() .name("cache_last_updated") @@ -91,7 +62,7 @@ public class CachedSpecService { Gauge.build() .name("feature_table_count") .subsystem("feast_serving") - .help("number of feature sets served by this instance") + .help("number of feature tables served by this instance") .register(); private final LoadingCache< @@ -102,14 +73,6 @@ public CachedSpecService(CoreSpecService coreService, StoreProto.Store store) { this.coreService = coreService; this.store = coreService.registerStore(store); - Map featureSets = getFeatureSetMap(); - featureToFeatureSetMapping = - new ConcurrentHashMap<>(getFeatureToFeatureSetMapping(featureSets)); - CacheLoader featureSetCacheLoader = CacheLoader.from(featureSets::get); - featureSetCache = - CacheBuilder.newBuilder().maximumSize(MAX_SPEC_COUNT).build(featureSetCacheLoader); - featureSetCache.putAll(featureSets); - Map featureTables = getFeatureTableMap().getLeft(); CacheLoader featureTableCacheLoader = CacheLoader.from(featureTables::get); @@ -134,126 +97,11 @@ public Store getStore() { return this.store; } - public FeatureSetSpec getFeatureSetSpec(String featureSetRef) throws ExecutionException { - return featureSetCache.get(featureSetRef); - } - - /** - * Get FeatureSetSpecs for the given features references. See {@link #getFeatureSets(List, - * String)} for full documentation. - */ - public List getFeatureSets(List featureReferences) { - return getFeatureSets(featureReferences, ""); - } - - /** - * Get FeatureSetSpecs for the given features references. If the project is unspecified in the - * given references or project override, autofills the default project. Throws a {@link - * SpecRetrievalException} if multiple feature sets match given string reference. - * - * @param projectOverride If specified would take the spec request in the context of the given - * project only. Otherwise if "", will default to determining the project from the individual - * references. Has higher precedence compared to project specifed in Feature Reference if both - * are specified. - * @return FeatureSetRequest containing the specs, and their respective feature references - */ - public List getFeatureSets( - List featureReferences, String projectOverride) { - List featureSetRequests = new ArrayList<>(); - featureReferences.stream() - .map( - featureReference -> { - // apply project override when finding feature set for feature - FeatureReference queryFeatureRef = featureReference; - if (!projectOverride.isEmpty()) { - queryFeatureRef = featureReference.toBuilder().setProject(projectOverride).build(); - } - - String featureSetRefStr = mapFeatureToFeatureSetReference(queryFeatureRef); - return Pair.of(featureSetRefStr, featureReference); - }) - .collect(groupingBy(Pair::getLeft)) - .forEach( - (featureSetRefStr, fsRefStrAndFeatureRefs) -> { - List featureRefs = - fsRefStrAndFeatureRefs.stream().map(Pair::getRight).collect(Collectors.toList()); - featureSetRequests.add(buildFeatureSetRequest(featureSetRefStr, featureRefs)); - }); - return featureSetRequests; - } - - /** - * Build a Feature Set request from the Feature Set specified by given Feature Set reference and - * given Feature References. - * - * @param featureSetRefStr string feature set reference specifying the feature set that contains - * requested features - * @param featureReferences list of feature references specifying the containing feature set - * references. - */ - private FeatureSetRequest buildFeatureSetRequest( - String featureSetRefStr, List featureReferences) { - // get feature set for name - FeatureSetSpec featureSetSpec; - try { - featureSetSpec = featureSetCache.get(featureSetRefStr); - } catch (ExecutionException e) { - throw new SpecRetrievalException( - String.format("Unable to find featureSet with name: %s", featureSetRefStr), e); - } - - // check that requested features reference point to different features in the - // featureset. - HashSet featureNames = new HashSet<>(); - featureReferences.forEach( - ref -> { - if (featureNames.contains(ref.getName())) { - throw new SpecRetrievalException( - "Multiple Feature References referencing the same feature in a featureset is not allowed."); - } - featureNames.add(ref.getName()); - }); - - return FeatureSetRequest.newBuilder() - .setSpec(featureSetSpec) - .addAllFeatureReferences(featureReferences) - .build(); - } - - /** Maps given Feature Reference to the containing Feature Set's string reference */ - private String mapFeatureToFeatureSetReference(FeatureReference featureReference) { - // map feature reference to coresponding feature set string reference - String featureSetRefStr = - featureToFeatureSetMapping.get(getFeatureStringWithProjectRef(featureReference)); - if (featureSetRefStr == null) { - throw new SpecRetrievalException( - String.format( - "Unable to find Feature Set for the given Feature Reference: %s", - getFeatureStringWithProjectRef(featureReference))); - } else if (featureSetRefStr == FEATURE_SET_CONFLICT_FLAG) { - throw new SpecRetrievalException( - String.format( - "Given Feature Reference is amibigous as it matches multiple Feature Sets: %s." - + "Please specify a more specific Feature Reference (ie specify the project or feature set)", - getFeatureStringWithProjectRef(featureReference))); - } - return featureSetRefStr; - } - /** * Reload the store configuration from the given config path, then retrieve the necessary specs * from core to preload the cache. */ public void populateCache() { - Map featureSetMap = getFeatureSetMap(); - - featureSetCache.invalidateAll(); - featureSetCache.putAll(featureSetMap); - - featureToFeatureSetMapping = getFeatureToFeatureSetMapping(featureSetMap); - - featureSetsCount.set(featureSetCache.size()); - Map featureTableMap = getFeatureTableMap().getLeft(); featureTableCache.invalidateAll(); @@ -277,112 +125,6 @@ public void scheduledPopulateCache() { } } - private Map getFeatureSetMap() { - HashMap featureSets = new HashMap<>(); - - for (Subscription subscription : this.store.getSubscriptionsList()) { - try { - if (!subscription.getExclude()) { - ListFeatureSetsResponse featureSetsResponse = - coreService.listFeatureSets( - ListFeatureSetsRequest.newBuilder() - .setFilter( - ListFeatureSetsRequest.Filter.newBuilder() - .setProject(subscription.getProject()) - .setFeatureSetName(subscription.getName())) - .build()); - - for (FeatureSet featureSet : featureSetsResponse.getFeatureSetsList()) { - FeatureSetSpec spec = featureSet.getSpec(); - featureSets.put(getFeatureSetStringRef(spec), spec); - } - } - } catch (StatusRuntimeException e) { - throw new RuntimeException( - String.format("Unable to retrieve specs matching subscription %s", subscription), e); - } - } - return featureSets; - } - - /** - * Generate a feature to feature set mapping from the given feature sets map. Accounts for - * variations (missing project, feature_set) in string feature references generated by creating - * multiple entries in the returned mapping for each variation. - * - * @param featureSets map of feature set name to feature set specs - * @return mapping of string feature references to name of feature sets - */ - private Map getFeatureToFeatureSetMapping( - Map featureSets) { - Map mapping = new HashMap<>(); - - featureSets.values().stream() - .forEach( - featureSetSpec -> { - for (FeatureSpec featureSpec : featureSetSpec.getFeaturesList()) { - // Register the different permutations of string feature references - // that refers to this feature in the feature to featureset mapping. - - // Features in FeatureSets in default project can be referenced without project. - boolean isInDefaultProject = - featureSetSpec.getProject().equals(DEFAULT_PROJECT_NAME); - - for (boolean hasProject : new boolean[] {true, false}) { - if (!isInDefaultProject && !hasProject) continue; - // Features can be referenced without a featureset if there are no conflicts. - for (boolean hasFeatureSet : new boolean[] {true, false}) { - // Get mapping between string feature reference and featureset - Pair singleMapping = - this.generateFeatureToFeatureSetMapping( - featureSpec, featureSetSpec, hasProject, hasFeatureSet); - String featureRef = singleMapping.getKey(); - String featureSetRef = singleMapping.getValue(); - // Check if another feature set has already mapped to this - // string feature reference. if so mark the conflict. - if (mapping.containsKey(featureRef)) { - mapping.put(featureRef, FEATURE_SET_CONFLICT_FLAG); - } else { - mapping.put(featureRef, featureSetRef); - } - } - } - } - }); - - return mapping; - } - - /** - * Generate a single mapping between the given feature and the featureset. Maps a feature - * reference refering to the given feature to the corresponding featureset's name. - * - * @param featureSpec specifying the feature to create mapping for. - * @param featureSetSpec specifying the feature set to create mapping for. - * @param hasProject whether generated mapping's string feature ref has a project. - * @param hasFeatureSet whether generated mapping's string feature ref has a featureSet. - * @return a pair mapping a string feature reference to a featureset name. - */ - private Pair generateFeatureToFeatureSetMapping( - FeatureSpec featureSpec, - FeatureSetSpec featureSetSpec, - boolean hasProject, - boolean hasFeatureSet) { - FeatureReference.Builder featureRef = - FeatureReference.newBuilder() - .setProject(featureSetSpec.getProject()) - .setFeatureSet(featureSetSpec.getName()) - .setName(featureSpec.getName()); - if (!hasProject) { - featureRef = featureRef.clearProject(); - } - if (!hasFeatureSet) { - featureRef = featureRef.clearFeatureSet(); - } - return Pair.of( - getFeatureStringWithProjectRef(featureRef.build()), getFeatureSetStringRef(featureSetSpec)); - } - /** * Provides a map for easy retrieval of FeatureTable spec using FeatureTable reference * diff --git a/serving/src/main/java/feast/serving/specs/CoreSpecService.java b/serving/src/main/java/feast/serving/specs/CoreSpecService.java index 8bdf4fcdc0..5d1209f41e 100644 --- a/serving/src/main/java/feast/serving/specs/CoreSpecService.java +++ b/serving/src/main/java/feast/serving/specs/CoreSpecService.java @@ -17,10 +17,6 @@ package feast.serving.specs; import feast.proto.core.CoreServiceGrpc; -import feast.proto.core.CoreServiceProto.GetFeatureSetRequest; -import feast.proto.core.CoreServiceProto.GetFeatureSetResponse; -import feast.proto.core.CoreServiceProto.ListFeatureSetsRequest; -import feast.proto.core.CoreServiceProto.ListFeatureSetsResponse; import feast.proto.core.CoreServiceProto.ListFeatureTablesRequest; import feast.proto.core.CoreServiceProto.ListFeatureTablesResponse; import feast.proto.core.CoreServiceProto.ListProjectsRequest; @@ -52,14 +48,6 @@ public CoreSpecService( } } - public GetFeatureSetResponse getFeatureSet(GetFeatureSetRequest getFeatureSetRequest) { - return blockingStub.getFeatureSet(getFeatureSetRequest); - } - - public ListFeatureSetsResponse listFeatureSets(ListFeatureSetsRequest ListFeatureSetsRequest) { - return blockingStub.listFeatureSets(ListFeatureSetsRequest); - } - public UpdateStoreResponse updateStore(UpdateStoreRequest updateStoreRequest) { return blockingStub.updateStore(updateStoreRequest); } diff --git a/serving/src/main/java/feast/serving/util/RequestHelper.java b/serving/src/main/java/feast/serving/util/RequestHelper.java index 6a3a79b03e..4d478f430f 100644 --- a/serving/src/main/java/feast/serving/util/RequestHelper.java +++ b/serving/src/main/java/feast/serving/util/RequestHelper.java @@ -16,26 +16,11 @@ */ package feast.serving.util; -import feast.proto.serving.ServingAPIProto.FeatureReference; import feast.proto.serving.ServingAPIProto.FeatureReferenceV2; -import feast.proto.serving.ServingAPIProto.GetBatchFeaturesRequest; -import feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest; import feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2; -import io.grpc.Status; -import java.util.Set; -import java.util.stream.Collectors; public class RequestHelper { - public static void validateOnlineRequest(GetOnlineFeaturesRequest request) { - // EntityDataSetRow shall not be empty - if (request.getEntityRowsCount() <= 0) { - throw Status.INVALID_ARGUMENT - .withDescription("Entity value must be provided") - .asRuntimeException(); - } - } - public static void validateOnlineRequest(GetOnlineFeaturesRequestV2 request) { // All EntityRows should not be empty if (request.getEntityRowsCount() <= 0) { @@ -47,30 +32,6 @@ public static void validateOnlineRequest(GetOnlineFeaturesRequestV2 request) { } } - public static void validateBatchRequest(GetBatchFeaturesRequest getFeaturesRequest) { - if (!getFeaturesRequest.hasDatasetSource()) { - throw Status.INVALID_ARGUMENT - .withDescription("Dataset source must be provided") - .asRuntimeException(); - } - - if (!getFeaturesRequest.getDatasetSource().hasFileSource()) { - throw Status.INVALID_ARGUMENT - .withDescription("Dataset source must be provided: only file source supported") - .asRuntimeException(); - } - - Set uniqueFeatureNames = - getFeaturesRequest.getFeaturesList().stream() - .map(FeatureReference::getName) - .collect(Collectors.toSet()); - if (uniqueFeatureNames.size() != getFeaturesRequest.getFeaturesList().size()) { - throw Status.INVALID_ARGUMENT - .withDescription("Feature names must be unique within the request") - .asRuntimeException(); - } - } - public static void validateOnlineRequestFeatureReference(FeatureReferenceV2 featureReference) { if (featureReference.getFeatureTable().isEmpty()) { throw new IllegalArgumentException("FeatureTable name must be provided in FeatureReference"); diff --git a/serving/src/test/java/feast/serving/controller/ServingServiceGRpcControllerTest.java b/serving/src/test/java/feast/serving/controller/ServingServiceGRpcControllerTest.java index b824f3ae43..c0901c48bc 100644 --- a/serving/src/test/java/feast/serving/controller/ServingServiceGRpcControllerTest.java +++ b/serving/src/test/java/feast/serving/controller/ServingServiceGRpcControllerTest.java @@ -36,7 +36,6 @@ import feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse; import feast.proto.types.ValueProto.Value; import feast.serving.config.FeastProperties; -import feast.serving.service.ServingService; import feast.serving.service.ServingServiceV2; import io.grpc.stub.StreamObserver; import io.jaegertracing.Configuration; @@ -51,8 +50,6 @@ public class ServingServiceGRpcControllerTest { - @Mock private ServingService mockServingService; - @Mock private ServingServiceV2 mockServingServiceV2; @Mock private StreamObserver mockStreamObserver; @@ -104,7 +101,7 @@ private ServingServiceGRpcController getServingServiceGRpcController(boolean ena AuthorizationService authorizationservice = new AuthorizationService(feastProperties.getSecurity(), authProvider); return new ServingServiceGRpcController( - authorizationservice, mockServingService, mockServingServiceV2, feastProperties, tracer); + authorizationservice, mockServingServiceV2, feastProperties, tracer); } @Test diff --git a/serving/src/test/java/feast/serving/it/AuthTestUtils.java b/serving/src/test/java/feast/serving/it/AuthTestUtils.java index 1990ad4ece..a4c3db7def 100644 --- a/serving/src/test/java/feast/serving/it/AuthTestUtils.java +++ b/serving/src/test/java/feast/serving/it/AuthTestUtils.java @@ -21,7 +21,6 @@ import com.google.protobuf.Timestamp; import feast.common.auth.credentials.OAuthCredentials; import feast.proto.core.CoreServiceGrpc; -import feast.proto.core.SourceProto; import feast.proto.serving.ServingAPIProto; import feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2; import feast.proto.serving.ServingServiceGrpc; @@ -50,24 +49,6 @@ public class AuthTestUtils { private static final String DEFAULT_FLAVOR = "glob"; - static SourceProto.Source defaultSource = - createSource("kafka:9092,localhost:9094", "feast-features"); - - public static SourceProto.Source getDefaultSource() { - return defaultSource; - } - - public static SourceProto.Source createSource(String server, String topic) { - return SourceProto.Source.newBuilder() - .setType(SourceProto.SourceType.KAFKA) - .setKafkaSourceConfig( - SourceProto.KafkaSourceConfig.newBuilder() - .setBootstrapServers(server) - .setTopic(topic) - .build()) - .build(); - } - public static GetOnlineFeaturesRequestV2 createOnlineFeatureRequest( String projectName, String featureTableName, diff --git a/serving/src/test/java/feast/serving/it/BaseAuthIT.java b/serving/src/test/java/feast/serving/it/BaseAuthIT.java index 6cc4529bdb..79d47737e7 100644 --- a/serving/src/test/java/feast/serving/it/BaseAuthIT.java +++ b/serving/src/test/java/feast/serving/it/BaseAuthIT.java @@ -53,8 +53,6 @@ public class BaseAuthIT { static final int FEAST_CORE_PORT = 6565; - static final int FEAST_JOB_CONTROLLER_PORT = 6570; - @DynamicPropertySource static void properties(DynamicPropertyRegistry registry) { registry.add("feast.stores[0].name", () -> "online"); diff --git a/serving/src/test/java/feast/serving/it/CoreSimpleAPIClient.java b/serving/src/test/java/feast/serving/it/CoreSimpleAPIClient.java index d526bbee75..f7bc12f5fc 100644 --- a/serving/src/test/java/feast/serving/it/CoreSimpleAPIClient.java +++ b/serving/src/test/java/feast/serving/it/CoreSimpleAPIClient.java @@ -19,7 +19,6 @@ import feast.proto.core.CoreServiceGrpc; import feast.proto.core.CoreServiceProto; import feast.proto.core.EntityProto; -import feast.proto.core.FeatureSetProto; import feast.proto.core.FeatureTableProto; public class CoreSimpleAPIClient { @@ -29,20 +28,6 @@ public CoreSimpleAPIClient(CoreServiceGrpc.CoreServiceBlockingStub stub) { this.stub = stub; } - public void simpleApplyFeatureSet(FeatureSetProto.FeatureSet featureSet) { - stub.applyFeatureSet( - CoreServiceProto.ApplyFeatureSetRequest.newBuilder().setFeatureSet(featureSet).build()); - } - - public FeatureSetProto.FeatureSet simpleGetFeatureSet(String projectName, String name) { - return stub.getFeatureSet( - CoreServiceProto.GetFeatureSetRequest.newBuilder() - .setName(name) - .setProject(projectName) - .build()) - .getFeatureSet(); - } - public void simpleApplyEntity(String projectName, EntityProto.EntitySpecV2 entitySpec) { stub.applyEntity( CoreServiceProto.ApplyEntityRequest.newBuilder() diff --git a/serving/src/test/java/feast/serving/it/ServingServiceOauthAuthorizationIT.java b/serving/src/test/java/feast/serving/it/ServingServiceOauthAuthorizationIT.java index e5a4d7ad1f..9bc5cbe044 100644 --- a/serving/src/test/java/feast/serving/it/ServingServiceOauthAuthorizationIT.java +++ b/serving/src/test/java/feast/serving/it/ServingServiceOauthAuthorizationIT.java @@ -151,7 +151,6 @@ public void shouldNotAllowUnauthenticatedGetOnlineFeatures() { @Test void canGetOnlineFeaturesIfAdmin() { - // apply feature set ServingServiceBlockingStub servingStub = AuthTestUtils.getServingServiceStub(true, FEAST_SERVING_PORT, adminCredentials); GetOnlineFeaturesRequestV2 onlineFeatureRequest = diff --git a/serving/src/test/java/feast/serving/service/CachedSpecServiceTest.java b/serving/src/test/java/feast/serving/service/CachedSpecServiceTest.java index 2775f76315..57932d4929 100644 --- a/serving/src/test/java/feast/serving/service/CachedSpecServiceTest.java +++ b/serving/src/test/java/feast/serving/service/CachedSpecServiceTest.java @@ -30,7 +30,6 @@ import feast.proto.core.CoreServiceProto.ListFeatureTablesResponse; import feast.proto.core.CoreServiceProto.ListProjectsRequest; import feast.proto.core.CoreServiceProto.ListProjectsResponse; -import feast.proto.core.FeatureSetProto.FeatureSetSpec; import feast.proto.core.FeatureTableProto; import feast.proto.core.FeatureTableProto.FeatureTableSpec; import feast.proto.core.StoreProto.Store; @@ -38,7 +37,6 @@ import feast.proto.types.ValueProto; import feast.serving.specs.CachedSpecService; import feast.serving.specs.CoreSpecService; -import java.util.Map; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -53,7 +51,6 @@ public class CachedSpecServiceTest { @Mock CoreSpecService coreService; - private Map featureSetSpecs; private CachedSpecService cachedSpecService; private ImmutableList featureTableEntities; diff --git a/serving/src/test/java/feast/serving/service/OnlineServingServiceTest.java b/serving/src/test/java/feast/serving/service/OnlineServingServiceTest.java index e98f4204ee..8a6dfdffe7 100644 --- a/serving/src/test/java/feast/serving/service/OnlineServingServiceTest.java +++ b/serving/src/test/java/feast/serving/service/OnlineServingServiceTest.java @@ -23,7 +23,6 @@ import static org.mockito.Mockito.when; import static org.mockito.MockitoAnnotations.initMocks; -import com.google.common.collect.Lists; import com.google.protobuf.Duration; import com.google.protobuf.Timestamp; import feast.proto.core.FeatureProto; @@ -33,13 +32,10 @@ import feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse; import feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FieldStatus; import feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FieldValues; -import feast.proto.types.FeatureRowProto.FeatureRow; -import feast.proto.types.FieldProto; import feast.proto.types.ValueProto; import feast.serving.specs.CachedSpecService; import feast.storage.api.retriever.Feature; import feast.storage.connectors.redis.retriever.OnlineRetriever; -import feast.storage.connectors.redis.retriever.RedisOnlineRetriever; import io.opentracing.Tracer; import io.opentracing.Tracer.SpanBuilder; import java.util.ArrayList; @@ -54,82 +50,19 @@ public class OnlineServingServiceTest { @Mock CachedSpecService specService; - @Mock Tracer tracer; - - @Mock RedisOnlineRetriever retriever; @Mock OnlineRetriever retrieverV2; - private OnlineServingService onlineServingService; private OnlineServingServiceV2 onlineServingServiceV2; - List testFeatureRows; List mockedFeatureRows; List featureSpecs; @Before public void setUp() { initMocks(this); - onlineServingService = new OnlineServingService(retriever, specService, tracer); onlineServingServiceV2 = new OnlineServingServiceV2(retrieverV2, specService, tracer); - // create fake feature rows for testing. - testFeatureRows = new ArrayList<>(); - testFeatureRows.add( - FeatureRow.newBuilder() - .setEventTimestamp(Timestamp.newBuilder().setSeconds(100)) - .addAllFields( - Lists.newArrayList( - FieldProto.Field.newBuilder() - .setName("entity1") - .setValue(createInt64Value(1)) - .build(), - FieldProto.Field.newBuilder() - .setName("entity2") - .setValue(createStrValue("a")) - .build(), - FieldProto.Field.newBuilder() - .setName("feature1") - .setValue(createInt64Value(1)) - .build(), - FieldProto.Field.newBuilder() - .setName("feature2") - .setValue(createInt64Value(1)) - .build())) - .setFeatureSet("featureSet") - .build()); - - testFeatureRows.add( - FeatureRow.newBuilder() - .setEventTimestamp(Timestamp.newBuilder().setSeconds(100)) - .addAllFields( - Lists.newArrayList( - FieldProto.Field.newBuilder() - .setName("entity1") - .setValue(createInt64Value(2)) - .build(), - FieldProto.Field.newBuilder() - .setName("entity2") - .setValue(createStrValue("b")) - .build(), - FieldProto.Field.newBuilder() - .setName("feature1") - .setValue(createInt64Value(2)) - .build(), - FieldProto.Field.newBuilder() - .setName("feature2") - .setValue(createInt64Value(2)) - .build())) - .setFeatureSet("featureSet") - .build()); - - testFeatureRows.add( - testFeatureRows - .get(1) - .toBuilder() - .setEventTimestamp(Timestamp.newBuilder().setSeconds(50)) - .build()); - mockedFeatureRows = new ArrayList<>(); mockedFeatureRows.add( Feature.builder() diff --git a/storage/api/src/main/java/feast/storage/api/retriever/FeatureSetRequest.java b/storage/api/src/main/java/feast/storage/api/retriever/FeatureSetRequest.java deleted file mode 100644 index 3482529a97..0000000000 --- a/storage/api/src/main/java/feast/storage/api/retriever/FeatureSetRequest.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * Copyright 2018-2019 The Feast Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package feast.storage.api.retriever; - -import com.google.auto.value.AutoValue; -import com.google.common.collect.ImmutableSet; -import feast.proto.core.FeatureSetProto.FeatureSetSpec; -import feast.proto.serving.ServingAPIProto.FeatureReference; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -@AutoValue -public abstract class FeatureSetRequest { - public abstract FeatureSetSpec getSpec(); - - public abstract ImmutableSet getFeatureReferences(); - - public static Builder newBuilder() { - return new AutoValue_FeatureSetRequest.Builder(); - } - - @AutoValue.Builder - public abstract static class Builder { - public abstract Builder setSpec(FeatureSetSpec spec); - - abstract ImmutableSet.Builder featureReferencesBuilder(); - - public Builder addAllFeatureReferences(List featureReferenceList) { - featureReferencesBuilder().addAll(featureReferenceList); - return this; - } - - public Builder addFeatureReference(FeatureReference featureReference) { - featureReferencesBuilder().add(featureReference); - return this; - } - - public abstract FeatureSetRequest build(); - } - - public Map getFeatureRefsByName() { - return getFeatureReferences().stream() - .collect(Collectors.toMap(FeatureReference::getName, featureReference -> featureReference)); - } -} diff --git a/storage/api/src/main/java/feast/storage/api/retriever/OnlineRetriever.java b/storage/api/src/main/java/feast/storage/api/retriever/OnlineRetriever.java deleted file mode 100644 index f56cf6ca02..0000000000 --- a/storage/api/src/main/java/feast/storage/api/retriever/OnlineRetriever.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * Copyright 2018-2020 The Feast Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package feast.storage.api.retriever; - -import feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest.EntityRow; -import feast.proto.types.FeatureRowProto.FeatureRow; -import java.util.List; -import java.util.Optional; - -/** An online retriever is a feature retriever that retrieves the latest feature data. */ -public interface OnlineRetriever { - - /** - * Get online features for the given entity rows using data retrieved from the feature/featureset - * specified in feature set request. - * - *

Each {@link FeatureRow} optional in the returned list then corresponds to an {@link - * EntityRow} provided by the user. If feature for a given entity row is not found, will return an - * empty optional instead. The no. of {@link FeatureRow} returned should match the no. of given - * {@link EntityRow}s - * - * @param entityRows list of entity rows to request features for. - * @param featureSetRequest specifies the features/feature set to retrieve data from - * @return list of {@link FeatureRow}s corresponding to data retrieved for each entity row from - * feature/featureset specified in featureset request. - */ - List> getOnlineFeatures( - List entityRows, FeatureSetRequest featureSetRequest); -} diff --git a/storage/connectors/redis/src/main/java/feast/storage/connectors/redis/retriever/FeatureRowDecoder.java b/storage/connectors/redis/src/main/java/feast/storage/connectors/redis/retriever/FeatureRowDecoder.java deleted file mode 100644 index 02bc537927..0000000000 --- a/storage/connectors/redis/src/main/java/feast/storage/connectors/redis/retriever/FeatureRowDecoder.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * Copyright 2018-2020 The Feast Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package feast.storage.connectors.redis.retriever; - -import com.google.common.hash.Hashing; -import feast.proto.core.FeatureSetProto.FeatureSetSpec; -import feast.proto.core.FeatureSetProto.FeatureSpec; -import feast.proto.types.FeatureRowProto.FeatureRow; -import feast.proto.types.FieldProto.Field; -import feast.proto.types.ValueProto.Value; -import java.nio.charset.StandardCharsets; -import java.util.Comparator; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - -public class FeatureRowDecoder { - - private final String featureSetRef; - private final FeatureSetSpec spec; - - public FeatureRowDecoder(String featureSetRef, FeatureSetSpec spec) { - this.featureSetRef = featureSetRef; - this.spec = spec; - } - - /** - * Check if encoded feature row can be decoded by v1 Decoder. The v1 Decoder requires that the - * Feature Row to have both it's feature set reference and fields names are not set. The no. of - * fields in the feature row should also match up with the number of fields in the Feature Set - * spec. NOTE: This method is deprecated and will be removed in Feast v0.7. - * - * @param featureRow Feature row - * @return boolean - */ - @Deprecated - private boolean isEncodedV1(FeatureRow featureRow) { - return featureRow.getFeatureSet().isEmpty() - && featureRow.getFieldsList().stream().allMatch(field -> field.getName().isEmpty()) - && featureRow.getFieldsList().size() == spec.getFeaturesList().size(); - } - - /** - * Check if encoded feature row can be decoded by Decoder. The v2 Decoder requires that a Feature - * Row to have both it feature set reference and fields names are set. - * - * @param featureRow Feature row - * @return boolean - */ - private boolean isEncodedV2(FeatureRow featureRow) { - return !featureRow.getFieldsList().stream().anyMatch(field -> field.getName().isEmpty()); - } - - /** - * Decode feature row encoded. - * - * @throws IllegalArgumentException if unable to the decode the given feature row - * @param encodedFeatureRow Feature row - * @return boolean - */ - public FeatureRow decode(FeatureRow encodedFeatureRow) { - if (isEncodedV1(encodedFeatureRow)) { - // TODO: remove v1 feature row decoder in Feast 0.7 - // Decode Feature Rows using the v1 Decoder. - final List fieldsWithoutName = encodedFeatureRow.getFieldsList(); - List featureNames = - spec.getFeaturesList().stream() - .sorted(Comparator.comparing(FeatureSpec::getName)) - .map(FeatureSpec::getName) - .collect(Collectors.toList()); - - List fields = - IntStream.range(0, featureNames.size()) - .mapToObj( - featureNameIndex -> { - String featureName = featureNames.get(featureNameIndex); - return fieldsWithoutName - .get(featureNameIndex) - .toBuilder() - .setName(featureName) - .build(); - }) - .collect(Collectors.toList()); - - return encodedFeatureRow - .toBuilder() - .clearFields() - .setFeatureSet(featureSetRef) - .addAllFields(fields) - .build(); - } - if (isEncodedV2(encodedFeatureRow)) { - // Decode Feature Rows using the v2 Decoder. - // v2 Decoder input Feature Rows should use a hashed name as the field name and - // should not have feature set reference set. - // Decoding reverts the field name to a unhashed string and set feature set reference. - Map nameHashValueMap = - encodedFeatureRow.getFieldsList().stream() - .collect(Collectors.toMap(field -> field.getName(), field -> field.getValue())); - - List featureNames = - spec.getFeaturesList().stream().map(FeatureSpec::getName).collect(Collectors.toList()); - - List fields = - featureNames.stream() - .map( - name -> { - String nameHash = - Hashing.murmur3_32().hashString(name, StandardCharsets.UTF_8).toString(); - Value value = - nameHashValueMap.getOrDefault(nameHash, Value.newBuilder().build()); - return Field.newBuilder().setName(name).setValue(value).build(); - }) - .collect(Collectors.toList()); - - return encodedFeatureRow - .toBuilder() - .clearFields() - .setFeatureSet(featureSetRef) - .addAllFields(fields) - .build(); - } - throw new IllegalArgumentException("Failed to decode FeatureRow row: Possible data corruption"); - } -} diff --git a/storage/connectors/redis/src/main/java/feast/storage/connectors/redis/retriever/RedisClusterOnlineRetriever.java b/storage/connectors/redis/src/main/java/feast/storage/connectors/redis/retriever/RedisClusterOnlineRetriever.java deleted file mode 100644 index c49745bbbd..0000000000 --- a/storage/connectors/redis/src/main/java/feast/storage/connectors/redis/retriever/RedisClusterOnlineRetriever.java +++ /dev/null @@ -1,279 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * Copyright 2018-2020 The Feast Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package feast.storage.connectors.redis.retriever; - -import com.google.protobuf.InvalidProtocolBufferException; -import feast.proto.core.FeatureSetProto.EntitySpec; -import feast.proto.core.FeatureSetProto.FeatureSetSpec; -import feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest.EntityRow; -import feast.proto.storage.RedisProto.RedisKey; -import feast.proto.types.FeatureRowProto.FeatureRow; -import feast.proto.types.FieldProto.Field; -import feast.proto.types.ValueProto.Value; -import feast.storage.api.retriever.FeatureSetRequest; -import feast.storage.api.retriever.OnlineRetriever; -import feast.storage.connectors.redis.serializer.RedisKeyPrefixSerializer; -import feast.storage.connectors.redis.serializer.RedisKeySerializer; -import io.grpc.Status; -import io.lettuce.core.RedisURI; -import io.lettuce.core.cluster.RedisClusterClient; -import io.lettuce.core.cluster.api.StatefulRedisClusterConnection; -import io.lettuce.core.cluster.api.sync.RedisAdvancedClusterCommands; -import io.lettuce.core.codec.ByteArrayCodec; -import java.util.*; -import java.util.concurrent.ExecutionException; -import java.util.stream.Collectors; -import java.util.stream.IntStream; -import javax.annotation.Nullable; - -/** Defines a storage retriever */ -public class RedisClusterOnlineRetriever implements OnlineRetriever { - - private final RedisAdvancedClusterCommands syncCommands; - private final RedisKeySerializer serializer; - @Nullable private final RedisKeySerializer fallbackSerializer; - - static class Builder { - private final StatefulRedisClusterConnection connection; - private final RedisKeySerializer serializer; - @Nullable private RedisKeySerializer fallbackSerializer; - - Builder( - StatefulRedisClusterConnection connection, RedisKeySerializer serializer) { - this.connection = connection; - this.serializer = serializer; - } - - Builder withFallbackSerializer(RedisKeySerializer fallbackSerializer) { - this.fallbackSerializer = fallbackSerializer; - return this; - } - - RedisClusterOnlineRetriever build() { - return new RedisClusterOnlineRetriever(this); - } - } - - private RedisClusterOnlineRetriever(Builder builder) { - this.syncCommands = builder.connection.sync(); - this.serializer = builder.serializer; - this.fallbackSerializer = builder.fallbackSerializer; - } - - public static OnlineRetriever create(Map config) { - List redisURIList = - Arrays.stream(config.get("connection_string").split(",")) - .map( - hostPort -> { - String[] hostPortSplit = hostPort.trim().split(":"); - return RedisURI.create(hostPortSplit[0], Integer.parseInt(hostPortSplit[1])); - }) - .collect(Collectors.toList()); - StatefulRedisClusterConnection connection = - RedisClusterClient.create(redisURIList).connect(new ByteArrayCodec()); - - RedisKeySerializer serializer = - new RedisKeyPrefixSerializer(config.getOrDefault("key_prefix", "")); - - Builder builder = new Builder(connection, serializer); - - if (Boolean.parseBoolean(config.getOrDefault("enable_fallback", "false"))) { - RedisKeySerializer fallbackSerializer = - new RedisKeyPrefixSerializer(config.getOrDefault("fallback_prefix", "")); - builder = builder.withFallbackSerializer(fallbackSerializer); - } - - return builder.build(); - } - - /** {@inheritDoc} */ - @Override - public List> getOnlineFeatures( - List entityRows, FeatureSetRequest featureSetRequest) { - - // get features for this features/featureset in featureset request - FeatureSetSpec featureSetSpec = featureSetRequest.getSpec(); - List redisKeys = buildRedisKeys(entityRows, featureSetSpec); - FeatureRowDecoder decoder = - new FeatureRowDecoder(generateFeatureSetStringRef(featureSetSpec), featureSetSpec); - List> featureRows = new ArrayList<>(); - try { - featureRows = getFeaturesFromRedis(redisKeys, decoder); - } catch (InvalidProtocolBufferException | ExecutionException e) { - throw Status.INTERNAL - .withDescription("Unable to parse protobuf while retrieving feature") - .withCause(e) - .asRuntimeException(); - } - return featureRows; - } - - private List buildRedisKeys(List entityRows, FeatureSetSpec featureSetSpec) { - String featureSetRef = generateFeatureSetStringRef(featureSetSpec); - List featureSetEntityNames = - featureSetSpec.getEntitiesList().stream() - .map(EntitySpec::getName) - .collect(Collectors.toList()); - return entityRows.stream() - .map(row -> makeRedisKey(featureSetRef, featureSetEntityNames, row)) - .collect(Collectors.toList()); - } - - /** - * Create {@link RedisKey} - * - * @param featureSet featureSet reference of the feature. E.g. feature_set_1:1 - * @param featureSetEntityNames entity names that belong to the featureSet - * @param entityRow entityRow to build the key from - * @return {@link RedisKey} - */ - private RedisKey makeRedisKey( - String featureSet, List featureSetEntityNames, EntityRow entityRow) { - RedisKey.Builder builder = RedisKey.newBuilder().setFeatureSet(featureSet); - Map fieldsMap = entityRow.getFieldsMap(); - featureSetEntityNames.sort(String::compareTo); - for (String entityName : featureSetEntityNames) { - if (!fieldsMap.containsKey(entityName)) { - throw Status.INVALID_ARGUMENT - .withDescription( - String.format( - "Entity row fields \"%s\" does not contain required entity field \"%s\"", - fieldsMap.keySet().toString(), entityName)) - .asRuntimeException(); - } - - builder.addEntities( - Field.newBuilder().setName(entityName).setValue(fieldsMap.get(entityName))); - } - return builder.build(); - } - - /** - * Get features from data pulled from the Redis for a specific featureset. - * - * @param redisKeys keys used to retrieve data from Redis for a specific featureset. - * @param decoder used to decode the data retrieved from Redis for a specific featureset. - * @return List of {@link FeatureRow} optionals - */ - private List> getFeaturesFromRedis( - List redisKeys, FeatureRowDecoder decoder) - throws InvalidProtocolBufferException, ExecutionException { - // pull feature row data bytes from redis using given redis keys - List featureRowsBytes = sendMultiGet(redisKeys); - List> featureRows = new ArrayList<>(); - - for (byte[] featureRowBytes : featureRowsBytes) { - if (featureRowBytes == null) { - featureRows.add(Optional.empty()); - continue; - } - - // decode feature rows from data bytes using decoder. - FeatureRow featureRow = FeatureRow.parseFrom(featureRowBytes); - try { - featureRow = decoder.decode(featureRow); - } catch (IllegalArgumentException e) { - // decoding feature row failed: data corruption could have occurred - throw Status.DATA_LOSS.withCause(e).withDescription(e.getMessage()).asRuntimeException(); - } - featureRows.add(Optional.of(featureRow)); - } - return featureRows; - } - - /** - * Pull the data stored in Redis at the given keys as bytes using the mget command. If no data is - * stored at a given key in Redis, will subsitute the data with null. - * - * @param keys list of {@link RedisKey} to pull from redis. - * @return list of data bytes or null pulled from redis for each given key. - */ - private List sendMultiGet(List keys) { - try { - byte[][] binaryKeys = - keys.stream() - .map(serializer::serialize) - .collect(Collectors.toList()) - .toArray(new byte[0][0]); - List redisValues = - syncCommands.mget(binaryKeys).stream() - .map( - keyValue -> { - if (keyValue == null) { - return null; - } - return keyValue.getValueOrElse(null); - }) - .collect(Collectors.toList()); - - List redisValuesWithFallback = redisValues; - if (fallbackSerializer != null) { - List indexMissingValue = - IntStream.range(0, keys.size()) - .filter(i -> redisValues.get(i) == null) - .boxed() - .collect(Collectors.toList()); - - if (indexMissingValue.isEmpty()) { - return redisValues; - } - - byte[][] fallbackBinaryKeys = - indexMissingValue.stream() - .map(i -> fallbackSerializer.serialize(keys.get(i))) - .collect(Collectors.toList()) - .toArray(new byte[0][0]); - - List fallBackValues = - syncCommands.mget(fallbackBinaryKeys).stream() - .map( - keyValue -> { - if (keyValue == null) { - return null; - } - return keyValue.getValueOrElse(null); - }) - .collect(Collectors.toList()); - - redisValuesWithFallback = - IntStream.range(0, keys.size()) - .mapToObj( - i -> { - if (indexMissingValue.contains(i)) { - return fallBackValues.get(indexMissingValue.indexOf(i)); - } else { - return redisValues.get(i); - } - }) - .collect(Collectors.toList()); - } - - return redisValuesWithFallback; - } catch (Exception e) { - throw Status.NOT_FOUND - .withDescription("Unable to retrieve feature from Redis") - .withCause(e) - .asRuntimeException(); - } - } - - // TODO: Refactor this out to common package? - private static String generateFeatureSetStringRef(FeatureSetSpec featureSetSpec) { - String ref = String.format("%s/%s", featureSetSpec.getProject(), featureSetSpec.getName()); - return ref; - } -} diff --git a/storage/connectors/redis/src/main/java/feast/storage/connectors/redis/retriever/RedisOnlineRetriever.java b/storage/connectors/redis/src/main/java/feast/storage/connectors/redis/retriever/RedisOnlineRetriever.java deleted file mode 100644 index 049175879d..0000000000 --- a/storage/connectors/redis/src/main/java/feast/storage/connectors/redis/retriever/RedisOnlineRetriever.java +++ /dev/null @@ -1,201 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * Copyright 2018-2020 The Feast Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package feast.storage.connectors.redis.retriever; - -import com.google.protobuf.AbstractMessageLite; -import com.google.protobuf.InvalidProtocolBufferException; -import feast.proto.core.FeatureSetProto.EntitySpec; -import feast.proto.core.FeatureSetProto.FeatureSetSpec; -import feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest.EntityRow; -import feast.proto.storage.RedisProto.RedisKey; -import feast.proto.types.FeatureRowProto.FeatureRow; -import feast.proto.types.FieldProto.Field; -import feast.proto.types.ValueProto.Value; -import feast.storage.api.retriever.FeatureSetRequest; -import feast.storage.api.retriever.OnlineRetriever; -import io.grpc.Status; -import io.lettuce.core.RedisClient; -import io.lettuce.core.RedisURI; -import io.lettuce.core.api.StatefulRedisConnection; -import io.lettuce.core.api.sync.RedisCommands; -import io.lettuce.core.codec.ByteArrayCodec; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.concurrent.ExecutionException; -import java.util.stream.Collectors; - -public class RedisOnlineRetriever implements OnlineRetriever { - - private final RedisCommands syncCommands; - - private RedisOnlineRetriever(StatefulRedisConnection connection) { - this.syncCommands = connection.sync(); - } - - public static OnlineRetriever create(Map config) { - - StatefulRedisConnection connection = - RedisClient.create( - RedisURI.create(config.get("host"), Integer.parseInt(config.get("port")))) - .connect(new ByteArrayCodec()); - - return new RedisOnlineRetriever(connection); - } - - public static OnlineRetriever create(StatefulRedisConnection connection) { - return new RedisOnlineRetriever(connection); - } - - /** {@inheritDoc} */ - @Override - public List> getOnlineFeatures( - List entityRows, FeatureSetRequest featureSetRequest) { - - // get features for this features/featureset in featureset request - FeatureSetSpec featureSetSpec = featureSetRequest.getSpec(); - List redisKeys = buildRedisKeys(entityRows, featureSetSpec); - FeatureRowDecoder decoder = - new FeatureRowDecoder(generateFeatureSetStringRef(featureSetSpec), featureSetSpec); - List> featureRows = new ArrayList<>(); - try { - featureRows = getFeaturesFromRedis(redisKeys, decoder); - } catch (InvalidProtocolBufferException | ExecutionException e) { - throw Status.INTERNAL - .withDescription("Unable to parse protobuf while retrieving feature") - .withCause(e) - .asRuntimeException(); - } - - return featureRows; - } - - private List buildRedisKeys(List entityRows, FeatureSetSpec featureSetSpec) { - String featureSetRef = generateFeatureSetStringRef(featureSetSpec); - List featureSetEntityNames = - featureSetSpec.getEntitiesList().stream() - .map(EntitySpec::getName) - .collect(Collectors.toList()); - List redisKeys = - entityRows.stream() - .map(row -> makeRedisKey(featureSetRef, featureSetEntityNames, row)) - .collect(Collectors.toList()); - return redisKeys; - } - - /** - * Create {@link RedisKey} - * - * @param featureSet featureSet reference of the feature. E.g. feature_set_1 - * @param featureSetEntityNames entity names that belong to the featureSet - * @param entityRow entityRow to build the key from - * @return {@link RedisKey} - */ - private RedisKey makeRedisKey( - String featureSet, List featureSetEntityNames, EntityRow entityRow) { - RedisKey.Builder builder = RedisKey.newBuilder().setFeatureSet(featureSet); - Map fieldsMap = entityRow.getFieldsMap(); - featureSetEntityNames.sort(String::compareTo); - for (int i = 0; i < featureSetEntityNames.size(); i++) { - String entityName = featureSetEntityNames.get(i); - - if (!fieldsMap.containsKey(entityName)) { - throw Status.INVALID_ARGUMENT - .withDescription( - String.format( - "Entity row fields \"%s\" does not contain required entity field \"%s\"", - fieldsMap.keySet().toString(), entityName)) - .asRuntimeException(); - } - - builder.addEntities( - Field.newBuilder().setName(entityName).setValue(fieldsMap.get(entityName))); - } - return builder.build(); - } - - /** - * Get features from data pulled from the Redis for a specific featureset. - * - * @param redisKeys keys used to retrieve data from Redis for a specific featureset. - * @param decoder used to decode the data retrieved from Redis for a specific featureset. - * @return List of {@link FeatureRow} optionals - */ - private List> getFeaturesFromRedis( - List redisKeys, FeatureRowDecoder decoder) - throws InvalidProtocolBufferException, ExecutionException { - // pull feature row data bytes from redis using given redis keys - List featureRowsBytes = sendMultiGet(redisKeys); - List> featureRows = new ArrayList<>(); - - for (byte[] featureRowBytes : featureRowsBytes) { - if (featureRowBytes == null) { - featureRows.add(Optional.empty()); - continue; - } - - // decode feature rows from data bytes using decoder. - FeatureRow featureRow = FeatureRow.parseFrom(featureRowBytes); - try { - featureRow = decoder.decode(featureRow); - } catch (IllegalArgumentException e) { - // decoding feature row failed: data corruption could have occurred - throw Status.DATA_LOSS.withCause(e).withDescription(e.getMessage()).asRuntimeException(); - } - featureRows.add(Optional.of(featureRow)); - } - return featureRows; - } - - /** - * Pull the data stored in Redis at the given keys as bytes using the mget command. If no data is - * stored at a given key in Redis, will subsitute the data with null. - * - * @param keys list of {@link RedisKey} to pull from redis. - * @return list of data bytes or null pulled from redis for each given key. - */ - private List sendMultiGet(List keys) { - try { - byte[][] binaryKeys = - keys.stream() - .map(AbstractMessageLite::toByteArray) - .collect(Collectors.toList()) - .toArray(new byte[0][0]); - return syncCommands.mget(binaryKeys).stream() - .map( - keyValue -> { - if (keyValue == null) { - return null; - } - return keyValue.getValueOrElse(null); - }) - .collect(Collectors.toList()); - } catch (Exception e) { - throw Status.UNKNOWN - .withDescription("Unexpected error when pulling data from from Redis.") - .withCause(e) - .asRuntimeException(); - } - } - - // TODO: Refactor this out to common package - private static String generateFeatureSetStringRef(FeatureSetSpec featureSetSpec) { - String ref = String.format("%s/%s", featureSetSpec.getProject(), featureSetSpec.getName()); - return ref; - } -} diff --git a/storage/connectors/redis/src/main/java/feast/storage/connectors/redis/serializer/RedisKeyPrefixSerializer.java b/storage/connectors/redis/src/main/java/feast/storage/connectors/redis/serializer/RedisKeyPrefixSerializer.java deleted file mode 100644 index b676479692..0000000000 --- a/storage/connectors/redis/src/main/java/feast/storage/connectors/redis/serializer/RedisKeyPrefixSerializer.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * Copyright 2018-2020 The Feast Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package feast.storage.connectors.redis.serializer; - -import feast.proto.storage.RedisProto.RedisKey; - -public class RedisKeyPrefixSerializer implements RedisKeySerializer { - - private final byte[] prefixBytes; - - public RedisKeyPrefixSerializer(String prefix) { - this.prefixBytes = prefix.getBytes(); - } - - public byte[] serialize(RedisKey redisKey) { - byte[] key = redisKey.toByteArray(); - - if (prefixBytes.length == 0) { - return key; - } - - byte[] keyWithPrefix = new byte[prefixBytes.length + key.length]; - System.arraycopy(prefixBytes, 0, keyWithPrefix, 0, prefixBytes.length); - System.arraycopy(key, 0, keyWithPrefix, prefixBytes.length, key.length); - return keyWithPrefix; - } -} diff --git a/storage/connectors/redis/src/main/java/feast/storage/connectors/redis/serializer/RedisKeyProtoSerializer.java b/storage/connectors/redis/src/main/java/feast/storage/connectors/redis/serializer/RedisKeyProtoSerializer.java deleted file mode 100644 index 62c3cfd30b..0000000000 --- a/storage/connectors/redis/src/main/java/feast/storage/connectors/redis/serializer/RedisKeyProtoSerializer.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * Copyright 2018-2020 The Feast Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package feast.storage.connectors.redis.serializer; - -import feast.proto.storage.RedisProto.RedisKey; - -public class RedisKeyProtoSerializer implements RedisKeySerializer { - - public byte[] serialize(RedisKey redisKey) { - return redisKey.toByteArray(); - } -} diff --git a/storage/connectors/redis/src/main/java/feast/storage/connectors/redis/serializer/RedisKeySerializer.java b/storage/connectors/redis/src/main/java/feast/storage/connectors/redis/serializer/RedisKeySerializer.java deleted file mode 100644 index cac3d10f7d..0000000000 --- a/storage/connectors/redis/src/main/java/feast/storage/connectors/redis/serializer/RedisKeySerializer.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * Copyright 2018-2020 The Feast Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package feast.storage.connectors.redis.serializer; - -import feast.proto.storage.RedisProto.RedisKey; -import java.io.Serializable; - -public interface RedisKeySerializer extends Serializable { - - byte[] serialize(RedisKey key); -}