From 0b362a0bb7245433008c57c7dfb736fedca30fc2 Mon Sep 17 00:00:00 2001 From: darpanKumar29 Date: Thu, 5 Jan 2023 17:37:55 +0530 Subject: [PATCH 01/67] changes --- java/pom.xml | 28 ------------------ java/serving/pom.xml | 22 -------------- .../service/OnlineServingServiceV2.java | 3 +- .../main/resources/application-override.yaml | 10 +++++++ .../src/main/resources/application.yml | 4 +-- java/serving/src/main/resources/registry.pb | Bin 0 -> 23163 bytes 6 files changed, 14 insertions(+), 53 deletions(-) create mode 100644 java/serving/src/main/resources/application-override.yaml create mode 100644 java/serving/src/main/resources/registry.pb diff --git a/java/pom.xml b/java/pom.xml index 5f1c8f5df90..a465e331177 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -424,34 +424,6 @@ - - org.apache.maven.plugins - maven-gpg-plugin - 1.6 - - - sign-artifacts - verify - - sign - - - - - --pinentry-mode - loopback - - - - ${gpg.passphrase} - - - - diff --git a/java/serving/pom.xml b/java/serving/pom.xml index 8f0cf407e96..a04fb48baff 100644 --- a/java/serving/pom.xml +++ b/java/serving/pom.xml @@ -83,28 +83,6 @@ - - org.codehaus.mojo - exec-maven-plugin - 1.6.0 - - - - python - src/test/resources/docker-compose/feast10/ - - setup_it.py - - ${skipITs} - - feast_test_apply - process-test-resources - - exec - - - - diff --git a/java/serving/src/main/java/feast/serving/service/OnlineServingServiceV2.java b/java/serving/src/main/java/feast/serving/service/OnlineServingServiceV2.java index dd6a592fb80..48de923d36e 100644 --- a/java/serving/src/main/java/feast/serving/service/OnlineServingServiceV2.java +++ b/java/serving/src/main/java/feast/serving/service/OnlineServingServiceV2.java @@ -52,10 +52,11 @@ public class OnlineServingServiceV2 implements ServingServiceV2 { private static final Logger log = org.slf4j.LoggerFactory.getLogger(OnlineServingServiceV2.class); private final Optional tracerOptional; private final OnlineRetriever retriever; - private final RegistryRepository registryRepository; private final OnlineTransformationService onlineTransformationService; private final String project; + private final RegistryRepository registryRepository; + public static final String DUMMY_ENTITY_ID = "__dummy_id"; public static final String DUMMY_ENTITY_VAL = ""; public static final ValueProto.Value DUMMY_ENTITY_VALUE = diff --git a/java/serving/src/main/resources/application-override.yaml b/java/serving/src/main/resources/application-override.yaml new file mode 100644 index 00000000000..fe37ffe9c6c --- /dev/null +++ b/java/serving/src/main/resources/application-override.yaml @@ -0,0 +1,10 @@ +feast: + project: "ltr_lt" + registry: "java/serving/src/main/resources/registry.pb" + activeStore: online + stores: + - name: online + type: REDIS + config: + host: localhost + port: 6379 \ No newline at end of file diff --git a/java/serving/src/main/resources/application.yml b/java/serving/src/main/resources/application.yml index 62ace5018e8..8cba3cb2983 100644 --- a/java/serving/src/main/resources/application.yml +++ b/java/serving/src/main/resources/application.yml @@ -1,6 +1,6 @@ feast: - project: "" - registry: "prompt_dory/data/registry.db" + project: "feast_java_demo" + registry: "java/serving/src/main/resources/registry.pb" registryRefreshInterval: 0 # Indicates the active store. Only a single store in the last can be active at one time. In the future this key diff --git a/java/serving/src/main/resources/registry.pb b/java/serving/src/main/resources/registry.pb new file mode 100644 index 0000000000000000000000000000000000000000..f87d51aaa4cdcf507e217942a2b6f5ab5e73fd06 GIT binary patch literal 23163 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 Date: Wed, 25 Jan 2023 17:35:25 +0530 Subject: [PATCH 02/67] new pb files --- all protos/Aggregation.proto | 15 + all protos/Connector.proto | 34 + all protos/DataFormat.proto | 61 + all protos/DataSource.proto | 271 + all protos/DatastoreTable.proto | 39 + all protos/DynamoDBTable.proto | 31 + all protos/Entity.proto | 60 + all protos/EntityKey.proto | 30 + all protos/Feature.proto | 36 + all protos/FeatureService.proto | 98 + all protos/FeatureTable.proto | 86 + all protos/FeatureView.proto | 94 + all protos/FeatureViewProjection.proto | 25 + all protos/Field.proto | 30 + all protos/HealthService.proto | 24 + all protos/InfraObject.proto | 51 + all protos/OnDemandFeatureView.proto | 89 + all protos/Redis.proto | 33 + all protos/Registry.proto | 61 + all protos/RequestFeatureView.proto | 51 + all protos/SavedDataset.proto | 83 + all protos/ServingService.proto | 133 + all protos/SqliteTable.proto | 31 + all protos/Store.proto | 130 + all protos/StreamFeatureView.proto | 91 + all protos/TransformationService.proto | 67 + all protos/ValidationProfile.proto | 60 + all protos/Value.proto | 109 + java/pom.xml | 9 +- java/serving/pom.xml | 15 + .../controller/HealthServiceController.java | 6 +- .../main/resources/application-override.yaml | 17 +- java/serving/src/main/resources/log4j2.xml | 45 +- java/serving/src/main/resources/registry.pb | Bin 23163 -> 23063 bytes proto/serving/ServingAPIProto.java | 10634 ++++++++++++++++ 35 files changed, 12620 insertions(+), 29 deletions(-) create mode 100644 all protos/Aggregation.proto create mode 100644 all protos/Connector.proto create mode 100644 all protos/DataFormat.proto create mode 100644 all protos/DataSource.proto create mode 100644 all protos/DatastoreTable.proto create mode 100644 all protos/DynamoDBTable.proto create mode 100644 all protos/Entity.proto create mode 100644 all protos/EntityKey.proto create mode 100644 all protos/Feature.proto create mode 100644 all protos/FeatureService.proto create mode 100644 all protos/FeatureTable.proto create mode 100644 all protos/FeatureView.proto create mode 100644 all protos/FeatureViewProjection.proto create mode 100644 all protos/Field.proto create mode 100644 all protos/HealthService.proto create mode 100644 all protos/InfraObject.proto create mode 100644 all protos/OnDemandFeatureView.proto create mode 100644 all protos/Redis.proto create mode 100644 all protos/Registry.proto create mode 100644 all protos/RequestFeatureView.proto create mode 100644 all protos/SavedDataset.proto create mode 100644 all protos/ServingService.proto create mode 100644 all protos/SqliteTable.proto create mode 100644 all protos/Store.proto create mode 100644 all protos/StreamFeatureView.proto create mode 100644 all protos/TransformationService.proto create mode 100644 all protos/ValidationProfile.proto create mode 100644 all protos/Value.proto create mode 100644 proto/serving/ServingAPIProto.java diff --git a/all protos/Aggregation.proto b/all protos/Aggregation.proto new file mode 100644 index 00000000000..d2d6cab7021 --- /dev/null +++ b/all protos/Aggregation.proto @@ -0,0 +1,15 @@ +syntax = "proto3"; +package feast.core; + +option go_package = "github.com/feast-dev/feast/go/protos/feast/core"; +option java_outer_classname = "AggregationProto"; +option java_package = "feast.proto.core"; + +import "google/protobuf/duration.proto"; + +message Aggregation { + string column = 1; + string function = 2; + google.protobuf.Duration time_window = 3; + google.protobuf.Duration slide_interval = 4; +} \ No newline at end of file diff --git a/all protos/Connector.proto b/all protos/Connector.proto new file mode 100644 index 00000000000..4e4ec51774d --- /dev/null +++ b/all protos/Connector.proto @@ -0,0 +1,34 @@ +syntax = "proto3"; + +package grpc.connector; + +import "google/protobuf/timestamp.proto"; +import "feast/types/Value.proto"; +import "feast/types/EntityKey.proto"; +import "feast/serving/ServingService.proto"; + +option go_package = "github.com/feast-dev/feast/go/protos/feast/serving"; + +message ConnectorFeature { + feast.serving.FeatureReferenceV2 reference = 1; + google.protobuf.Timestamp timestamp = 2; + feast.types.Value value = 3; +} + +message ConnectorFeatureList { + repeated ConnectorFeature featureList = 1; +} + +service OnlineStore { + rpc OnlineRead(OnlineReadRequest) returns (OnlineReadResponse); +} + +message OnlineReadRequest { + repeated feast.types.EntityKey entityKeys = 1; + string view = 2; + repeated string features = 3; +} + +message OnlineReadResponse { + repeated ConnectorFeatureList results = 1; +} \ No newline at end of file diff --git a/all protos/DataFormat.proto b/all protos/DataFormat.proto new file mode 100644 index 00000000000..c453e5e4c83 --- /dev/null +++ b/all protos/DataFormat.proto @@ -0,0 +1,61 @@ +// +// 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/go/protos/feast/core"; +option java_outer_classname = "DataFormatProto"; +option java_package = "feast.proto.core"; + +// Defines the file format encoding the features/entity data in files +message FileFormat { + // Defines options for the Parquet data format + message ParquetFormat {} + + oneof format { + ParquetFormat parquet_format = 1; + } +} + +// Defines the data format encoding features/entity data in data streams +message StreamFormat { + // Defines options for the protobuf data format + message ProtoFormat { + // Classpath to the generated Java Protobuf class that can be used to decode + // Feature data from the obtained stream message + string class_path = 1; + } + + // Defines options for the avro data format + message AvroFormat { + // Optional if used in a File DataSource as schema is embedded in avro file. + // Specifies the schema of the Avro message as JSON string. + string schema_json = 1; + } + + message JsonFormat { + string schema_json = 1; + } + + // Specifies the data format and format specific options + oneof format { + AvroFormat avro_format = 1; + ProtoFormat proto_format = 2; + JsonFormat json_format = 3; + } +} diff --git a/all protos/DataSource.proto b/all protos/DataSource.proto new file mode 100644 index 00000000000..3992d2c247d --- /dev/null +++ b/all protos/DataSource.proto @@ -0,0 +1,271 @@ +// +// 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/go/protos/feast/core"; +option java_outer_classname = "DataSourceProto"; +option java_package = "feast.proto.core"; + +import "google/protobuf/duration.proto"; +import "google/protobuf/timestamp.proto"; +import "feast/core/DataFormat.proto"; +import "feast/types/Value.proto"; +import "feast/core/Feature.proto"; + +// Defines a Data Source that can be used source Feature data +// Next available id: 28 +message DataSource { + // Field indexes should *not* be reused. Not sure if fields 6-10 were used previously or not, + // but they are going to be reserved for backwards compatibility. + reserved 6 to 10; + + // Type of Data Source. + // Next available id: 12 + enum SourceType { + INVALID = 0; + BATCH_FILE = 1; + BATCH_SNOWFLAKE = 8; + BATCH_BIGQUERY = 2; + BATCH_REDSHIFT = 5; + STREAM_KAFKA = 3; + STREAM_KINESIS = 4; + CUSTOM_SOURCE = 6; + REQUEST_SOURCE = 7; + PUSH_SOURCE = 9; + BATCH_TRINO = 10; + BATCH_SPARK = 11; + BATCH_ATHENA = 12; + } + + // Unique name of data source within the project + string name = 20; + + // Name of Feast project that this data source belongs to. + string project = 21; + + string description = 23; + + map tags = 24; + + string owner = 25; + + SourceType type = 1; + + // Defines mapping between fields in the sourced data + // and fields in parent FeatureTable. + map field_mapping = 2; + + // Must specify event timestamp column name + string timestamp_field = 3; + + // (Optional) Specify partition column + // useful for file sources + string date_partition_column = 4; + + // Must specify creation timestamp column name + string created_timestamp_column = 5; + + // This is an internal field that is represents the python class for the data source object a proto object represents. + // This should be set by feast, and not by users. + // The field is used primarily by custom data sources and is mandatory for them to set. Feast may set it for + // first party sources as well. + string data_source_class_type = 17; + + // Optional batch source for streaming sources for historical features and materialization. + DataSource batch_source = 26; + + SourceMeta meta = 50; + + message SourceMeta { + google.protobuf.Timestamp earliestEventTimestamp = 1; + google.protobuf.Timestamp latestEventTimestamp = 2; + } + + // Defines options for DataSource that sources features from a file + message FileOptions { + FileFormat file_format = 1; + + // Target URL of file to retrieve and source features from. + // s3://path/to/file for AWS S3 storage + // gs://path/to/file for GCP GCS storage + // file:///path/to/file for local storage + string uri = 2; + + // override AWS S3 storage endpoint with custom S3 endpoint + string s3_endpoint_override = 3; + } + + // Defines options for DataSource that sources features from a BigQuery Query + message BigQueryOptions { + // Full table reference in the form of [project:dataset.table] + string table = 1; + + // SQL query that returns a table containing feature data. Must contain an event_timestamp column, and respective + // entity columns + string query = 2; + } + + // Defines options for DataSource that sources features from a Trino Query + message TrinoOptions { + // Full table reference in the form of [project:dataset.table] + string table = 1; + + // SQL query that returns a table containing feature data. Must contain an event_timestamp column, and respective + // entity columns + string query = 2; + } + + // Defines options for DataSource that sources features from Kafka messages. + // Each message should be a Protobuf that can be decoded with the generated + // Java Protobuf class at the given class path + message KafkaOptions { + // Comma separated list of Kafka bootstrap servers. Used for feature tables without a defined source host[:port]] + string kafka_bootstrap_servers = 1; + + // Kafka topic to collect feature data from. + string topic = 2; + + // Defines the stream data format encoding feature/entity data in Kafka messages. + StreamFormat message_format = 3; + + // Watermark delay threshold for stream data + google.protobuf.Duration watermark_delay_threshold = 4; + } + + // Defines options for DataSource that sources features from Kinesis records. + // Each record should be a Protobuf that can be decoded with the generated + // Java Protobuf class at the given class path + message KinesisOptions { + // AWS region of the Kinesis stream + string region = 1; + + // Name of the Kinesis stream to obtain feature data from. + string stream_name = 2; + + // Defines the data format encoding the feature/entity data in Kinesis records. + // Kinesis Data Sources support Avro and Proto as data formats. + StreamFormat record_format = 3; + } + + // Defines options for DataSource that sources features from a Redshift Query + message RedshiftOptions { + // Redshift table name + string table = 1; + + // SQL query that returns a table containing feature data. Must contain an event_timestamp column, and respective + // entity columns + string query = 2; + + // Redshift schema name + string schema = 3; + + // Redshift database name + string database = 4; + } + + // Defines options for DataSource that sources features from a Athena Query + message AthenaOptions { + // Athena table name + string table = 1; + + // SQL query that returns a table containing feature data. Must contain an event_timestamp column, and respective + // entity columns + string query = 2; + + // Athena database name + string database = 3; + + // Athena schema name + string data_source = 4; + } + + // Defines options for DataSource that sources features from a Snowflake Query + message SnowflakeOptions { + // Snowflake table name + string table = 1; + + // SQL query that returns a table containing feature data. Must contain an event_timestamp column, and respective + // entity columns + string query = 2; + + // Snowflake schema name + string schema = 3; + + // Snowflake schema name + string database = 4; + + // Snowflake warehouse name + string warehouse = 5; + } + + // Defines options for DataSource that sources features from a spark table/query + message SparkOptions { + // Table name + string table = 1; + + // Spark SQl query that returns the table, this is an alternative to `table` + string query = 2; + + // Path from which spark can read the table, this is an alternative to `table` + string path = 3; + + // Format of files at `path` (e.g. parquet, avro, etc) + string file_format = 4; + } + + // Defines configuration for custom third-party data sources. + message CustomSourceOptions { + // Serialized configuration information for the data source. The implementer of the custom data source is + // responsible for serializing and deserializing data from bytes + bytes configuration = 1; + } + + // Defines options for DataSource that sources features from request data + message RequestDataOptions { + reserved 1; + // Mapping of feature name to type + map deprecated_schema = 2; + + repeated FeatureSpecV2 schema = 3; + + } + + // Defines options for DataSource that supports pushing data to it. This allows data to be pushed to + // the online store on-demand, such as by stream consumers. + message PushOptions { + reserved 1; + } + + + // DataSource options. + oneof options { + FileOptions file_options = 11; + BigQueryOptions bigquery_options = 12; + KafkaOptions kafka_options = 13; + KinesisOptions kinesis_options = 14; + RedshiftOptions redshift_options = 15; + RequestDataOptions request_data_options = 18; + CustomSourceOptions custom_options = 16; + SnowflakeOptions snowflake_options = 19; + PushOptions push_options = 22; + SparkOptions spark_options = 27; + TrinoOptions trino_options = 30; + AthenaOptions athena_options = 35; + } +} diff --git a/all protos/DatastoreTable.proto b/all protos/DatastoreTable.proto new file mode 100644 index 00000000000..4246a6ae6e7 --- /dev/null +++ b/all protos/DatastoreTable.proto @@ -0,0 +1,39 @@ +// +// * Copyright 2021 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 = "DatastoreTableProto"; +option go_package = "github.com/feast-dev/feast/go/protos/feast/core"; + +import "google/protobuf/wrappers.proto"; + +// Represents a Datastore table +message DatastoreTable { + // Feast project of the table + string project = 1; + + // Name of the table + string name = 2; + + // GCP project id + google.protobuf.StringValue project_id = 3; + + // Datastore namespace + google.protobuf.StringValue namespace = 4; +} \ No newline at end of file diff --git a/all protos/DynamoDBTable.proto b/all protos/DynamoDBTable.proto new file mode 100644 index 00000000000..4e5c8714e84 --- /dev/null +++ b/all protos/DynamoDBTable.proto @@ -0,0 +1,31 @@ +// +// * Copyright 2021 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 = "DynamoDBTableProto"; +option go_package = "github.com/feast-dev/feast/go/protos/feast/core"; + +// Represents a DynamoDB table +message DynamoDBTable { + // Name of the table + string name = 1; + + // Region of the table + string region = 2; +} \ No newline at end of file diff --git a/all protos/Entity.proto b/all protos/Entity.proto new file mode 100644 index 00000000000..d8d8bedc5eb --- /dev/null +++ b/all protos/Entity.proto @@ -0,0 +1,60 @@ +// +// * 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 java_package = "feast.proto.core"; +option java_outer_classname = "EntityProto"; +option go_package = "github.com/feast-dev/feast/go/protos/feast/core"; + +import "feast/types/Value.proto"; +import "google/protobuf/timestamp.proto"; + +message Entity { + // User-specified specifications of this entity. + EntitySpecV2 spec = 1; + // System-populated metadata for this entity. + EntityMeta meta = 2; +} + +message EntitySpecV2 { + // Name of the entity. + string name = 1; + + // Name of Feast project that this feature table belongs to. + string project = 9; + + // Type of the entity. + feast.types.ValueType.Enum value_type = 2; + + // Description of the entity. + string description = 3; + + // Join key for the entity (i.e. name of the column the entity maps to). + string join_key = 4; + + // User defined metadata + map tags = 8; + + // Owner of the entity. + string owner = 10; +} + +message EntityMeta { + google.protobuf.Timestamp created_timestamp = 1; + google.protobuf.Timestamp last_updated_timestamp = 2; +} diff --git a/all protos/EntityKey.proto b/all protos/EntityKey.proto new file mode 100644 index 00000000000..d7eebf25d03 --- /dev/null +++ b/all protos/EntityKey.proto @@ -0,0 +1,30 @@ +/* + * 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 "feast/types/Value.proto"; + +package feast.types; + +option java_package = "feast.proto.types"; +option java_outer_classname = "EntityKeyProto"; +option go_package = "github.com/feast-dev/feast/go/protos/feast/types"; + +message EntityKey { + repeated string join_keys = 1; + repeated feast.types.Value entity_values = 2; +} diff --git a/all protos/Feature.proto b/all protos/Feature.proto new file mode 100644 index 00000000000..f6826bef810 --- /dev/null +++ b/all protos/Feature.proto @@ -0,0 +1,36 @@ +// +// 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/go/protos/feast/core"; +option java_outer_classname = "FeatureProto"; +option java_package = "feast.proto.core"; + +import "feast/types/Value.proto"; + +message FeatureSpecV2 { + // Name of the feature. Not updatable. + string name = 1; + + // Value type of the feature. Not updatable. + feast.types.ValueType.Enum value_type = 2; + + // Tags for user defined metadata on a feature + map tags = 3; +} diff --git a/all protos/FeatureService.proto b/all protos/FeatureService.proto new file mode 100644 index 00000000000..80d32eb4dec --- /dev/null +++ b/all protos/FeatureService.proto @@ -0,0 +1,98 @@ +syntax = "proto3"; +package feast.core; + +option go_package = "github.com/feast-dev/feast/go/protos/feast/core"; +option java_outer_classname = "FeatureServiceProto"; +option java_package = "feast.proto.core"; + +import "google/protobuf/timestamp.proto"; +import "feast/core/FeatureViewProjection.proto"; + +message FeatureService { + // User-specified specifications of this feature service. + FeatureServiceSpec spec = 1; + + // System-populated metadata for this feature service. + FeatureServiceMeta meta = 2; +} + +message FeatureServiceSpec { + // Name of the Feature Service. Must be unique. Not updated. + string name = 1; + + // Name of Feast project that this Feature Service belongs to. + string project = 2; + + // Represents a projection that's to be applied on top of the FeatureView. + // Contains data such as the features to use from a FeatureView. + repeated FeatureViewProjection features = 3; + + // User defined metadata + map tags = 4; + + // Description of the feature service. + string description = 5; + + // Owner of the feature service. + string owner = 6; + + // (optional) if provided logging will be enabled for this feature service. + LoggingConfig logging_config = 7; +} + + +message FeatureServiceMeta { + // Time where this Feature Service is created + google.protobuf.Timestamp created_timestamp = 1; + + // Time where this Feature Service is last updated + google.protobuf.Timestamp last_updated_timestamp = 2; + +} + + +message LoggingConfig { + float sample_rate = 1; + + oneof destination { + FileDestination file_destination = 3; + BigQueryDestination bigquery_destination = 4; + RedshiftDestination redshift_destination = 5; + SnowflakeDestination snowflake_destination = 6; + CustomDestination custom_destination = 7; + AthenaDestination athena_destination = 8; + } + + message FileDestination { + string path = 1; + string s3_endpoint_override = 2; + + // column names to use for partitioning + repeated string partition_by = 3; + } + + message BigQueryDestination { + // Full table reference in the form of [project:dataset.table] + string table_ref = 1; + } + + message RedshiftDestination { + // Destination table name. ClusterId and database will be taken from an offline store config + string table_name = 1; + } + + message AthenaDestination { + // Destination table name. data_source and database will be taken from an offline store config + string table_name = 1; + } + + message SnowflakeDestination { + // Destination table name. Schema and database will be taken from an offline store config + string table_name = 1; + } + + message CustomDestination { + string kind = 1; + map config = 2; + } +} diff --git a/all protos/FeatureTable.proto b/all protos/FeatureTable.proto new file mode 100644 index 00000000000..4054db58aed --- /dev/null +++ b/all protos/FeatureTable.proto @@ -0,0 +1,86 @@ +// +// 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/go/protos/feast/core"; +option java_outer_classname = "FeatureTableProto"; +option java_package = "feast.proto.core"; + +import "google/protobuf/duration.proto"; +import "google/protobuf/timestamp.proto"; +import "feast/core/DataSource.proto"; +import "feast/core/Feature.proto"; + +message FeatureTable { + // User-specified specifications of this feature table. + FeatureTableSpec spec = 1; + + // System-populated metadata for this feature table. + FeatureTableMeta meta = 2; +} + +message FeatureTableSpec { + // Name of the feature table. Must be unique. Not updated. + string name = 1; + + // Name of Feast project that this feature table belongs to. + string project = 9; + + // List names of entities to associate with the Features defined in this + // Feature Table. Not updatable. + repeated string entities = 3; + + // List of features specifications for each feature defined with this feature table. + repeated FeatureSpecV2 features = 4; + + // User defined metadata + map labels = 5; + + // Features in this feature table can only be retrieved from online serving + // younger than max age. Age is measured as the duration of time between + // the feature's event timestamp and when the feature is retrieved + // Feature values outside max age will be returned as unset values and indicated to end user + google.protobuf.Duration max_age = 6; + + // Batch/Offline DataSource to source batch/offline feature data. + // Only batch DataSource can be specified + // (ie source type should start with 'BATCH_') + DataSource batch_source = 7; + + // Stream/Online DataSource to source stream/online feature data. + // Only stream DataSource can be specified + // (ie source type should start with 'STREAM_') + DataSource stream_source = 8; +} + +message FeatureTableMeta { + // Time where this Feature Table is created + google.protobuf.Timestamp created_timestamp = 1; + + // Time where this Feature Table is last updated + google.protobuf.Timestamp last_updated_timestamp = 2; + + // Auto incrementing revision no. of this Feature Table + int64 revision = 3; + + // Hash entities, features, batch_source and stream_source to inform JobService if + // jobs should be restarted should hash change + string hash = 4; +} diff --git a/all protos/FeatureView.proto b/all protos/FeatureView.proto new file mode 100644 index 00000000000..c9e38bf3448 --- /dev/null +++ b/all protos/FeatureView.proto @@ -0,0 +1,94 @@ +// +// 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/go/protos/feast/core"; +option java_outer_classname = "FeatureViewProto"; +option java_package = "feast.proto.core"; + +import "google/protobuf/duration.proto"; +import "google/protobuf/timestamp.proto"; +import "feast/core/DataSource.proto"; +import "feast/core/Feature.proto"; + +message FeatureView { + // User-specified specifications of this feature view. + FeatureViewSpec spec = 1; + + // System-populated metadata for this feature view. + FeatureViewMeta meta = 2; +} + +// Next available id: 13 +// TODO(adchia): refactor common fields from this and ODFV into separate metadata proto +message FeatureViewSpec { + // Name of the feature view. Must be unique. Not updated. + string name = 1; + + // Name of Feast project that this feature view belongs to. + string project = 2; + + // List of names of entities associated with this feature view. + repeated string entities = 3; + + // List of specifications for each feature defined as part of this feature view. + repeated FeatureSpecV2 features = 4; + + // List of specifications for each entity defined as part of this feature view. + repeated FeatureSpecV2 entity_columns = 12; + + // Description of the feature view. + string description = 10; + + // User defined metadata + map tags = 5; + + // Owner of the feature view. + string owner = 11; + + // Features in this feature view can only be retrieved from online serving + // younger than ttl. Ttl is measured as the duration of time between + // the feature's event timestamp and when the feature is retrieved + // Feature values outside ttl will be returned as unset values and indicated to end user + google.protobuf.Duration ttl = 6; + + // Batch/Offline DataSource where this view can retrieve offline feature data. + DataSource batch_source = 7; + // Streaming DataSource from where this view can consume "online" feature data. + DataSource stream_source = 9; + + // Whether these features should be served online or not + bool online = 8; +} + +message FeatureViewMeta { + // Time where this Feature View is created + google.protobuf.Timestamp created_timestamp = 1; + + // Time where this Feature View is last updated + google.protobuf.Timestamp last_updated_timestamp = 2; + + // List of pairs (start_time, end_time) for which this feature view has been materialized. + repeated MaterializationInterval materialization_intervals = 3; +} + +message MaterializationInterval { + google.protobuf.Timestamp start_time = 1; + google.protobuf.Timestamp end_time = 2; +} diff --git a/all protos/FeatureViewProjection.proto b/all protos/FeatureViewProjection.proto new file mode 100644 index 00000000000..36d17632e7d --- /dev/null +++ b/all protos/FeatureViewProjection.proto @@ -0,0 +1,25 @@ +syntax = "proto3"; +package feast.core; + +option go_package = "github.com/feast-dev/feast/go/protos/feast/core"; +option java_outer_classname = "FeatureReferenceProto"; +option java_package = "feast.proto.core"; + +import "feast/core/Feature.proto"; + + +// A projection to be applied on top of a FeatureView. +// Contains the modifications to a FeatureView such as the features subset to use. +message FeatureViewProjection { + // The feature view name + string feature_view_name = 1; + + // Alias for feature view name + string feature_view_name_alias = 3; + + // The features of the feature view that are a part of the feature reference. + repeated FeatureSpecV2 feature_columns = 2; + + // Map for entity join_key overrides of feature data entity join_key to entity data join_key + map join_key_map = 4; +} diff --git a/all protos/Field.proto b/all protos/Field.proto new file mode 100644 index 00000000000..8349263cc60 --- /dev/null +++ b/all protos/Field.proto @@ -0,0 +1,30 @@ +/* + * 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 "feast/types/Value.proto"; + +package feast.types; + +option java_package = "feast.proto.types"; +option java_outer_classname = "FieldProto"; +option go_package = "github.com/feast-dev/feast/go/protos/feast/types"; + +message Field { + string name = 1; + feast.types.ValueType.Enum value = 2; +} diff --git a/all protos/HealthService.proto b/all protos/HealthService.proto new file mode 100644 index 00000000000..342db35d4c3 --- /dev/null +++ b/all protos/HealthService.proto @@ -0,0 +1,24 @@ +syntax = "proto3"; + +package grpc.health.v1; + +option java_package = "io.grpc.health.v1"; +option java_outer_classname = "HealthProto"; + +message HealthCheckRequest { + string service = 1; +} + +enum ServingStatus { + UNKNOWN = 0; + SERVING = 1; + NOT_SERVING = 2; +} + +message HealthCheckResponse { + ServingStatus status = 1; +} + +service Health { + rpc Check(HealthCheckRequest) returns (HealthCheckResponse); +} \ No newline at end of file diff --git a/all protos/InfraObject.proto b/all protos/InfraObject.proto new file mode 100644 index 00000000000..35204015173 --- /dev/null +++ b/all protos/InfraObject.proto @@ -0,0 +1,51 @@ +// +// * Copyright 2021 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 = "InfraObjectProto"; +option go_package = "github.com/feast-dev/feast/go/protos/feast/core"; + +import "feast/core/DatastoreTable.proto"; +import "feast/core/DynamoDBTable.proto"; +import "feast/core/SqliteTable.proto"; + +// Represents a set of infrastructure objects managed by Feast +message Infra { + // List of infrastructure objects managed by Feast + repeated InfraObject infra_objects = 1; +} + +// Represents a single infrastructure object managed by Feast +message InfraObject { + // Represents the Python class for the infrastructure object + string infra_object_class_type = 1; + + // The infrastructure object + oneof infra_object { + DynamoDBTable dynamodb_table = 2; + DatastoreTable datastore_table = 3; + SqliteTable sqlite_table = 4; + CustomInfra custom_infra = 100; + } + + // Allows for custom infra objects to be added + message CustomInfra { + bytes field = 1; + } +} \ No newline at end of file diff --git a/all protos/OnDemandFeatureView.proto b/all protos/OnDemandFeatureView.proto new file mode 100644 index 00000000000..50bf8b6f557 --- /dev/null +++ b/all protos/OnDemandFeatureView.proto @@ -0,0 +1,89 @@ +// +// 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/go/protos/feast/core"; +option java_outer_classname = "OnDemandFeatureViewProto"; +option java_package = "feast.proto.core"; + +import "google/protobuf/timestamp.proto"; +import "feast/core/FeatureView.proto"; +import "feast/core/FeatureViewProjection.proto"; +import "feast/core/Feature.proto"; +import "feast/core/DataSource.proto"; + +message OnDemandFeatureView { + // User-specified specifications of this feature view. + OnDemandFeatureViewSpec spec = 1; + OnDemandFeatureViewMeta meta = 2; +} + +// Next available id: 9 +message OnDemandFeatureViewSpec { + // Name of the feature view. Must be unique. Not updated. + string name = 1; + + // Name of Feast project that this feature view belongs to. + string project = 2; + + // List of features specifications for each feature defined with this feature view. + repeated FeatureSpecV2 features = 3; + + // Map of sources for this feature view. + map sources = 4; + + UserDefinedFunction user_defined_function = 5; + + // Description of the on demand feature view. + string description = 6; + + // User defined metadata. + map tags = 7; + + // Owner of the on demand feature view. + string owner = 8; +} + +message OnDemandFeatureViewMeta { + // Time where this Feature View is created + google.protobuf.Timestamp created_timestamp = 1; + + // Time where this Feature View is last updated + google.protobuf.Timestamp last_updated_timestamp = 2; +} + +message OnDemandSource { + oneof source { + FeatureView feature_view = 1; + FeatureViewProjection feature_view_projection = 3; + DataSource request_data_source = 2; + } +} + +// Serialized representation of python function. +message UserDefinedFunction { + // The function name + string name = 1; + + // The python-syntax function body (serialized by dill) + bytes body = 2; + + // The string representation of the udf + string body_text = 3; +} diff --git a/all protos/Redis.proto b/all protos/Redis.proto new file mode 100644 index 00000000000..c89e0b6b2fa --- /dev/null +++ b/all protos/Redis.proto @@ -0,0 +1,33 @@ +/* + * 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"; + +import "feast/types/Value.proto"; + +package feast.storage; + +option java_outer_classname = "RedisProto"; +option java_package = "feast.proto.storage"; +option go_package = "github.com/feast-dev/feast/go/protos/feast/storage"; + +message RedisKeyV2 { + string project = 1; + + repeated string entity_names = 2; + + repeated feast.types.Value entity_values = 3; +} diff --git a/all protos/Registry.proto b/all protos/Registry.proto new file mode 100644 index 00000000000..7d80d8c837f --- /dev/null +++ b/all protos/Registry.proto @@ -0,0 +1,61 @@ +// +// * 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 java_package = "feast.proto.core"; +option java_outer_classname = "RegistryProto"; +option go_package = "github.com/feast-dev/feast/go/protos/feast/core"; + +import "feast/core/Entity.proto"; +import "feast/core/FeatureService.proto"; +import "feast/core/FeatureTable.proto"; +import "feast/core/FeatureView.proto"; +import "feast/core/InfraObject.proto"; +import "feast/core/OnDemandFeatureView.proto"; +import "feast/core/RequestFeatureView.proto"; +import "feast/core/StreamFeatureView.proto"; +import "feast/core/DataSource.proto"; +import "feast/core/SavedDataset.proto"; +import "feast/core/ValidationProfile.proto"; +import "google/protobuf/timestamp.proto"; + +// Next id: 16 +message Registry { + repeated Entity entities = 1; + repeated FeatureTable feature_tables = 2; + repeated FeatureView feature_views = 6; + repeated DataSource data_sources = 12; + repeated OnDemandFeatureView on_demand_feature_views = 8; + repeated RequestFeatureView request_feature_views = 9; + repeated StreamFeatureView stream_feature_views = 14; + repeated FeatureService feature_services = 7; + repeated SavedDataset saved_datasets = 11; + repeated ValidationReference validation_references = 13; + Infra infra = 10; + // Tracking metadata of Feast by project + repeated ProjectMetadata project_metadata = 15; + + string registry_schema_version = 3; // to support migrations; incremented when schema is changed + string version_id = 4; // version id, random string generated on each update of the data; now used only for debugging purposes + google.protobuf.Timestamp last_updated = 5; +} + +message ProjectMetadata { + string project = 1; + string project_uuid = 2; +} diff --git a/all protos/RequestFeatureView.proto b/all protos/RequestFeatureView.proto new file mode 100644 index 00000000000..4049053c2be --- /dev/null +++ b/all protos/RequestFeatureView.proto @@ -0,0 +1,51 @@ +// +// Copyright 2021 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/go/protos/feast/core"; +option java_outer_classname = "RequestFeatureViewProto"; +option java_package = "feast.proto.core"; + +import "feast/core/DataSource.proto"; + +message RequestFeatureView { + // User-specified specifications of this feature view. + RequestFeatureViewSpec spec = 1; +} + +// Next available id: 7 +message RequestFeatureViewSpec { + // Name of the feature view. Must be unique. Not updated. + string name = 1; + + // Name of Feast project that this feature view belongs to. + string project = 2; + + // Request data which contains the underlying data schema and list of associated features + DataSource request_data_source = 3; + + // Description of the request feature view. + string description = 4; + + // User defined metadata. + map tags = 5; + + // Owner of the request feature view. + string owner = 6; +} diff --git a/all protos/SavedDataset.proto b/all protos/SavedDataset.proto new file mode 100644 index 00000000000..111548aa480 --- /dev/null +++ b/all protos/SavedDataset.proto @@ -0,0 +1,83 @@ +// +// Copyright 2021 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 = "SavedDatasetProto"; +option go_package = "github.com/feast-dev/feast/go/protos/feast/core"; + +import "google/protobuf/timestamp.proto"; +import "feast/core/DataSource.proto"; + +message SavedDatasetSpec { + // Name of the dataset. Must be unique since it's possible to overwrite dataset by name + string name = 1; + + // Name of Feast project that this Dataset belongs to. + string project = 2; + + // list of feature references with format ":" + repeated string features = 3; + + // entity columns + request columns from all feature views used during retrieval + repeated string join_keys = 4; + + // Whether full feature names are used in stored data + bool full_feature_names = 5; + + SavedDatasetStorage storage = 6; + + // Optional and only populated if generated from a feature service fetch + string feature_service_name = 8; + + // User defined metadata + map tags = 7; +} + +message SavedDatasetStorage { + oneof kind { + DataSource.FileOptions file_storage = 4; + DataSource.BigQueryOptions bigquery_storage = 5; + DataSource.RedshiftOptions redshift_storage = 6; + DataSource.SnowflakeOptions snowflake_storage = 7; + DataSource.TrinoOptions trino_storage = 8; + DataSource.SparkOptions spark_storage = 9; + DataSource.CustomSourceOptions custom_storage = 10; + DataSource.AthenaOptions athena_storage = 11; + } +} + +message SavedDatasetMeta { + // Time when this saved dataset is created + google.protobuf.Timestamp created_timestamp = 1; + + // Time when this saved dataset is last updated + google.protobuf.Timestamp last_updated_timestamp = 2; + + // Min timestamp in the dataset (needed for retrieval) + google.protobuf.Timestamp min_event_timestamp = 3; + + // Max timestamp in the dataset (needed for retrieval) + google.protobuf.Timestamp max_event_timestamp = 4; +} + +message SavedDataset { + SavedDatasetSpec spec = 1; + SavedDatasetMeta meta = 2; +} diff --git a/all protos/ServingService.proto b/all protos/ServingService.proto new file mode 100644 index 00000000000..a940b725025 --- /dev/null +++ b/all protos/ServingService.proto @@ -0,0 +1,133 @@ +/* + * 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"; + +package feast.serving; + +import "google/protobuf/timestamp.proto"; +import "feast/types/Value.proto"; + +option java_package = "feast.proto.serving"; +option java_outer_classname = "ServingAPIProto"; +option go_package = "github.com/feast-dev/feast/go/protos/feast/serving"; + +service ServingService { + // Get information about this Feast serving. + rpc GetFeastServingInfo (GetFeastServingInfoRequest) returns (GetFeastServingInfoResponse); + // Get online features synchronously. + rpc GetOnlineFeatures (GetOnlineFeaturesRequest) returns (GetOnlineFeaturesResponse); +} + +message GetFeastServingInfoRequest {} + +message GetFeastServingInfoResponse { + // Feast version of this serving deployment. + string version = 1; +} + +message FeatureReferenceV2 { + // Name of the Feature View to retrieve the feature from. + string feature_view_name = 1; + + // Name of the Feature to retrieve the feature from. + string feature_name = 2; +} + +// ToDo (oleksii): remove this message (since it's not used) and move EntityRow on package level +message GetOnlineFeaturesRequestV2 { + // List of features that are being retrieved + repeated FeatureReferenceV2 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; + + // 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 timestamp = 1; + + // Map containing mapping of entity name to entity value. + map fields = 2; + } +} + +// In JSON "val" field can be omitted +message FeatureList { + repeated string val = 1; +} + +message GetOnlineFeaturesRequest { + oneof kind { + string feature_service = 1; + FeatureList features = 2; + } + // The entity data is specified in a columnar format + // A map of entity name -> list of values + map entities = 3; + bool full_feature_names = 4; + + // Context for OnDemand Feature Transformation + // (was moved to dedicated parameter to avoid unnecessary separation logic on serving side) + // A map of variable name -> list of values + map request_context = 5; +} + +message GetOnlineFeaturesResponse { + GetOnlineFeaturesResponseMetadata metadata = 1; + + // Length of "results" array should match length of requested features. + // We also preserve the same order of features here as in metadata.feature_names + repeated FeatureVector results = 2; + + message FeatureVector { + repeated feast.types.Value values = 1; + repeated FieldStatus statuses = 2; + repeated google.protobuf.Timestamp event_timestamps = 3; + } +} + +message GetOnlineFeaturesResponseMetadata { + FeatureList feature_names = 1; +} + +enum FieldStatus { + // Status is unset for this field. + INVALID = 0; + + // Field value is present for this field and age is within max age. + PRESENT = 1; + + // Values could be found for entity key and age is within max age, but + // this field value is assigned a value on ingestion into feast. + NULL_VALUE = 2; + + // Entity key did not return any values as they do not exist in Feast. + // This could suggest that the feature values have not yet been ingested + // into feast or the ingestion failed. + NOT_FOUND = 3; + + // Values could be found for entity key, but field values are outside the maximum + // allowable range. + OUTSIDE_MAX_AGE = 4; +} diff --git a/all protos/SqliteTable.proto b/all protos/SqliteTable.proto new file mode 100644 index 00000000000..8665be840ae --- /dev/null +++ b/all protos/SqliteTable.proto @@ -0,0 +1,31 @@ +// +// * Copyright 2021 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 = "SqliteTableProto"; +option go_package = "github.com/feast-dev/feast/go/protos/feast/core"; + +// Represents a Sqlite table +message SqliteTable { + // Absolute path of the table + string path = 1; + + // Name of the table + string name = 2; +} \ No newline at end of file diff --git a/all protos/Store.proto b/all protos/Store.proto new file mode 100644 index 00000000000..c92a526354d --- /dev/null +++ b/all protos/Store.proto @@ -0,0 +1,130 @@ +// +// * 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 = "StoreProto"; +option go_package = "github.com/feast-dev/feast/go/protos/feast/core"; + +// Store provides a location where Feast reads and writes feature values. +// Feature values will be written to the Store in the form of FeatureRow elements. +// The way FeatureRow is encoded and decoded when it is written to and read from +// the Store depends on the type of the Store. +// +message Store { + + enum StoreType { + // These positions should not be reused. + reserved 2, 3, 12, 13; + + INVALID = 0; + + // Redis stores a FeatureRow element as a key, value pair. + // + // The Redis data types used (https://redis.io/topics/data-types): + // - key: STRING + // - value: STRING + // + // Encodings: + // - key: byte array of RedisKey (refer to feast.storage.RedisKeyV2) + // - value: Redis hashmap + // + REDIS = 1; + + REDIS_CLUSTER = 4; + } + + message RedisConfig { + string host = 1; + int32 port = 2; + // Optional. The number of milliseconds to wait before retrying failed Redis connection. + // By default, Feast uses exponential backoff policy and "initial_backoff_ms" sets the initial wait duration. + int32 initial_backoff_ms = 3; + // Optional. Maximum total number of retries for connecting to Redis. Default to zero retries. + int32 max_retries = 4; + // Optional. How often flush data to redis + int32 flush_frequency_seconds = 5; + // Optional. Connect over SSL. + bool ssl = 6; + } + + message RedisClusterConfig { + // List of Redis Uri for all the nodes in Redis Cluster, comma separated. Eg. host1:6379, host2:6379 + string connection_string = 1; + int32 initial_backoff_ms = 2; + int32 max_retries = 3; + // Optional. How often flush data to redis + int32 flush_frequency_seconds = 4; + // Optional. Append a prefix to the Redis Key + string key_prefix = 5; + // Optional. Enable fallback to another key prefix if the original key is not present. + // Useful for migrating key prefix without re-ingestion. Disabled by default. + bool enable_fallback = 6; + // Optional. This would be the fallback prefix to use if enable_fallback is true. + string fallback_prefix = 7; + + // Optional. Priority of nodes when reading from cluster + enum ReadFrom { + MASTER = 0; + MASTER_PREFERRED = 1; + REPLICA = 2; + REPLICA_PREFERRED = 3; + } + ReadFrom read_from = 8; + } + + message Subscription { + // 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. + 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 name = 1; + + // All matches with exclude enabled will be filtered out instead of added + bool exclude = 4; + + // Feature set version was removed in v0.5.0. + reserved 2; + } + + // Name of the store. + string name = 1; + + // Type of store. + StoreType type = 2; + + // Feature sets to subscribe to. + repeated Subscription subscriptions = 4; + + // Configuration to connect to the store. Required. + oneof config { + RedisConfig redis_config = 11; + RedisClusterConfig redis_cluster_config = 14; + } +} diff --git a/all protos/StreamFeatureView.proto b/all protos/StreamFeatureView.proto new file mode 100644 index 00000000000..3181bdf3602 --- /dev/null +++ b/all protos/StreamFeatureView.proto @@ -0,0 +1,91 @@ +// +// 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/go/protos/feast/core"; +option java_outer_classname = "StreamFeatureViewProto"; +option java_package = "feast.proto.core"; + + +import "google/protobuf/duration.proto"; +import "feast/core/OnDemandFeatureView.proto"; +import "feast/core/FeatureView.proto"; +import "feast/core/Feature.proto"; +import "feast/core/DataSource.proto"; +import "feast/core/Aggregation.proto"; + +message StreamFeatureView { + // User-specified specifications of this feature view. + StreamFeatureViewSpec spec = 1; + FeatureViewMeta meta = 2; +} + +// Next available id: 17 +message StreamFeatureViewSpec { + // Name of the feature view. Must be unique. Not updated. + string name = 1; + + // Name of Feast project that this feature view belongs to. + string project = 2; + + // List of names of entities associated with this feature view. + repeated string entities = 3; + + // List of specifications for each feature defined as part of this feature view. + repeated FeatureSpecV2 features = 4; + + // List of specifications for each entity defined as part of this feature view. + repeated FeatureSpecV2 entity_columns = 5; + + // Description of the feature view. + string description = 6; + + // User defined metadata + map tags = 7; + + // Owner of the feature view. + string owner = 8; + + // Features in this feature view can only be retrieved from online serving + // younger than ttl. Ttl is measured as the duration of time between + // the feature's event timestamp and when the feature is retrieved + // Feature values outside ttl will be returned as unset values and indicated to end user + google.protobuf.Duration ttl = 9; + + // Batch/Offline DataSource where this view can retrieve offline feature data. + DataSource batch_source = 10; + // Streaming DataSource from where this view can consume "online" feature data. + DataSource stream_source = 11; + + // Whether these features should be served online or not + bool online = 12; + + // Serialized function that is encoded in the streamfeatureview + UserDefinedFunction user_defined_function = 13; + + // Mode of execution + string mode = 14; + + // Aggregation definitions + repeated Aggregation aggregations = 15; + + // Timestamp field for aggregation + string timestamp_field = 16; +} + diff --git a/all protos/TransformationService.proto b/all protos/TransformationService.proto new file mode 100644 index 00000000000..bd1a7917f3c --- /dev/null +++ b/all protos/TransformationService.proto @@ -0,0 +1,67 @@ +/* + * Copyright 2021 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.serving; + +option java_package = "feast.proto.serving"; +option java_outer_classname = "TransformationServiceAPIProto"; +option go_package = "github.com/feast-dev/feast/go/protos/feast/serving"; + +service TransformationService { + rpc GetTransformationServiceInfo (GetTransformationServiceInfoRequest) returns (GetTransformationServiceInfoResponse); + + rpc TransformFeatures (TransformFeaturesRequest) returns (TransformFeaturesResponse); +} + +message ValueType { + oneof value { + // Having a oneOf provides forward compatibility if we need to support compound types + // that are not supported by arrow natively. + bytes arrow_value = 1; + } +} + +message GetTransformationServiceInfoRequest {} + +message GetTransformationServiceInfoResponse { + // Feast version of this transformation service deployment. + string version = 1; + + // Type of transformation service deployment. This is either Python, or custom + TransformationServiceType type = 2; + + string transformation_service_type_details = 3; +} + +message TransformFeaturesRequest { + string on_demand_feature_view_name = 1; + string project = 2; + + ValueType transformation_input = 3; +} + +message TransformFeaturesResponse { + ValueType transformation_output = 3; +} + +enum TransformationServiceType { + TRANSFORMATION_SERVICE_TYPE_INVALID = 0; + TRANSFORMATION_SERVICE_TYPE_PYTHON = 1; + + TRANSFORMATION_SERVICE_TYPE_CUSTOM = 100; +} diff --git a/all protos/ValidationProfile.proto b/all protos/ValidationProfile.proto new file mode 100644 index 00000000000..10027995859 --- /dev/null +++ b/all protos/ValidationProfile.proto @@ -0,0 +1,60 @@ +// +// Copyright 2021 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 = "ValidationProfile"; +option go_package = "github.com/feast-dev/feast/go/protos/feast/core"; + +message GEValidationProfiler { + message UserDefinedProfiler { + // The python-syntax function body (serialized by dill) + bytes body = 1; + } + + UserDefinedProfiler profiler = 1; +} + +message GEValidationProfile { + // JSON-serialized ExpectationSuite object + bytes expectation_suite = 1; +} + +message ValidationReference { + // Unique name of validation reference within the project + string name = 1; + // Name of saved dataset used as reference dataset + string reference_dataset_name = 2; + // Name of Feast project that this object source belongs to + string project = 3; + // Description of the validation reference + string description = 4; + // User defined metadata + map tags = 5; + + // validation profiler + oneof profiler { + GEValidationProfiler ge_profiler = 6; + } + + // (optional) cached validation profile (to avoid constant recalculation) + oneof cached_profile { + GEValidationProfile ge_profile = 7; + } +} diff --git a/all protos/Value.proto b/all protos/Value.proto new file mode 100644 index 00000000000..b273fecfeae --- /dev/null +++ b/all protos/Value.proto @@ -0,0 +1,109 @@ +/* + * 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"; + +package feast.types; + +option java_package = "feast.proto.types"; +option java_outer_classname = "ValueProto"; +option go_package = "github.com/feast-dev/feast/go/protos/feast/types"; + +message ValueType { + enum Enum { + INVALID = 0; + BYTES = 1; + STRING = 2; + INT32 = 3; + INT64 = 4; + DOUBLE = 5; + FLOAT = 6; + BOOL = 7; + UNIX_TIMESTAMP = 8; + BYTES_LIST = 11; + STRING_LIST = 12; + INT32_LIST = 13; + INT64_LIST = 14; + DOUBLE_LIST = 15; + FLOAT_LIST = 16; + BOOL_LIST = 17; + UNIX_TIMESTAMP_LIST = 18; + NULL = 19; + } +} + +message Value { + // ValueType is referenced by the metadata types, FeatureInfo and EntityInfo. + // The enum values do not have to match the oneof val field ids, but they should. + // In JSON "*_val" field can be omitted + oneof val { + bytes bytes_val = 1; + string string_val = 2; + int32 int32_val = 3; + int64 int64_val = 4; + double double_val = 5; + float float_val = 6; + bool bool_val = 7; + int64 unix_timestamp_val = 8; + BytesList bytes_list_val = 11; + StringList string_list_val = 12; + Int32List int32_list_val = 13; + Int64List int64_list_val = 14; + DoubleList double_list_val = 15; + FloatList float_list_val = 16; + BoolList bool_list_val = 17; + Int64List unix_timestamp_list_val = 18; + Null null_val = 19; + } +} + +enum Null { + NULL = 0; +} + +message BytesList { + repeated bytes val = 1; +} + +message StringList { + repeated string val = 1; +} + +message Int32List { + repeated int32 val = 1; +} + +message Int64List { + repeated int64 val = 1; +} + +message DoubleList { + repeated double val = 1; +} + +message FloatList { + repeated float val = 1; +} + +message BoolList { + repeated bool val = 1; +} + +// This is to avoid an issue of being unable to specify `repeated value` in oneofs or maps +// In JSON "val" field can be omitted +message RepeatedValue { + repeated Value val = 1; +} \ No newline at end of file diff --git a/java/pom.xml b/java/pom.xml index a465e331177..76b82072fc8 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -52,7 +52,7 @@ 0.26.0 - 2.17.1 + 2.19.0 2.9.9 2.0.2 1.18.24 @@ -250,13 +250,6 @@ - - spotless-check - process-test-classes - - check - - diff --git a/java/serving/pom.xml b/java/serving/pom.xml index a04fb48baff..5d27a9881ac 100644 --- a/java/serving/pom.xml +++ b/java/serving/pom.xml @@ -221,6 +221,21 @@ 1.12.261 + + org.apache.logging.log4j + log4j-core + ${log4jVersion} + + + + + org.apache.logging.log4j + log4j-api + ${log4jVersion} + + + + com.adobe.testing s3mock-testcontainers diff --git a/java/serving/src/main/java/feast/serving/service/controller/HealthServiceController.java b/java/serving/src/main/java/feast/serving/service/controller/HealthServiceController.java index 2ce17a57511..156585486d4 100644 --- a/java/serving/src/main/java/feast/serving/service/controller/HealthServiceController.java +++ b/java/serving/src/main/java/feast/serving/service/controller/HealthServiceController.java @@ -19,16 +19,19 @@ import com.google.inject.Inject; import feast.proto.serving.ServingAPIProto.GetFeastServingInfoRequest; import feast.serving.service.ServingServiceV2; +import feast.serving.service.config.ServingServiceV2Module; import io.grpc.health.v1.HealthGrpc.HealthImplBase; import io.grpc.health.v1.HealthProto.HealthCheckRequest; import io.grpc.health.v1.HealthProto.HealthCheckResponse; import io.grpc.health.v1.HealthProto.ServingStatus; import io.grpc.stub.StreamObserver; +import org.slf4j.Logger; // Reference: https://github.com/grpc/grpc/blob/master/doc/health-checking.md public class HealthServiceController extends HealthImplBase { private final ServingServiceV2 servingService; + private static final Logger log = org.slf4j.LoggerFactory.getLogger(HealthServiceController.class); @Inject public HealthServiceController(final ServingServiceV2 servingService) { this.servingService = servingService; @@ -37,12 +40,13 @@ public HealthServiceController(final ServingServiceV2 servingService) { @Override public void check( HealthCheckRequest request, StreamObserver responseObserver) { - // TODO: Implement proper logic to determine if ServingServiceV2 is healthy e.g. + // TODO: Implement proper logicp 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 similarly for batch service. try { + log.info("checking 1244"); servingService.getFeastServingInfo(GetFeastServingInfoRequest.getDefaultInstance()); responseObserver.onNext( HealthCheckResponse.newBuilder().setStatus(ServingStatus.SERVING).build()); diff --git a/java/serving/src/main/resources/application-override.yaml b/java/serving/src/main/resources/application-override.yaml index fe37ffe9c6c..d92c51c015f 100644 --- a/java/serving/src/main/resources/application-override.yaml +++ b/java/serving/src/main/resources/application-override.yaml @@ -7,4 +7,19 @@ feast: type: REDIS config: host: localhost - port: 6379 \ No newline at end of file + port: 6379 +logging: + # Audit logging provides a machine readable structured JSON log that can give better + # insight into what is happening in Feast. + audit: + # Whether audit logging is enabled. + enabled: true + # Whether to enable message level (ie request/response) audit logging + messageLogging: + enabled: false + # Logging forwarder currently provides a machine readable structured JSON log to an + # external fluentd service that can give better insight into what is happening in Feast. + # Accepts console / fluentd as destination + destination: console + fluentdHost: localhost + fluentdPort: 24224 \ No newline at end of file diff --git a/java/serving/src/main/resources/log4j2.xml b/java/serving/src/main/resources/log4j2.xml index c75c2db13cc..bc415f580f4 100644 --- a/java/serving/src/main/resources/log4j2.xml +++ b/java/serving/src/main/resources/log4j2.xml @@ -1,23 +1,9 @@ - - + + + /var/log/blackbuck %d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${hostName} --- [%15.15t] %-40.40c{1.} : %m%n%ex @@ -34,15 +20,36 @@ + + + [%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n + + + + + + + + + + + + + + - + + - + + diff --git a/java/serving/src/main/resources/registry.pb b/java/serving/src/main/resources/registry.pb index f87d51aaa4cdcf507e217942a2b6f5ab5e73fd06..961e3d2ee53d367304597690f80bfc4cd4d362d8 100644 GIT binary patch literal 23063 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 CZ9n?} literal 23163 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 + * Status is unset for this field. + * + * + * INVALID = 0; + */ + INVALID(0), + /** + *
+     * Field value is present for this field and age is within max age.
+     * 
+ * + * PRESENT = 1; + */ + PRESENT(1), + /** + *
+     * Values could be found for entity key and age is within max age, but
+     * this field value is assigned a value on ingestion into feast.
+     * 
+ * + * NULL_VALUE = 2; + */ + NULL_VALUE(2), + /** + *
+     * Entity key did not return any values as they do not exist in Feast.
+     * This could suggest that the feature values have not yet been ingested
+     * into feast or the ingestion failed.
+     * 
+ * + * NOT_FOUND = 3; + */ + NOT_FOUND(3), + /** + *
+     * Values could be found for entity key, but field values are outside the maximum
+     * allowable range.
+     * 
+ * + * OUTSIDE_MAX_AGE = 4; + */ + OUTSIDE_MAX_AGE(4), + UNRECOGNIZED(-1), + ; + + /** + *
+     * Status is unset for this field.
+     * 
+ * + * INVALID = 0; + */ + public static final int INVALID_VALUE = 0; + /** + *
+     * Field value is present for this field and age is within max age.
+     * 
+ * + * PRESENT = 1; + */ + public static final int PRESENT_VALUE = 1; + /** + *
+     * Values could be found for entity key and age is within max age, but
+     * this field value is assigned a value on ingestion into feast.
+     * 
+ * + * NULL_VALUE = 2; + */ + public static final int NULL_VALUE_VALUE = 2; + /** + *
+     * Entity key did not return any values as they do not exist in Feast.
+     * This could suggest that the feature values have not yet been ingested
+     * into feast or the ingestion failed.
+     * 
+ * + * NOT_FOUND = 3; + */ + public static final int NOT_FOUND_VALUE = 3; + /** + *
+     * Values could be found for entity key, but field values are outside the maximum
+     * allowable range.
+     * 
+ * + * OUTSIDE_MAX_AGE = 4; + */ + public static final int OUTSIDE_MAX_AGE_VALUE = 4; + + + public final int getNumber() { + if (this == UNRECOGNIZED) { + throw new java.lang.IllegalArgumentException( + "Can't get the number of an unknown enum value."); + } + return value; + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static FieldStatus valueOf(int value) { + return forNumber(value); + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + */ + public static FieldStatus forNumber(int value) { + switch (value) { + case 0: return INVALID; + case 1: return PRESENT; + case 2: return NULL_VALUE; + case 3: return NOT_FOUND; + case 4: return OUTSIDE_MAX_AGE; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static final com.google.protobuf.Internal.EnumLiteMap< + FieldStatus> internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public FieldStatus findValueByNumber(int number) { + return FieldStatus.forNumber(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + if (this == UNRECOGNIZED) { + throw new java.lang.IllegalStateException( + "Can't get the descriptor of an unrecognized enum value."); + } + return getDescriptor().getValues().get(ordinal()); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return feast.proto.serving.ServingAPIProto.getDescriptor().getEnumTypes().get(0); + } + + private static final FieldStatus[] VALUES = values(); + + public static FieldStatus valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + if (desc.getIndex() == -1) { + return UNRECOGNIZED; + } + return VALUES[desc.getIndex()]; + } + + private final int value; + + private FieldStatus(int value) { + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:feast.serving.FieldStatus) + } + + public interface GetFeastServingInfoRequestOrBuilder extends + // @@protoc_insertion_point(interface_extends:feast.serving.GetFeastServingInfoRequest) + com.google.protobuf.MessageOrBuilder { + } + /** + * Protobuf type {@code feast.serving.GetFeastServingInfoRequest} + */ + public static final class GetFeastServingInfoRequest extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:feast.serving.GetFeastServingInfoRequest) + GetFeastServingInfoRequestOrBuilder { + private static final long serialVersionUID = 0L; + // Use GetFeastServingInfoRequest.newBuilder() to construct. + private GetFeastServingInfoRequest(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private GetFeastServingInfoRequest() { + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new GetFeastServingInfoRequest(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private GetFeastServingInfoRequest( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return feast.proto.serving.ServingAPIProto.internal_static_feast_serving_GetFeastServingInfoRequest_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return feast.proto.serving.ServingAPIProto.internal_static_feast_serving_GetFeastServingInfoRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + feast.proto.serving.ServingAPIProto.GetFeastServingInfoRequest.class, feast.proto.serving.ServingAPIProto.GetFeastServingInfoRequest.Builder.class); + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof feast.proto.serving.ServingAPIProto.GetFeastServingInfoRequest)) { + return super.equals(obj); + } + feast.proto.serving.ServingAPIProto.GetFeastServingInfoRequest other = (feast.proto.serving.ServingAPIProto.GetFeastServingInfoRequest) obj; + + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static feast.proto.serving.ServingAPIProto.GetFeastServingInfoRequest parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static feast.proto.serving.ServingAPIProto.GetFeastServingInfoRequest parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static feast.proto.serving.ServingAPIProto.GetFeastServingInfoRequest parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static feast.proto.serving.ServingAPIProto.GetFeastServingInfoRequest parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static feast.proto.serving.ServingAPIProto.GetFeastServingInfoRequest parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static feast.proto.serving.ServingAPIProto.GetFeastServingInfoRequest parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static feast.proto.serving.ServingAPIProto.GetFeastServingInfoRequest parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static feast.proto.serving.ServingAPIProto.GetFeastServingInfoRequest parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static feast.proto.serving.ServingAPIProto.GetFeastServingInfoRequest parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static feast.proto.serving.ServingAPIProto.GetFeastServingInfoRequest parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static feast.proto.serving.ServingAPIProto.GetFeastServingInfoRequest parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static feast.proto.serving.ServingAPIProto.GetFeastServingInfoRequest parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(feast.proto.serving.ServingAPIProto.GetFeastServingInfoRequest prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code feast.serving.GetFeastServingInfoRequest} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:feast.serving.GetFeastServingInfoRequest) + feast.proto.serving.ServingAPIProto.GetFeastServingInfoRequestOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return feast.proto.serving.ServingAPIProto.internal_static_feast_serving_GetFeastServingInfoRequest_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return feast.proto.serving.ServingAPIProto.internal_static_feast_serving_GetFeastServingInfoRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + feast.proto.serving.ServingAPIProto.GetFeastServingInfoRequest.class, feast.proto.serving.ServingAPIProto.GetFeastServingInfoRequest.Builder.class); + } + + // Construct using feast.proto.serving.ServingAPIProto.GetFeastServingInfoRequest.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return feast.proto.serving.ServingAPIProto.internal_static_feast_serving_GetFeastServingInfoRequest_descriptor; + } + + @java.lang.Override + public feast.proto.serving.ServingAPIProto.GetFeastServingInfoRequest getDefaultInstanceForType() { + return feast.proto.serving.ServingAPIProto.GetFeastServingInfoRequest.getDefaultInstance(); + } + + @java.lang.Override + public feast.proto.serving.ServingAPIProto.GetFeastServingInfoRequest build() { + feast.proto.serving.ServingAPIProto.GetFeastServingInfoRequest result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public feast.proto.serving.ServingAPIProto.GetFeastServingInfoRequest buildPartial() { + feast.proto.serving.ServingAPIProto.GetFeastServingInfoRequest result = new feast.proto.serving.ServingAPIProto.GetFeastServingInfoRequest(this); + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof feast.proto.serving.ServingAPIProto.GetFeastServingInfoRequest) { + return mergeFrom((feast.proto.serving.ServingAPIProto.GetFeastServingInfoRequest)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(feast.proto.serving.ServingAPIProto.GetFeastServingInfoRequest other) { + if (other == feast.proto.serving.ServingAPIProto.GetFeastServingInfoRequest.getDefaultInstance()) return this; + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + feast.proto.serving.ServingAPIProto.GetFeastServingInfoRequest parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (feast.proto.serving.ServingAPIProto.GetFeastServingInfoRequest) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:feast.serving.GetFeastServingInfoRequest) + } + + // @@protoc_insertion_point(class_scope:feast.serving.GetFeastServingInfoRequest) + private static final feast.proto.serving.ServingAPIProto.GetFeastServingInfoRequest DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new feast.proto.serving.ServingAPIProto.GetFeastServingInfoRequest(); + } + + public static feast.proto.serving.ServingAPIProto.GetFeastServingInfoRequest getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public GetFeastServingInfoRequest parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new GetFeastServingInfoRequest(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public feast.proto.serving.ServingAPIProto.GetFeastServingInfoRequest getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface GetFeastServingInfoResponseOrBuilder extends + // @@protoc_insertion_point(interface_extends:feast.serving.GetFeastServingInfoResponse) + com.google.protobuf.MessageOrBuilder { + + /** + *
+     * Feast version of this serving deployment.
+     * 
+ * + * string version = 1; + * @return The version. + */ + java.lang.String getVersion(); + /** + *
+     * Feast version of this serving deployment.
+     * 
+ * + * string version = 1; + * @return The bytes for version. + */ + com.google.protobuf.ByteString + getVersionBytes(); + } + /** + * Protobuf type {@code feast.serving.GetFeastServingInfoResponse} + */ + public static final class GetFeastServingInfoResponse extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:feast.serving.GetFeastServingInfoResponse) + GetFeastServingInfoResponseOrBuilder { + private static final long serialVersionUID = 0L; + // Use GetFeastServingInfoResponse.newBuilder() to construct. + private GetFeastServingInfoResponse(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private GetFeastServingInfoResponse() { + version_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new GetFeastServingInfoResponse(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private GetFeastServingInfoResponse( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + java.lang.String s = input.readStringRequireUtf8(); + + version_ = s; + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return feast.proto.serving.ServingAPIProto.internal_static_feast_serving_GetFeastServingInfoResponse_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return feast.proto.serving.ServingAPIProto.internal_static_feast_serving_GetFeastServingInfoResponse_fieldAccessorTable + .ensureFieldAccessorsInitialized( + feast.proto.serving.ServingAPIProto.GetFeastServingInfoResponse.class, feast.proto.serving.ServingAPIProto.GetFeastServingInfoResponse.Builder.class); + } + + public static final int VERSION_FIELD_NUMBER = 1; + private volatile java.lang.Object version_; + /** + *
+     * Feast version of this serving deployment.
+     * 
+ * + * string version = 1; + * @return The version. + */ + @java.lang.Override + public java.lang.String getVersion() { + java.lang.Object ref = version_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + version_ = s; + return s; + } + } + /** + *
+     * Feast version of this serving deployment.
+     * 
+ * + * string version = 1; + * @return The bytes for version. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getVersionBytes() { + java.lang.Object ref = version_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + version_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(version_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, version_); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(version_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, version_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof feast.proto.serving.ServingAPIProto.GetFeastServingInfoResponse)) { + return super.equals(obj); + } + feast.proto.serving.ServingAPIProto.GetFeastServingInfoResponse other = (feast.proto.serving.ServingAPIProto.GetFeastServingInfoResponse) obj; + + if (!getVersion() + .equals(other.getVersion())) return false; + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + VERSION_FIELD_NUMBER; + hash = (53 * hash) + getVersion().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static feast.proto.serving.ServingAPIProto.GetFeastServingInfoResponse parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static feast.proto.serving.ServingAPIProto.GetFeastServingInfoResponse parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static feast.proto.serving.ServingAPIProto.GetFeastServingInfoResponse parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static feast.proto.serving.ServingAPIProto.GetFeastServingInfoResponse parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static feast.proto.serving.ServingAPIProto.GetFeastServingInfoResponse parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static feast.proto.serving.ServingAPIProto.GetFeastServingInfoResponse parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static feast.proto.serving.ServingAPIProto.GetFeastServingInfoResponse parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static feast.proto.serving.ServingAPIProto.GetFeastServingInfoResponse parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static feast.proto.serving.ServingAPIProto.GetFeastServingInfoResponse parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static feast.proto.serving.ServingAPIProto.GetFeastServingInfoResponse parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static feast.proto.serving.ServingAPIProto.GetFeastServingInfoResponse parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static feast.proto.serving.ServingAPIProto.GetFeastServingInfoResponse parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(feast.proto.serving.ServingAPIProto.GetFeastServingInfoResponse prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code feast.serving.GetFeastServingInfoResponse} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:feast.serving.GetFeastServingInfoResponse) + feast.proto.serving.ServingAPIProto.GetFeastServingInfoResponseOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return feast.proto.serving.ServingAPIProto.internal_static_feast_serving_GetFeastServingInfoResponse_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return feast.proto.serving.ServingAPIProto.internal_static_feast_serving_GetFeastServingInfoResponse_fieldAccessorTable + .ensureFieldAccessorsInitialized( + feast.proto.serving.ServingAPIProto.GetFeastServingInfoResponse.class, feast.proto.serving.ServingAPIProto.GetFeastServingInfoResponse.Builder.class); + } + + // Construct using feast.proto.serving.ServingAPIProto.GetFeastServingInfoResponse.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + version_ = ""; + + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return feast.proto.serving.ServingAPIProto.internal_static_feast_serving_GetFeastServingInfoResponse_descriptor; + } + + @java.lang.Override + public feast.proto.serving.ServingAPIProto.GetFeastServingInfoResponse getDefaultInstanceForType() { + return feast.proto.serving.ServingAPIProto.GetFeastServingInfoResponse.getDefaultInstance(); + } + + @java.lang.Override + public feast.proto.serving.ServingAPIProto.GetFeastServingInfoResponse build() { + feast.proto.serving.ServingAPIProto.GetFeastServingInfoResponse result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public feast.proto.serving.ServingAPIProto.GetFeastServingInfoResponse buildPartial() { + feast.proto.serving.ServingAPIProto.GetFeastServingInfoResponse result = new feast.proto.serving.ServingAPIProto.GetFeastServingInfoResponse(this); + result.version_ = version_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof feast.proto.serving.ServingAPIProto.GetFeastServingInfoResponse) { + return mergeFrom((feast.proto.serving.ServingAPIProto.GetFeastServingInfoResponse)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(feast.proto.serving.ServingAPIProto.GetFeastServingInfoResponse other) { + if (other == feast.proto.serving.ServingAPIProto.GetFeastServingInfoResponse.getDefaultInstance()) return this; + if (!other.getVersion().isEmpty()) { + version_ = other.version_; + onChanged(); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + feast.proto.serving.ServingAPIProto.GetFeastServingInfoResponse parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (feast.proto.serving.ServingAPIProto.GetFeastServingInfoResponse) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + private java.lang.Object version_ = ""; + /** + *
+       * Feast version of this serving deployment.
+       * 
+ * + * string version = 1; + * @return The version. + */ + public java.lang.String getVersion() { + java.lang.Object ref = version_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + version_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + *
+       * Feast version of this serving deployment.
+       * 
+ * + * string version = 1; + * @return The bytes for version. + */ + public com.google.protobuf.ByteString + getVersionBytes() { + java.lang.Object ref = version_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + version_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + *
+       * Feast version of this serving deployment.
+       * 
+ * + * string version = 1; + * @param value The version to set. + * @return This builder for chaining. + */ + public Builder setVersion( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + version_ = value; + onChanged(); + return this; + } + /** + *
+       * Feast version of this serving deployment.
+       * 
+ * + * string version = 1; + * @return This builder for chaining. + */ + public Builder clearVersion() { + + version_ = getDefaultInstance().getVersion(); + onChanged(); + return this; + } + /** + *
+       * Feast version of this serving deployment.
+       * 
+ * + * string version = 1; + * @param value The bytes for version to set. + * @return This builder for chaining. + */ + public Builder setVersionBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + version_ = value; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:feast.serving.GetFeastServingInfoResponse) + } + + // @@protoc_insertion_point(class_scope:feast.serving.GetFeastServingInfoResponse) + private static final feast.proto.serving.ServingAPIProto.GetFeastServingInfoResponse DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new feast.proto.serving.ServingAPIProto.GetFeastServingInfoResponse(); + } + + public static feast.proto.serving.ServingAPIProto.GetFeastServingInfoResponse getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public GetFeastServingInfoResponse parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new GetFeastServingInfoResponse(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public feast.proto.serving.ServingAPIProto.GetFeastServingInfoResponse getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface FeatureReferenceV2OrBuilder extends + // @@protoc_insertion_point(interface_extends:feast.serving.FeatureReferenceV2) + com.google.protobuf.MessageOrBuilder { + + /** + *
+     * Name of the Feature View to retrieve the feature from.
+     * 
+ * + * string feature_view_name = 1; + * @return The featureViewName. + */ + java.lang.String getFeatureViewName(); + /** + *
+     * Name of the Feature View to retrieve the feature from.
+     * 
+ * + * string feature_view_name = 1; + * @return The bytes for featureViewName. + */ + com.google.protobuf.ByteString + getFeatureViewNameBytes(); + + /** + *
+     * Name of the Feature to retrieve the feature from.
+     * 
+ * + * string feature_name = 2; + * @return The featureName. + */ + java.lang.String getFeatureName(); + /** + *
+     * Name of the Feature to retrieve the feature from.
+     * 
+ * + * string feature_name = 2; + * @return The bytes for featureName. + */ + com.google.protobuf.ByteString + getFeatureNameBytes(); + } + /** + * Protobuf type {@code feast.serving.FeatureReferenceV2} + */ + public static final class FeatureReferenceV2 extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:feast.serving.FeatureReferenceV2) + FeatureReferenceV2OrBuilder { + private static final long serialVersionUID = 0L; + // Use FeatureReferenceV2.newBuilder() to construct. + private FeatureReferenceV2(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private FeatureReferenceV2() { + featureViewName_ = ""; + featureName_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new FeatureReferenceV2(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private FeatureReferenceV2( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + java.lang.String s = input.readStringRequireUtf8(); + + featureViewName_ = s; + break; + } + case 18: { + java.lang.String s = input.readStringRequireUtf8(); + + featureName_ = s; + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return feast.proto.serving.ServingAPIProto.internal_static_feast_serving_FeatureReferenceV2_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return feast.proto.serving.ServingAPIProto.internal_static_feast_serving_FeatureReferenceV2_fieldAccessorTable + .ensureFieldAccessorsInitialized( + feast.proto.serving.ServingAPIProto.FeatureReferenceV2.class, feast.proto.serving.ServingAPIProto.FeatureReferenceV2.Builder.class); + } + + public static final int FEATURE_VIEW_NAME_FIELD_NUMBER = 1; + private volatile java.lang.Object featureViewName_; + /** + *
+     * Name of the Feature View to retrieve the feature from.
+     * 
+ * + * string feature_view_name = 1; + * @return The featureViewName. + */ + @java.lang.Override + public java.lang.String getFeatureViewName() { + java.lang.Object ref = featureViewName_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + featureViewName_ = s; + return s; + } + } + /** + *
+     * Name of the Feature View to retrieve the feature from.
+     * 
+ * + * string feature_view_name = 1; + * @return The bytes for featureViewName. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getFeatureViewNameBytes() { + java.lang.Object ref = featureViewName_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + featureViewName_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int FEATURE_NAME_FIELD_NUMBER = 2; + private volatile java.lang.Object featureName_; + /** + *
+     * Name of the Feature to retrieve the feature from.
+     * 
+ * + * string feature_name = 2; + * @return The featureName. + */ + @java.lang.Override + public java.lang.String getFeatureName() { + java.lang.Object ref = featureName_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + featureName_ = s; + return s; + } + } + /** + *
+     * Name of the Feature to retrieve the feature from.
+     * 
+ * + * string feature_name = 2; + * @return The bytes for featureName. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getFeatureNameBytes() { + java.lang.Object ref = featureName_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + featureName_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(featureViewName_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, featureViewName_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(featureName_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 2, featureName_); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(featureViewName_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, featureViewName_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(featureName_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, featureName_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof feast.proto.serving.ServingAPIProto.FeatureReferenceV2)) { + return super.equals(obj); + } + feast.proto.serving.ServingAPIProto.FeatureReferenceV2 other = (feast.proto.serving.ServingAPIProto.FeatureReferenceV2) obj; + + if (!getFeatureViewName() + .equals(other.getFeatureViewName())) return false; + if (!getFeatureName() + .equals(other.getFeatureName())) return false; + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + FEATURE_VIEW_NAME_FIELD_NUMBER; + hash = (53 * hash) + getFeatureViewName().hashCode(); + hash = (37 * hash) + FEATURE_NAME_FIELD_NUMBER; + hash = (53 * hash) + getFeatureName().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static feast.proto.serving.ServingAPIProto.FeatureReferenceV2 parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static feast.proto.serving.ServingAPIProto.FeatureReferenceV2 parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static feast.proto.serving.ServingAPIProto.FeatureReferenceV2 parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static feast.proto.serving.ServingAPIProto.FeatureReferenceV2 parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static feast.proto.serving.ServingAPIProto.FeatureReferenceV2 parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static feast.proto.serving.ServingAPIProto.FeatureReferenceV2 parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static feast.proto.serving.ServingAPIProto.FeatureReferenceV2 parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static feast.proto.serving.ServingAPIProto.FeatureReferenceV2 parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static feast.proto.serving.ServingAPIProto.FeatureReferenceV2 parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static feast.proto.serving.ServingAPIProto.FeatureReferenceV2 parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static feast.proto.serving.ServingAPIProto.FeatureReferenceV2 parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static feast.proto.serving.ServingAPIProto.FeatureReferenceV2 parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(feast.proto.serving.ServingAPIProto.FeatureReferenceV2 prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code feast.serving.FeatureReferenceV2} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:feast.serving.FeatureReferenceV2) + feast.proto.serving.ServingAPIProto.FeatureReferenceV2OrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return feast.proto.serving.ServingAPIProto.internal_static_feast_serving_FeatureReferenceV2_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return feast.proto.serving.ServingAPIProto.internal_static_feast_serving_FeatureReferenceV2_fieldAccessorTable + .ensureFieldAccessorsInitialized( + feast.proto.serving.ServingAPIProto.FeatureReferenceV2.class, feast.proto.serving.ServingAPIProto.FeatureReferenceV2.Builder.class); + } + + // Construct using feast.proto.serving.ServingAPIProto.FeatureReferenceV2.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + featureViewName_ = ""; + + featureName_ = ""; + + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return feast.proto.serving.ServingAPIProto.internal_static_feast_serving_FeatureReferenceV2_descriptor; + } + + @java.lang.Override + public feast.proto.serving.ServingAPIProto.FeatureReferenceV2 getDefaultInstanceForType() { + return feast.proto.serving.ServingAPIProto.FeatureReferenceV2.getDefaultInstance(); + } + + @java.lang.Override + public feast.proto.serving.ServingAPIProto.FeatureReferenceV2 build() { + feast.proto.serving.ServingAPIProto.FeatureReferenceV2 result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public feast.proto.serving.ServingAPIProto.FeatureReferenceV2 buildPartial() { + feast.proto.serving.ServingAPIProto.FeatureReferenceV2 result = new feast.proto.serving.ServingAPIProto.FeatureReferenceV2(this); + result.featureViewName_ = featureViewName_; + result.featureName_ = featureName_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof feast.proto.serving.ServingAPIProto.FeatureReferenceV2) { + return mergeFrom((feast.proto.serving.ServingAPIProto.FeatureReferenceV2)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(feast.proto.serving.ServingAPIProto.FeatureReferenceV2 other) { + if (other == feast.proto.serving.ServingAPIProto.FeatureReferenceV2.getDefaultInstance()) return this; + if (!other.getFeatureViewName().isEmpty()) { + featureViewName_ = other.featureViewName_; + onChanged(); + } + if (!other.getFeatureName().isEmpty()) { + featureName_ = other.featureName_; + onChanged(); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + feast.proto.serving.ServingAPIProto.FeatureReferenceV2 parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (feast.proto.serving.ServingAPIProto.FeatureReferenceV2) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + private java.lang.Object featureViewName_ = ""; + /** + *
+       * Name of the Feature View to retrieve the feature from.
+       * 
+ * + * string feature_view_name = 1; + * @return The featureViewName. + */ + public java.lang.String getFeatureViewName() { + java.lang.Object ref = featureViewName_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + featureViewName_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + *
+       * Name of the Feature View to retrieve the feature from.
+       * 
+ * + * string feature_view_name = 1; + * @return The bytes for featureViewName. + */ + public com.google.protobuf.ByteString + getFeatureViewNameBytes() { + java.lang.Object ref = featureViewName_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + featureViewName_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + *
+       * Name of the Feature View to retrieve the feature from.
+       * 
+ * + * string feature_view_name = 1; + * @param value The featureViewName to set. + * @return This builder for chaining. + */ + public Builder setFeatureViewName( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + featureViewName_ = value; + onChanged(); + return this; + } + /** + *
+       * Name of the Feature View to retrieve the feature from.
+       * 
+ * + * string feature_view_name = 1; + * @return This builder for chaining. + */ + public Builder clearFeatureViewName() { + + featureViewName_ = getDefaultInstance().getFeatureViewName(); + onChanged(); + return this; + } + /** + *
+       * Name of the Feature View to retrieve the feature from.
+       * 
+ * + * string feature_view_name = 1; + * @param value The bytes for featureViewName to set. + * @return This builder for chaining. + */ + public Builder setFeatureViewNameBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + featureViewName_ = value; + onChanged(); + return this; + } + + private java.lang.Object featureName_ = ""; + /** + *
+       * Name of the Feature to retrieve the feature from.
+       * 
+ * + * string feature_name = 2; + * @return The featureName. + */ + public java.lang.String getFeatureName() { + java.lang.Object ref = featureName_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + featureName_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + *
+       * Name of the Feature to retrieve the feature from.
+       * 
+ * + * string feature_name = 2; + * @return The bytes for featureName. + */ + public com.google.protobuf.ByteString + getFeatureNameBytes() { + java.lang.Object ref = featureName_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + featureName_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + *
+       * Name of the Feature to retrieve the feature from.
+       * 
+ * + * string feature_name = 2; + * @param value The featureName to set. + * @return This builder for chaining. + */ + public Builder setFeatureName( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + featureName_ = value; + onChanged(); + return this; + } + /** + *
+       * Name of the Feature to retrieve the feature from.
+       * 
+ * + * string feature_name = 2; + * @return This builder for chaining. + */ + public Builder clearFeatureName() { + + featureName_ = getDefaultInstance().getFeatureName(); + onChanged(); + return this; + } + /** + *
+       * Name of the Feature to retrieve the feature from.
+       * 
+ * + * string feature_name = 2; + * @param value The bytes for featureName to set. + * @return This builder for chaining. + */ + public Builder setFeatureNameBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + featureName_ = value; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:feast.serving.FeatureReferenceV2) + } + + // @@protoc_insertion_point(class_scope:feast.serving.FeatureReferenceV2) + private static final feast.proto.serving.ServingAPIProto.FeatureReferenceV2 DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new feast.proto.serving.ServingAPIProto.FeatureReferenceV2(); + } + + public static feast.proto.serving.ServingAPIProto.FeatureReferenceV2 getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public FeatureReferenceV2 parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new FeatureReferenceV2(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public feast.proto.serving.ServingAPIProto.FeatureReferenceV2 getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface GetOnlineFeaturesRequestV2OrBuilder extends + // @@protoc_insertion_point(interface_extends:feast.serving.GetOnlineFeaturesRequestV2) + com.google.protobuf.MessageOrBuilder { + + /** + *
+     * List of features that are being retrieved
+     * 
+ * + * repeated .feast.serving.FeatureReferenceV2 features = 4; + */ + java.util.List + getFeaturesList(); + /** + *
+     * List of features that are being retrieved
+     * 
+ * + * repeated .feast.serving.FeatureReferenceV2 features = 4; + */ + feast.proto.serving.ServingAPIProto.FeatureReferenceV2 getFeatures(int index); + /** + *
+     * List of features that are being retrieved
+     * 
+ * + * repeated .feast.serving.FeatureReferenceV2 features = 4; + */ + int getFeaturesCount(); + /** + *
+     * List of features that are being retrieved
+     * 
+ * + * repeated .feast.serving.FeatureReferenceV2 features = 4; + */ + java.util.List + getFeaturesOrBuilderList(); + /** + *
+     * List of features that are being retrieved
+     * 
+ * + * repeated .feast.serving.FeatureReferenceV2 features = 4; + */ + feast.proto.serving.ServingAPIProto.FeatureReferenceV2OrBuilder getFeaturesOrBuilder( + int index); + + /** + *
+     * 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 .feast.serving.GetOnlineFeaturesRequestV2.EntityRow entity_rows = 2; + */ + java.util.List + getEntityRowsList(); + /** + *
+     * 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 .feast.serving.GetOnlineFeaturesRequestV2.EntityRow entity_rows = 2; + */ + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow getEntityRows(int index); + /** + *
+     * 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 .feast.serving.GetOnlineFeaturesRequestV2.EntityRow entity_rows = 2; + */ + int getEntityRowsCount(); + /** + *
+     * 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 .feast.serving.GetOnlineFeaturesRequestV2.EntityRow entity_rows = 2; + */ + java.util.List + getEntityRowsOrBuilderList(); + /** + *
+     * 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 .feast.serving.GetOnlineFeaturesRequestV2.EntityRow entity_rows = 2; + */ + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRowOrBuilder getEntityRowsOrBuilder( + int index); + + /** + *
+     * 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; + * @return The project. + */ + java.lang.String getProject(); + /** + *
+     * 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; + * @return The bytes for project. + */ + com.google.protobuf.ByteString + getProjectBytes(); + } + /** + *
+   * ToDo (oleksii): remove this message (since it's not used) and move EntityRow on package level
+   * 
+ * + * Protobuf type {@code feast.serving.GetOnlineFeaturesRequestV2} + */ + public static final class GetOnlineFeaturesRequestV2 extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:feast.serving.GetOnlineFeaturesRequestV2) + GetOnlineFeaturesRequestV2OrBuilder { + private static final long serialVersionUID = 0L; + // Use GetOnlineFeaturesRequestV2.newBuilder() to construct. + private GetOnlineFeaturesRequestV2(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private GetOnlineFeaturesRequestV2() { + features_ = java.util.Collections.emptyList(); + entityRows_ = java.util.Collections.emptyList(); + project_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new GetOnlineFeaturesRequestV2(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private GetOnlineFeaturesRequestV2( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 18: { + if (!((mutable_bitField0_ & 0x00000002) != 0)) { + entityRows_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000002; + } + entityRows_.add( + input.readMessage(feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow.parser(), extensionRegistry)); + break; + } + case 34: { + if (!((mutable_bitField0_ & 0x00000001) != 0)) { + features_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000001; + } + features_.add( + input.readMessage(feast.proto.serving.ServingAPIProto.FeatureReferenceV2.parser(), extensionRegistry)); + break; + } + case 42: { + java.lang.String s = input.readStringRequireUtf8(); + + project_ = s; + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000002) != 0)) { + entityRows_ = java.util.Collections.unmodifiableList(entityRows_); + } + if (((mutable_bitField0_ & 0x00000001) != 0)) { + features_ = java.util.Collections.unmodifiableList(features_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return feast.proto.serving.ServingAPIProto.internal_static_feast_serving_GetOnlineFeaturesRequestV2_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return feast.proto.serving.ServingAPIProto.internal_static_feast_serving_GetOnlineFeaturesRequestV2_fieldAccessorTable + .ensureFieldAccessorsInitialized( + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.class, feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.Builder.class); + } + + public interface EntityRowOrBuilder extends + // @@protoc_insertion_point(interface_extends:feast.serving.GetOnlineFeaturesRequestV2.EntityRow) + com.google.protobuf.MessageOrBuilder { + + /** + *
+       * Request timestamp of this row. This value will be used,
+       * together with maxAge, to determine feature staleness.
+       * 
+ * + * .google.protobuf.Timestamp timestamp = 1; + * @return Whether the timestamp field is set. + */ + boolean hasTimestamp(); + /** + *
+       * Request timestamp of this row. This value will be used,
+       * together with maxAge, to determine feature staleness.
+       * 
+ * + * .google.protobuf.Timestamp timestamp = 1; + * @return The timestamp. + */ + com.google.protobuf.Timestamp getTimestamp(); + /** + *
+       * Request timestamp of this row. This value will be used,
+       * together with maxAge, to determine feature staleness.
+       * 
+ * + * .google.protobuf.Timestamp timestamp = 1; + */ + com.google.protobuf.TimestampOrBuilder getTimestampOrBuilder(); + + /** + *
+       * Map containing mapping of entity name to entity value.
+       * 
+ * + * map<string, .feast.types.Value> fields = 2; + */ + int getFieldsCount(); + /** + *
+       * Map containing mapping of entity name to entity value.
+       * 
+ * + * map<string, .feast.types.Value> fields = 2; + */ + boolean containsFields( + java.lang.String key); + /** + * Use {@link #getFieldsMap()} instead. + */ + @java.lang.Deprecated + java.util.Map + getFields(); + /** + *
+       * Map containing mapping of entity name to entity value.
+       * 
+ * + * map<string, .feast.types.Value> fields = 2; + */ + java.util.Map + getFieldsMap(); + /** + *
+       * Map containing mapping of entity name to entity value.
+       * 
+ * + * map<string, .feast.types.Value> fields = 2; + */ + + /* nullable */ +feast.proto.types.ValueProto.Value getFieldsOrDefault( + java.lang.String key, + /* nullable */ +feast.proto.types.ValueProto.Value defaultValue); + /** + *
+       * Map containing mapping of entity name to entity value.
+       * 
+ * + * map<string, .feast.types.Value> fields = 2; + */ + + feast.proto.types.ValueProto.Value getFieldsOrThrow( + java.lang.String key); + } + /** + * Protobuf type {@code feast.serving.GetOnlineFeaturesRequestV2.EntityRow} + */ + public static final class EntityRow extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:feast.serving.GetOnlineFeaturesRequestV2.EntityRow) + EntityRowOrBuilder { + private static final long serialVersionUID = 0L; + // Use EntityRow.newBuilder() to construct. + private EntityRow(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private EntityRow() { + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new EntityRow(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private EntityRow( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + com.google.protobuf.Timestamp.Builder subBuilder = null; + if (timestamp_ != null) { + subBuilder = timestamp_.toBuilder(); + } + timestamp_ = input.readMessage(com.google.protobuf.Timestamp.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(timestamp_); + timestamp_ = subBuilder.buildPartial(); + } + + break; + } + case 18: { + if (!((mutable_bitField0_ & 0x00000001) != 0)) { + fields_ = com.google.protobuf.MapField.newMapField( + FieldsDefaultEntryHolder.defaultEntry); + mutable_bitField0_ |= 0x00000001; + } + com.google.protobuf.MapEntry + fields__ = input.readMessage( + FieldsDefaultEntryHolder.defaultEntry.getParserForType(), extensionRegistry); + fields_.getMutableMap().put( + fields__.getKey(), fields__.getValue()); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return feast.proto.serving.ServingAPIProto.internal_static_feast_serving_GetOnlineFeaturesRequestV2_EntityRow_descriptor; + } + + @SuppressWarnings({"rawtypes"}) + @java.lang.Override + protected com.google.protobuf.MapField internalGetMapField( + int number) { + switch (number) { + case 2: + return internalGetFields(); + default: + throw new RuntimeException( + "Invalid map field number: " + number); + } + } + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return feast.proto.serving.ServingAPIProto.internal_static_feast_serving_GetOnlineFeaturesRequestV2_EntityRow_fieldAccessorTable + .ensureFieldAccessorsInitialized( + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow.class, feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow.Builder.class); + } + + public static final int TIMESTAMP_FIELD_NUMBER = 1; + private com.google.protobuf.Timestamp timestamp_; + /** + *
+       * Request timestamp of this row. This value will be used,
+       * together with maxAge, to determine feature staleness.
+       * 
+ * + * .google.protobuf.Timestamp timestamp = 1; + * @return Whether the timestamp field is set. + */ + @java.lang.Override + public boolean hasTimestamp() { + return timestamp_ != null; + } + /** + *
+       * Request timestamp of this row. This value will be used,
+       * together with maxAge, to determine feature staleness.
+       * 
+ * + * .google.protobuf.Timestamp timestamp = 1; + * @return The timestamp. + */ + @java.lang.Override + public com.google.protobuf.Timestamp getTimestamp() { + return timestamp_ == null ? com.google.protobuf.Timestamp.getDefaultInstance() : timestamp_; + } + /** + *
+       * Request timestamp of this row. This value will be used,
+       * together with maxAge, to determine feature staleness.
+       * 
+ * + * .google.protobuf.Timestamp timestamp = 1; + */ + @java.lang.Override + public com.google.protobuf.TimestampOrBuilder getTimestampOrBuilder() { + return getTimestamp(); + } + + public static final int FIELDS_FIELD_NUMBER = 2; + private static final class FieldsDefaultEntryHolder { + static final com.google.protobuf.MapEntry< + java.lang.String, feast.proto.types.ValueProto.Value> defaultEntry = + com.google.protobuf.MapEntry + .newDefaultInstance( + feast.proto.serving.ServingAPIProto.internal_static_feast_serving_GetOnlineFeaturesRequestV2_EntityRow_FieldsEntry_descriptor, + com.google.protobuf.WireFormat.FieldType.STRING, + "", + com.google.protobuf.WireFormat.FieldType.MESSAGE, + feast.proto.types.ValueProto.Value.getDefaultInstance()); + } + private com.google.protobuf.MapField< + java.lang.String, feast.proto.types.ValueProto.Value> fields_; + private com.google.protobuf.MapField + internalGetFields() { + if (fields_ == null) { + return com.google.protobuf.MapField.emptyMapField( + FieldsDefaultEntryHolder.defaultEntry); + } + return fields_; + } + + public int getFieldsCount() { + return internalGetFields().getMap().size(); + } + /** + *
+       * Map containing mapping of entity name to entity value.
+       * 
+ * + * map<string, .feast.types.Value> fields = 2; + */ + + @java.lang.Override + public boolean containsFields( + java.lang.String key) { + if (key == null) { throw new NullPointerException("map key"); } + return internalGetFields().getMap().containsKey(key); + } + /** + * Use {@link #getFieldsMap()} instead. + */ + @java.lang.Override + @java.lang.Deprecated + public java.util.Map getFields() { + return getFieldsMap(); + } + /** + *
+       * Map containing mapping of entity name to entity value.
+       * 
+ * + * map<string, .feast.types.Value> fields = 2; + */ + @java.lang.Override + + public java.util.Map getFieldsMap() { + return internalGetFields().getMap(); + } + /** + *
+       * Map containing mapping of entity name to entity value.
+       * 
+ * + * map<string, .feast.types.Value> fields = 2; + */ + @java.lang.Override + + public feast.proto.types.ValueProto.Value getFieldsOrDefault( + java.lang.String key, + feast.proto.types.ValueProto.Value defaultValue) { + if (key == null) { throw new NullPointerException("map key"); } + java.util.Map map = + internalGetFields().getMap(); + return map.containsKey(key) ? map.get(key) : defaultValue; + } + /** + *
+       * Map containing mapping of entity name to entity value.
+       * 
+ * + * map<string, .feast.types.Value> fields = 2; + */ + @java.lang.Override + + public feast.proto.types.ValueProto.Value getFieldsOrThrow( + java.lang.String key) { + if (key == null) { throw new NullPointerException("map key"); } + java.util.Map map = + internalGetFields().getMap(); + if (!map.containsKey(key)) { + throw new java.lang.IllegalArgumentException(); + } + return map.get(key); + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (timestamp_ != null) { + output.writeMessage(1, getTimestamp()); + } + com.google.protobuf.GeneratedMessageV3 + .serializeStringMapTo( + output, + internalGetFields(), + FieldsDefaultEntryHolder.defaultEntry, + 2); + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (timestamp_ != null) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(1, getTimestamp()); + } + for (java.util.Map.Entry entry + : internalGetFields().getMap().entrySet()) { + com.google.protobuf.MapEntry + fields__ = FieldsDefaultEntryHolder.defaultEntry.newBuilderForType() + .setKey(entry.getKey()) + .setValue(entry.getValue()) + .build(); + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(2, fields__); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow)) { + return super.equals(obj); + } + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow other = (feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow) obj; + + if (hasTimestamp() != other.hasTimestamp()) return false; + if (hasTimestamp()) { + if (!getTimestamp() + .equals(other.getTimestamp())) return false; + } + if (!internalGetFields().equals( + other.internalGetFields())) return false; + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasTimestamp()) { + hash = (37 * hash) + TIMESTAMP_FIELD_NUMBER; + hash = (53 * hash) + getTimestamp().hashCode(); + } + if (!internalGetFields().getMap().isEmpty()) { + hash = (37 * hash) + FIELDS_FIELD_NUMBER; + hash = (53 * hash) + internalGetFields().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code feast.serving.GetOnlineFeaturesRequestV2.EntityRow} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:feast.serving.GetOnlineFeaturesRequestV2.EntityRow) + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRowOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return feast.proto.serving.ServingAPIProto.internal_static_feast_serving_GetOnlineFeaturesRequestV2_EntityRow_descriptor; + } + + @SuppressWarnings({"rawtypes"}) + protected com.google.protobuf.MapField internalGetMapField( + int number) { + switch (number) { + case 2: + return internalGetFields(); + default: + throw new RuntimeException( + "Invalid map field number: " + number); + } + } + @SuppressWarnings({"rawtypes"}) + protected com.google.protobuf.MapField internalGetMutableMapField( + int number) { + switch (number) { + case 2: + return internalGetMutableFields(); + default: + throw new RuntimeException( + "Invalid map field number: " + number); + } + } + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return feast.proto.serving.ServingAPIProto.internal_static_feast_serving_GetOnlineFeaturesRequestV2_EntityRow_fieldAccessorTable + .ensureFieldAccessorsInitialized( + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow.class, feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow.Builder.class); + } + + // Construct using feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + if (timestampBuilder_ == null) { + timestamp_ = null; + } else { + timestamp_ = null; + timestampBuilder_ = null; + } + internalGetMutableFields().clear(); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return feast.proto.serving.ServingAPIProto.internal_static_feast_serving_GetOnlineFeaturesRequestV2_EntityRow_descriptor; + } + + @java.lang.Override + public feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow getDefaultInstanceForType() { + return feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow.getDefaultInstance(); + } + + @java.lang.Override + public feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow build() { + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow buildPartial() { + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow result = new feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow(this); + int from_bitField0_ = bitField0_; + if (timestampBuilder_ == null) { + result.timestamp_ = timestamp_; + } else { + result.timestamp_ = timestampBuilder_.build(); + } + result.fields_ = internalGetFields(); + result.fields_.makeImmutable(); + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow) { + return mergeFrom((feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow other) { + if (other == feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow.getDefaultInstance()) return this; + if (other.hasTimestamp()) { + mergeTimestamp(other.getTimestamp()); + } + internalGetMutableFields().mergeFrom( + other.internalGetFields()); + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private com.google.protobuf.Timestamp timestamp_; + private com.google.protobuf.SingleFieldBuilderV3< + com.google.protobuf.Timestamp, com.google.protobuf.Timestamp.Builder, com.google.protobuf.TimestampOrBuilder> timestampBuilder_; + /** + *
+         * Request timestamp of this row. This value will be used,
+         * together with maxAge, to determine feature staleness.
+         * 
+ * + * .google.protobuf.Timestamp timestamp = 1; + * @return Whether the timestamp field is set. + */ + public boolean hasTimestamp() { + return timestampBuilder_ != null || timestamp_ != null; + } + /** + *
+         * Request timestamp of this row. This value will be used,
+         * together with maxAge, to determine feature staleness.
+         * 
+ * + * .google.protobuf.Timestamp timestamp = 1; + * @return The timestamp. + */ + public com.google.protobuf.Timestamp getTimestamp() { + if (timestampBuilder_ == null) { + return timestamp_ == null ? com.google.protobuf.Timestamp.getDefaultInstance() : timestamp_; + } else { + return timestampBuilder_.getMessage(); + } + } + /** + *
+         * Request timestamp of this row. This value will be used,
+         * together with maxAge, to determine feature staleness.
+         * 
+ * + * .google.protobuf.Timestamp timestamp = 1; + */ + public Builder setTimestamp(com.google.protobuf.Timestamp value) { + if (timestampBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + timestamp_ = value; + onChanged(); + } else { + timestampBuilder_.setMessage(value); + } + + return this; + } + /** + *
+         * Request timestamp of this row. This value will be used,
+         * together with maxAge, to determine feature staleness.
+         * 
+ * + * .google.protobuf.Timestamp timestamp = 1; + */ + public Builder setTimestamp( + com.google.protobuf.Timestamp.Builder builderForValue) { + if (timestampBuilder_ == null) { + timestamp_ = builderForValue.build(); + onChanged(); + } else { + timestampBuilder_.setMessage(builderForValue.build()); + } + + return this; + } + /** + *
+         * Request timestamp of this row. This value will be used,
+         * together with maxAge, to determine feature staleness.
+         * 
+ * + * .google.protobuf.Timestamp timestamp = 1; + */ + public Builder mergeTimestamp(com.google.protobuf.Timestamp value) { + if (timestampBuilder_ == null) { + if (timestamp_ != null) { + timestamp_ = + com.google.protobuf.Timestamp.newBuilder(timestamp_).mergeFrom(value).buildPartial(); + } else { + timestamp_ = value; + } + onChanged(); + } else { + timestampBuilder_.mergeFrom(value); + } + + return this; + } + /** + *
+         * Request timestamp of this row. This value will be used,
+         * together with maxAge, to determine feature staleness.
+         * 
+ * + * .google.protobuf.Timestamp timestamp = 1; + */ + public Builder clearTimestamp() { + if (timestampBuilder_ == null) { + timestamp_ = null; + onChanged(); + } else { + timestamp_ = null; + timestampBuilder_ = null; + } + + return this; + } + /** + *
+         * Request timestamp of this row. This value will be used,
+         * together with maxAge, to determine feature staleness.
+         * 
+ * + * .google.protobuf.Timestamp timestamp = 1; + */ + public com.google.protobuf.Timestamp.Builder getTimestampBuilder() { + + onChanged(); + return getTimestampFieldBuilder().getBuilder(); + } + /** + *
+         * Request timestamp of this row. This value will be used,
+         * together with maxAge, to determine feature staleness.
+         * 
+ * + * .google.protobuf.Timestamp timestamp = 1; + */ + public com.google.protobuf.TimestampOrBuilder getTimestampOrBuilder() { + if (timestampBuilder_ != null) { + return timestampBuilder_.getMessageOrBuilder(); + } else { + return timestamp_ == null ? + com.google.protobuf.Timestamp.getDefaultInstance() : timestamp_; + } + } + /** + *
+         * Request timestamp of this row. This value will be used,
+         * together with maxAge, to determine feature staleness.
+         * 
+ * + * .google.protobuf.Timestamp timestamp = 1; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.google.protobuf.Timestamp, com.google.protobuf.Timestamp.Builder, com.google.protobuf.TimestampOrBuilder> + getTimestampFieldBuilder() { + if (timestampBuilder_ == null) { + timestampBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.google.protobuf.Timestamp, com.google.protobuf.Timestamp.Builder, com.google.protobuf.TimestampOrBuilder>( + getTimestamp(), + getParentForChildren(), + isClean()); + timestamp_ = null; + } + return timestampBuilder_; + } + + private com.google.protobuf.MapField< + java.lang.String, feast.proto.types.ValueProto.Value> fields_; + private com.google.protobuf.MapField + internalGetFields() { + if (fields_ == null) { + return com.google.protobuf.MapField.emptyMapField( + FieldsDefaultEntryHolder.defaultEntry); + } + return fields_; + } + private com.google.protobuf.MapField + internalGetMutableFields() { + onChanged();; + if (fields_ == null) { + fields_ = com.google.protobuf.MapField.newMapField( + FieldsDefaultEntryHolder.defaultEntry); + } + if (!fields_.isMutable()) { + fields_ = fields_.copy(); + } + return fields_; + } + + public int getFieldsCount() { + return internalGetFields().getMap().size(); + } + /** + *
+         * Map containing mapping of entity name to entity value.
+         * 
+ * + * map<string, .feast.types.Value> fields = 2; + */ + + @java.lang.Override + public boolean containsFields( + java.lang.String key) { + if (key == null) { throw new NullPointerException("map key"); } + return internalGetFields().getMap().containsKey(key); + } + /** + * Use {@link #getFieldsMap()} instead. + */ + @java.lang.Override + @java.lang.Deprecated + public java.util.Map getFields() { + return getFieldsMap(); + } + /** + *
+         * Map containing mapping of entity name to entity value.
+         * 
+ * + * map<string, .feast.types.Value> fields = 2; + */ + @java.lang.Override + + public java.util.Map getFieldsMap() { + return internalGetFields().getMap(); + } + /** + *
+         * Map containing mapping of entity name to entity value.
+         * 
+ * + * map<string, .feast.types.Value> fields = 2; + */ + @java.lang.Override + + public feast.proto.types.ValueProto.Value getFieldsOrDefault( + java.lang.String key, + feast.proto.types.ValueProto.Value defaultValue) { + if (key == null) { throw new NullPointerException("map key"); } + java.util.Map map = + internalGetFields().getMap(); + return map.containsKey(key) ? map.get(key) : defaultValue; + } + /** + *
+         * Map containing mapping of entity name to entity value.
+         * 
+ * + * map<string, .feast.types.Value> fields = 2; + */ + @java.lang.Override + + public feast.proto.types.ValueProto.Value getFieldsOrThrow( + java.lang.String key) { + if (key == null) { throw new NullPointerException("map key"); } + java.util.Map map = + internalGetFields().getMap(); + if (!map.containsKey(key)) { + throw new java.lang.IllegalArgumentException(); + } + return map.get(key); + } + + public Builder clearFields() { + internalGetMutableFields().getMutableMap() + .clear(); + return this; + } + /** + *
+         * Map containing mapping of entity name to entity value.
+         * 
+ * + * map<string, .feast.types.Value> fields = 2; + */ + + public Builder removeFields( + java.lang.String key) { + if (key == null) { throw new NullPointerException("map key"); } + internalGetMutableFields().getMutableMap() + .remove(key); + return this; + } + /** + * Use alternate mutation accessors instead. + */ + @java.lang.Deprecated + public java.util.Map + getMutableFields() { + return internalGetMutableFields().getMutableMap(); + } + /** + *
+         * Map containing mapping of entity name to entity value.
+         * 
+ * + * map<string, .feast.types.Value> fields = 2; + */ + public Builder putFields( + java.lang.String key, + feast.proto.types.ValueProto.Value value) { + if (key == null) { throw new NullPointerException("map key"); } + if (value == null) { + throw new NullPointerException("map value"); +} + + internalGetMutableFields().getMutableMap() + .put(key, value); + return this; + } + /** + *
+         * Map containing mapping of entity name to entity value.
+         * 
+ * + * map<string, .feast.types.Value> fields = 2; + */ + + public Builder putAllFields( + java.util.Map values) { + internalGetMutableFields().getMutableMap() + .putAll(values); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:feast.serving.GetOnlineFeaturesRequestV2.EntityRow) + } + + // @@protoc_insertion_point(class_scope:feast.serving.GetOnlineFeaturesRequestV2.EntityRow) + private static final feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow(); + } + + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public EntityRow parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new EntityRow(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public static final int FEATURES_FIELD_NUMBER = 4; + private java.util.List features_; + /** + *
+     * List of features that are being retrieved
+     * 
+ * + * repeated .feast.serving.FeatureReferenceV2 features = 4; + */ + @java.lang.Override + public java.util.List getFeaturesList() { + return features_; + } + /** + *
+     * List of features that are being retrieved
+     * 
+ * + * repeated .feast.serving.FeatureReferenceV2 features = 4; + */ + @java.lang.Override + public java.util.List + getFeaturesOrBuilderList() { + return features_; + } + /** + *
+     * List of features that are being retrieved
+     * 
+ * + * repeated .feast.serving.FeatureReferenceV2 features = 4; + */ + @java.lang.Override + public int getFeaturesCount() { + return features_.size(); + } + /** + *
+     * List of features that are being retrieved
+     * 
+ * + * repeated .feast.serving.FeatureReferenceV2 features = 4; + */ + @java.lang.Override + public feast.proto.serving.ServingAPIProto.FeatureReferenceV2 getFeatures(int index) { + return features_.get(index); + } + /** + *
+     * List of features that are being retrieved
+     * 
+ * + * repeated .feast.serving.FeatureReferenceV2 features = 4; + */ + @java.lang.Override + public feast.proto.serving.ServingAPIProto.FeatureReferenceV2OrBuilder getFeaturesOrBuilder( + int index) { + return features_.get(index); + } + + public static final int ENTITY_ROWS_FIELD_NUMBER = 2; + private java.util.List entityRows_; + /** + *
+     * 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 .feast.serving.GetOnlineFeaturesRequestV2.EntityRow entity_rows = 2; + */ + @java.lang.Override + public java.util.List getEntityRowsList() { + return entityRows_; + } + /** + *
+     * 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 .feast.serving.GetOnlineFeaturesRequestV2.EntityRow entity_rows = 2; + */ + @java.lang.Override + public java.util.List + getEntityRowsOrBuilderList() { + return entityRows_; + } + /** + *
+     * 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 .feast.serving.GetOnlineFeaturesRequestV2.EntityRow entity_rows = 2; + */ + @java.lang.Override + public int getEntityRowsCount() { + return entityRows_.size(); + } + /** + *
+     * 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 .feast.serving.GetOnlineFeaturesRequestV2.EntityRow entity_rows = 2; + */ + @java.lang.Override + public feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow getEntityRows(int index) { + return entityRows_.get(index); + } + /** + *
+     * 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 .feast.serving.GetOnlineFeaturesRequestV2.EntityRow entity_rows = 2; + */ + @java.lang.Override + public feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRowOrBuilder getEntityRowsOrBuilder( + int index) { + return entityRows_.get(index); + } + + public static final int PROJECT_FIELD_NUMBER = 5; + private volatile java.lang.Object project_; + /** + *
+     * 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; + * @return The project. + */ + @java.lang.Override + public java.lang.String getProject() { + java.lang.Object ref = project_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + project_ = s; + return s; + } + } + /** + *
+     * 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; + * @return The bytes for project. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getProjectBytes() { + java.lang.Object ref = project_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + project_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + for (int i = 0; i < entityRows_.size(); i++) { + output.writeMessage(2, entityRows_.get(i)); + } + for (int i = 0; i < features_.size(); i++) { + output.writeMessage(4, features_.get(i)); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(project_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 5, project_); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + for (int i = 0; i < entityRows_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(2, entityRows_.get(i)); + } + for (int i = 0; i < features_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(4, features_.get(i)); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(project_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(5, project_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2)) { + return super.equals(obj); + } + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2 other = (feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2) obj; + + if (!getFeaturesList() + .equals(other.getFeaturesList())) return false; + if (!getEntityRowsList() + .equals(other.getEntityRowsList())) return false; + if (!getProject() + .equals(other.getProject())) return false; + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (getFeaturesCount() > 0) { + hash = (37 * hash) + FEATURES_FIELD_NUMBER; + hash = (53 * hash) + getFeaturesList().hashCode(); + } + if (getEntityRowsCount() > 0) { + hash = (37 * hash) + ENTITY_ROWS_FIELD_NUMBER; + hash = (53 * hash) + getEntityRowsList().hashCode(); + } + hash = (37 * hash) + PROJECT_FIELD_NUMBER; + hash = (53 * hash) + getProject().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2 parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2 parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2 parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2 parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2 parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2 parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2 parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2 parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2 parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2 parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2 parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2 parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2 prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
+     * ToDo (oleksii): remove this message (since it's not used) and move EntityRow on package level
+     * 
+ * + * Protobuf type {@code feast.serving.GetOnlineFeaturesRequestV2} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:feast.serving.GetOnlineFeaturesRequestV2) + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2OrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return feast.proto.serving.ServingAPIProto.internal_static_feast_serving_GetOnlineFeaturesRequestV2_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return feast.proto.serving.ServingAPIProto.internal_static_feast_serving_GetOnlineFeaturesRequestV2_fieldAccessorTable + .ensureFieldAccessorsInitialized( + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.class, feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.Builder.class); + } + + // Construct using feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + getFeaturesFieldBuilder(); + getEntityRowsFieldBuilder(); + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + if (featuresBuilder_ == null) { + features_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); + } else { + featuresBuilder_.clear(); + } + if (entityRowsBuilder_ == null) { + entityRows_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000002); + } else { + entityRowsBuilder_.clear(); + } + project_ = ""; + + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return feast.proto.serving.ServingAPIProto.internal_static_feast_serving_GetOnlineFeaturesRequestV2_descriptor; + } + + @java.lang.Override + public feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2 getDefaultInstanceForType() { + return feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.getDefaultInstance(); + } + + @java.lang.Override + public feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2 build() { + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2 result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2 buildPartial() { + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2 result = new feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2(this); + int from_bitField0_ = bitField0_; + if (featuresBuilder_ == null) { + if (((bitField0_ & 0x00000001) != 0)) { + features_ = java.util.Collections.unmodifiableList(features_); + bitField0_ = (bitField0_ & ~0x00000001); + } + result.features_ = features_; + } else { + result.features_ = featuresBuilder_.build(); + } + if (entityRowsBuilder_ == null) { + if (((bitField0_ & 0x00000002) != 0)) { + entityRows_ = java.util.Collections.unmodifiableList(entityRows_); + bitField0_ = (bitField0_ & ~0x00000002); + } + result.entityRows_ = entityRows_; + } else { + result.entityRows_ = entityRowsBuilder_.build(); + } + result.project_ = project_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2) { + return mergeFrom((feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2 other) { + if (other == feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.getDefaultInstance()) return this; + if (featuresBuilder_ == null) { + if (!other.features_.isEmpty()) { + if (features_.isEmpty()) { + features_ = other.features_; + bitField0_ = (bitField0_ & ~0x00000001); + } else { + ensureFeaturesIsMutable(); + features_.addAll(other.features_); + } + onChanged(); + } + } else { + if (!other.features_.isEmpty()) { + if (featuresBuilder_.isEmpty()) { + featuresBuilder_.dispose(); + featuresBuilder_ = null; + features_ = other.features_; + bitField0_ = (bitField0_ & ~0x00000001); + featuresBuilder_ = + com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? + getFeaturesFieldBuilder() : null; + } else { + featuresBuilder_.addAllMessages(other.features_); + } + } + } + if (entityRowsBuilder_ == null) { + if (!other.entityRows_.isEmpty()) { + if (entityRows_.isEmpty()) { + entityRows_ = other.entityRows_; + bitField0_ = (bitField0_ & ~0x00000002); + } else { + ensureEntityRowsIsMutable(); + entityRows_.addAll(other.entityRows_); + } + onChanged(); + } + } else { + if (!other.entityRows_.isEmpty()) { + if (entityRowsBuilder_.isEmpty()) { + entityRowsBuilder_.dispose(); + entityRowsBuilder_ = null; + entityRows_ = other.entityRows_; + bitField0_ = (bitField0_ & ~0x00000002); + entityRowsBuilder_ = + com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? + getEntityRowsFieldBuilder() : null; + } else { + entityRowsBuilder_.addAllMessages(other.entityRows_); + } + } + } + if (!other.getProject().isEmpty()) { + project_ = other.project_; + onChanged(); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2 parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private java.util.List features_ = + java.util.Collections.emptyList(); + private void ensureFeaturesIsMutable() { + if (!((bitField0_ & 0x00000001) != 0)) { + features_ = new java.util.ArrayList(features_); + bitField0_ |= 0x00000001; + } + } + + private com.google.protobuf.RepeatedFieldBuilderV3< + feast.proto.serving.ServingAPIProto.FeatureReferenceV2, feast.proto.serving.ServingAPIProto.FeatureReferenceV2.Builder, feast.proto.serving.ServingAPIProto.FeatureReferenceV2OrBuilder> featuresBuilder_; + + /** + *
+       * List of features that are being retrieved
+       * 
+ * + * repeated .feast.serving.FeatureReferenceV2 features = 4; + */ + public java.util.List getFeaturesList() { + if (featuresBuilder_ == null) { + return java.util.Collections.unmodifiableList(features_); + } else { + return featuresBuilder_.getMessageList(); + } + } + /** + *
+       * List of features that are being retrieved
+       * 
+ * + * repeated .feast.serving.FeatureReferenceV2 features = 4; + */ + public int getFeaturesCount() { + if (featuresBuilder_ == null) { + return features_.size(); + } else { + return featuresBuilder_.getCount(); + } + } + /** + *
+       * List of features that are being retrieved
+       * 
+ * + * repeated .feast.serving.FeatureReferenceV2 features = 4; + */ + public feast.proto.serving.ServingAPIProto.FeatureReferenceV2 getFeatures(int index) { + if (featuresBuilder_ == null) { + return features_.get(index); + } else { + return featuresBuilder_.getMessage(index); + } + } + /** + *
+       * List of features that are being retrieved
+       * 
+ * + * repeated .feast.serving.FeatureReferenceV2 features = 4; + */ + public Builder setFeatures( + int index, feast.proto.serving.ServingAPIProto.FeatureReferenceV2 value) { + if (featuresBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureFeaturesIsMutable(); + features_.set(index, value); + onChanged(); + } else { + featuresBuilder_.setMessage(index, value); + } + return this; + } + /** + *
+       * List of features that are being retrieved
+       * 
+ * + * repeated .feast.serving.FeatureReferenceV2 features = 4; + */ + public Builder setFeatures( + int index, feast.proto.serving.ServingAPIProto.FeatureReferenceV2.Builder builderForValue) { + if (featuresBuilder_ == null) { + ensureFeaturesIsMutable(); + features_.set(index, builderForValue.build()); + onChanged(); + } else { + featuresBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + *
+       * List of features that are being retrieved
+       * 
+ * + * repeated .feast.serving.FeatureReferenceV2 features = 4; + */ + public Builder addFeatures(feast.proto.serving.ServingAPIProto.FeatureReferenceV2 value) { + if (featuresBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureFeaturesIsMutable(); + features_.add(value); + onChanged(); + } else { + featuresBuilder_.addMessage(value); + } + return this; + } + /** + *
+       * List of features that are being retrieved
+       * 
+ * + * repeated .feast.serving.FeatureReferenceV2 features = 4; + */ + public Builder addFeatures( + int index, feast.proto.serving.ServingAPIProto.FeatureReferenceV2 value) { + if (featuresBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureFeaturesIsMutable(); + features_.add(index, value); + onChanged(); + } else { + featuresBuilder_.addMessage(index, value); + } + return this; + } + /** + *
+       * List of features that are being retrieved
+       * 
+ * + * repeated .feast.serving.FeatureReferenceV2 features = 4; + */ + public Builder addFeatures( + feast.proto.serving.ServingAPIProto.FeatureReferenceV2.Builder builderForValue) { + if (featuresBuilder_ == null) { + ensureFeaturesIsMutable(); + features_.add(builderForValue.build()); + onChanged(); + } else { + featuresBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + *
+       * List of features that are being retrieved
+       * 
+ * + * repeated .feast.serving.FeatureReferenceV2 features = 4; + */ + public Builder addFeatures( + int index, feast.proto.serving.ServingAPIProto.FeatureReferenceV2.Builder builderForValue) { + if (featuresBuilder_ == null) { + ensureFeaturesIsMutable(); + features_.add(index, builderForValue.build()); + onChanged(); + } else { + featuresBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + *
+       * List of features that are being retrieved
+       * 
+ * + * repeated .feast.serving.FeatureReferenceV2 features = 4; + */ + public Builder addAllFeatures( + java.lang.Iterable values) { + if (featuresBuilder_ == null) { + ensureFeaturesIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, features_); + onChanged(); + } else { + featuresBuilder_.addAllMessages(values); + } + return this; + } + /** + *
+       * List of features that are being retrieved
+       * 
+ * + * repeated .feast.serving.FeatureReferenceV2 features = 4; + */ + public Builder clearFeatures() { + if (featuresBuilder_ == null) { + features_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + } else { + featuresBuilder_.clear(); + } + return this; + } + /** + *
+       * List of features that are being retrieved
+       * 
+ * + * repeated .feast.serving.FeatureReferenceV2 features = 4; + */ + public Builder removeFeatures(int index) { + if (featuresBuilder_ == null) { + ensureFeaturesIsMutable(); + features_.remove(index); + onChanged(); + } else { + featuresBuilder_.remove(index); + } + return this; + } + /** + *
+       * List of features that are being retrieved
+       * 
+ * + * repeated .feast.serving.FeatureReferenceV2 features = 4; + */ + public feast.proto.serving.ServingAPIProto.FeatureReferenceV2.Builder getFeaturesBuilder( + int index) { + return getFeaturesFieldBuilder().getBuilder(index); + } + /** + *
+       * List of features that are being retrieved
+       * 
+ * + * repeated .feast.serving.FeatureReferenceV2 features = 4; + */ + public feast.proto.serving.ServingAPIProto.FeatureReferenceV2OrBuilder getFeaturesOrBuilder( + int index) { + if (featuresBuilder_ == null) { + return features_.get(index); } else { + return featuresBuilder_.getMessageOrBuilder(index); + } + } + /** + *
+       * List of features that are being retrieved
+       * 
+ * + * repeated .feast.serving.FeatureReferenceV2 features = 4; + */ + public java.util.List + getFeaturesOrBuilderList() { + if (featuresBuilder_ != null) { + return featuresBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(features_); + } + } + /** + *
+       * List of features that are being retrieved
+       * 
+ * + * repeated .feast.serving.FeatureReferenceV2 features = 4; + */ + public feast.proto.serving.ServingAPIProto.FeatureReferenceV2.Builder addFeaturesBuilder() { + return getFeaturesFieldBuilder().addBuilder( + feast.proto.serving.ServingAPIProto.FeatureReferenceV2.getDefaultInstance()); + } + /** + *
+       * List of features that are being retrieved
+       * 
+ * + * repeated .feast.serving.FeatureReferenceV2 features = 4; + */ + public feast.proto.serving.ServingAPIProto.FeatureReferenceV2.Builder addFeaturesBuilder( + int index) { + return getFeaturesFieldBuilder().addBuilder( + index, feast.proto.serving.ServingAPIProto.FeatureReferenceV2.getDefaultInstance()); + } + /** + *
+       * List of features that are being retrieved
+       * 
+ * + * repeated .feast.serving.FeatureReferenceV2 features = 4; + */ + public java.util.List + getFeaturesBuilderList() { + return getFeaturesFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilderV3< + feast.proto.serving.ServingAPIProto.FeatureReferenceV2, feast.proto.serving.ServingAPIProto.FeatureReferenceV2.Builder, feast.proto.serving.ServingAPIProto.FeatureReferenceV2OrBuilder> + getFeaturesFieldBuilder() { + if (featuresBuilder_ == null) { + featuresBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3< + feast.proto.serving.ServingAPIProto.FeatureReferenceV2, feast.proto.serving.ServingAPIProto.FeatureReferenceV2.Builder, feast.proto.serving.ServingAPIProto.FeatureReferenceV2OrBuilder>( + features_, + ((bitField0_ & 0x00000001) != 0), + getParentForChildren(), + isClean()); + features_ = null; + } + return featuresBuilder_; + } + + private java.util.List entityRows_ = + java.util.Collections.emptyList(); + private void ensureEntityRowsIsMutable() { + if (!((bitField0_ & 0x00000002) != 0)) { + entityRows_ = new java.util.ArrayList(entityRows_); + bitField0_ |= 0x00000002; + } + } + + private com.google.protobuf.RepeatedFieldBuilderV3< + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow, feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow.Builder, feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRowOrBuilder> entityRowsBuilder_; + + /** + *
+       * 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 .feast.serving.GetOnlineFeaturesRequestV2.EntityRow entity_rows = 2; + */ + public java.util.List getEntityRowsList() { + if (entityRowsBuilder_ == null) { + return java.util.Collections.unmodifiableList(entityRows_); + } else { + return entityRowsBuilder_.getMessageList(); + } + } + /** + *
+       * 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 .feast.serving.GetOnlineFeaturesRequestV2.EntityRow entity_rows = 2; + */ + public int getEntityRowsCount() { + if (entityRowsBuilder_ == null) { + return entityRows_.size(); + } else { + return entityRowsBuilder_.getCount(); + } + } + /** + *
+       * 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 .feast.serving.GetOnlineFeaturesRequestV2.EntityRow entity_rows = 2; + */ + public feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow getEntityRows(int index) { + if (entityRowsBuilder_ == null) { + return entityRows_.get(index); + } else { + return entityRowsBuilder_.getMessage(index); + } + } + /** + *
+       * 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 .feast.serving.GetOnlineFeaturesRequestV2.EntityRow entity_rows = 2; + */ + public Builder setEntityRows( + int index, feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow value) { + if (entityRowsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureEntityRowsIsMutable(); + entityRows_.set(index, value); + onChanged(); + } else { + entityRowsBuilder_.setMessage(index, value); + } + return this; + } + /** + *
+       * 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 .feast.serving.GetOnlineFeaturesRequestV2.EntityRow entity_rows = 2; + */ + public Builder setEntityRows( + int index, feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow.Builder builderForValue) { + if (entityRowsBuilder_ == null) { + ensureEntityRowsIsMutable(); + entityRows_.set(index, builderForValue.build()); + onChanged(); + } else { + entityRowsBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + *
+       * 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 .feast.serving.GetOnlineFeaturesRequestV2.EntityRow entity_rows = 2; + */ + public Builder addEntityRows(feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow value) { + if (entityRowsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureEntityRowsIsMutable(); + entityRows_.add(value); + onChanged(); + } else { + entityRowsBuilder_.addMessage(value); + } + return this; + } + /** + *
+       * 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 .feast.serving.GetOnlineFeaturesRequestV2.EntityRow entity_rows = 2; + */ + public Builder addEntityRows( + int index, feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow value) { + if (entityRowsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureEntityRowsIsMutable(); + entityRows_.add(index, value); + onChanged(); + } else { + entityRowsBuilder_.addMessage(index, value); + } + return this; + } + /** + *
+       * 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 .feast.serving.GetOnlineFeaturesRequestV2.EntityRow entity_rows = 2; + */ + public Builder addEntityRows( + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow.Builder builderForValue) { + if (entityRowsBuilder_ == null) { + ensureEntityRowsIsMutable(); + entityRows_.add(builderForValue.build()); + onChanged(); + } else { + entityRowsBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + *
+       * 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 .feast.serving.GetOnlineFeaturesRequestV2.EntityRow entity_rows = 2; + */ + public Builder addEntityRows( + int index, feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow.Builder builderForValue) { + if (entityRowsBuilder_ == null) { + ensureEntityRowsIsMutable(); + entityRows_.add(index, builderForValue.build()); + onChanged(); + } else { + entityRowsBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + *
+       * 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 .feast.serving.GetOnlineFeaturesRequestV2.EntityRow entity_rows = 2; + */ + public Builder addAllEntityRows( + java.lang.Iterable values) { + if (entityRowsBuilder_ == null) { + ensureEntityRowsIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, entityRows_); + onChanged(); + } else { + entityRowsBuilder_.addAllMessages(values); + } + return this; + } + /** + *
+       * 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 .feast.serving.GetOnlineFeaturesRequestV2.EntityRow entity_rows = 2; + */ + public Builder clearEntityRows() { + if (entityRowsBuilder_ == null) { + entityRows_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000002); + onChanged(); + } else { + entityRowsBuilder_.clear(); + } + return this; + } + /** + *
+       * 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 .feast.serving.GetOnlineFeaturesRequestV2.EntityRow entity_rows = 2; + */ + public Builder removeEntityRows(int index) { + if (entityRowsBuilder_ == null) { + ensureEntityRowsIsMutable(); + entityRows_.remove(index); + onChanged(); + } else { + entityRowsBuilder_.remove(index); + } + return this; + } + /** + *
+       * 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 .feast.serving.GetOnlineFeaturesRequestV2.EntityRow entity_rows = 2; + */ + public feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow.Builder getEntityRowsBuilder( + int index) { + return getEntityRowsFieldBuilder().getBuilder(index); + } + /** + *
+       * 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 .feast.serving.GetOnlineFeaturesRequestV2.EntityRow entity_rows = 2; + */ + public feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRowOrBuilder getEntityRowsOrBuilder( + int index) { + if (entityRowsBuilder_ == null) { + return entityRows_.get(index); } else { + return entityRowsBuilder_.getMessageOrBuilder(index); + } + } + /** + *
+       * 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 .feast.serving.GetOnlineFeaturesRequestV2.EntityRow entity_rows = 2; + */ + public java.util.List + getEntityRowsOrBuilderList() { + if (entityRowsBuilder_ != null) { + return entityRowsBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(entityRows_); + } + } + /** + *
+       * 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 .feast.serving.GetOnlineFeaturesRequestV2.EntityRow entity_rows = 2; + */ + public feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow.Builder addEntityRowsBuilder() { + return getEntityRowsFieldBuilder().addBuilder( + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow.getDefaultInstance()); + } + /** + *
+       * 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 .feast.serving.GetOnlineFeaturesRequestV2.EntityRow entity_rows = 2; + */ + public feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow.Builder addEntityRowsBuilder( + int index) { + return getEntityRowsFieldBuilder().addBuilder( + index, feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow.getDefaultInstance()); + } + /** + *
+       * 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 .feast.serving.GetOnlineFeaturesRequestV2.EntityRow entity_rows = 2; + */ + public java.util.List + getEntityRowsBuilderList() { + return getEntityRowsFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilderV3< + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow, feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow.Builder, feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRowOrBuilder> + getEntityRowsFieldBuilder() { + if (entityRowsBuilder_ == null) { + entityRowsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3< + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow, feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRow.Builder, feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2.EntityRowOrBuilder>( + entityRows_, + ((bitField0_ & 0x00000002) != 0), + getParentForChildren(), + isClean()); + entityRows_ = null; + } + return entityRowsBuilder_; + } + + private java.lang.Object project_ = ""; + /** + *
+       * 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; + * @return The project. + */ + public java.lang.String getProject() { + java.lang.Object ref = project_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + project_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + *
+       * 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; + * @return The bytes for project. + */ + public com.google.protobuf.ByteString + getProjectBytes() { + java.lang.Object ref = project_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + project_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + *
+       * 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; + * @param value The project to set. + * @return This builder for chaining. + */ + public Builder setProject( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + project_ = value; + onChanged(); + return this; + } + /** + *
+       * 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; + * @return This builder for chaining. + */ + public Builder clearProject() { + + project_ = getDefaultInstance().getProject(); + onChanged(); + return this; + } + /** + *
+       * 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; + * @param value The bytes for project to set. + * @return This builder for chaining. + */ + public Builder setProjectBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + project_ = value; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:feast.serving.GetOnlineFeaturesRequestV2) + } + + // @@protoc_insertion_point(class_scope:feast.serving.GetOnlineFeaturesRequestV2) + private static final feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2 DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2(); + } + + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2 getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public GetOnlineFeaturesRequestV2 parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new GetOnlineFeaturesRequestV2(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2 getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface FeatureListOrBuilder extends + // @@protoc_insertion_point(interface_extends:feast.serving.FeatureList) + com.google.protobuf.MessageOrBuilder { + + /** + * repeated string val = 1; + * @return A list containing the val. + */ + java.util.List + getValList(); + /** + * repeated string val = 1; + * @return The count of val. + */ + int getValCount(); + /** + * repeated string val = 1; + * @param index The index of the element to return. + * @return The val at the given index. + */ + java.lang.String getVal(int index); + /** + * repeated string val = 1; + * @param index The index of the value to return. + * @return The bytes of the val at the given index. + */ + com.google.protobuf.ByteString + getValBytes(int index); + } + /** + *
+   * In JSON "val" field can be omitted
+   * 
+ * + * Protobuf type {@code feast.serving.FeatureList} + */ + public static final class FeatureList extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:feast.serving.FeatureList) + FeatureListOrBuilder { + private static final long serialVersionUID = 0L; + // Use FeatureList.newBuilder() to construct. + private FeatureList(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private FeatureList() { + val_ = com.google.protobuf.LazyStringArrayList.EMPTY; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new FeatureList(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private FeatureList( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + java.lang.String s = input.readStringRequireUtf8(); + if (!((mutable_bitField0_ & 0x00000001) != 0)) { + val_ = new com.google.protobuf.LazyStringArrayList(); + mutable_bitField0_ |= 0x00000001; + } + val_.add(s); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000001) != 0)) { + val_ = val_.getUnmodifiableView(); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return feast.proto.serving.ServingAPIProto.internal_static_feast_serving_FeatureList_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return feast.proto.serving.ServingAPIProto.internal_static_feast_serving_FeatureList_fieldAccessorTable + .ensureFieldAccessorsInitialized( + feast.proto.serving.ServingAPIProto.FeatureList.class, feast.proto.serving.ServingAPIProto.FeatureList.Builder.class); + } + + public static final int VAL_FIELD_NUMBER = 1; + private com.google.protobuf.LazyStringList val_; + /** + * repeated string val = 1; + * @return A list containing the val. + */ + public com.google.protobuf.ProtocolStringList + getValList() { + return val_; + } + /** + * repeated string val = 1; + * @return The count of val. + */ + public int getValCount() { + return val_.size(); + } + /** + * repeated string val = 1; + * @param index The index of the element to return. + * @return The val at the given index. + */ + public java.lang.String getVal(int index) { + return val_.get(index); + } + /** + * repeated string val = 1; + * @param index The index of the value to return. + * @return The bytes of the val at the given index. + */ + public com.google.protobuf.ByteString + getValBytes(int index) { + return val_.getByteString(index); + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + for (int i = 0; i < val_.size(); i++) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, val_.getRaw(i)); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + { + int dataSize = 0; + for (int i = 0; i < val_.size(); i++) { + dataSize += computeStringSizeNoTag(val_.getRaw(i)); + } + size += dataSize; + size += 1 * getValList().size(); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof feast.proto.serving.ServingAPIProto.FeatureList)) { + return super.equals(obj); + } + feast.proto.serving.ServingAPIProto.FeatureList other = (feast.proto.serving.ServingAPIProto.FeatureList) obj; + + if (!getValList() + .equals(other.getValList())) return false; + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (getValCount() > 0) { + hash = (37 * hash) + VAL_FIELD_NUMBER; + hash = (53 * hash) + getValList().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static feast.proto.serving.ServingAPIProto.FeatureList parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static feast.proto.serving.ServingAPIProto.FeatureList parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static feast.proto.serving.ServingAPIProto.FeatureList parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static feast.proto.serving.ServingAPIProto.FeatureList parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static feast.proto.serving.ServingAPIProto.FeatureList parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static feast.proto.serving.ServingAPIProto.FeatureList parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static feast.proto.serving.ServingAPIProto.FeatureList parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static feast.proto.serving.ServingAPIProto.FeatureList parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static feast.proto.serving.ServingAPIProto.FeatureList parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static feast.proto.serving.ServingAPIProto.FeatureList parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static feast.proto.serving.ServingAPIProto.FeatureList parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static feast.proto.serving.ServingAPIProto.FeatureList parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(feast.proto.serving.ServingAPIProto.FeatureList prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
+     * In JSON "val" field can be omitted
+     * 
+ * + * Protobuf type {@code feast.serving.FeatureList} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:feast.serving.FeatureList) + feast.proto.serving.ServingAPIProto.FeatureListOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return feast.proto.serving.ServingAPIProto.internal_static_feast_serving_FeatureList_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return feast.proto.serving.ServingAPIProto.internal_static_feast_serving_FeatureList_fieldAccessorTable + .ensureFieldAccessorsInitialized( + feast.proto.serving.ServingAPIProto.FeatureList.class, feast.proto.serving.ServingAPIProto.FeatureList.Builder.class); + } + + // Construct using feast.proto.serving.ServingAPIProto.FeatureList.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + val_ = com.google.protobuf.LazyStringArrayList.EMPTY; + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return feast.proto.serving.ServingAPIProto.internal_static_feast_serving_FeatureList_descriptor; + } + + @java.lang.Override + public feast.proto.serving.ServingAPIProto.FeatureList getDefaultInstanceForType() { + return feast.proto.serving.ServingAPIProto.FeatureList.getDefaultInstance(); + } + + @java.lang.Override + public feast.proto.serving.ServingAPIProto.FeatureList build() { + feast.proto.serving.ServingAPIProto.FeatureList result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public feast.proto.serving.ServingAPIProto.FeatureList buildPartial() { + feast.proto.serving.ServingAPIProto.FeatureList result = new feast.proto.serving.ServingAPIProto.FeatureList(this); + int from_bitField0_ = bitField0_; + if (((bitField0_ & 0x00000001) != 0)) { + val_ = val_.getUnmodifiableView(); + bitField0_ = (bitField0_ & ~0x00000001); + } + result.val_ = val_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof feast.proto.serving.ServingAPIProto.FeatureList) { + return mergeFrom((feast.proto.serving.ServingAPIProto.FeatureList)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(feast.proto.serving.ServingAPIProto.FeatureList other) { + if (other == feast.proto.serving.ServingAPIProto.FeatureList.getDefaultInstance()) return this; + if (!other.val_.isEmpty()) { + if (val_.isEmpty()) { + val_ = other.val_; + bitField0_ = (bitField0_ & ~0x00000001); + } else { + ensureValIsMutable(); + val_.addAll(other.val_); + } + onChanged(); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + feast.proto.serving.ServingAPIProto.FeatureList parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (feast.proto.serving.ServingAPIProto.FeatureList) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private com.google.protobuf.LazyStringList val_ = com.google.protobuf.LazyStringArrayList.EMPTY; + private void ensureValIsMutable() { + if (!((bitField0_ & 0x00000001) != 0)) { + val_ = new com.google.protobuf.LazyStringArrayList(val_); + bitField0_ |= 0x00000001; + } + } + /** + * repeated string val = 1; + * @return A list containing the val. + */ + public com.google.protobuf.ProtocolStringList + getValList() { + return val_.getUnmodifiableView(); + } + /** + * repeated string val = 1; + * @return The count of val. + */ + public int getValCount() { + return val_.size(); + } + /** + * repeated string val = 1; + * @param index The index of the element to return. + * @return The val at the given index. + */ + public java.lang.String getVal(int index) { + return val_.get(index); + } + /** + * repeated string val = 1; + * @param index The index of the value to return. + * @return The bytes of the val at the given index. + */ + public com.google.protobuf.ByteString + getValBytes(int index) { + return val_.getByteString(index); + } + /** + * repeated string val = 1; + * @param index The index to set the value at. + * @param value The val to set. + * @return This builder for chaining. + */ + public Builder setVal( + int index, java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + ensureValIsMutable(); + val_.set(index, value); + onChanged(); + return this; + } + /** + * repeated string val = 1; + * @param value The val to add. + * @return This builder for chaining. + */ + public Builder addVal( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + ensureValIsMutable(); + val_.add(value); + onChanged(); + return this; + } + /** + * repeated string val = 1; + * @param values The val to add. + * @return This builder for chaining. + */ + public Builder addAllVal( + java.lang.Iterable values) { + ensureValIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, val_); + onChanged(); + return this; + } + /** + * repeated string val = 1; + * @return This builder for chaining. + */ + public Builder clearVal() { + val_ = com.google.protobuf.LazyStringArrayList.EMPTY; + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + return this; + } + /** + * repeated string val = 1; + * @param value The bytes of the val to add. + * @return This builder for chaining. + */ + public Builder addValBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + ensureValIsMutable(); + val_.add(value); + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:feast.serving.FeatureList) + } + + // @@protoc_insertion_point(class_scope:feast.serving.FeatureList) + private static final feast.proto.serving.ServingAPIProto.FeatureList DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new feast.proto.serving.ServingAPIProto.FeatureList(); + } + + public static feast.proto.serving.ServingAPIProto.FeatureList getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public FeatureList parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new FeatureList(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public feast.proto.serving.ServingAPIProto.FeatureList getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface GetOnlineFeaturesRequestOrBuilder extends + // @@protoc_insertion_point(interface_extends:feast.serving.GetOnlineFeaturesRequest) + com.google.protobuf.MessageOrBuilder { + + /** + * string feature_service = 1; + * @return Whether the featureService field is set. + */ + boolean hasFeatureService(); + /** + * string feature_service = 1; + * @return The featureService. + */ + java.lang.String getFeatureService(); + /** + * string feature_service = 1; + * @return The bytes for featureService. + */ + com.google.protobuf.ByteString + getFeatureServiceBytes(); + + /** + * .feast.serving.FeatureList features = 2; + * @return Whether the features field is set. + */ + boolean hasFeatures(); + /** + * .feast.serving.FeatureList features = 2; + * @return The features. + */ + feast.proto.serving.ServingAPIProto.FeatureList getFeatures(); + /** + * .feast.serving.FeatureList features = 2; + */ + feast.proto.serving.ServingAPIProto.FeatureListOrBuilder getFeaturesOrBuilder(); + + /** + *
+     * The entity data is specified in a columnar format
+     * A map of entity name -> list of values
+     * 
+ * + * map<string, .feast.types.RepeatedValue> entities = 3; + */ + int getEntitiesCount(); + /** + *
+     * The entity data is specified in a columnar format
+     * A map of entity name -> list of values
+     * 
+ * + * map<string, .feast.types.RepeatedValue> entities = 3; + */ + boolean containsEntities( + java.lang.String key); + /** + * Use {@link #getEntitiesMap()} instead. + */ + @java.lang.Deprecated + java.util.Map + getEntities(); + /** + *
+     * The entity data is specified in a columnar format
+     * A map of entity name -> list of values
+     * 
+ * + * map<string, .feast.types.RepeatedValue> entities = 3; + */ + java.util.Map + getEntitiesMap(); + /** + *
+     * The entity data is specified in a columnar format
+     * A map of entity name -> list of values
+     * 
+ * + * map<string, .feast.types.RepeatedValue> entities = 3; + */ + + /* nullable */ +feast.proto.types.ValueProto.RepeatedValue getEntitiesOrDefault( + java.lang.String key, + /* nullable */ +feast.proto.types.ValueProto.RepeatedValue defaultValue); + /** + *
+     * The entity data is specified in a columnar format
+     * A map of entity name -> list of values
+     * 
+ * + * map<string, .feast.types.RepeatedValue> entities = 3; + */ + + feast.proto.types.ValueProto.RepeatedValue getEntitiesOrThrow( + java.lang.String key); + + /** + * bool full_feature_names = 4; + * @return The fullFeatureNames. + */ + boolean getFullFeatureNames(); + + /** + *
+     * Context for OnDemand Feature Transformation
+     * (was moved to dedicated parameter to avoid unnecessary separation logic on serving side)
+     * A map of variable name -> list of values
+     * 
+ * + * map<string, .feast.types.RepeatedValue> request_context = 5; + */ + int getRequestContextCount(); + /** + *
+     * Context for OnDemand Feature Transformation
+     * (was moved to dedicated parameter to avoid unnecessary separation logic on serving side)
+     * A map of variable name -> list of values
+     * 
+ * + * map<string, .feast.types.RepeatedValue> request_context = 5; + */ + boolean containsRequestContext( + java.lang.String key); + /** + * Use {@link #getRequestContextMap()} instead. + */ + @java.lang.Deprecated + java.util.Map + getRequestContext(); + /** + *
+     * Context for OnDemand Feature Transformation
+     * (was moved to dedicated parameter to avoid unnecessary separation logic on serving side)
+     * A map of variable name -> list of values
+     * 
+ * + * map<string, .feast.types.RepeatedValue> request_context = 5; + */ + java.util.Map + getRequestContextMap(); + /** + *
+     * Context for OnDemand Feature Transformation
+     * (was moved to dedicated parameter to avoid unnecessary separation logic on serving side)
+     * A map of variable name -> list of values
+     * 
+ * + * map<string, .feast.types.RepeatedValue> request_context = 5; + */ + + /* nullable */ +feast.proto.types.ValueProto.RepeatedValue getRequestContextOrDefault( + java.lang.String key, + /* nullable */ +feast.proto.types.ValueProto.RepeatedValue defaultValue); + /** + *
+     * Context for OnDemand Feature Transformation
+     * (was moved to dedicated parameter to avoid unnecessary separation logic on serving side)
+     * A map of variable name -> list of values
+     * 
+ * + * map<string, .feast.types.RepeatedValue> request_context = 5; + */ + + feast.proto.types.ValueProto.RepeatedValue getRequestContextOrThrow( + java.lang.String key); + + public feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest.KindCase getKindCase(); + } + /** + * Protobuf type {@code feast.serving.GetOnlineFeaturesRequest} + */ + public static final class GetOnlineFeaturesRequest extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:feast.serving.GetOnlineFeaturesRequest) + GetOnlineFeaturesRequestOrBuilder { + private static final long serialVersionUID = 0L; + // Use GetOnlineFeaturesRequest.newBuilder() to construct. + private GetOnlineFeaturesRequest(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private GetOnlineFeaturesRequest() { + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new GetOnlineFeaturesRequest(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private GetOnlineFeaturesRequest( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + java.lang.String s = input.readStringRequireUtf8(); + kindCase_ = 1; + kind_ = s; + break; + } + case 18: { + feast.proto.serving.ServingAPIProto.FeatureList.Builder subBuilder = null; + if (kindCase_ == 2) { + subBuilder = ((feast.proto.serving.ServingAPIProto.FeatureList) kind_).toBuilder(); + } + kind_ = + input.readMessage(feast.proto.serving.ServingAPIProto.FeatureList.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom((feast.proto.serving.ServingAPIProto.FeatureList) kind_); + kind_ = subBuilder.buildPartial(); + } + kindCase_ = 2; + break; + } + case 26: { + if (!((mutable_bitField0_ & 0x00000001) != 0)) { + entities_ = com.google.protobuf.MapField.newMapField( + EntitiesDefaultEntryHolder.defaultEntry); + mutable_bitField0_ |= 0x00000001; + } + com.google.protobuf.MapEntry + entities__ = input.readMessage( + EntitiesDefaultEntryHolder.defaultEntry.getParserForType(), extensionRegistry); + entities_.getMutableMap().put( + entities__.getKey(), entities__.getValue()); + break; + } + case 32: { + + fullFeatureNames_ = input.readBool(); + break; + } + case 42: { + if (!((mutable_bitField0_ & 0x00000002) != 0)) { + requestContext_ = com.google.protobuf.MapField.newMapField( + RequestContextDefaultEntryHolder.defaultEntry); + mutable_bitField0_ |= 0x00000002; + } + com.google.protobuf.MapEntry + requestContext__ = input.readMessage( + RequestContextDefaultEntryHolder.defaultEntry.getParserForType(), extensionRegistry); + requestContext_.getMutableMap().put( + requestContext__.getKey(), requestContext__.getValue()); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return feast.proto.serving.ServingAPIProto.internal_static_feast_serving_GetOnlineFeaturesRequest_descriptor; + } + + @SuppressWarnings({"rawtypes"}) + @java.lang.Override + protected com.google.protobuf.MapField internalGetMapField( + int number) { + switch (number) { + case 3: + return internalGetEntities(); + case 5: + return internalGetRequestContext(); + default: + throw new RuntimeException( + "Invalid map field number: " + number); + } + } + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return feast.proto.serving.ServingAPIProto.internal_static_feast_serving_GetOnlineFeaturesRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest.class, feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest.Builder.class); + } + + private int kindCase_ = 0; + private java.lang.Object kind_; + public enum KindCase + implements com.google.protobuf.Internal.EnumLite, + com.google.protobuf.AbstractMessage.InternalOneOfEnum { + FEATURE_SERVICE(1), + FEATURES(2), + KIND_NOT_SET(0); + private final int value; + private KindCase(int value) { + this.value = value; + } + /** + * @param value The number of the enum to look for. + * @return The enum associated with the given number. + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static KindCase valueOf(int value) { + return forNumber(value); + } + + public static KindCase forNumber(int value) { + switch (value) { + case 1: return FEATURE_SERVICE; + case 2: return FEATURES; + case 0: return KIND_NOT_SET; + default: return null; + } + } + public int getNumber() { + return this.value; + } + }; + + public KindCase + getKindCase() { + return KindCase.forNumber( + kindCase_); + } + + public static final int FEATURE_SERVICE_FIELD_NUMBER = 1; + /** + * string feature_service = 1; + * @return Whether the featureService field is set. + */ + public boolean hasFeatureService() { + return kindCase_ == 1; + } + /** + * string feature_service = 1; + * @return The featureService. + */ + public java.lang.String getFeatureService() { + java.lang.Object ref = ""; + if (kindCase_ == 1) { + ref = kind_; + } + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (kindCase_ == 1) { + kind_ = s; + } + return s; + } + } + /** + * string feature_service = 1; + * @return The bytes for featureService. + */ + public com.google.protobuf.ByteString + getFeatureServiceBytes() { + java.lang.Object ref = ""; + if (kindCase_ == 1) { + ref = kind_; + } + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + if (kindCase_ == 1) { + kind_ = b; + } + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int FEATURES_FIELD_NUMBER = 2; + /** + * .feast.serving.FeatureList features = 2; + * @return Whether the features field is set. + */ + @java.lang.Override + public boolean hasFeatures() { + return kindCase_ == 2; + } + /** + * .feast.serving.FeatureList features = 2; + * @return The features. + */ + @java.lang.Override + public feast.proto.serving.ServingAPIProto.FeatureList getFeatures() { + if (kindCase_ == 2) { + return (feast.proto.serving.ServingAPIProto.FeatureList) kind_; + } + return feast.proto.serving.ServingAPIProto.FeatureList.getDefaultInstance(); + } + /** + * .feast.serving.FeatureList features = 2; + */ + @java.lang.Override + public feast.proto.serving.ServingAPIProto.FeatureListOrBuilder getFeaturesOrBuilder() { + if (kindCase_ == 2) { + return (feast.proto.serving.ServingAPIProto.FeatureList) kind_; + } + return feast.proto.serving.ServingAPIProto.FeatureList.getDefaultInstance(); + } + + public static final int ENTITIES_FIELD_NUMBER = 3; + private static final class EntitiesDefaultEntryHolder { + static final com.google.protobuf.MapEntry< + java.lang.String, feast.proto.types.ValueProto.RepeatedValue> defaultEntry = + com.google.protobuf.MapEntry + .newDefaultInstance( + feast.proto.serving.ServingAPIProto.internal_static_feast_serving_GetOnlineFeaturesRequest_EntitiesEntry_descriptor, + com.google.protobuf.WireFormat.FieldType.STRING, + "", + com.google.protobuf.WireFormat.FieldType.MESSAGE, + feast.proto.types.ValueProto.RepeatedValue.getDefaultInstance()); + } + private com.google.protobuf.MapField< + java.lang.String, feast.proto.types.ValueProto.RepeatedValue> entities_; + private com.google.protobuf.MapField + internalGetEntities() { + if (entities_ == null) { + return com.google.protobuf.MapField.emptyMapField( + EntitiesDefaultEntryHolder.defaultEntry); + } + return entities_; + } + + public int getEntitiesCount() { + return internalGetEntities().getMap().size(); + } + /** + *
+     * The entity data is specified in a columnar format
+     * A map of entity name -> list of values
+     * 
+ * + * map<string, .feast.types.RepeatedValue> entities = 3; + */ + + @java.lang.Override + public boolean containsEntities( + java.lang.String key) { + if (key == null) { throw new NullPointerException("map key"); } + return internalGetEntities().getMap().containsKey(key); + } + /** + * Use {@link #getEntitiesMap()} instead. + */ + @java.lang.Override + @java.lang.Deprecated + public java.util.Map getEntities() { + return getEntitiesMap(); + } + /** + *
+     * The entity data is specified in a columnar format
+     * A map of entity name -> list of values
+     * 
+ * + * map<string, .feast.types.RepeatedValue> entities = 3; + */ + @java.lang.Override + + public java.util.Map getEntitiesMap() { + return internalGetEntities().getMap(); + } + /** + *
+     * The entity data is specified in a columnar format
+     * A map of entity name -> list of values
+     * 
+ * + * map<string, .feast.types.RepeatedValue> entities = 3; + */ + @java.lang.Override + + public feast.proto.types.ValueProto.RepeatedValue getEntitiesOrDefault( + java.lang.String key, + feast.proto.types.ValueProto.RepeatedValue defaultValue) { + if (key == null) { throw new NullPointerException("map key"); } + java.util.Map map = + internalGetEntities().getMap(); + return map.containsKey(key) ? map.get(key) : defaultValue; + } + /** + *
+     * The entity data is specified in a columnar format
+     * A map of entity name -> list of values
+     * 
+ * + * map<string, .feast.types.RepeatedValue> entities = 3; + */ + @java.lang.Override + + public feast.proto.types.ValueProto.RepeatedValue getEntitiesOrThrow( + java.lang.String key) { + if (key == null) { throw new NullPointerException("map key"); } + java.util.Map map = + internalGetEntities().getMap(); + if (!map.containsKey(key)) { + throw new java.lang.IllegalArgumentException(); + } + return map.get(key); + } + + public static final int FULL_FEATURE_NAMES_FIELD_NUMBER = 4; + private boolean fullFeatureNames_; + /** + * bool full_feature_names = 4; + * @return The fullFeatureNames. + */ + @java.lang.Override + public boolean getFullFeatureNames() { + return fullFeatureNames_; + } + + public static final int REQUEST_CONTEXT_FIELD_NUMBER = 5; + private static final class RequestContextDefaultEntryHolder { + static final com.google.protobuf.MapEntry< + java.lang.String, feast.proto.types.ValueProto.RepeatedValue> defaultEntry = + com.google.protobuf.MapEntry + .newDefaultInstance( + feast.proto.serving.ServingAPIProto.internal_static_feast_serving_GetOnlineFeaturesRequest_RequestContextEntry_descriptor, + com.google.protobuf.WireFormat.FieldType.STRING, + "", + com.google.protobuf.WireFormat.FieldType.MESSAGE, + feast.proto.types.ValueProto.RepeatedValue.getDefaultInstance()); + } + private com.google.protobuf.MapField< + java.lang.String, feast.proto.types.ValueProto.RepeatedValue> requestContext_; + private com.google.protobuf.MapField + internalGetRequestContext() { + if (requestContext_ == null) { + return com.google.protobuf.MapField.emptyMapField( + RequestContextDefaultEntryHolder.defaultEntry); + } + return requestContext_; + } + + public int getRequestContextCount() { + return internalGetRequestContext().getMap().size(); + } + /** + *
+     * Context for OnDemand Feature Transformation
+     * (was moved to dedicated parameter to avoid unnecessary separation logic on serving side)
+     * A map of variable name -> list of values
+     * 
+ * + * map<string, .feast.types.RepeatedValue> request_context = 5; + */ + + @java.lang.Override + public boolean containsRequestContext( + java.lang.String key) { + if (key == null) { throw new NullPointerException("map key"); } + return internalGetRequestContext().getMap().containsKey(key); + } + /** + * Use {@link #getRequestContextMap()} instead. + */ + @java.lang.Override + @java.lang.Deprecated + public java.util.Map getRequestContext() { + return getRequestContextMap(); + } + /** + *
+     * Context for OnDemand Feature Transformation
+     * (was moved to dedicated parameter to avoid unnecessary separation logic on serving side)
+     * A map of variable name -> list of values
+     * 
+ * + * map<string, .feast.types.RepeatedValue> request_context = 5; + */ + @java.lang.Override + + public java.util.Map getRequestContextMap() { + return internalGetRequestContext().getMap(); + } + /** + *
+     * Context for OnDemand Feature Transformation
+     * (was moved to dedicated parameter to avoid unnecessary separation logic on serving side)
+     * A map of variable name -> list of values
+     * 
+ * + * map<string, .feast.types.RepeatedValue> request_context = 5; + */ + @java.lang.Override + + public feast.proto.types.ValueProto.RepeatedValue getRequestContextOrDefault( + java.lang.String key, + feast.proto.types.ValueProto.RepeatedValue defaultValue) { + if (key == null) { throw new NullPointerException("map key"); } + java.util.Map map = + internalGetRequestContext().getMap(); + return map.containsKey(key) ? map.get(key) : defaultValue; + } + /** + *
+     * Context for OnDemand Feature Transformation
+     * (was moved to dedicated parameter to avoid unnecessary separation logic on serving side)
+     * A map of variable name -> list of values
+     * 
+ * + * map<string, .feast.types.RepeatedValue> request_context = 5; + */ + @java.lang.Override + + public feast.proto.types.ValueProto.RepeatedValue getRequestContextOrThrow( + java.lang.String key) { + if (key == null) { throw new NullPointerException("map key"); } + java.util.Map map = + internalGetRequestContext().getMap(); + if (!map.containsKey(key)) { + throw new java.lang.IllegalArgumentException(); + } + return map.get(key); + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (kindCase_ == 1) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, kind_); + } + if (kindCase_ == 2) { + output.writeMessage(2, (feast.proto.serving.ServingAPIProto.FeatureList) kind_); + } + com.google.protobuf.GeneratedMessageV3 + .serializeStringMapTo( + output, + internalGetEntities(), + EntitiesDefaultEntryHolder.defaultEntry, + 3); + if (fullFeatureNames_ != false) { + output.writeBool(4, fullFeatureNames_); + } + com.google.protobuf.GeneratedMessageV3 + .serializeStringMapTo( + output, + internalGetRequestContext(), + RequestContextDefaultEntryHolder.defaultEntry, + 5); + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (kindCase_ == 1) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, kind_); + } + if (kindCase_ == 2) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(2, (feast.proto.serving.ServingAPIProto.FeatureList) kind_); + } + for (java.util.Map.Entry entry + : internalGetEntities().getMap().entrySet()) { + com.google.protobuf.MapEntry + entities__ = EntitiesDefaultEntryHolder.defaultEntry.newBuilderForType() + .setKey(entry.getKey()) + .setValue(entry.getValue()) + .build(); + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(3, entities__); + } + if (fullFeatureNames_ != false) { + size += com.google.protobuf.CodedOutputStream + .computeBoolSize(4, fullFeatureNames_); + } + for (java.util.Map.Entry entry + : internalGetRequestContext().getMap().entrySet()) { + com.google.protobuf.MapEntry + requestContext__ = RequestContextDefaultEntryHolder.defaultEntry.newBuilderForType() + .setKey(entry.getKey()) + .setValue(entry.getValue()) + .build(); + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(5, requestContext__); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest)) { + return super.equals(obj); + } + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest other = (feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest) obj; + + if (!internalGetEntities().equals( + other.internalGetEntities())) return false; + if (getFullFeatureNames() + != other.getFullFeatureNames()) return false; + if (!internalGetRequestContext().equals( + other.internalGetRequestContext())) return false; + if (!getKindCase().equals(other.getKindCase())) return false; + switch (kindCase_) { + case 1: + if (!getFeatureService() + .equals(other.getFeatureService())) return false; + break; + case 2: + if (!getFeatures() + .equals(other.getFeatures())) return false; + break; + case 0: + default: + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (!internalGetEntities().getMap().isEmpty()) { + hash = (37 * hash) + ENTITIES_FIELD_NUMBER; + hash = (53 * hash) + internalGetEntities().hashCode(); + } + hash = (37 * hash) + FULL_FEATURE_NAMES_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean( + getFullFeatureNames()); + if (!internalGetRequestContext().getMap().isEmpty()) { + hash = (37 * hash) + REQUEST_CONTEXT_FIELD_NUMBER; + hash = (53 * hash) + internalGetRequestContext().hashCode(); + } + switch (kindCase_) { + case 1: + hash = (37 * hash) + FEATURE_SERVICE_FIELD_NUMBER; + hash = (53 * hash) + getFeatureService().hashCode(); + break; + case 2: + hash = (37 * hash) + FEATURES_FIELD_NUMBER; + hash = (53 * hash) + getFeatures().hashCode(); + break; + case 0: + default: + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code feast.serving.GetOnlineFeaturesRequest} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:feast.serving.GetOnlineFeaturesRequest) + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return feast.proto.serving.ServingAPIProto.internal_static_feast_serving_GetOnlineFeaturesRequest_descriptor; + } + + @SuppressWarnings({"rawtypes"}) + protected com.google.protobuf.MapField internalGetMapField( + int number) { + switch (number) { + case 3: + return internalGetEntities(); + case 5: + return internalGetRequestContext(); + default: + throw new RuntimeException( + "Invalid map field number: " + number); + } + } + @SuppressWarnings({"rawtypes"}) + protected com.google.protobuf.MapField internalGetMutableMapField( + int number) { + switch (number) { + case 3: + return internalGetMutableEntities(); + case 5: + return internalGetMutableRequestContext(); + default: + throw new RuntimeException( + "Invalid map field number: " + number); + } + } + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return feast.proto.serving.ServingAPIProto.internal_static_feast_serving_GetOnlineFeaturesRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest.class, feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest.Builder.class); + } + + // Construct using feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + internalGetMutableEntities().clear(); + fullFeatureNames_ = false; + + internalGetMutableRequestContext().clear(); + kindCase_ = 0; + kind_ = null; + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return feast.proto.serving.ServingAPIProto.internal_static_feast_serving_GetOnlineFeaturesRequest_descriptor; + } + + @java.lang.Override + public feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest getDefaultInstanceForType() { + return feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest.getDefaultInstance(); + } + + @java.lang.Override + public feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest build() { + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest buildPartial() { + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest result = new feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest(this); + int from_bitField0_ = bitField0_; + if (kindCase_ == 1) { + result.kind_ = kind_; + } + if (kindCase_ == 2) { + if (featuresBuilder_ == null) { + result.kind_ = kind_; + } else { + result.kind_ = featuresBuilder_.build(); + } + } + result.entities_ = internalGetEntities(); + result.entities_.makeImmutable(); + result.fullFeatureNames_ = fullFeatureNames_; + result.requestContext_ = internalGetRequestContext(); + result.requestContext_.makeImmutable(); + result.kindCase_ = kindCase_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest) { + return mergeFrom((feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest other) { + if (other == feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest.getDefaultInstance()) return this; + internalGetMutableEntities().mergeFrom( + other.internalGetEntities()); + if (other.getFullFeatureNames() != false) { + setFullFeatureNames(other.getFullFeatureNames()); + } + internalGetMutableRequestContext().mergeFrom( + other.internalGetRequestContext()); + switch (other.getKindCase()) { + case FEATURE_SERVICE: { + kindCase_ = 1; + kind_ = other.kind_; + onChanged(); + break; + } + case FEATURES: { + mergeFeatures(other.getFeatures()); + break; + } + case KIND_NOT_SET: { + break; + } + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int kindCase_ = 0; + private java.lang.Object kind_; + public KindCase + getKindCase() { + return KindCase.forNumber( + kindCase_); + } + + public Builder clearKind() { + kindCase_ = 0; + kind_ = null; + onChanged(); + return this; + } + + private int bitField0_; + + /** + * string feature_service = 1; + * @return Whether the featureService field is set. + */ + @java.lang.Override + public boolean hasFeatureService() { + return kindCase_ == 1; + } + /** + * string feature_service = 1; + * @return The featureService. + */ + @java.lang.Override + public java.lang.String getFeatureService() { + java.lang.Object ref = ""; + if (kindCase_ == 1) { + ref = kind_; + } + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (kindCase_ == 1) { + kind_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * string feature_service = 1; + * @return The bytes for featureService. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getFeatureServiceBytes() { + java.lang.Object ref = ""; + if (kindCase_ == 1) { + ref = kind_; + } + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + if (kindCase_ == 1) { + kind_ = b; + } + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * string feature_service = 1; + * @param value The featureService to set. + * @return This builder for chaining. + */ + public Builder setFeatureService( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + kindCase_ = 1; + kind_ = value; + onChanged(); + return this; + } + /** + * string feature_service = 1; + * @return This builder for chaining. + */ + public Builder clearFeatureService() { + if (kindCase_ == 1) { + kindCase_ = 0; + kind_ = null; + onChanged(); + } + return this; + } + /** + * string feature_service = 1; + * @param value The bytes for featureService to set. + * @return This builder for chaining. + */ + public Builder setFeatureServiceBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + kindCase_ = 1; + kind_ = value; + onChanged(); + return this; + } + + private com.google.protobuf.SingleFieldBuilderV3< + feast.proto.serving.ServingAPIProto.FeatureList, feast.proto.serving.ServingAPIProto.FeatureList.Builder, feast.proto.serving.ServingAPIProto.FeatureListOrBuilder> featuresBuilder_; + /** + * .feast.serving.FeatureList features = 2; + * @return Whether the features field is set. + */ + @java.lang.Override + public boolean hasFeatures() { + return kindCase_ == 2; + } + /** + * .feast.serving.FeatureList features = 2; + * @return The features. + */ + @java.lang.Override + public feast.proto.serving.ServingAPIProto.FeatureList getFeatures() { + if (featuresBuilder_ == null) { + if (kindCase_ == 2) { + return (feast.proto.serving.ServingAPIProto.FeatureList) kind_; + } + return feast.proto.serving.ServingAPIProto.FeatureList.getDefaultInstance(); + } else { + if (kindCase_ == 2) { + return featuresBuilder_.getMessage(); + } + return feast.proto.serving.ServingAPIProto.FeatureList.getDefaultInstance(); + } + } + /** + * .feast.serving.FeatureList features = 2; + */ + public Builder setFeatures(feast.proto.serving.ServingAPIProto.FeatureList value) { + if (featuresBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + kind_ = value; + onChanged(); + } else { + featuresBuilder_.setMessage(value); + } + kindCase_ = 2; + return this; + } + /** + * .feast.serving.FeatureList features = 2; + */ + public Builder setFeatures( + feast.proto.serving.ServingAPIProto.FeatureList.Builder builderForValue) { + if (featuresBuilder_ == null) { + kind_ = builderForValue.build(); + onChanged(); + } else { + featuresBuilder_.setMessage(builderForValue.build()); + } + kindCase_ = 2; + return this; + } + /** + * .feast.serving.FeatureList features = 2; + */ + public Builder mergeFeatures(feast.proto.serving.ServingAPIProto.FeatureList value) { + if (featuresBuilder_ == null) { + if (kindCase_ == 2 && + kind_ != feast.proto.serving.ServingAPIProto.FeatureList.getDefaultInstance()) { + kind_ = feast.proto.serving.ServingAPIProto.FeatureList.newBuilder((feast.proto.serving.ServingAPIProto.FeatureList) kind_) + .mergeFrom(value).buildPartial(); + } else { + kind_ = value; + } + onChanged(); + } else { + if (kindCase_ == 2) { + featuresBuilder_.mergeFrom(value); + } else { + featuresBuilder_.setMessage(value); + } + } + kindCase_ = 2; + return this; + } + /** + * .feast.serving.FeatureList features = 2; + */ + public Builder clearFeatures() { + if (featuresBuilder_ == null) { + if (kindCase_ == 2) { + kindCase_ = 0; + kind_ = null; + onChanged(); + } + } else { + if (kindCase_ == 2) { + kindCase_ = 0; + kind_ = null; + } + featuresBuilder_.clear(); + } + return this; + } + /** + * .feast.serving.FeatureList features = 2; + */ + public feast.proto.serving.ServingAPIProto.FeatureList.Builder getFeaturesBuilder() { + return getFeaturesFieldBuilder().getBuilder(); + } + /** + * .feast.serving.FeatureList features = 2; + */ + @java.lang.Override + public feast.proto.serving.ServingAPIProto.FeatureListOrBuilder getFeaturesOrBuilder() { + if ((kindCase_ == 2) && (featuresBuilder_ != null)) { + return featuresBuilder_.getMessageOrBuilder(); + } else { + if (kindCase_ == 2) { + return (feast.proto.serving.ServingAPIProto.FeatureList) kind_; + } + return feast.proto.serving.ServingAPIProto.FeatureList.getDefaultInstance(); + } + } + /** + * .feast.serving.FeatureList features = 2; + */ + private com.google.protobuf.SingleFieldBuilderV3< + feast.proto.serving.ServingAPIProto.FeatureList, feast.proto.serving.ServingAPIProto.FeatureList.Builder, feast.proto.serving.ServingAPIProto.FeatureListOrBuilder> + getFeaturesFieldBuilder() { + if (featuresBuilder_ == null) { + if (!(kindCase_ == 2)) { + kind_ = feast.proto.serving.ServingAPIProto.FeatureList.getDefaultInstance(); + } + featuresBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + feast.proto.serving.ServingAPIProto.FeatureList, feast.proto.serving.ServingAPIProto.FeatureList.Builder, feast.proto.serving.ServingAPIProto.FeatureListOrBuilder>( + (feast.proto.serving.ServingAPIProto.FeatureList) kind_, + getParentForChildren(), + isClean()); + kind_ = null; + } + kindCase_ = 2; + onChanged();; + return featuresBuilder_; + } + + private com.google.protobuf.MapField< + java.lang.String, feast.proto.types.ValueProto.RepeatedValue> entities_; + private com.google.protobuf.MapField + internalGetEntities() { + if (entities_ == null) { + return com.google.protobuf.MapField.emptyMapField( + EntitiesDefaultEntryHolder.defaultEntry); + } + return entities_; + } + private com.google.protobuf.MapField + internalGetMutableEntities() { + onChanged();; + if (entities_ == null) { + entities_ = com.google.protobuf.MapField.newMapField( + EntitiesDefaultEntryHolder.defaultEntry); + } + if (!entities_.isMutable()) { + entities_ = entities_.copy(); + } + return entities_; + } + + public int getEntitiesCount() { + return internalGetEntities().getMap().size(); + } + /** + *
+       * The entity data is specified in a columnar format
+       * A map of entity name -> list of values
+       * 
+ * + * map<string, .feast.types.RepeatedValue> entities = 3; + */ + + @java.lang.Override + public boolean containsEntities( + java.lang.String key) { + if (key == null) { throw new NullPointerException("map key"); } + return internalGetEntities().getMap().containsKey(key); + } + /** + * Use {@link #getEntitiesMap()} instead. + */ + @java.lang.Override + @java.lang.Deprecated + public java.util.Map getEntities() { + return getEntitiesMap(); + } + /** + *
+       * The entity data is specified in a columnar format
+       * A map of entity name -> list of values
+       * 
+ * + * map<string, .feast.types.RepeatedValue> entities = 3; + */ + @java.lang.Override + + public java.util.Map getEntitiesMap() { + return internalGetEntities().getMap(); + } + /** + *
+       * The entity data is specified in a columnar format
+       * A map of entity name -> list of values
+       * 
+ * + * map<string, .feast.types.RepeatedValue> entities = 3; + */ + @java.lang.Override + + public feast.proto.types.ValueProto.RepeatedValue getEntitiesOrDefault( + java.lang.String key, + feast.proto.types.ValueProto.RepeatedValue defaultValue) { + if (key == null) { throw new NullPointerException("map key"); } + java.util.Map map = + internalGetEntities().getMap(); + return map.containsKey(key) ? map.get(key) : defaultValue; + } + /** + *
+       * The entity data is specified in a columnar format
+       * A map of entity name -> list of values
+       * 
+ * + * map<string, .feast.types.RepeatedValue> entities = 3; + */ + @java.lang.Override + + public feast.proto.types.ValueProto.RepeatedValue getEntitiesOrThrow( + java.lang.String key) { + if (key == null) { throw new NullPointerException("map key"); } + java.util.Map map = + internalGetEntities().getMap(); + if (!map.containsKey(key)) { + throw new java.lang.IllegalArgumentException(); + } + return map.get(key); + } + + public Builder clearEntities() { + internalGetMutableEntities().getMutableMap() + .clear(); + return this; + } + /** + *
+       * The entity data is specified in a columnar format
+       * A map of entity name -> list of values
+       * 
+ * + * map<string, .feast.types.RepeatedValue> entities = 3; + */ + + public Builder removeEntities( + java.lang.String key) { + if (key == null) { throw new NullPointerException("map key"); } + internalGetMutableEntities().getMutableMap() + .remove(key); + return this; + } + /** + * Use alternate mutation accessors instead. + */ + @java.lang.Deprecated + public java.util.Map + getMutableEntities() { + return internalGetMutableEntities().getMutableMap(); + } + /** + *
+       * The entity data is specified in a columnar format
+       * A map of entity name -> list of values
+       * 
+ * + * map<string, .feast.types.RepeatedValue> entities = 3; + */ + public Builder putEntities( + java.lang.String key, + feast.proto.types.ValueProto.RepeatedValue value) { + if (key == null) { throw new NullPointerException("map key"); } + if (value == null) { + throw new NullPointerException("map value"); +} + + internalGetMutableEntities().getMutableMap() + .put(key, value); + return this; + } + /** + *
+       * The entity data is specified in a columnar format
+       * A map of entity name -> list of values
+       * 
+ * + * map<string, .feast.types.RepeatedValue> entities = 3; + */ + + public Builder putAllEntities( + java.util.Map values) { + internalGetMutableEntities().getMutableMap() + .putAll(values); + return this; + } + + private boolean fullFeatureNames_ ; + /** + * bool full_feature_names = 4; + * @return The fullFeatureNames. + */ + @java.lang.Override + public boolean getFullFeatureNames() { + return fullFeatureNames_; + } + /** + * bool full_feature_names = 4; + * @param value The fullFeatureNames to set. + * @return This builder for chaining. + */ + public Builder setFullFeatureNames(boolean value) { + + fullFeatureNames_ = value; + onChanged(); + return this; + } + /** + * bool full_feature_names = 4; + * @return This builder for chaining. + */ + public Builder clearFullFeatureNames() { + + fullFeatureNames_ = false; + onChanged(); + return this; + } + + private com.google.protobuf.MapField< + java.lang.String, feast.proto.types.ValueProto.RepeatedValue> requestContext_; + private com.google.protobuf.MapField + internalGetRequestContext() { + if (requestContext_ == null) { + return com.google.protobuf.MapField.emptyMapField( + RequestContextDefaultEntryHolder.defaultEntry); + } + return requestContext_; + } + private com.google.protobuf.MapField + internalGetMutableRequestContext() { + onChanged();; + if (requestContext_ == null) { + requestContext_ = com.google.protobuf.MapField.newMapField( + RequestContextDefaultEntryHolder.defaultEntry); + } + if (!requestContext_.isMutable()) { + requestContext_ = requestContext_.copy(); + } + return requestContext_; + } + + public int getRequestContextCount() { + return internalGetRequestContext().getMap().size(); + } + /** + *
+       * Context for OnDemand Feature Transformation
+       * (was moved to dedicated parameter to avoid unnecessary separation logic on serving side)
+       * A map of variable name -> list of values
+       * 
+ * + * map<string, .feast.types.RepeatedValue> request_context = 5; + */ + + @java.lang.Override + public boolean containsRequestContext( + java.lang.String key) { + if (key == null) { throw new NullPointerException("map key"); } + return internalGetRequestContext().getMap().containsKey(key); + } + /** + * Use {@link #getRequestContextMap()} instead. + */ + @java.lang.Override + @java.lang.Deprecated + public java.util.Map getRequestContext() { + return getRequestContextMap(); + } + /** + *
+       * Context for OnDemand Feature Transformation
+       * (was moved to dedicated parameter to avoid unnecessary separation logic on serving side)
+       * A map of variable name -> list of values
+       * 
+ * + * map<string, .feast.types.RepeatedValue> request_context = 5; + */ + @java.lang.Override + + public java.util.Map getRequestContextMap() { + return internalGetRequestContext().getMap(); + } + /** + *
+       * Context for OnDemand Feature Transformation
+       * (was moved to dedicated parameter to avoid unnecessary separation logic on serving side)
+       * A map of variable name -> list of values
+       * 
+ * + * map<string, .feast.types.RepeatedValue> request_context = 5; + */ + @java.lang.Override + + public feast.proto.types.ValueProto.RepeatedValue getRequestContextOrDefault( + java.lang.String key, + feast.proto.types.ValueProto.RepeatedValue defaultValue) { + if (key == null) { throw new NullPointerException("map key"); } + java.util.Map map = + internalGetRequestContext().getMap(); + return map.containsKey(key) ? map.get(key) : defaultValue; + } + /** + *
+       * Context for OnDemand Feature Transformation
+       * (was moved to dedicated parameter to avoid unnecessary separation logic on serving side)
+       * A map of variable name -> list of values
+       * 
+ * + * map<string, .feast.types.RepeatedValue> request_context = 5; + */ + @java.lang.Override + + public feast.proto.types.ValueProto.RepeatedValue getRequestContextOrThrow( + java.lang.String key) { + if (key == null) { throw new NullPointerException("map key"); } + java.util.Map map = + internalGetRequestContext().getMap(); + if (!map.containsKey(key)) { + throw new java.lang.IllegalArgumentException(); + } + return map.get(key); + } + + public Builder clearRequestContext() { + internalGetMutableRequestContext().getMutableMap() + .clear(); + return this; + } + /** + *
+       * Context for OnDemand Feature Transformation
+       * (was moved to dedicated parameter to avoid unnecessary separation logic on serving side)
+       * A map of variable name -> list of values
+       * 
+ * + * map<string, .feast.types.RepeatedValue> request_context = 5; + */ + + public Builder removeRequestContext( + java.lang.String key) { + if (key == null) { throw new NullPointerException("map key"); } + internalGetMutableRequestContext().getMutableMap() + .remove(key); + return this; + } + /** + * Use alternate mutation accessors instead. + */ + @java.lang.Deprecated + public java.util.Map + getMutableRequestContext() { + return internalGetMutableRequestContext().getMutableMap(); + } + /** + *
+       * Context for OnDemand Feature Transformation
+       * (was moved to dedicated parameter to avoid unnecessary separation logic on serving side)
+       * A map of variable name -> list of values
+       * 
+ * + * map<string, .feast.types.RepeatedValue> request_context = 5; + */ + public Builder putRequestContext( + java.lang.String key, + feast.proto.types.ValueProto.RepeatedValue value) { + if (key == null) { throw new NullPointerException("map key"); } + if (value == null) { + throw new NullPointerException("map value"); +} + + internalGetMutableRequestContext().getMutableMap() + .put(key, value); + return this; + } + /** + *
+       * Context for OnDemand Feature Transformation
+       * (was moved to dedicated parameter to avoid unnecessary separation logic on serving side)
+       * A map of variable name -> list of values
+       * 
+ * + * map<string, .feast.types.RepeatedValue> request_context = 5; + */ + + public Builder putAllRequestContext( + java.util.Map values) { + internalGetMutableRequestContext().getMutableMap() + .putAll(values); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:feast.serving.GetOnlineFeaturesRequest) + } + + // @@protoc_insertion_point(class_scope:feast.serving.GetOnlineFeaturesRequest) + private static final feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest(); + } + + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public GetOnlineFeaturesRequest parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new GetOnlineFeaturesRequest(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface GetOnlineFeaturesResponseOrBuilder extends + // @@protoc_insertion_point(interface_extends:feast.serving.GetOnlineFeaturesResponse) + com.google.protobuf.MessageOrBuilder { + + /** + * .feast.serving.GetOnlineFeaturesResponseMetadata metadata = 1; + * @return Whether the metadata field is set. + */ + boolean hasMetadata(); + /** + * .feast.serving.GetOnlineFeaturesResponseMetadata metadata = 1; + * @return The metadata. + */ + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata getMetadata(); + /** + * .feast.serving.GetOnlineFeaturesResponseMetadata metadata = 1; + */ + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadataOrBuilder getMetadataOrBuilder(); + + /** + *
+     * Length of "results" array should match length of requested features.
+     * We also preserve the same order of features here as in metadata.feature_names
+     * 
+ * + * repeated .feast.serving.GetOnlineFeaturesResponse.FeatureVector results = 2; + */ + java.util.List + getResultsList(); + /** + *
+     * Length of "results" array should match length of requested features.
+     * We also preserve the same order of features here as in metadata.feature_names
+     * 
+ * + * repeated .feast.serving.GetOnlineFeaturesResponse.FeatureVector results = 2; + */ + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector getResults(int index); + /** + *
+     * Length of "results" array should match length of requested features.
+     * We also preserve the same order of features here as in metadata.feature_names
+     * 
+ * + * repeated .feast.serving.GetOnlineFeaturesResponse.FeatureVector results = 2; + */ + int getResultsCount(); + /** + *
+     * Length of "results" array should match length of requested features.
+     * We also preserve the same order of features here as in metadata.feature_names
+     * 
+ * + * repeated .feast.serving.GetOnlineFeaturesResponse.FeatureVector results = 2; + */ + java.util.List + getResultsOrBuilderList(); + /** + *
+     * Length of "results" array should match length of requested features.
+     * We also preserve the same order of features here as in metadata.feature_names
+     * 
+ * + * repeated .feast.serving.GetOnlineFeaturesResponse.FeatureVector results = 2; + */ + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVectorOrBuilder getResultsOrBuilder( + int index); + } + /** + * Protobuf type {@code feast.serving.GetOnlineFeaturesResponse} + */ + public static final class GetOnlineFeaturesResponse extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:feast.serving.GetOnlineFeaturesResponse) + GetOnlineFeaturesResponseOrBuilder { + private static final long serialVersionUID = 0L; + // Use GetOnlineFeaturesResponse.newBuilder() to construct. + private GetOnlineFeaturesResponse(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private GetOnlineFeaturesResponse() { + results_ = java.util.Collections.emptyList(); + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new GetOnlineFeaturesResponse(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private GetOnlineFeaturesResponse( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata.Builder subBuilder = null; + if (metadata_ != null) { + subBuilder = metadata_.toBuilder(); + } + metadata_ = input.readMessage(feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(metadata_); + metadata_ = subBuilder.buildPartial(); + } + + break; + } + case 18: { + if (!((mutable_bitField0_ & 0x00000001) != 0)) { + results_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000001; + } + results_.add( + input.readMessage(feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector.parser(), extensionRegistry)); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000001) != 0)) { + results_ = java.util.Collections.unmodifiableList(results_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return feast.proto.serving.ServingAPIProto.internal_static_feast_serving_GetOnlineFeaturesResponse_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return feast.proto.serving.ServingAPIProto.internal_static_feast_serving_GetOnlineFeaturesResponse_fieldAccessorTable + .ensureFieldAccessorsInitialized( + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.class, feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.Builder.class); + } + + public interface FeatureVectorOrBuilder extends + // @@protoc_insertion_point(interface_extends:feast.serving.GetOnlineFeaturesResponse.FeatureVector) + com.google.protobuf.MessageOrBuilder { + + /** + * repeated .feast.types.Value values = 1; + */ + java.util.List + getValuesList(); + /** + * repeated .feast.types.Value values = 1; + */ + feast.proto.types.ValueProto.Value getValues(int index); + /** + * repeated .feast.types.Value values = 1; + */ + int getValuesCount(); + /** + * repeated .feast.types.Value values = 1; + */ + java.util.List + getValuesOrBuilderList(); + /** + * repeated .feast.types.Value values = 1; + */ + feast.proto.types.ValueProto.ValueOrBuilder getValuesOrBuilder( + int index); + + /** + * repeated .feast.serving.FieldStatus statuses = 2; + * @return A list containing the statuses. + */ + java.util.List getStatusesList(); + /** + * repeated .feast.serving.FieldStatus statuses = 2; + * @return The count of statuses. + */ + int getStatusesCount(); + /** + * repeated .feast.serving.FieldStatus statuses = 2; + * @param index The index of the element to return. + * @return The statuses at the given index. + */ + feast.proto.serving.ServingAPIProto.FieldStatus getStatuses(int index); + /** + * repeated .feast.serving.FieldStatus statuses = 2; + * @return A list containing the enum numeric values on the wire for statuses. + */ + java.util.List + getStatusesValueList(); + /** + * repeated .feast.serving.FieldStatus statuses = 2; + * @param index The index of the value to return. + * @return The enum numeric value on the wire of statuses at the given index. + */ + int getStatusesValue(int index); + + /** + * repeated .google.protobuf.Timestamp event_timestamps = 3; + */ + java.util.List + getEventTimestampsList(); + /** + * repeated .google.protobuf.Timestamp event_timestamps = 3; + */ + com.google.protobuf.Timestamp getEventTimestamps(int index); + /** + * repeated .google.protobuf.Timestamp event_timestamps = 3; + */ + int getEventTimestampsCount(); + /** + * repeated .google.protobuf.Timestamp event_timestamps = 3; + */ + java.util.List + getEventTimestampsOrBuilderList(); + /** + * repeated .google.protobuf.Timestamp event_timestamps = 3; + */ + com.google.protobuf.TimestampOrBuilder getEventTimestampsOrBuilder( + int index); + } + /** + * Protobuf type {@code feast.serving.GetOnlineFeaturesResponse.FeatureVector} + */ + public static final class FeatureVector extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:feast.serving.GetOnlineFeaturesResponse.FeatureVector) + FeatureVectorOrBuilder { + private static final long serialVersionUID = 0L; + // Use FeatureVector.newBuilder() to construct. + private FeatureVector(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private FeatureVector() { + values_ = java.util.Collections.emptyList(); + statuses_ = java.util.Collections.emptyList(); + eventTimestamps_ = java.util.Collections.emptyList(); + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new FeatureVector(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private FeatureVector( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + if (!((mutable_bitField0_ & 0x00000001) != 0)) { + values_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000001; + } + values_.add( + input.readMessage(feast.proto.types.ValueProto.Value.parser(), extensionRegistry)); + break; + } + case 16: { + int rawValue = input.readEnum(); + if (!((mutable_bitField0_ & 0x00000002) != 0)) { + statuses_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000002; + } + statuses_.add(rawValue); + break; + } + case 18: { + int length = input.readRawVarint32(); + int oldLimit = input.pushLimit(length); + while(input.getBytesUntilLimit() > 0) { + int rawValue = input.readEnum(); + if (!((mutable_bitField0_ & 0x00000002) != 0)) { + statuses_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000002; + } + statuses_.add(rawValue); + } + input.popLimit(oldLimit); + break; + } + case 26: { + if (!((mutable_bitField0_ & 0x00000004) != 0)) { + eventTimestamps_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000004; + } + eventTimestamps_.add( + input.readMessage(com.google.protobuf.Timestamp.parser(), extensionRegistry)); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000001) != 0)) { + values_ = java.util.Collections.unmodifiableList(values_); + } + if (((mutable_bitField0_ & 0x00000002) != 0)) { + statuses_ = java.util.Collections.unmodifiableList(statuses_); + } + if (((mutable_bitField0_ & 0x00000004) != 0)) { + eventTimestamps_ = java.util.Collections.unmodifiableList(eventTimestamps_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return feast.proto.serving.ServingAPIProto.internal_static_feast_serving_GetOnlineFeaturesResponse_FeatureVector_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return feast.proto.serving.ServingAPIProto.internal_static_feast_serving_GetOnlineFeaturesResponse_FeatureVector_fieldAccessorTable + .ensureFieldAccessorsInitialized( + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector.class, feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector.Builder.class); + } + + public static final int VALUES_FIELD_NUMBER = 1; + private java.util.List values_; + /** + * repeated .feast.types.Value values = 1; + */ + @java.lang.Override + public java.util.List getValuesList() { + return values_; + } + /** + * repeated .feast.types.Value values = 1; + */ + @java.lang.Override + public java.util.List + getValuesOrBuilderList() { + return values_; + } + /** + * repeated .feast.types.Value values = 1; + */ + @java.lang.Override + public int getValuesCount() { + return values_.size(); + } + /** + * repeated .feast.types.Value values = 1; + */ + @java.lang.Override + public feast.proto.types.ValueProto.Value getValues(int index) { + return values_.get(index); + } + /** + * repeated .feast.types.Value values = 1; + */ + @java.lang.Override + public feast.proto.types.ValueProto.ValueOrBuilder getValuesOrBuilder( + int index) { + return values_.get(index); + } + + public static final int STATUSES_FIELD_NUMBER = 2; + private java.util.List statuses_; + private static final com.google.protobuf.Internal.ListAdapter.Converter< + java.lang.Integer, feast.proto.serving.ServingAPIProto.FieldStatus> statuses_converter_ = + new com.google.protobuf.Internal.ListAdapter.Converter< + java.lang.Integer, feast.proto.serving.ServingAPIProto.FieldStatus>() { + public feast.proto.serving.ServingAPIProto.FieldStatus convert(java.lang.Integer from) { + @SuppressWarnings("deprecation") + feast.proto.serving.ServingAPIProto.FieldStatus result = feast.proto.serving.ServingAPIProto.FieldStatus.valueOf(from); + return result == null ? feast.proto.serving.ServingAPIProto.FieldStatus.UNRECOGNIZED : result; + } + }; + /** + * repeated .feast.serving.FieldStatus statuses = 2; + * @return A list containing the statuses. + */ + @java.lang.Override + public java.util.List getStatusesList() { + return new com.google.protobuf.Internal.ListAdapter< + java.lang.Integer, feast.proto.serving.ServingAPIProto.FieldStatus>(statuses_, statuses_converter_); + } + /** + * repeated .feast.serving.FieldStatus statuses = 2; + * @return The count of statuses. + */ + @java.lang.Override + public int getStatusesCount() { + return statuses_.size(); + } + /** + * repeated .feast.serving.FieldStatus statuses = 2; + * @param index The index of the element to return. + * @return The statuses at the given index. + */ + @java.lang.Override + public feast.proto.serving.ServingAPIProto.FieldStatus getStatuses(int index) { + return statuses_converter_.convert(statuses_.get(index)); + } + /** + * repeated .feast.serving.FieldStatus statuses = 2; + * @return A list containing the enum numeric values on the wire for statuses. + */ + @java.lang.Override + public java.util.List + getStatusesValueList() { + return statuses_; + } + /** + * repeated .feast.serving.FieldStatus statuses = 2; + * @param index The index of the value to return. + * @return The enum numeric value on the wire of statuses at the given index. + */ + @java.lang.Override + public int getStatusesValue(int index) { + return statuses_.get(index); + } + private int statusesMemoizedSerializedSize; + + public static final int EVENT_TIMESTAMPS_FIELD_NUMBER = 3; + private java.util.List eventTimestamps_; + /** + * repeated .google.protobuf.Timestamp event_timestamps = 3; + */ + @java.lang.Override + public java.util.List getEventTimestampsList() { + return eventTimestamps_; + } + /** + * repeated .google.protobuf.Timestamp event_timestamps = 3; + */ + @java.lang.Override + public java.util.List + getEventTimestampsOrBuilderList() { + return eventTimestamps_; + } + /** + * repeated .google.protobuf.Timestamp event_timestamps = 3; + */ + @java.lang.Override + public int getEventTimestampsCount() { + return eventTimestamps_.size(); + } + /** + * repeated .google.protobuf.Timestamp event_timestamps = 3; + */ + @java.lang.Override + public com.google.protobuf.Timestamp getEventTimestamps(int index) { + return eventTimestamps_.get(index); + } + /** + * repeated .google.protobuf.Timestamp event_timestamps = 3; + */ + @java.lang.Override + public com.google.protobuf.TimestampOrBuilder getEventTimestampsOrBuilder( + int index) { + return eventTimestamps_.get(index); + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + for (int i = 0; i < values_.size(); i++) { + output.writeMessage(1, values_.get(i)); + } + if (getStatusesList().size() > 0) { + output.writeUInt32NoTag(18); + output.writeUInt32NoTag(statusesMemoizedSerializedSize); + } + for (int i = 0; i < statuses_.size(); i++) { + output.writeEnumNoTag(statuses_.get(i)); + } + for (int i = 0; i < eventTimestamps_.size(); i++) { + output.writeMessage(3, eventTimestamps_.get(i)); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + for (int i = 0; i < values_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(1, values_.get(i)); + } + { + int dataSize = 0; + for (int i = 0; i < statuses_.size(); i++) { + dataSize += com.google.protobuf.CodedOutputStream + .computeEnumSizeNoTag(statuses_.get(i)); + } + size += dataSize; + if (!getStatusesList().isEmpty()) { size += 1; + size += com.google.protobuf.CodedOutputStream + .computeUInt32SizeNoTag(dataSize); + }statusesMemoizedSerializedSize = dataSize; + } + for (int i = 0; i < eventTimestamps_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(3, eventTimestamps_.get(i)); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector)) { + return super.equals(obj); + } + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector other = (feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector) obj; + + if (!getValuesList() + .equals(other.getValuesList())) return false; + if (!statuses_.equals(other.statuses_)) return false; + if (!getEventTimestampsList() + .equals(other.getEventTimestampsList())) return false; + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (getValuesCount() > 0) { + hash = (37 * hash) + VALUES_FIELD_NUMBER; + hash = (53 * hash) + getValuesList().hashCode(); + } + if (getStatusesCount() > 0) { + hash = (37 * hash) + STATUSES_FIELD_NUMBER; + hash = (53 * hash) + statuses_.hashCode(); + } + if (getEventTimestampsCount() > 0) { + hash = (37 * hash) + EVENT_TIMESTAMPS_FIELD_NUMBER; + hash = (53 * hash) + getEventTimestampsList().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code feast.serving.GetOnlineFeaturesResponse.FeatureVector} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:feast.serving.GetOnlineFeaturesResponse.FeatureVector) + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVectorOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return feast.proto.serving.ServingAPIProto.internal_static_feast_serving_GetOnlineFeaturesResponse_FeatureVector_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return feast.proto.serving.ServingAPIProto.internal_static_feast_serving_GetOnlineFeaturesResponse_FeatureVector_fieldAccessorTable + .ensureFieldAccessorsInitialized( + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector.class, feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector.Builder.class); + } + + // Construct using feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + getValuesFieldBuilder(); + getEventTimestampsFieldBuilder(); + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + if (valuesBuilder_ == null) { + values_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); + } else { + valuesBuilder_.clear(); + } + statuses_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000002); + if (eventTimestampsBuilder_ == null) { + eventTimestamps_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000004); + } else { + eventTimestampsBuilder_.clear(); + } + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return feast.proto.serving.ServingAPIProto.internal_static_feast_serving_GetOnlineFeaturesResponse_FeatureVector_descriptor; + } + + @java.lang.Override + public feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector getDefaultInstanceForType() { + return feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector.getDefaultInstance(); + } + + @java.lang.Override + public feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector build() { + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector buildPartial() { + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector result = new feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector(this); + int from_bitField0_ = bitField0_; + if (valuesBuilder_ == null) { + if (((bitField0_ & 0x00000001) != 0)) { + values_ = java.util.Collections.unmodifiableList(values_); + bitField0_ = (bitField0_ & ~0x00000001); + } + result.values_ = values_; + } else { + result.values_ = valuesBuilder_.build(); + } + if (((bitField0_ & 0x00000002) != 0)) { + statuses_ = java.util.Collections.unmodifiableList(statuses_); + bitField0_ = (bitField0_ & ~0x00000002); + } + result.statuses_ = statuses_; + if (eventTimestampsBuilder_ == null) { + if (((bitField0_ & 0x00000004) != 0)) { + eventTimestamps_ = java.util.Collections.unmodifiableList(eventTimestamps_); + bitField0_ = (bitField0_ & ~0x00000004); + } + result.eventTimestamps_ = eventTimestamps_; + } else { + result.eventTimestamps_ = eventTimestampsBuilder_.build(); + } + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector) { + return mergeFrom((feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector other) { + if (other == feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector.getDefaultInstance()) return this; + if (valuesBuilder_ == null) { + if (!other.values_.isEmpty()) { + if (values_.isEmpty()) { + values_ = other.values_; + bitField0_ = (bitField0_ & ~0x00000001); + } else { + ensureValuesIsMutable(); + values_.addAll(other.values_); + } + onChanged(); + } + } else { + if (!other.values_.isEmpty()) { + if (valuesBuilder_.isEmpty()) { + valuesBuilder_.dispose(); + valuesBuilder_ = null; + values_ = other.values_; + bitField0_ = (bitField0_ & ~0x00000001); + valuesBuilder_ = + com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? + getValuesFieldBuilder() : null; + } else { + valuesBuilder_.addAllMessages(other.values_); + } + } + } + if (!other.statuses_.isEmpty()) { + if (statuses_.isEmpty()) { + statuses_ = other.statuses_; + bitField0_ = (bitField0_ & ~0x00000002); + } else { + ensureStatusesIsMutable(); + statuses_.addAll(other.statuses_); + } + onChanged(); + } + if (eventTimestampsBuilder_ == null) { + if (!other.eventTimestamps_.isEmpty()) { + if (eventTimestamps_.isEmpty()) { + eventTimestamps_ = other.eventTimestamps_; + bitField0_ = (bitField0_ & ~0x00000004); + } else { + ensureEventTimestampsIsMutable(); + eventTimestamps_.addAll(other.eventTimestamps_); + } + onChanged(); + } + } else { + if (!other.eventTimestamps_.isEmpty()) { + if (eventTimestampsBuilder_.isEmpty()) { + eventTimestampsBuilder_.dispose(); + eventTimestampsBuilder_ = null; + eventTimestamps_ = other.eventTimestamps_; + bitField0_ = (bitField0_ & ~0x00000004); + eventTimestampsBuilder_ = + com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? + getEventTimestampsFieldBuilder() : null; + } else { + eventTimestampsBuilder_.addAllMessages(other.eventTimestamps_); + } + } + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private java.util.List values_ = + java.util.Collections.emptyList(); + private void ensureValuesIsMutable() { + if (!((bitField0_ & 0x00000001) != 0)) { + values_ = new java.util.ArrayList(values_); + bitField0_ |= 0x00000001; + } + } + + private com.google.protobuf.RepeatedFieldBuilderV3< + feast.proto.types.ValueProto.Value, feast.proto.types.ValueProto.Value.Builder, feast.proto.types.ValueProto.ValueOrBuilder> valuesBuilder_; + + /** + * repeated .feast.types.Value values = 1; + */ + public java.util.List getValuesList() { + if (valuesBuilder_ == null) { + return java.util.Collections.unmodifiableList(values_); + } else { + return valuesBuilder_.getMessageList(); + } + } + /** + * repeated .feast.types.Value values = 1; + */ + public int getValuesCount() { + if (valuesBuilder_ == null) { + return values_.size(); + } else { + return valuesBuilder_.getCount(); + } + } + /** + * repeated .feast.types.Value values = 1; + */ + public feast.proto.types.ValueProto.Value getValues(int index) { + if (valuesBuilder_ == null) { + return values_.get(index); + } else { + return valuesBuilder_.getMessage(index); + } + } + /** + * repeated .feast.types.Value values = 1; + */ + public Builder setValues( + int index, feast.proto.types.ValueProto.Value value) { + if (valuesBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureValuesIsMutable(); + values_.set(index, value); + onChanged(); + } else { + valuesBuilder_.setMessage(index, value); + } + return this; + } + /** + * repeated .feast.types.Value values = 1; + */ + public Builder setValues( + int index, feast.proto.types.ValueProto.Value.Builder builderForValue) { + if (valuesBuilder_ == null) { + ensureValuesIsMutable(); + values_.set(index, builderForValue.build()); + onChanged(); + } else { + valuesBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .feast.types.Value values = 1; + */ + public Builder addValues(feast.proto.types.ValueProto.Value value) { + if (valuesBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureValuesIsMutable(); + values_.add(value); + onChanged(); + } else { + valuesBuilder_.addMessage(value); + } + return this; + } + /** + * repeated .feast.types.Value values = 1; + */ + public Builder addValues( + int index, feast.proto.types.ValueProto.Value value) { + if (valuesBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureValuesIsMutable(); + values_.add(index, value); + onChanged(); + } else { + valuesBuilder_.addMessage(index, value); + } + return this; + } + /** + * repeated .feast.types.Value values = 1; + */ + public Builder addValues( + feast.proto.types.ValueProto.Value.Builder builderForValue) { + if (valuesBuilder_ == null) { + ensureValuesIsMutable(); + values_.add(builderForValue.build()); + onChanged(); + } else { + valuesBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + * repeated .feast.types.Value values = 1; + */ + public Builder addValues( + int index, feast.proto.types.ValueProto.Value.Builder builderForValue) { + if (valuesBuilder_ == null) { + ensureValuesIsMutable(); + values_.add(index, builderForValue.build()); + onChanged(); + } else { + valuesBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .feast.types.Value values = 1; + */ + public Builder addAllValues( + java.lang.Iterable values) { + if (valuesBuilder_ == null) { + ensureValuesIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, values_); + onChanged(); + } else { + valuesBuilder_.addAllMessages(values); + } + return this; + } + /** + * repeated .feast.types.Value values = 1; + */ + public Builder clearValues() { + if (valuesBuilder_ == null) { + values_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + } else { + valuesBuilder_.clear(); + } + return this; + } + /** + * repeated .feast.types.Value values = 1; + */ + public Builder removeValues(int index) { + if (valuesBuilder_ == null) { + ensureValuesIsMutable(); + values_.remove(index); + onChanged(); + } else { + valuesBuilder_.remove(index); + } + return this; + } + /** + * repeated .feast.types.Value values = 1; + */ + public feast.proto.types.ValueProto.Value.Builder getValuesBuilder( + int index) { + return getValuesFieldBuilder().getBuilder(index); + } + /** + * repeated .feast.types.Value values = 1; + */ + public feast.proto.types.ValueProto.ValueOrBuilder getValuesOrBuilder( + int index) { + if (valuesBuilder_ == null) { + return values_.get(index); } else { + return valuesBuilder_.getMessageOrBuilder(index); + } + } + /** + * repeated .feast.types.Value values = 1; + */ + public java.util.List + getValuesOrBuilderList() { + if (valuesBuilder_ != null) { + return valuesBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(values_); + } + } + /** + * repeated .feast.types.Value values = 1; + */ + public feast.proto.types.ValueProto.Value.Builder addValuesBuilder() { + return getValuesFieldBuilder().addBuilder( + feast.proto.types.ValueProto.Value.getDefaultInstance()); + } + /** + * repeated .feast.types.Value values = 1; + */ + public feast.proto.types.ValueProto.Value.Builder addValuesBuilder( + int index) { + return getValuesFieldBuilder().addBuilder( + index, feast.proto.types.ValueProto.Value.getDefaultInstance()); + } + /** + * repeated .feast.types.Value values = 1; + */ + public java.util.List + getValuesBuilderList() { + return getValuesFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilderV3< + feast.proto.types.ValueProto.Value, feast.proto.types.ValueProto.Value.Builder, feast.proto.types.ValueProto.ValueOrBuilder> + getValuesFieldBuilder() { + if (valuesBuilder_ == null) { + valuesBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3< + feast.proto.types.ValueProto.Value, feast.proto.types.ValueProto.Value.Builder, feast.proto.types.ValueProto.ValueOrBuilder>( + values_, + ((bitField0_ & 0x00000001) != 0), + getParentForChildren(), + isClean()); + values_ = null; + } + return valuesBuilder_; + } + + private java.util.List statuses_ = + java.util.Collections.emptyList(); + private void ensureStatusesIsMutable() { + if (!((bitField0_ & 0x00000002) != 0)) { + statuses_ = new java.util.ArrayList(statuses_); + bitField0_ |= 0x00000002; + } + } + /** + * repeated .feast.serving.FieldStatus statuses = 2; + * @return A list containing the statuses. + */ + public java.util.List getStatusesList() { + return new com.google.protobuf.Internal.ListAdapter< + java.lang.Integer, feast.proto.serving.ServingAPIProto.FieldStatus>(statuses_, statuses_converter_); + } + /** + * repeated .feast.serving.FieldStatus statuses = 2; + * @return The count of statuses. + */ + public int getStatusesCount() { + return statuses_.size(); + } + /** + * repeated .feast.serving.FieldStatus statuses = 2; + * @param index The index of the element to return. + * @return The statuses at the given index. + */ + public feast.proto.serving.ServingAPIProto.FieldStatus getStatuses(int index) { + return statuses_converter_.convert(statuses_.get(index)); + } + /** + * repeated .feast.serving.FieldStatus statuses = 2; + * @param index The index to set the value at. + * @param value The statuses to set. + * @return This builder for chaining. + */ + public Builder setStatuses( + int index, feast.proto.serving.ServingAPIProto.FieldStatus value) { + if (value == null) { + throw new NullPointerException(); + } + ensureStatusesIsMutable(); + statuses_.set(index, value.getNumber()); + onChanged(); + return this; + } + /** + * repeated .feast.serving.FieldStatus statuses = 2; + * @param value The statuses to add. + * @return This builder for chaining. + */ + public Builder addStatuses(feast.proto.serving.ServingAPIProto.FieldStatus value) { + if (value == null) { + throw new NullPointerException(); + } + ensureStatusesIsMutable(); + statuses_.add(value.getNumber()); + onChanged(); + return this; + } + /** + * repeated .feast.serving.FieldStatus statuses = 2; + * @param values The statuses to add. + * @return This builder for chaining. + */ + public Builder addAllStatuses( + java.lang.Iterable values) { + ensureStatusesIsMutable(); + for (feast.proto.serving.ServingAPIProto.FieldStatus value : values) { + statuses_.add(value.getNumber()); + } + onChanged(); + return this; + } + /** + * repeated .feast.serving.FieldStatus statuses = 2; + * @return This builder for chaining. + */ + public Builder clearStatuses() { + statuses_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000002); + onChanged(); + return this; + } + /** + * repeated .feast.serving.FieldStatus statuses = 2; + * @return A list containing the enum numeric values on the wire for statuses. + */ + public java.util.List + getStatusesValueList() { + return java.util.Collections.unmodifiableList(statuses_); + } + /** + * repeated .feast.serving.FieldStatus statuses = 2; + * @param index The index of the value to return. + * @return The enum numeric value on the wire of statuses at the given index. + */ + public int getStatusesValue(int index) { + return statuses_.get(index); + } + /** + * repeated .feast.serving.FieldStatus statuses = 2; + * @param index The index to set the value at. + * @param value The enum numeric value on the wire for statuses to set. + * @return This builder for chaining. + */ + public Builder setStatusesValue( + int index, int value) { + ensureStatusesIsMutable(); + statuses_.set(index, value); + onChanged(); + return this; + } + /** + * repeated .feast.serving.FieldStatus statuses = 2; + * @param value The enum numeric value on the wire for statuses to add. + * @return This builder for chaining. + */ + public Builder addStatusesValue(int value) { + ensureStatusesIsMutable(); + statuses_.add(value); + onChanged(); + return this; + } + /** + * repeated .feast.serving.FieldStatus statuses = 2; + * @param values The enum numeric values on the wire for statuses to add. + * @return This builder for chaining. + */ + public Builder addAllStatusesValue( + java.lang.Iterable values) { + ensureStatusesIsMutable(); + for (int value : values) { + statuses_.add(value); + } + onChanged(); + return this; + } + + private java.util.List eventTimestamps_ = + java.util.Collections.emptyList(); + private void ensureEventTimestampsIsMutable() { + if (!((bitField0_ & 0x00000004) != 0)) { + eventTimestamps_ = new java.util.ArrayList(eventTimestamps_); + bitField0_ |= 0x00000004; + } + } + + private com.google.protobuf.RepeatedFieldBuilderV3< + com.google.protobuf.Timestamp, com.google.protobuf.Timestamp.Builder, com.google.protobuf.TimestampOrBuilder> eventTimestampsBuilder_; + + /** + * repeated .google.protobuf.Timestamp event_timestamps = 3; + */ + public java.util.List getEventTimestampsList() { + if (eventTimestampsBuilder_ == null) { + return java.util.Collections.unmodifiableList(eventTimestamps_); + } else { + return eventTimestampsBuilder_.getMessageList(); + } + } + /** + * repeated .google.protobuf.Timestamp event_timestamps = 3; + */ + public int getEventTimestampsCount() { + if (eventTimestampsBuilder_ == null) { + return eventTimestamps_.size(); + } else { + return eventTimestampsBuilder_.getCount(); + } + } + /** + * repeated .google.protobuf.Timestamp event_timestamps = 3; + */ + public com.google.protobuf.Timestamp getEventTimestamps(int index) { + if (eventTimestampsBuilder_ == null) { + return eventTimestamps_.get(index); + } else { + return eventTimestampsBuilder_.getMessage(index); + } + } + /** + * repeated .google.protobuf.Timestamp event_timestamps = 3; + */ + public Builder setEventTimestamps( + int index, com.google.protobuf.Timestamp value) { + if (eventTimestampsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureEventTimestampsIsMutable(); + eventTimestamps_.set(index, value); + onChanged(); + } else { + eventTimestampsBuilder_.setMessage(index, value); + } + return this; + } + /** + * repeated .google.protobuf.Timestamp event_timestamps = 3; + */ + public Builder setEventTimestamps( + int index, com.google.protobuf.Timestamp.Builder builderForValue) { + if (eventTimestampsBuilder_ == null) { + ensureEventTimestampsIsMutable(); + eventTimestamps_.set(index, builderForValue.build()); + onChanged(); + } else { + eventTimestampsBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .google.protobuf.Timestamp event_timestamps = 3; + */ + public Builder addEventTimestamps(com.google.protobuf.Timestamp value) { + if (eventTimestampsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureEventTimestampsIsMutable(); + eventTimestamps_.add(value); + onChanged(); + } else { + eventTimestampsBuilder_.addMessage(value); + } + return this; + } + /** + * repeated .google.protobuf.Timestamp event_timestamps = 3; + */ + public Builder addEventTimestamps( + int index, com.google.protobuf.Timestamp value) { + if (eventTimestampsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureEventTimestampsIsMutable(); + eventTimestamps_.add(index, value); + onChanged(); + } else { + eventTimestampsBuilder_.addMessage(index, value); + } + return this; + } + /** + * repeated .google.protobuf.Timestamp event_timestamps = 3; + */ + public Builder addEventTimestamps( + com.google.protobuf.Timestamp.Builder builderForValue) { + if (eventTimestampsBuilder_ == null) { + ensureEventTimestampsIsMutable(); + eventTimestamps_.add(builderForValue.build()); + onChanged(); + } else { + eventTimestampsBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + * repeated .google.protobuf.Timestamp event_timestamps = 3; + */ + public Builder addEventTimestamps( + int index, com.google.protobuf.Timestamp.Builder builderForValue) { + if (eventTimestampsBuilder_ == null) { + ensureEventTimestampsIsMutable(); + eventTimestamps_.add(index, builderForValue.build()); + onChanged(); + } else { + eventTimestampsBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .google.protobuf.Timestamp event_timestamps = 3; + */ + public Builder addAllEventTimestamps( + java.lang.Iterable values) { + if (eventTimestampsBuilder_ == null) { + ensureEventTimestampsIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, eventTimestamps_); + onChanged(); + } else { + eventTimestampsBuilder_.addAllMessages(values); + } + return this; + } + /** + * repeated .google.protobuf.Timestamp event_timestamps = 3; + */ + public Builder clearEventTimestamps() { + if (eventTimestampsBuilder_ == null) { + eventTimestamps_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000004); + onChanged(); + } else { + eventTimestampsBuilder_.clear(); + } + return this; + } + /** + * repeated .google.protobuf.Timestamp event_timestamps = 3; + */ + public Builder removeEventTimestamps(int index) { + if (eventTimestampsBuilder_ == null) { + ensureEventTimestampsIsMutable(); + eventTimestamps_.remove(index); + onChanged(); + } else { + eventTimestampsBuilder_.remove(index); + } + return this; + } + /** + * repeated .google.protobuf.Timestamp event_timestamps = 3; + */ + public com.google.protobuf.Timestamp.Builder getEventTimestampsBuilder( + int index) { + return getEventTimestampsFieldBuilder().getBuilder(index); + } + /** + * repeated .google.protobuf.Timestamp event_timestamps = 3; + */ + public com.google.protobuf.TimestampOrBuilder getEventTimestampsOrBuilder( + int index) { + if (eventTimestampsBuilder_ == null) { + return eventTimestamps_.get(index); } else { + return eventTimestampsBuilder_.getMessageOrBuilder(index); + } + } + /** + * repeated .google.protobuf.Timestamp event_timestamps = 3; + */ + public java.util.List + getEventTimestampsOrBuilderList() { + if (eventTimestampsBuilder_ != null) { + return eventTimestampsBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(eventTimestamps_); + } + } + /** + * repeated .google.protobuf.Timestamp event_timestamps = 3; + */ + public com.google.protobuf.Timestamp.Builder addEventTimestampsBuilder() { + return getEventTimestampsFieldBuilder().addBuilder( + com.google.protobuf.Timestamp.getDefaultInstance()); + } + /** + * repeated .google.protobuf.Timestamp event_timestamps = 3; + */ + public com.google.protobuf.Timestamp.Builder addEventTimestampsBuilder( + int index) { + return getEventTimestampsFieldBuilder().addBuilder( + index, com.google.protobuf.Timestamp.getDefaultInstance()); + } + /** + * repeated .google.protobuf.Timestamp event_timestamps = 3; + */ + public java.util.List + getEventTimestampsBuilderList() { + return getEventTimestampsFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilderV3< + com.google.protobuf.Timestamp, com.google.protobuf.Timestamp.Builder, com.google.protobuf.TimestampOrBuilder> + getEventTimestampsFieldBuilder() { + if (eventTimestampsBuilder_ == null) { + eventTimestampsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3< + com.google.protobuf.Timestamp, com.google.protobuf.Timestamp.Builder, com.google.protobuf.TimestampOrBuilder>( + eventTimestamps_, + ((bitField0_ & 0x00000004) != 0), + getParentForChildren(), + isClean()); + eventTimestamps_ = null; + } + return eventTimestampsBuilder_; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:feast.serving.GetOnlineFeaturesResponse.FeatureVector) + } + + // @@protoc_insertion_point(class_scope:feast.serving.GetOnlineFeaturesResponse.FeatureVector) + private static final feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector(); + } + + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public FeatureVector parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new FeatureVector(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public static final int METADATA_FIELD_NUMBER = 1; + private feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata metadata_; + /** + * .feast.serving.GetOnlineFeaturesResponseMetadata metadata = 1; + * @return Whether the metadata field is set. + */ + @java.lang.Override + public boolean hasMetadata() { + return metadata_ != null; + } + /** + * .feast.serving.GetOnlineFeaturesResponseMetadata metadata = 1; + * @return The metadata. + */ + @java.lang.Override + public feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata getMetadata() { + return metadata_ == null ? feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata.getDefaultInstance() : metadata_; + } + /** + * .feast.serving.GetOnlineFeaturesResponseMetadata metadata = 1; + */ + @java.lang.Override + public feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadataOrBuilder getMetadataOrBuilder() { + return getMetadata(); + } + + public static final int RESULTS_FIELD_NUMBER = 2; + private java.util.List results_; + /** + *
+     * Length of "results" array should match length of requested features.
+     * We also preserve the same order of features here as in metadata.feature_names
+     * 
+ * + * repeated .feast.serving.GetOnlineFeaturesResponse.FeatureVector results = 2; + */ + @java.lang.Override + public java.util.List getResultsList() { + return results_; + } + /** + *
+     * Length of "results" array should match length of requested features.
+     * We also preserve the same order of features here as in metadata.feature_names
+     * 
+ * + * repeated .feast.serving.GetOnlineFeaturesResponse.FeatureVector results = 2; + */ + @java.lang.Override + public java.util.List + getResultsOrBuilderList() { + return results_; + } + /** + *
+     * Length of "results" array should match length of requested features.
+     * We also preserve the same order of features here as in metadata.feature_names
+     * 
+ * + * repeated .feast.serving.GetOnlineFeaturesResponse.FeatureVector results = 2; + */ + @java.lang.Override + public int getResultsCount() { + return results_.size(); + } + /** + *
+     * Length of "results" array should match length of requested features.
+     * We also preserve the same order of features here as in metadata.feature_names
+     * 
+ * + * repeated .feast.serving.GetOnlineFeaturesResponse.FeatureVector results = 2; + */ + @java.lang.Override + public feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector getResults(int index) { + return results_.get(index); + } + /** + *
+     * Length of "results" array should match length of requested features.
+     * We also preserve the same order of features here as in metadata.feature_names
+     * 
+ * + * repeated .feast.serving.GetOnlineFeaturesResponse.FeatureVector results = 2; + */ + @java.lang.Override + public feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVectorOrBuilder getResultsOrBuilder( + int index) { + return results_.get(index); + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (metadata_ != null) { + output.writeMessage(1, getMetadata()); + } + for (int i = 0; i < results_.size(); i++) { + output.writeMessage(2, results_.get(i)); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (metadata_ != null) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(1, getMetadata()); + } + for (int i = 0; i < results_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(2, results_.get(i)); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse)) { + return super.equals(obj); + } + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse other = (feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse) obj; + + if (hasMetadata() != other.hasMetadata()) return false; + if (hasMetadata()) { + if (!getMetadata() + .equals(other.getMetadata())) return false; + } + if (!getResultsList() + .equals(other.getResultsList())) return false; + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasMetadata()) { + hash = (37 * hash) + METADATA_FIELD_NUMBER; + hash = (53 * hash) + getMetadata().hashCode(); + } + if (getResultsCount() > 0) { + hash = (37 * hash) + RESULTS_FIELD_NUMBER; + hash = (53 * hash) + getResultsList().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code feast.serving.GetOnlineFeaturesResponse} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:feast.serving.GetOnlineFeaturesResponse) + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return feast.proto.serving.ServingAPIProto.internal_static_feast_serving_GetOnlineFeaturesResponse_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return feast.proto.serving.ServingAPIProto.internal_static_feast_serving_GetOnlineFeaturesResponse_fieldAccessorTable + .ensureFieldAccessorsInitialized( + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.class, feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.Builder.class); + } + + // Construct using feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + getResultsFieldBuilder(); + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + if (metadataBuilder_ == null) { + metadata_ = null; + } else { + metadata_ = null; + metadataBuilder_ = null; + } + if (resultsBuilder_ == null) { + results_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); + } else { + resultsBuilder_.clear(); + } + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return feast.proto.serving.ServingAPIProto.internal_static_feast_serving_GetOnlineFeaturesResponse_descriptor; + } + + @java.lang.Override + public feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse getDefaultInstanceForType() { + return feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.getDefaultInstance(); + } + + @java.lang.Override + public feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse build() { + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse buildPartial() { + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse result = new feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse(this); + int from_bitField0_ = bitField0_; + if (metadataBuilder_ == null) { + result.metadata_ = metadata_; + } else { + result.metadata_ = metadataBuilder_.build(); + } + if (resultsBuilder_ == null) { + if (((bitField0_ & 0x00000001) != 0)) { + results_ = java.util.Collections.unmodifiableList(results_); + bitField0_ = (bitField0_ & ~0x00000001); + } + result.results_ = results_; + } else { + result.results_ = resultsBuilder_.build(); + } + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse) { + return mergeFrom((feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse other) { + if (other == feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.getDefaultInstance()) return this; + if (other.hasMetadata()) { + mergeMetadata(other.getMetadata()); + } + if (resultsBuilder_ == null) { + if (!other.results_.isEmpty()) { + if (results_.isEmpty()) { + results_ = other.results_; + bitField0_ = (bitField0_ & ~0x00000001); + } else { + ensureResultsIsMutable(); + results_.addAll(other.results_); + } + onChanged(); + } + } else { + if (!other.results_.isEmpty()) { + if (resultsBuilder_.isEmpty()) { + resultsBuilder_.dispose(); + resultsBuilder_ = null; + results_ = other.results_; + bitField0_ = (bitField0_ & ~0x00000001); + resultsBuilder_ = + com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? + getResultsFieldBuilder() : null; + } else { + resultsBuilder_.addAllMessages(other.results_); + } + } + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata metadata_; + private com.google.protobuf.SingleFieldBuilderV3< + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata, feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata.Builder, feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadataOrBuilder> metadataBuilder_; + /** + * .feast.serving.GetOnlineFeaturesResponseMetadata metadata = 1; + * @return Whether the metadata field is set. + */ + public boolean hasMetadata() { + return metadataBuilder_ != null || metadata_ != null; + } + /** + * .feast.serving.GetOnlineFeaturesResponseMetadata metadata = 1; + * @return The metadata. + */ + public feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata getMetadata() { + if (metadataBuilder_ == null) { + return metadata_ == null ? feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata.getDefaultInstance() : metadata_; + } else { + return metadataBuilder_.getMessage(); + } + } + /** + * .feast.serving.GetOnlineFeaturesResponseMetadata metadata = 1; + */ + public Builder setMetadata(feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata value) { + if (metadataBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + metadata_ = value; + onChanged(); + } else { + metadataBuilder_.setMessage(value); + } + + return this; + } + /** + * .feast.serving.GetOnlineFeaturesResponseMetadata metadata = 1; + */ + public Builder setMetadata( + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata.Builder builderForValue) { + if (metadataBuilder_ == null) { + metadata_ = builderForValue.build(); + onChanged(); + } else { + metadataBuilder_.setMessage(builderForValue.build()); + } + + return this; + } + /** + * .feast.serving.GetOnlineFeaturesResponseMetadata metadata = 1; + */ + public Builder mergeMetadata(feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata value) { + if (metadataBuilder_ == null) { + if (metadata_ != null) { + metadata_ = + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata.newBuilder(metadata_).mergeFrom(value).buildPartial(); + } else { + metadata_ = value; + } + onChanged(); + } else { + metadataBuilder_.mergeFrom(value); + } + + return this; + } + /** + * .feast.serving.GetOnlineFeaturesResponseMetadata metadata = 1; + */ + public Builder clearMetadata() { + if (metadataBuilder_ == null) { + metadata_ = null; + onChanged(); + } else { + metadata_ = null; + metadataBuilder_ = null; + } + + return this; + } + /** + * .feast.serving.GetOnlineFeaturesResponseMetadata metadata = 1; + */ + public feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata.Builder getMetadataBuilder() { + + onChanged(); + return getMetadataFieldBuilder().getBuilder(); + } + /** + * .feast.serving.GetOnlineFeaturesResponseMetadata metadata = 1; + */ + public feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadataOrBuilder getMetadataOrBuilder() { + if (metadataBuilder_ != null) { + return metadataBuilder_.getMessageOrBuilder(); + } else { + return metadata_ == null ? + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata.getDefaultInstance() : metadata_; + } + } + /** + * .feast.serving.GetOnlineFeaturesResponseMetadata metadata = 1; + */ + private com.google.protobuf.SingleFieldBuilderV3< + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata, feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata.Builder, feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadataOrBuilder> + getMetadataFieldBuilder() { + if (metadataBuilder_ == null) { + metadataBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata, feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata.Builder, feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadataOrBuilder>( + getMetadata(), + getParentForChildren(), + isClean()); + metadata_ = null; + } + return metadataBuilder_; + } + + private java.util.List results_ = + java.util.Collections.emptyList(); + private void ensureResultsIsMutable() { + if (!((bitField0_ & 0x00000001) != 0)) { + results_ = new java.util.ArrayList(results_); + bitField0_ |= 0x00000001; + } + } + + private com.google.protobuf.RepeatedFieldBuilderV3< + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector, feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector.Builder, feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVectorOrBuilder> resultsBuilder_; + + /** + *
+       * Length of "results" array should match length of requested features.
+       * We also preserve the same order of features here as in metadata.feature_names
+       * 
+ * + * repeated .feast.serving.GetOnlineFeaturesResponse.FeatureVector results = 2; + */ + public java.util.List getResultsList() { + if (resultsBuilder_ == null) { + return java.util.Collections.unmodifiableList(results_); + } else { + return resultsBuilder_.getMessageList(); + } + } + /** + *
+       * Length of "results" array should match length of requested features.
+       * We also preserve the same order of features here as in metadata.feature_names
+       * 
+ * + * repeated .feast.serving.GetOnlineFeaturesResponse.FeatureVector results = 2; + */ + public int getResultsCount() { + if (resultsBuilder_ == null) { + return results_.size(); + } else { + return resultsBuilder_.getCount(); + } + } + /** + *
+       * Length of "results" array should match length of requested features.
+       * We also preserve the same order of features here as in metadata.feature_names
+       * 
+ * + * repeated .feast.serving.GetOnlineFeaturesResponse.FeatureVector results = 2; + */ + public feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector getResults(int index) { + if (resultsBuilder_ == null) { + return results_.get(index); + } else { + return resultsBuilder_.getMessage(index); + } + } + /** + *
+       * Length of "results" array should match length of requested features.
+       * We also preserve the same order of features here as in metadata.feature_names
+       * 
+ * + * repeated .feast.serving.GetOnlineFeaturesResponse.FeatureVector results = 2; + */ + public Builder setResults( + int index, feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector value) { + if (resultsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureResultsIsMutable(); + results_.set(index, value); + onChanged(); + } else { + resultsBuilder_.setMessage(index, value); + } + return this; + } + /** + *
+       * Length of "results" array should match length of requested features.
+       * We also preserve the same order of features here as in metadata.feature_names
+       * 
+ * + * repeated .feast.serving.GetOnlineFeaturesResponse.FeatureVector results = 2; + */ + public Builder setResults( + int index, feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector.Builder builderForValue) { + if (resultsBuilder_ == null) { + ensureResultsIsMutable(); + results_.set(index, builderForValue.build()); + onChanged(); + } else { + resultsBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + *
+       * Length of "results" array should match length of requested features.
+       * We also preserve the same order of features here as in metadata.feature_names
+       * 
+ * + * repeated .feast.serving.GetOnlineFeaturesResponse.FeatureVector results = 2; + */ + public Builder addResults(feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector value) { + if (resultsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureResultsIsMutable(); + results_.add(value); + onChanged(); + } else { + resultsBuilder_.addMessage(value); + } + return this; + } + /** + *
+       * Length of "results" array should match length of requested features.
+       * We also preserve the same order of features here as in metadata.feature_names
+       * 
+ * + * repeated .feast.serving.GetOnlineFeaturesResponse.FeatureVector results = 2; + */ + public Builder addResults( + int index, feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector value) { + if (resultsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureResultsIsMutable(); + results_.add(index, value); + onChanged(); + } else { + resultsBuilder_.addMessage(index, value); + } + return this; + } + /** + *
+       * Length of "results" array should match length of requested features.
+       * We also preserve the same order of features here as in metadata.feature_names
+       * 
+ * + * repeated .feast.serving.GetOnlineFeaturesResponse.FeatureVector results = 2; + */ + public Builder addResults( + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector.Builder builderForValue) { + if (resultsBuilder_ == null) { + ensureResultsIsMutable(); + results_.add(builderForValue.build()); + onChanged(); + } else { + resultsBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + *
+       * Length of "results" array should match length of requested features.
+       * We also preserve the same order of features here as in metadata.feature_names
+       * 
+ * + * repeated .feast.serving.GetOnlineFeaturesResponse.FeatureVector results = 2; + */ + public Builder addResults( + int index, feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector.Builder builderForValue) { + if (resultsBuilder_ == null) { + ensureResultsIsMutable(); + results_.add(index, builderForValue.build()); + onChanged(); + } else { + resultsBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + *
+       * Length of "results" array should match length of requested features.
+       * We also preserve the same order of features here as in metadata.feature_names
+       * 
+ * + * repeated .feast.serving.GetOnlineFeaturesResponse.FeatureVector results = 2; + */ + public Builder addAllResults( + java.lang.Iterable values) { + if (resultsBuilder_ == null) { + ensureResultsIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, results_); + onChanged(); + } else { + resultsBuilder_.addAllMessages(values); + } + return this; + } + /** + *
+       * Length of "results" array should match length of requested features.
+       * We also preserve the same order of features here as in metadata.feature_names
+       * 
+ * + * repeated .feast.serving.GetOnlineFeaturesResponse.FeatureVector results = 2; + */ + public Builder clearResults() { + if (resultsBuilder_ == null) { + results_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + } else { + resultsBuilder_.clear(); + } + return this; + } + /** + *
+       * Length of "results" array should match length of requested features.
+       * We also preserve the same order of features here as in metadata.feature_names
+       * 
+ * + * repeated .feast.serving.GetOnlineFeaturesResponse.FeatureVector results = 2; + */ + public Builder removeResults(int index) { + if (resultsBuilder_ == null) { + ensureResultsIsMutable(); + results_.remove(index); + onChanged(); + } else { + resultsBuilder_.remove(index); + } + return this; + } + /** + *
+       * Length of "results" array should match length of requested features.
+       * We also preserve the same order of features here as in metadata.feature_names
+       * 
+ * + * repeated .feast.serving.GetOnlineFeaturesResponse.FeatureVector results = 2; + */ + public feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector.Builder getResultsBuilder( + int index) { + return getResultsFieldBuilder().getBuilder(index); + } + /** + *
+       * Length of "results" array should match length of requested features.
+       * We also preserve the same order of features here as in metadata.feature_names
+       * 
+ * + * repeated .feast.serving.GetOnlineFeaturesResponse.FeatureVector results = 2; + */ + public feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVectorOrBuilder getResultsOrBuilder( + int index) { + if (resultsBuilder_ == null) { + return results_.get(index); } else { + return resultsBuilder_.getMessageOrBuilder(index); + } + } + /** + *
+       * Length of "results" array should match length of requested features.
+       * We also preserve the same order of features here as in metadata.feature_names
+       * 
+ * + * repeated .feast.serving.GetOnlineFeaturesResponse.FeatureVector results = 2; + */ + public java.util.List + getResultsOrBuilderList() { + if (resultsBuilder_ != null) { + return resultsBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(results_); + } + } + /** + *
+       * Length of "results" array should match length of requested features.
+       * We also preserve the same order of features here as in metadata.feature_names
+       * 
+ * + * repeated .feast.serving.GetOnlineFeaturesResponse.FeatureVector results = 2; + */ + public feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector.Builder addResultsBuilder() { + return getResultsFieldBuilder().addBuilder( + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector.getDefaultInstance()); + } + /** + *
+       * Length of "results" array should match length of requested features.
+       * We also preserve the same order of features here as in metadata.feature_names
+       * 
+ * + * repeated .feast.serving.GetOnlineFeaturesResponse.FeatureVector results = 2; + */ + public feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector.Builder addResultsBuilder( + int index) { + return getResultsFieldBuilder().addBuilder( + index, feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector.getDefaultInstance()); + } + /** + *
+       * Length of "results" array should match length of requested features.
+       * We also preserve the same order of features here as in metadata.feature_names
+       * 
+ * + * repeated .feast.serving.GetOnlineFeaturesResponse.FeatureVector results = 2; + */ + public java.util.List + getResultsBuilderList() { + return getResultsFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilderV3< + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector, feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector.Builder, feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVectorOrBuilder> + getResultsFieldBuilder() { + if (resultsBuilder_ == null) { + resultsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3< + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector, feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVector.Builder, feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FeatureVectorOrBuilder>( + results_, + ((bitField0_ & 0x00000001) != 0), + getParentForChildren(), + isClean()); + results_ = null; + } + return resultsBuilder_; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:feast.serving.GetOnlineFeaturesResponse) + } + + // @@protoc_insertion_point(class_scope:feast.serving.GetOnlineFeaturesResponse) + private static final feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse(); + } + + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public GetOnlineFeaturesResponse parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new GetOnlineFeaturesResponse(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface GetOnlineFeaturesResponseMetadataOrBuilder extends + // @@protoc_insertion_point(interface_extends:feast.serving.GetOnlineFeaturesResponseMetadata) + com.google.protobuf.MessageOrBuilder { + + /** + * .feast.serving.FeatureList feature_names = 1; + * @return Whether the featureNames field is set. + */ + boolean hasFeatureNames(); + /** + * .feast.serving.FeatureList feature_names = 1; + * @return The featureNames. + */ + feast.proto.serving.ServingAPIProto.FeatureList getFeatureNames(); + /** + * .feast.serving.FeatureList feature_names = 1; + */ + feast.proto.serving.ServingAPIProto.FeatureListOrBuilder getFeatureNamesOrBuilder(); + } + /** + * Protobuf type {@code feast.serving.GetOnlineFeaturesResponseMetadata} + */ + public static final class GetOnlineFeaturesResponseMetadata extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:feast.serving.GetOnlineFeaturesResponseMetadata) + GetOnlineFeaturesResponseMetadataOrBuilder { + private static final long serialVersionUID = 0L; + // Use GetOnlineFeaturesResponseMetadata.newBuilder() to construct. + private GetOnlineFeaturesResponseMetadata(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private GetOnlineFeaturesResponseMetadata() { + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new GetOnlineFeaturesResponseMetadata(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private GetOnlineFeaturesResponseMetadata( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + feast.proto.serving.ServingAPIProto.FeatureList.Builder subBuilder = null; + if (featureNames_ != null) { + subBuilder = featureNames_.toBuilder(); + } + featureNames_ = input.readMessage(feast.proto.serving.ServingAPIProto.FeatureList.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(featureNames_); + featureNames_ = subBuilder.buildPartial(); + } + + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return feast.proto.serving.ServingAPIProto.internal_static_feast_serving_GetOnlineFeaturesResponseMetadata_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return feast.proto.serving.ServingAPIProto.internal_static_feast_serving_GetOnlineFeaturesResponseMetadata_fieldAccessorTable + .ensureFieldAccessorsInitialized( + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata.class, feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata.Builder.class); + } + + public static final int FEATURE_NAMES_FIELD_NUMBER = 1; + private feast.proto.serving.ServingAPIProto.FeatureList featureNames_; + /** + * .feast.serving.FeatureList feature_names = 1; + * @return Whether the featureNames field is set. + */ + @java.lang.Override + public boolean hasFeatureNames() { + return featureNames_ != null; + } + /** + * .feast.serving.FeatureList feature_names = 1; + * @return The featureNames. + */ + @java.lang.Override + public feast.proto.serving.ServingAPIProto.FeatureList getFeatureNames() { + return featureNames_ == null ? feast.proto.serving.ServingAPIProto.FeatureList.getDefaultInstance() : featureNames_; + } + /** + * .feast.serving.FeatureList feature_names = 1; + */ + @java.lang.Override + public feast.proto.serving.ServingAPIProto.FeatureListOrBuilder getFeatureNamesOrBuilder() { + return getFeatureNames(); + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (featureNames_ != null) { + output.writeMessage(1, getFeatureNames()); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (featureNames_ != null) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(1, getFeatureNames()); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata)) { + return super.equals(obj); + } + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata other = (feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata) obj; + + if (hasFeatureNames() != other.hasFeatureNames()) return false; + if (hasFeatureNames()) { + if (!getFeatureNames() + .equals(other.getFeatureNames())) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasFeatureNames()) { + hash = (37 * hash) + FEATURE_NAMES_FIELD_NUMBER; + hash = (53 * hash) + getFeatureNames().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code feast.serving.GetOnlineFeaturesResponseMetadata} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:feast.serving.GetOnlineFeaturesResponseMetadata) + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadataOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return feast.proto.serving.ServingAPIProto.internal_static_feast_serving_GetOnlineFeaturesResponseMetadata_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return feast.proto.serving.ServingAPIProto.internal_static_feast_serving_GetOnlineFeaturesResponseMetadata_fieldAccessorTable + .ensureFieldAccessorsInitialized( + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata.class, feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata.Builder.class); + } + + // Construct using feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + if (featureNamesBuilder_ == null) { + featureNames_ = null; + } else { + featureNames_ = null; + featureNamesBuilder_ = null; + } + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return feast.proto.serving.ServingAPIProto.internal_static_feast_serving_GetOnlineFeaturesResponseMetadata_descriptor; + } + + @java.lang.Override + public feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata getDefaultInstanceForType() { + return feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata.getDefaultInstance(); + } + + @java.lang.Override + public feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata build() { + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata buildPartial() { + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata result = new feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata(this); + if (featureNamesBuilder_ == null) { + result.featureNames_ = featureNames_; + } else { + result.featureNames_ = featureNamesBuilder_.build(); + } + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata) { + return mergeFrom((feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata other) { + if (other == feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata.getDefaultInstance()) return this; + if (other.hasFeatureNames()) { + mergeFeatureNames(other.getFeatureNames()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + private feast.proto.serving.ServingAPIProto.FeatureList featureNames_; + private com.google.protobuf.SingleFieldBuilderV3< + feast.proto.serving.ServingAPIProto.FeatureList, feast.proto.serving.ServingAPIProto.FeatureList.Builder, feast.proto.serving.ServingAPIProto.FeatureListOrBuilder> featureNamesBuilder_; + /** + * .feast.serving.FeatureList feature_names = 1; + * @return Whether the featureNames field is set. + */ + public boolean hasFeatureNames() { + return featureNamesBuilder_ != null || featureNames_ != null; + } + /** + * .feast.serving.FeatureList feature_names = 1; + * @return The featureNames. + */ + public feast.proto.serving.ServingAPIProto.FeatureList getFeatureNames() { + if (featureNamesBuilder_ == null) { + return featureNames_ == null ? feast.proto.serving.ServingAPIProto.FeatureList.getDefaultInstance() : featureNames_; + } else { + return featureNamesBuilder_.getMessage(); + } + } + /** + * .feast.serving.FeatureList feature_names = 1; + */ + public Builder setFeatureNames(feast.proto.serving.ServingAPIProto.FeatureList value) { + if (featureNamesBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + featureNames_ = value; + onChanged(); + } else { + featureNamesBuilder_.setMessage(value); + } + + return this; + } + /** + * .feast.serving.FeatureList feature_names = 1; + */ + public Builder setFeatureNames( + feast.proto.serving.ServingAPIProto.FeatureList.Builder builderForValue) { + if (featureNamesBuilder_ == null) { + featureNames_ = builderForValue.build(); + onChanged(); + } else { + featureNamesBuilder_.setMessage(builderForValue.build()); + } + + return this; + } + /** + * .feast.serving.FeatureList feature_names = 1; + */ + public Builder mergeFeatureNames(feast.proto.serving.ServingAPIProto.FeatureList value) { + if (featureNamesBuilder_ == null) { + if (featureNames_ != null) { + featureNames_ = + feast.proto.serving.ServingAPIProto.FeatureList.newBuilder(featureNames_).mergeFrom(value).buildPartial(); + } else { + featureNames_ = value; + } + onChanged(); + } else { + featureNamesBuilder_.mergeFrom(value); + } + + return this; + } + /** + * .feast.serving.FeatureList feature_names = 1; + */ + public Builder clearFeatureNames() { + if (featureNamesBuilder_ == null) { + featureNames_ = null; + onChanged(); + } else { + featureNames_ = null; + featureNamesBuilder_ = null; + } + + return this; + } + /** + * .feast.serving.FeatureList feature_names = 1; + */ + public feast.proto.serving.ServingAPIProto.FeatureList.Builder getFeatureNamesBuilder() { + + onChanged(); + return getFeatureNamesFieldBuilder().getBuilder(); + } + /** + * .feast.serving.FeatureList feature_names = 1; + */ + public feast.proto.serving.ServingAPIProto.FeatureListOrBuilder getFeatureNamesOrBuilder() { + if (featureNamesBuilder_ != null) { + return featureNamesBuilder_.getMessageOrBuilder(); + } else { + return featureNames_ == null ? + feast.proto.serving.ServingAPIProto.FeatureList.getDefaultInstance() : featureNames_; + } + } + /** + * .feast.serving.FeatureList feature_names = 1; + */ + private com.google.protobuf.SingleFieldBuilderV3< + feast.proto.serving.ServingAPIProto.FeatureList, feast.proto.serving.ServingAPIProto.FeatureList.Builder, feast.proto.serving.ServingAPIProto.FeatureListOrBuilder> + getFeatureNamesFieldBuilder() { + if (featureNamesBuilder_ == null) { + featureNamesBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + feast.proto.serving.ServingAPIProto.FeatureList, feast.proto.serving.ServingAPIProto.FeatureList.Builder, feast.proto.serving.ServingAPIProto.FeatureListOrBuilder>( + getFeatureNames(), + getParentForChildren(), + isClean()); + featureNames_ = null; + } + return featureNamesBuilder_; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:feast.serving.GetOnlineFeaturesResponseMetadata) + } + + // @@protoc_insertion_point(class_scope:feast.serving.GetOnlineFeaturesResponseMetadata) + private static final feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata(); + } + + public static feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public GetOnlineFeaturesResponseMetadata parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new GetOnlineFeaturesResponseMetadata(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseMetadata getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_feast_serving_GetFeastServingInfoRequest_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_feast_serving_GetFeastServingInfoRequest_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_feast_serving_GetFeastServingInfoResponse_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_feast_serving_GetFeastServingInfoResponse_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_feast_serving_FeatureReferenceV2_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_feast_serving_FeatureReferenceV2_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_feast_serving_GetOnlineFeaturesRequestV2_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_feast_serving_GetOnlineFeaturesRequestV2_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_feast_serving_GetOnlineFeaturesRequestV2_EntityRow_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_feast_serving_GetOnlineFeaturesRequestV2_EntityRow_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_feast_serving_GetOnlineFeaturesRequestV2_EntityRow_FieldsEntry_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_feast_serving_GetOnlineFeaturesRequestV2_EntityRow_FieldsEntry_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_feast_serving_FeatureList_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_feast_serving_FeatureList_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_feast_serving_GetOnlineFeaturesRequest_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_feast_serving_GetOnlineFeaturesRequest_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_feast_serving_GetOnlineFeaturesRequest_EntitiesEntry_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_feast_serving_GetOnlineFeaturesRequest_EntitiesEntry_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_feast_serving_GetOnlineFeaturesRequest_RequestContextEntry_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_feast_serving_GetOnlineFeaturesRequest_RequestContextEntry_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_feast_serving_GetOnlineFeaturesResponse_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_feast_serving_GetOnlineFeaturesResponse_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_feast_serving_GetOnlineFeaturesResponse_FeatureVector_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_feast_serving_GetOnlineFeaturesResponse_FeatureVector_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_feast_serving_GetOnlineFeaturesResponseMetadata_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_feast_serving_GetOnlineFeaturesResponseMetadata_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\"feast/serving/ServingService.proto\022\rfe" + + "ast.serving\032\037google/protobuf/timestamp.p" + + "roto\032\027feast/types/Value.proto\"\034\n\032GetFeas" + + "tServingInfoRequest\".\n\033GetFeastServingIn" + + "foResponse\022\017\n\007version\030\001 \001(\t\"E\n\022FeatureRe" + + "ferenceV2\022\031\n\021feature_view_name\030\001 \001(\t\022\024\n\014" + + "feature_name\030\002 \001(\t\"\375\002\n\032GetOnlineFeatures" + + "RequestV2\0223\n\010features\030\004 \003(\0132!.feast.serv" + + "ing.FeatureReferenceV2\022H\n\013entity_rows\030\002 " + + "\003(\01323.feast.serving.GetOnlineFeaturesReq" + + "uestV2.EntityRow\022\017\n\007project\030\005 \001(\t\032\316\001\n\tEn" + + "tityRow\022-\n\ttimestamp\030\001 \001(\0132\032.google.prot" + + "obuf.Timestamp\022O\n\006fields\030\002 \003(\0132?.feast.s" + + "erving.GetOnlineFeaturesRequestV2.Entity" + + "Row.FieldsEntry\032A\n\013FieldsEntry\022\013\n\003key\030\001 " + + "\001(\t\022!\n\005value\030\002 \001(\0132\022.feast.types.Value:\002" + + "8\001\"\032\n\013FeatureList\022\013\n\003val\030\001 \003(\t\"\310\003\n\030GetOn" + + "lineFeaturesRequest\022\031\n\017feature_service\030\001" + + " \001(\tH\000\022.\n\010features\030\002 \001(\0132\032.feast.serving" + + ".FeatureListH\000\022G\n\010entities\030\003 \003(\01325.feast" + + ".serving.GetOnlineFeaturesRequest.Entiti" + + "esEntry\022\032\n\022full_feature_names\030\004 \001(\010\022T\n\017r" + + "equest_context\030\005 \003(\0132;.feast.serving.Get" + + "OnlineFeaturesRequest.RequestContextEntr" + + "y\032K\n\rEntitiesEntry\022\013\n\003key\030\001 \001(\t\022)\n\005value" + + "\030\002 \001(\0132\032.feast.types.RepeatedValue:\0028\001\032Q" + + "\n\023RequestContextEntry\022\013\n\003key\030\001 \001(\t\022)\n\005va" + + "lue\030\002 \001(\0132\032.feast.types.RepeatedValue:\0028" + + "\001B\006\n\004kind\"\302\002\n\031GetOnlineFeaturesResponse\022" + + "B\n\010metadata\030\001 \001(\01320.feast.serving.GetOnl" + + "ineFeaturesResponseMetadata\022G\n\007results\030\002" + + " \003(\01326.feast.serving.GetOnlineFeaturesRe" + + "sponse.FeatureVector\032\227\001\n\rFeatureVector\022\"" + + "\n\006values\030\001 \003(\0132\022.feast.types.Value\022,\n\010st" + + "atuses\030\002 \003(\0162\032.feast.serving.FieldStatus" + + "\0224\n\020event_timestamps\030\003 \003(\0132\032.google.prot" + + "obuf.Timestamp\"V\n!GetOnlineFeaturesRespo" + + "nseMetadata\0221\n\rfeature_names\030\001 \001(\0132\032.fea" + + "st.serving.FeatureList*[\n\013FieldStatus\022\013\n" + + "\007INVALID\020\000\022\013\n\007PRESENT\020\001\022\016\n\nNULL_VALUE\020\002\022" + + "\r\n\tNOT_FOUND\020\003\022\023\n\017OUTSIDE_MAX_AGE\020\0042\346\001\n\016" + + "ServingService\022l\n\023GetFeastServingInfo\022)." + + "feast.serving.GetFeastServingInfoRequest" + + "\032*.feast.serving.GetFeastServingInfoResp" + + "onse\022f\n\021GetOnlineFeatures\022\'.feast.servin" + + "g.GetOnlineFeaturesRequest\032(.feast.servi" + + "ng.GetOnlineFeaturesResponseBZ\n\023feast.pr" + + "oto.servingB\017ServingAPIProtoZ2github.com" + + "/feast-dev/feast/go/protos/feast/serving" + + "b\006proto3" + }; + descriptor = com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + com.google.protobuf.TimestampProto.getDescriptor(), + feast.proto.types.ValueProto.getDescriptor(), + }); + internal_static_feast_serving_GetFeastServingInfoRequest_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_feast_serving_GetFeastServingInfoRequest_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_feast_serving_GetFeastServingInfoRequest_descriptor, + new java.lang.String[] { }); + internal_static_feast_serving_GetFeastServingInfoResponse_descriptor = + getDescriptor().getMessageTypes().get(1); + internal_static_feast_serving_GetFeastServingInfoResponse_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_feast_serving_GetFeastServingInfoResponse_descriptor, + new java.lang.String[] { "Version", }); + internal_static_feast_serving_FeatureReferenceV2_descriptor = + getDescriptor().getMessageTypes().get(2); + internal_static_feast_serving_FeatureReferenceV2_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_feast_serving_FeatureReferenceV2_descriptor, + new java.lang.String[] { "FeatureViewName", "FeatureName", }); + internal_static_feast_serving_GetOnlineFeaturesRequestV2_descriptor = + getDescriptor().getMessageTypes().get(3); + internal_static_feast_serving_GetOnlineFeaturesRequestV2_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_feast_serving_GetOnlineFeaturesRequestV2_descriptor, + new java.lang.String[] { "Features", "EntityRows", "Project", }); + internal_static_feast_serving_GetOnlineFeaturesRequestV2_EntityRow_descriptor = + internal_static_feast_serving_GetOnlineFeaturesRequestV2_descriptor.getNestedTypes().get(0); + internal_static_feast_serving_GetOnlineFeaturesRequestV2_EntityRow_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_feast_serving_GetOnlineFeaturesRequestV2_EntityRow_descriptor, + new java.lang.String[] { "Timestamp", "Fields", }); + internal_static_feast_serving_GetOnlineFeaturesRequestV2_EntityRow_FieldsEntry_descriptor = + internal_static_feast_serving_GetOnlineFeaturesRequestV2_EntityRow_descriptor.getNestedTypes().get(0); + internal_static_feast_serving_GetOnlineFeaturesRequestV2_EntityRow_FieldsEntry_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_feast_serving_GetOnlineFeaturesRequestV2_EntityRow_FieldsEntry_descriptor, + new java.lang.String[] { "Key", "Value", }); + internal_static_feast_serving_FeatureList_descriptor = + getDescriptor().getMessageTypes().get(4); + internal_static_feast_serving_FeatureList_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_feast_serving_FeatureList_descriptor, + new java.lang.String[] { "Val", }); + internal_static_feast_serving_GetOnlineFeaturesRequest_descriptor = + getDescriptor().getMessageTypes().get(5); + internal_static_feast_serving_GetOnlineFeaturesRequest_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_feast_serving_GetOnlineFeaturesRequest_descriptor, + new java.lang.String[] { "FeatureService", "Features", "Entities", "FullFeatureNames", "RequestContext", "Kind", }); + internal_static_feast_serving_GetOnlineFeaturesRequest_EntitiesEntry_descriptor = + internal_static_feast_serving_GetOnlineFeaturesRequest_descriptor.getNestedTypes().get(0); + internal_static_feast_serving_GetOnlineFeaturesRequest_EntitiesEntry_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_feast_serving_GetOnlineFeaturesRequest_EntitiesEntry_descriptor, + new java.lang.String[] { "Key", "Value", }); + internal_static_feast_serving_GetOnlineFeaturesRequest_RequestContextEntry_descriptor = + internal_static_feast_serving_GetOnlineFeaturesRequest_descriptor.getNestedTypes().get(1); + internal_static_feast_serving_GetOnlineFeaturesRequest_RequestContextEntry_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_feast_serving_GetOnlineFeaturesRequest_RequestContextEntry_descriptor, + new java.lang.String[] { "Key", "Value", }); + internal_static_feast_serving_GetOnlineFeaturesResponse_descriptor = + getDescriptor().getMessageTypes().get(6); + internal_static_feast_serving_GetOnlineFeaturesResponse_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_feast_serving_GetOnlineFeaturesResponse_descriptor, + new java.lang.String[] { "Metadata", "Results", }); + internal_static_feast_serving_GetOnlineFeaturesResponse_FeatureVector_descriptor = + internal_static_feast_serving_GetOnlineFeaturesResponse_descriptor.getNestedTypes().get(0); + internal_static_feast_serving_GetOnlineFeaturesResponse_FeatureVector_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_feast_serving_GetOnlineFeaturesResponse_FeatureVector_descriptor, + new java.lang.String[] { "Values", "Statuses", "EventTimestamps", }); + internal_static_feast_serving_GetOnlineFeaturesResponseMetadata_descriptor = + getDescriptor().getMessageTypes().get(7); + internal_static_feast_serving_GetOnlineFeaturesResponseMetadata_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_feast_serving_GetOnlineFeaturesResponseMetadata_descriptor, + new java.lang.String[] { "FeatureNames", }); + com.google.protobuf.TimestampProto.getDescriptor(); + feast.proto.types.ValueProto.getDescriptor(); + } + + // @@protoc_insertion_point(outer_class_scope) +} From fd726b08b894b3c2c889f10cc47c68dbb5621eb3 Mon Sep 17 00:00:00 2001 From: darpanKumar29 Date: Mon, 30 Jan 2023 17:07:25 +0530 Subject: [PATCH 03/67] new pb file addition --- java/serving/src/main/resources/registry.pb | Bin 23063 -> 23197 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/java/serving/src/main/resources/registry.pb b/java/serving/src/main/resources/registry.pb index 961e3d2ee53d367304597690f80bfc4cd4d362d8..e4117f44c2c49fccd6354991f69ec5df8bd953df 100644 GIT binary patch literal 23197 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 CZ9n?} From 13cc1520476a3fb5d0adfe073f3bda05c01283a2 Mon Sep 17 00:00:00 2001 From: darpanKumar29 Date: Tue, 31 Jan 2023 12:23:47 +0530 Subject: [PATCH 04/67] newrelic inmpl --- java/serving/libs/runtime/newrelic.jar | Bin 0 -> 22248967 bytes java/serving/src/main/resources/newrelic.yml | 411 +++++++++++++++++++ 2 files changed, 411 insertions(+) create mode 100644 java/serving/libs/runtime/newrelic.jar create mode 100644 java/serving/src/main/resources/newrelic.yml diff --git a/java/serving/libs/runtime/newrelic.jar b/java/serving/libs/runtime/newrelic.jar new file mode 100644 index 0000000000000000000000000000000000000000..6c2671924ce1f48ca9093b711c8164a7b7958bb8 GIT binary patch literal 22248967 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
  • Q5gm%A!c=+e0YQ>61Veva)0a66u<;ku@Az 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

    an$KE7at~j)V*8wu*CoBpgb5-ZYi5rWE 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